rds: Acquire per-CPU pointer within BH disabled section
authorSebastian Andrzej Siewior <bigeasy@linutronix.de>
Mon, 12 May 2025 09:27:35 +0000 (11:27 +0200)
committerPaolo Abeni <pabeni@redhat.com>
Thu, 15 May 2025 13:23:31 +0000 (15:23 +0200)
rds_page_remainder_alloc() obtains the current CPU with get_cpu() while
disabling preemption. Then the CPU number is used to access the per-CPU
data structure via per_cpu().

This can be optimized by relying on local_bh_disable() to provide a
stable CPU number/ avoid migration and then using this_cpu_ptr() to
retrieve the data structure.

Cc: Allison Henderson <allison.henderson@oracle.com>
Cc: linux-rdma@vger.kernel.org
Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
Link: https://patch.msgid.link/20250512092736.229935-15-bigeasy@linutronix.de
Signed-off-by: Paolo Abeni <pabeni@redhat.com>
net/rds/page.c

index e0dd4f62ea47a411341420220abf4847bac8cbbe..58a8548a915a9aa9d07c4b20ce9c82044ed5f380 100644 (file)
@@ -86,8 +86,8 @@ int rds_page_remainder_alloc(struct scatterlist *scat, unsigned long bytes,
                goto out;
        }
 
-       rem = &per_cpu(rds_page_remainders, get_cpu());
        local_bh_disable();
+       rem = this_cpu_ptr(&rds_page_remainders);
 
        while (1) {
                /* avoid a tiny region getting stuck by tossing it */
@@ -116,12 +116,11 @@ int rds_page_remainder_alloc(struct scatterlist *scat, unsigned long bytes,
 
                /* alloc if there is nothing for us to use */
                local_bh_enable();
-               put_cpu();
 
                page = alloc_page(gfp);
 
-               rem = &per_cpu(rds_page_remainders, get_cpu());
                local_bh_disable();
+               rem = this_cpu_ptr(&rds_page_remainders);
 
                if (!page) {
                        ret = -ENOMEM;
@@ -140,7 +139,6 @@ int rds_page_remainder_alloc(struct scatterlist *scat, unsigned long bytes,
        }
 
        local_bh_enable();
-       put_cpu();
 out:
        rdsdebug("bytes %lu ret %d %p %u %u\n", bytes, ret,
                 ret ? NULL : sg_page(scat), ret ? 0 : scat->offset,