]> git.apps.os.sepia.ceph.com Git - xfsprogs-dev.git/commitdiff
libfrog: enhance ptvar to support initializer functions
authorDarrick J. Wong <djwong@kernel.org>
Mon, 29 Jul 2024 23:23:08 +0000 (16:23 -0700)
committerDarrick J. Wong <djwong@kernel.org>
Tue, 30 Jul 2024 00:01:08 +0000 (17:01 -0700)
Modify the per-thread variable code to support passing in an initializer
function that will set up each thread's variable space when it is
claimed.

Signed-off-by: Darrick J. Wong <djwong@kernel.org>
Reviewed-by: Christoph Hellwig <hch@lst.de>
libfrog/ptvar.c
libfrog/ptvar.h
scrub/counter.c
scrub/descr.c
scrub/phase7.c
scrub/read_verify.c

index 7ac8c541862f94a93ef7f5e5e71a91286577d338..9d5ae6bc8e3988d16b1314ae6d86d119d4a87733 100644 (file)
@@ -26,6 +26,7 @@
 struct ptvar {
        pthread_key_t   key;
        pthread_mutex_t lock;
+       ptvar_init_fn   init_fn;
        size_t          nr_used;
        size_t          nr_counters;
        size_t          data_size;
@@ -38,6 +39,7 @@ int
 ptvar_alloc(
        size_t          nr,
        size_t          size,
+       ptvar_init_fn   init_fn,
        struct ptvar    **pptv)
 {
        struct ptvar    *ptv;
@@ -58,6 +60,7 @@ ptvar_alloc(
        ptv->data_size = size;
        ptv->nr_counters = nr;
        ptv->nr_used = 0;
+       ptv->init_fn = init_fn;
        memset(ptv->data, 0, nr * size);
        ret = -pthread_mutex_init(&ptv->lock, NULL);
        if (ret)
@@ -98,11 +101,15 @@ ptvar_get(
        if (!p) {
                pthread_mutex_lock(&ptv->lock);
                assert(ptv->nr_used < ptv->nr_counters);
-               p = &ptv->data[(ptv->nr_used++) * ptv->data_size];
+               p = &ptv->data[ptv->nr_used * ptv->data_size];
                ret = -pthread_setspecific(ptv->key, p);
                if (ret)
                        goto out_unlock;
+               ptv->nr_used++;
                pthread_mutex_unlock(&ptv->lock);
+
+               if (ptv->init_fn)
+                       ptv->init_fn(p);
        }
        *retp = 0;
        return p;
index b7d02d6269e80300e596f33ff9eae1875e805710..e4a181ffe76bc9e29cf01296e3c2226b242f1b28 100644 (file)
@@ -8,7 +8,9 @@
 
 struct ptvar;
 
-int ptvar_alloc(size_t nr, size_t size, struct ptvar **pptv);
+typedef void (*ptvar_init_fn)(void *data);
+int ptvar_alloc(size_t nr, size_t size, ptvar_init_fn init_fn,
+               struct ptvar **pptv);
 void ptvar_free(struct ptvar *ptv);
 void *ptvar_get(struct ptvar *ptv, int *ret);
 
index 2ee357f3a7650b55857e441b3786a2dc5e8ca51b..c903454c0dca95f2aea45fd375b439cb00a036e3 100644 (file)
@@ -38,7 +38,7 @@ ptcounter_alloc(
        p = malloc(sizeof(struct ptcounter));
        if (!p)
                return errno;
-       ret = -ptvar_alloc(nr, sizeof(uint64_t), &p->var);
+       ret = -ptvar_alloc(nr, sizeof(uint64_t), NULL, &p->var);
        if (ret) {
                free(p);
                return ret;
index 77d5378ec3fee760902db1aca607d4fac20c37f8..88ca5d95a78bc3895f8f869478c734d7fb73226b 100644 (file)
@@ -89,7 +89,7 @@ descr_init_phase(
        int                     ret;
 
        assert(descr_ptvar == NULL);
-       ret = -ptvar_alloc(nr_threads, DESCR_BUFSZ, &descr_ptvar);
+       ret = -ptvar_alloc(nr_threads, DESCR_BUFSZ, NULL, &descr_ptvar);
        if (ret)
                str_liberror(ctx, ret, _("creating description buffer"));
 
index cd4501f72b725ff71ea58ba9cbbc91be04ef5462..cce5ede00122a5c39c85ad0d445d82583e9310a3 100644 (file)
@@ -136,7 +136,7 @@ phase7_func(
        }
 
        error = -ptvar_alloc(scrub_nproc(ctx), sizeof(struct summary_counts),
-                       &ptvar);
+                       NULL, &ptvar);
        if (error) {
                str_liberror(ctx, error, _("setting up block counter"));
                return error;
index 29d7939549ffca048797834e642c1ae6ffff72b3..52348274be2c257150afc5938d4337c0a0fac021 100644 (file)
@@ -120,7 +120,7 @@ read_verify_pool_alloc(
        rvp->disk = disk;
        rvp->ioerr_fn = ioerr_fn;
        ret = -ptvar_alloc(submitter_threads, sizeof(struct read_verify),
-                       &rvp->rvstate);
+                       NULL, &rvp->rvstate);
        if (ret)
                goto out_counter;
        ret = -workqueue_create(&rvp->wq, (struct xfs_mount *)rvp,