On Tue, Jun 24, 2025 at 08:10:57PM -0700, Boqun Feng wrote:

> +/* Scan structure for synchronize_shazptr(). */
> +struct shazptr_scan {
> +     /* The scan kthread */
> +     struct task_struct *thread;
> +
> +     /* Wait queue for the scan kthread */
> +     struct swait_queue_head wq;
> +
> +     /* Whether the scan kthread has been scheduled to scan */
> +     bool scheduled;
> +
> +     /* The lock protecting ->queued and ->scheduled */
> +     struct mutex lock;
> +
> +     /* List of queued synchronize_shazptr() request. */
> +     struct list_head queued;
> +
> +     int cpu_grp_size;
> +
> +     /* List of scanning synchronize_shazptr() request. */
> +     struct list_head scanning;
> +
> +     /* Buffer used for hazptr slot scan, nr_cpu_ids slots*/
> +     struct shazptr_snapshot* snaps;
> +};

I find this style very hard to read, also the order of things is weird.

struct shazptr_scan {
        struct task_struct      *thread;
        struct swait_queue_head wq;
        struct list_head        scanning;

        struct mutex            lock;
        struct list_head        queued;    /* __guarded_by(lock) */
        bool                    scheduled; /* __guarded_by(lock) */

        struct shazptr_snapshot snaps[0] __counted_by(nr_cpu_ids);
};

(the __guarded_by() thing will come with Thread-Safety support that
Google is still cooking in clang)

> +static struct shazptr_scan shazptr_scan;

And then make this a pointer, and allocate the whole thing as a single
data structure with however much snaps data you need.

Reply via email to