]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
rds: Disable only bottom halves in rds_page_remainder_alloc()
authorSebastian Andrzej Siewior <bigeasy@linutronix.de>
Mon, 12 May 2025 09:27:34 +0000 (11:27 +0200)
committerPaolo Abeni <pabeni@redhat.com>
Thu, 15 May 2025 13:23:31 +0000 (15:23 +0200)
rds_page_remainder_alloc() is invoked from a preemptible context or a
tasklet. There is no need to disable interrupts for locking.

Use local_bh_disable() instead of local_irq_save() for locking.

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-14-bigeasy@linutronix.de
Signed-off-by: Paolo Abeni <pabeni@redhat.com>
net/rds/page.c

index 7cc57e098ddb98e23bade37f2792e6c198c4ad5b..e0dd4f62ea47a411341420220abf4847bac8cbbe 100644 (file)
@@ -69,7 +69,6 @@ int rds_page_remainder_alloc(struct scatterlist *scat, unsigned long bytes,
                             gfp_t gfp)
 {
        struct rds_page_remainder *rem;
-       unsigned long flags;
        struct page *page;
        int ret;
 
@@ -88,7 +87,7 @@ int rds_page_remainder_alloc(struct scatterlist *scat, unsigned long bytes,
        }
 
        rem = &per_cpu(rds_page_remainders, get_cpu());
-       local_irq_save(flags);
+       local_bh_disable();
 
        while (1) {
                /* avoid a tiny region getting stuck by tossing it */
@@ -116,13 +115,13 @@ int rds_page_remainder_alloc(struct scatterlist *scat, unsigned long bytes,
                }
 
                /* alloc if there is nothing for us to use */
-               local_irq_restore(flags);
+               local_bh_enable();
                put_cpu();
 
                page = alloc_page(gfp);
 
                rem = &per_cpu(rds_page_remainders, get_cpu());
-               local_irq_save(flags);
+               local_bh_disable();
 
                if (!page) {
                        ret = -ENOMEM;
@@ -140,7 +139,7 @@ int rds_page_remainder_alloc(struct scatterlist *scat, unsigned long bytes,
                rem->r_offset = 0;
        }
 
-       local_irq_restore(flags);
+       local_bh_enable();
        put_cpu();
 out:
        rdsdebug("bytes %lu ret %d %p %u %u\n", bytes, ret,