[PATCH 1/1] dibs: Re-apply lost patch
From: Steffen Jaeckel <hidden>
Date: 2026-01-27 16:16:23
Also in:
linux-s390, lkml
Subsystem:
dibs (direct internal buffer sharing), the rest · Maintainers:
Alexandra Winter, Linus Torvalds
While merging the dibs layer, Matt [1] noticed that the changes which were done in [2] conflicted and were missing. He subsequently fixed this in the merge commit of his own tree, but the changes never made it upstream. This commit re-introduces the changes. [1] https://lore.kernel.org/netdev/74368a5c-48ac-4f8e-a198-40ec1ed3cf5f@kernel.org/ (local) [2] a35c04de2565d ("net/smc: fix warning in smc_rx_splice() when calling get_page()") Fixes: cc21191b584c ("dibs: Move data path to dibs layer") Signed-off-by: Steffen Jaeckel <redacted> --- drivers/dibs/dibs_loopback.c | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-)
diff --git a/drivers/dibs/dibs_loopback.c b/drivers/dibs/dibs_loopback.c
index b3fd0f8100d4..aa029e29c6b2 100644
--- a/drivers/dibs/dibs_loopback.c
+++ b/drivers/dibs/dibs_loopback.c@@ -12,6 +12,7 @@ #include <linux/bitops.h> #include <linux/device.h> #include <linux/dibs.h> +#include <linux/mm.h> #include <linux/slab.h> #include <linux/spinlock.h> #include <linux/types.h>
@@ -49,6 +50,7 @@ static int dibs_lo_register_dmb(struct dibs_dev *dibs, struct dibs_dmb *dmb, { struct dibs_lo_dmb_node *dmb_node, *tmp_node; struct dibs_lo_dev *ldev; + struct folio *folio; unsigned long flags; int sba_idx, rc;
@@ -70,13 +72,16 @@ static int dibs_lo_register_dmb(struct dibs_dev *dibs, struct dibs_dmb *dmb, dmb_node->sba_idx = sba_idx; dmb_node->len = dmb->dmb_len; - dmb_node->cpu_addr = kzalloc(dmb_node->len, GFP_KERNEL | - __GFP_NOWARN | __GFP_NORETRY | - __GFP_NOMEMALLOC); - if (!dmb_node->cpu_addr) { + + /* not critical; fail under memory pressure and fallback to TCP */ + folio = folio_alloc(GFP_KERNEL | __GFP_NOWARN | __GFP_NOMEMALLOC | + __GFP_NORETRY | __GFP_ZERO, + get_order(dmb_node->len)); + if (!folio) { rc = -ENOMEM; goto err_node; } + dmb_node->cpu_addr = folio_address(folio); dmb_node->dma_addr = DIBS_DMA_ADDR_INVALID; refcount_set(&dmb_node->refcnt, 1);
@@ -122,7 +127,7 @@ static void __dibs_lo_unregister_dmb(struct dibs_lo_dev *ldev, write_unlock_bh(&ldev->dmb_ht_lock); clear_bit(dmb_node->sba_idx, ldev->sba_idx_mask); - kfree(dmb_node->cpu_addr); + folio_put(virt_to_folio(dmb_node->cpu_addr)); kfree(dmb_node); if (atomic_dec_and_test(&ldev->dmb_cnt))
--
2.52.0