* [PATCH net v5 0/3] net/smc: fix out-of-bounds and use-after-free in SMC-Rv2 LLC processing
@ 2026-08-01 9:42 Yehyeong Lee
2026-08-01 9:42 ` [PATCH net v5 1/3] net/smc: fix use-after-free of the LLC qentry in smc_llc_srv_add_link() Yehyeong Lee
` (2 more replies)
0 siblings, 3 replies; 10+ messages in thread
From: Yehyeong Lee @ 2026-08-01 9:42 UTC (permalink / raw)
To: alibuda, dust.li, sidraya, wenjia, kuba, davem, edumazet, pabeni
Cc: horms, mjambigi, tonylu, guwen, guangguan.wang, kees, gustavoars,
netdev, linux-rdma, linux-s390, linux-hardening, linux-kernel,
Yehyeong Lee
Split of the single v3 patch, in the order Jakub asked for:
1/3 frees the LLC queue entry in smc_llc_srv_add_link() only after the
last use of the pointer into it.
2/3 bounds the peer-declared rkey counts in smc_llc_save_add_link_rkeys()
and smc_llc_rmt_delete_rkey() by the buffer they read from.
3/3 copies an oversized SMC-Rv2 LLC message into the queue entry and
declares the rkeys that fit inline, so both consumers stop
reconstructing the layout themselves.
1/3 and 2/3 are tagged for stable. 3/3 is not: it does not fix a crash on
its own, and it changes a structure layout and a static function signature.
v5 touches 2/3 only, and only its comment and changelog: they gave
the wrong reason for skipping the extension. No functional change.
---
v4: https://lore.kernel.org/all/20260731070509.1818665-1-yhlee@isslab.korea.ac.kr/
v3: https://lore.kernel.org/all/20260727095833.1079618-1-yhlee@isslab.korea.ac.kr/
Yehyeong Lee (3):
net/smc: fix use-after-free of the LLC qentry in
smc_llc_srv_add_link()
net/smc: bound the peer rkey counts in SMC-Rv2 LLC messages
net/smc: carry oversized SMC-Rv2 LLC messages in the queue entry
net/smc/smc_llc.c | 101 ++++++++++++++++++++++++++++++++++------------
1 file changed, 76 insertions(+), 25 deletions(-)
--
2.43.0
^ permalink raw reply [flat|nested] 10+ messages in thread* [PATCH net v5 1/3] net/smc: fix use-after-free of the LLC qentry in smc_llc_srv_add_link() 2026-08-01 9:42 [PATCH net v5 0/3] net/smc: fix out-of-bounds and use-after-free in SMC-Rv2 LLC processing Yehyeong Lee @ 2026-08-01 9:42 ` Yehyeong Lee 2026-08-02 9:42 ` sashiko-bot 2026-08-05 13:57 ` Breno Leitao 2026-08-01 9:42 ` [PATCH net v5 2/3] net/smc: bound the peer rkey counts in SMC-Rv2 LLC messages Yehyeong Lee 2026-08-01 9:42 ` [PATCH net v5 3/3] net/smc: carry oversized SMC-Rv2 LLC messages in the queue entry Yehyeong Lee 2 siblings, 2 replies; 10+ messages in thread From: Yehyeong Lee @ 2026-08-01 9:42 UTC (permalink / raw) To: alibuda, dust.li, sidraya, wenjia, kuba, davem, edumazet, pabeni Cc: horms, mjambigi, tonylu, guwen, guangguan.wang, kees, gustavoars, netdev, linux-rdma, linux-s390, linux-hardening, linux-kernel, Yehyeong Lee, stable smc_llc_srv_add_link() keeps add_llc pointing into the queue entry: add_llc = &qentry->msg.add_link; smc_llc.c:1482 ... smc_llc_save_add_link_info(link_new, add_llc); smc_llc.c:1494 smc_llc_flow_qentry_del(&lgr->llc_flow_lcl); smc_llc.c:1495 ... u8 *llc_msg = smc_link_shared_v2_rxbuf(link) ? (u8 *)lgr->wr_rx_buf_v2 : (u8 *)add_llc; smc_llc.c:1504 smc_llc_save_add_link_rkeys(link, link_new, llc_msg); smc_llc.c:1506 smc_llc_flow_qentry_del() kfree()s the entry, so on a link without a shared v2 receive buffer the pointer handed to smc_llc_save_add_link_rkeys() is already freed. Before the Fixes: commit that branch always used lgr->wr_rx_buf_v2 and add_llc was not used after the free. Detach the entry instead of freeing it there, and free it explicitly on both exit paths. The reject path has to detach as well, otherwise it would be freed twice. Fixes: 27ef6a9981fe ("net/smc: support SMC-R V2 for rdma devices with max_recv_sge equals to 1") Cc: stable@vger.kernel.org Signed-off-by: Yehyeong Lee <yhlee@isslab.korea.ac.kr> --- Reproduced on an unpatched tree over rxe, with KASAN, kasan_multi_shot and a link forced to max_recv_sge == 1: the entry is freed and read by the same call, and the freeing frame is smc_llc_srv_add_link() itself. BUG: KASAN: slab-use-after-free in smc_llc_save_add_link_rkeys+0x333/0x350 Read of size 2 at addr ffff8880052194de by task kworker/0:1/11 Workqueue: smc_hs_wq smc_listen_work smc_llc_save_add_link_rkeys+0x333/0x350 smc_llc_srv_add_link+0xaa2/0x1e50 smc_listen_work+0x489e/0x4d00 Allocated by task 48: smc_llc_enqueue+0x72/0x560 smc_wr_rx_tasklet_fn+0x474/0xa80 Freed by task 11: kfree+0x121/0x380 smc_llc_srv_add_link+0x9a8/0x1e50 smc_listen_work+0x489e/0x4d00 The buggy address is located 94 bytes inside of freed 96-byte region [ffff888005219480, ffff8880052194e0) The offset is past the 72-byte queue entry because the out-of-bounds read fixed by the next patch is on the same line; what this patch removes is the free at smc_llc_srv_add_link+0x9a8 happening before the read at +0xaa2. net/smc/smc_llc.c | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/net/smc/smc_llc.c b/net/smc/smc_llc.c index 954b2ff1815c..90746cd1e29a 100644 --- a/net/smc/smc_llc.c +++ b/net/smc/smc_llc.c @@ -1481,7 +1481,7 @@ int smc_llc_srv_add_link(struct smc_link *link, } add_llc = &qentry->msg.add_link; if (add_llc->hd.flags & SMC_LLC_FLAG_ADD_LNK_REJ) { - smc_llc_flow_qentry_del(&lgr->llc_flow_lcl); + smc_llc_flow_qentry_clr(&lgr->llc_flow_lcl); rc = -ENOLINK; goto out_err; } @@ -1492,7 +1492,8 @@ int smc_llc_srv_add_link(struct smc_link *link, lgr_new_t = SMC_LGR_ASYMMETRIC_PEER; } smc_llc_save_add_link_info(link_new, add_llc); - smc_llc_flow_qentry_del(&lgr->llc_flow_lcl); + /* add_llc still points into qentry, so only detach it here */ + smc_llc_flow_qentry_clr(&lgr->llc_flow_lcl); rc = smc_ib_ready_link(link_new); if (rc) @@ -1512,6 +1513,7 @@ int smc_llc_srv_add_link(struct smc_link *link, rc = smc_llc_srv_conf_link(link, link_new, lgr_new_t); if (rc) goto out_err; + kfree(qentry); kfree(ini); return 0; out_err: @@ -1520,6 +1522,7 @@ int smc_llc_srv_add_link(struct smc_link *link, smcr_link_clear(link_new, false); } out: + kfree(qentry); kfree(ini); if (send_req_add_link_resp) smc_llc_send_req_add_link_response(req_qentry); -- 2.43.0 ^ permalink raw reply related [flat|nested] 10+ messages in thread
* Re: [PATCH net v5 1/3] net/smc: fix use-after-free of the LLC qentry in smc_llc_srv_add_link() 2026-08-01 9:42 ` [PATCH net v5 1/3] net/smc: fix use-after-free of the LLC qentry in smc_llc_srv_add_link() Yehyeong Lee @ 2026-08-02 9:42 ` sashiko-bot 2026-08-05 13:57 ` Breno Leitao 1 sibling, 0 replies; 10+ messages in thread From: sashiko-bot @ 2026-08-02 9:42 UTC (permalink / raw) To: Yehyeong Lee; +Cc: linux-s390, Alexander Gordeev, Heiko Carstens, Vasily Gorbik Thank you for your contribution! Sashiko AI review found 2 potential issue(s) to consider: Pre-existing issues: - [High] Out-of-bounds read of `qentry` in `smc_llc_save_add_link_rkeys` - [High] Data race on `flow->qentry` leading to memory leak -- --- Patch [1]: [PATCH net v5 1/3] net/smc: fix use-after-free of the LLC qentry in smc_llc_srv_add_link() --- commit c4dc330595782777736f487939ffd4cc82b7c859 Author: Yehyeong Lee <yhlee@isslab.korea.ac.kr> net/smc: fix use-after-free of the LLC qentry in smc_llc_srv_add_link() This patch resolves a use-after-free vulnerability by changing the code to detach the LLC queue entry instead of freeing it early. It explicitly frees the entry on all exit paths to ensure safe memory handling. > diff --git a/net/smc/smc_llc.c b/net/smc/smc_llc.c > index aa6d83af55eda..36c254f257350 100644 > --- a/net/smc/smc_llc.c > +++ b/net/smc/smc_llc.c > @@ -1481,7 +1481,7 @@ int smc_llc_srv_add_link(struct smc_link *link, > } > add_llc = &qentry->msg.add_link; > if (add_llc->hd.flags & SMC_LLC_FLAG_ADD_LNK_REJ) { > - smc_llc_flow_qentry_del(&lgr->llc_flow_lcl); > + smc_llc_flow_qentry_clr(&lgr->llc_flow_lcl); [Severity: High] This is a pre-existing issue, but does calling smc_llc_flow_qentry_clr() here without holding llc_flow_lock create a data race that can leak memory? If a remote peer sends an unexpected or duplicate LLC response, smc_llc_rx_response() running in softirq context could assign a newly allocated qentry: net/smc/smc_llc.c:smc_llc_rx_response() { ... smc_llc_flow_qentry_set(&link->lgr->llc_flow_lcl, qentry); ... } Concurrently, the process context calls smc_llc_flow_qentry_clr(), which clears the pointer without holding the lock: net/smc/smc_llc.c:smc_llc_flow_qentry_clr() { ... flow->qentry = NULL; ... } Could this allow the softirq to assign a new qentry right after the process context clears it? If so, when process context later calls smc_llc_flow_stop() and overwrites the flow state via memset(flow, 0, sizeof(*flow)), wouldn't that leak the newly allocated 72-byte qentry object? > rc = -ENOLINK; > goto out_err; > } [ ... ] > @@ -1512,6 +1513,7 @@ int smc_llc_srv_add_link(struct smc_link *link, > rc = smc_llc_srv_conf_link(link, link_new, lgr_new_t); > if (rc) > goto out_err; > + kfree(qentry); [Severity: High] This isn't a bug introduced by this patch, but does the processing of this qentry allocation cause an out-of-bounds read? When an SMC V2 ADD LINK message is received and the link does not have a shared v2 receive buffer, the pointer passed to smc_llc_save_add_link_rkeys() points into the 72-byte qentry slab allocation. Inside smc_llc_save_add_link_rkeys(), does this result in dereferencing memory past the allocation? net/smc/smc_llc.c:smc_llc_save_add_link_rkeys() { ... ext = (struct smc_llc_msg_add_link_v2_ext *)(llc_msg + SMC_WR_TX_SIZE); max = min_t(u8, ext->num_rkeys, SMC_LLC_RKEYS_PER_MSG_V2); ... } Since ext->num_rkeys is read from an offset past the end of the slab object, could this allow a remote attacker to manipulate the kernel into accepting random slab data or adjacent heap data as RDMA tokens? > kfree(ini); > return 0; > out_err: -- Sashiko AI review · https://sashiko.dev/#/patchset/20260801094208.1937951-1-yhlee@isslab.korea.ac.kr?part=1 ^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [PATCH net v5 1/3] net/smc: fix use-after-free of the LLC qentry in smc_llc_srv_add_link() 2026-08-01 9:42 ` [PATCH net v5 1/3] net/smc: fix use-after-free of the LLC qentry in smc_llc_srv_add_link() Yehyeong Lee 2026-08-02 9:42 ` sashiko-bot @ 2026-08-05 13:57 ` Breno Leitao 1 sibling, 0 replies; 10+ messages in thread From: Breno Leitao @ 2026-08-05 13:57 UTC (permalink / raw) To: Yehyeong Lee Cc: alibuda, dust.li, sidraya, wenjia, kuba, davem, edumazet, pabeni, horms, mjambigi, tonylu, guwen, guangguan.wang, kees, gustavoars, netdev, linux-rdma, linux-s390, linux-hardening, linux-kernel, stable On Sat, Aug 01, 2026 at 06:42:06PM +0900, Yehyeong Lee wrote: > @@ -1512,6 +1513,7 @@ int smc_llc_srv_add_link(struct smc_link *link, > rc = smc_llc_srv_conf_link(link, link_new, lgr_new_t); > if (rc) > goto out_err; > + kfree(qentry); > kfree(ini); Instead of these two kfree, can you just 'goto out' ? out: seems to do the free nows, and rc is 0 above. Also, is send_req_add_link_resp always false in smc_llc_srv_add_link() ? ^ permalink raw reply [flat|nested] 10+ messages in thread
* [PATCH net v5 2/3] net/smc: bound the peer rkey counts in SMC-Rv2 LLC messages 2026-08-01 9:42 [PATCH net v5 0/3] net/smc: fix out-of-bounds and use-after-free in SMC-Rv2 LLC processing Yehyeong Lee 2026-08-01 9:42 ` [PATCH net v5 1/3] net/smc: fix use-after-free of the LLC qentry in smc_llc_srv_add_link() Yehyeong Lee @ 2026-08-01 9:42 ` Yehyeong Lee 2026-08-02 9:42 ` sashiko-bot 2026-08-03 3:41 ` Yehyeong Lee 2026-08-01 9:42 ` [PATCH net v5 3/3] net/smc: carry oversized SMC-Rv2 LLC messages in the queue entry Yehyeong Lee 2 siblings, 2 replies; 10+ messages in thread From: Yehyeong Lee @ 2026-08-01 9:42 UTC (permalink / raw) To: alibuda, dust.li, sidraya, wenjia, kuba, davem, edumazet, pabeni Cc: horms, mjambigi, tonylu, guwen, guangguan.wang, kees, gustavoars, netdev, linux-rdma, linux-s390, linux-hardening, linux-kernel, Yehyeong Lee, stable On a link whose device has max_recv_sge == 1 there is no shared v2 receive buffer, and smc_llc_save_add_link_rkeys() takes the v2 extension from 44 bytes past the start of the queue entry's inline message: ext = (struct smc_llc_msg_add_link_v2_ext *)(llc_msg + SMC_WR_TX_SIZE); The entry is a 72-byte allocation and the extension starts at offset 68, so ext->num_rkeys at offset 94 is already past it. This happens on every SMC-Rv2 link addition, whatever the peer sends: BUG: KASAN: slab-out-of-bounds in smc_llc_save_add_link_rkeys+0x333/0x350 Read of size 2 at addr ffff8880056406de by task smctest/106 Call Trace: smc_llc_save_add_link_rkeys+0x333/0x350 smc_llc_cli_add_link+0xca7/0x1e80 __smc_connect+0x3f5c/0x4980 smc_connect+0x42c/0x580 __sys_connect+0xfc/0x130 Allocated by task 44: smc_llc_enqueue+0x72/0x560 smc_wr_rx_tasklet_fn+0x474/0xa80 The buggy address is located 22 bytes to the right of allocated 72-byte region [ffff888005640680, ffff8880056406c8) Whatever that read finds then bounds the ext->rt[] loop, so a peer that declares 255 rkeys reads much further. smc_llc_rmt_delete_rkey() has the same shape for llcv2->rkey[]. Bound both loops by the buffer they read from, and skip the extension altogether when there is no shared v2 receive buffer. The extension does arrive on the link, but smc_llc_enqueue() copies only sizeof(union smc_llc_msg) into the queue entry, so what that code read past the 44 inline bytes was heap and not peer data. Fixes: 27ef6a9981fe ("net/smc: support SMC-R V2 for rdma devices with max_recv_sge equals to 1") Cc: stable@vger.kernel.org Signed-off-by: Yehyeong Lee <yhlee@isslab.korea.ac.kr> --- v4 -> v5: corrected the reason given for skipping the extension. It does arrive on the link; what is not there is the copy in the queue entry. No functional change. Measured over rxe with KASAN and max_recv_sge forced to 1, five test cells (plain 1-rkey delete, delete declaring 255, plain ADD_LINK v2, ADD_LINK declaring 255, and an SMC-Rv1 link group). Without this patch four of the five report; with it none do. With kasan_multi_shot the unpatched kernel reports 491 times in a single ADD_LINK run, the patched one not at all. net/smc/smc_llc.c | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/net/smc/smc_llc.c b/net/smc/smc_llc.c index 90746cd1e29a..02561f39d6d8 100644 --- a/net/smc/smc_llc.c +++ b/net/smc/smc_llc.c @@ -1000,13 +1000,21 @@ static void smc_llc_save_add_link_rkeys(struct smc_link *link, struct smc_link *link_new, u8 *llc_msg) { + const u32 rt_off = offsetof(struct smc_llc_msg_add_link_v2_ext, rt); struct smc_llc_msg_add_link_v2_ext *ext; struct smc_link_group *lgr = link->lgr; int max, i; + /* Without a shared v2 receive buffer the extension is not copied + * into the queue entry, so not even ext->num_rkeys is there. + */ + if (!smc_link_shared_v2_rxbuf(link)) + return; ext = (struct smc_llc_msg_add_link_v2_ext *)(llc_msg + SMC_WR_TX_SIZE); max = min_t(u8, ext->num_rkeys, SMC_LLC_RKEYS_PER_MSG_V2); + max = min_t(u32, max, (SMC_WR_BUF_V2_SIZE - SMC_WR_TX_SIZE - rt_off) / + sizeof(ext->rt[0])); down_write(&lgr->rmbs_lock); for (i = 0; i < max; i++) { smc_rtoken_set(lgr, link->link_idx, link_new->link_idx, @@ -1813,17 +1821,25 @@ static void smc_llc_rmt_delete_rkey(struct smc_link_group *lgr) link = qentry->link; if (lgr->smc_version == SMC_V2) { + const u32 rkey_off = + offsetof(struct smc_llc_msg_delete_rkey_v2, rkey); struct smc_llc_msg_delete_rkey_v2 *llcv2; + u32 buf_len; if (smc_link_shared_v2_rxbuf(link)) { memcpy(lgr->wr_rx_buf_v2, llc, sizeof(*llc)); llcv2 = (struct smc_llc_msg_delete_rkey_v2 *)lgr->wr_rx_buf_v2; + buf_len = SMC_WR_BUF_V2_SIZE; } else { llcv2 = (struct smc_llc_msg_delete_rkey_v2 *)llc; + buf_len = sizeof(qentry->msg); } llcv2->num_inval_rkeys = 0; max = min_t(u8, llcv2->num_rkeys, SMC_LLC_RKEYS_PER_MSG_V2); + /* bound by the buffer llcv2 points at */ + max = min_t(u32, max, (buf_len - rkey_off) / + sizeof(llcv2->rkey[0])); for (i = 0; i < max; i++) { if (smc_rtoken_delete(link, llcv2->rkey[i])) llcv2->num_inval_rkeys++; -- 2.43.0 ^ permalink raw reply related [flat|nested] 10+ messages in thread
* Re: [PATCH net v5 2/3] net/smc: bound the peer rkey counts in SMC-Rv2 LLC messages 2026-08-01 9:42 ` [PATCH net v5 2/3] net/smc: bound the peer rkey counts in SMC-Rv2 LLC messages Yehyeong Lee @ 2026-08-02 9:42 ` sashiko-bot 2026-08-03 3:41 ` Yehyeong Lee 1 sibling, 0 replies; 10+ messages in thread From: sashiko-bot @ 2026-08-02 9:42 UTC (permalink / raw) To: Yehyeong Lee; +Cc: Vasily Gorbik, Alexander Gordeev, linux-s390, Heiko Carstens Thank you for your contribution! Sashiko AI review found 3 potential issue(s) to consider: New issues: - [High] Processing of stale memory due to incorrect bounds checking based on maximum buffer capacity. Pre-existing issues: - [Critical] Hardware DMA race condition overwrites shared receive spillover buffers. - [High] Data race corrupting rtokens due to missing rmbs_lock in remote flow handlers. -- --- Patch [2]: [PATCH net v5 2/3] net/smc: bound the peer rkey counts in SMC-Rv2 LLC messages --- commit b119f15f6831509347ac2042d2fc186b18c74eae Author: Yehyeong Lee <yhlee@isslab.korea.ac.kr> net/smc: bound the peer rkey counts in SMC-Rv2 LLC messages On a link whose device has max_recv_sge == 1 there is no shared v2 receive buffer, and smc_llc_save_add_link_rkeys() takes the v2 extension from 44 bytes past the start of the queue entry's inline message. [ ... ] > diff --git a/net/smc/smc_llc.c b/net/smc/smc_llc.c > index 36c254f257350..c9bf938f1ee2a 100644 > --- a/net/smc/smc_llc.c > +++ b/net/smc/smc_llc.c > @@ -1000,13 +1000,21 @@ static void smc_llc_save_add_link_rkeys(struct smc_link *link, > struct smc_link *link_new, > u8 *llc_msg) > { > + const u32 rt_off = offsetof(struct smc_llc_msg_add_link_v2_ext, rt); > struct smc_llc_msg_add_link_v2_ext *ext; > struct smc_link_group *lgr = link->lgr; > int max, i; > > + /* Without a shared v2 receive buffer the extension is not copied > + * into the queue entry, so not even ext->num_rkeys is there. > + */ > + if (!smc_link_shared_v2_rxbuf(link)) > + return; > ext = (struct smc_llc_msg_add_link_v2_ext *)(llc_msg + > SMC_WR_TX_SIZE); [Severity: Critical] This is a pre-existing issue, but does reading from this shared spillover buffer expose us to a hardware DMA race condition? All receive work requests are initialized with their second SGE pointing to the exact same shared physical memory address: net/smc/smc_wr.c:smc_wr_init_sge() { ... lnk->wr_rx_sges[x + 1].addr = lnk->wr_rx_v2_dma_addr + SMC_WR_TX_SIZE; ... } Because hardware DMA operates independently of the CPU, if two packets larger than 44 bytes arrive back-to-back, won't the network card silently overwrite the first packet's spillover data with the second packet's spillover data? When the deferred workqueue finally reads the first packet's extension from lgr->wr_rx_buf_v2 here in smc_llc_save_add_link_rkeys(), it seems it could read corrupted or overwritten data from the second packet, allowing a remote peer to induce cross-message fragment mixing. > max = min_t(u8, ext->num_rkeys, SMC_LLC_RKEYS_PER_MSG_V2); > + max = min_t(u32, max, (SMC_WR_BUF_V2_SIZE - SMC_WR_TX_SIZE - rt_off) / > + sizeof(ext->rt[0])); [Severity: High] Does this bounds check allow processing of stale memory? The bounds check uses the maximum buffer capacity (SMC_WR_BUF_V2_SIZE) rather than the actual message length received by the hardware. Because the shared spillover buffer lgr->wr_rx_buf_v2 is not zeroed between receives, could a remote attacker send a short packet with a maliciously large num_rkeys value? If so, the bounds check would allow the loop to run past the end of the newly received data, reading and processing stale memory contents left over from previous messages as valid rkeys. > down_write(&lgr->rmbs_lock); > for (i = 0; i < max; i++) { > smc_rtoken_set(lgr, link->link_idx, link_new->link_idx, [ ... ] > @@ -1813,17 +1821,25 @@ static void smc_llc_rmt_delete_rkey(struct smc_link_group *lgr) > link = qentry->link; > > if (lgr->smc_version == SMC_V2) { > + const u32 rkey_off = > + offsetof(struct smc_llc_msg_delete_rkey_v2, rkey); > struct smc_llc_msg_delete_rkey_v2 *llcv2; > + u32 buf_len; > > if (smc_link_shared_v2_rxbuf(link)) { > memcpy(lgr->wr_rx_buf_v2, llc, sizeof(*llc)); > llcv2 = (struct smc_llc_msg_delete_rkey_v2 *)lgr->wr_rx_buf_v2; > + buf_len = SMC_WR_BUF_V2_SIZE; > } else { > llcv2 = (struct smc_llc_msg_delete_rkey_v2 *)llc; > + buf_len = sizeof(qentry->msg); > } > llcv2->num_inval_rkeys = 0; > > max = min_t(u8, llcv2->num_rkeys, SMC_LLC_RKEYS_PER_MSG_V2); > + /* bound by the buffer llcv2 points at */ > + max = min_t(u32, max, (buf_len - rkey_off) / > + sizeof(llcv2->rkey[0])); [Severity: High] Is it safe to bound this by buf_len instead of the actual received length? Similar to smc_llc_save_add_link_rkeys(), this uses the maximum capacity (SMC_WR_BUF_V2_SIZE or sizeof(qentry->msg)) rather than the actual message length. A short packet with a large num_rkeys could cause this loop to process stale data left in the buffer from previous messages. > for (i = 0; i < max; i++) { > if (smc_rtoken_delete(link, llcv2->rkey[i])) [Severity: High] This is a pre-existing issue, but is there a data race here that could corrupt rtokens? The remote flow handlers like smc_llc_rmt_delete_rkey() execute in the context of smc_llc_event_work. They call smc_rtoken_delete() and smc_rtoken_add(), modifying the shared lgr->rtokens array and rtokens_used_mask without acquiring down_write(&lgr->rmbs_lock). Because local flow handlers (like smc_llc_add_link_work) can run concurrently on another CPU and do take rmbs_lock to modify the same structures, won't this result in a data race that can corrupt the token arrays and mask? > llcv2->num_inval_rkeys++; -- Sashiko AI review · https://sashiko.dev/#/patchset/20260801094208.1937951-1-yhlee@isslab.korea.ac.kr?part=2 ^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [PATCH net v5 2/3] net/smc: bound the peer rkey counts in SMC-Rv2 LLC messages 2026-08-01 9:42 ` [PATCH net v5 2/3] net/smc: bound the peer rkey counts in SMC-Rv2 LLC messages Yehyeong Lee 2026-08-02 9:42 ` sashiko-bot @ 2026-08-03 3:41 ` Yehyeong Lee 1 sibling, 0 replies; 10+ messages in thread From: Yehyeong Lee @ 2026-08-03 3:41 UTC (permalink / raw) To: alibuda, dust.li, sidraya, wenjia, kuba, davem, edumazet, pabeni Cc: horms, mjambigi, tonylu, guwen, guangguan.wang, kees, gustavoars, sashiko-reviews, netdev, linux-rdma, linux-s390, linux-hardening, linux-kernel, Yehyeong Lee > Does this bounds check allow processing of stale memory? It does, and 3/3 of this series stops it. This patch bounds by the size of the buffer the message landed in; 3/3 copies the tail of the message into the queue entry and bounds by its length instead. The bound in this patch never fires on a link with a shared v2 receive buffer. It works out at 507 rkeys for ADD_LINK and 2046 for DELETE_RKEY, and the min_t() above it has already capped both at 255. I measured a 44-byte DELETE_RKEY_V2 declaring 255 rkeys: mainline and this patch draw the same response, and in two of the four exchanges an rkey read past the message was live and was deleted. With 3/3 applied the response reports 9. It does fire on a link without that buffer, where it becomes 9. That is the out-of-bounds read this patch fixes, and why it carries Cc: stable while 3/3 does not. Best regards, Yehyeong Lee ^ permalink raw reply [flat|nested] 10+ messages in thread
* [PATCH net v5 3/3] net/smc: carry oversized SMC-Rv2 LLC messages in the queue entry 2026-08-01 9:42 [PATCH net v5 0/3] net/smc: fix out-of-bounds and use-after-free in SMC-Rv2 LLC processing Yehyeong Lee 2026-08-01 9:42 ` [PATCH net v5 1/3] net/smc: fix use-after-free of the LLC qentry in smc_llc_srv_add_link() Yehyeong Lee 2026-08-01 9:42 ` [PATCH net v5 2/3] net/smc: bound the peer rkey counts in SMC-Rv2 LLC messages Yehyeong Lee @ 2026-08-01 9:42 ` Yehyeong Lee 2026-08-02 9:42 ` sashiko-bot 2026-08-05 12:13 ` Simon Horman 2 siblings, 2 replies; 10+ messages in thread From: Yehyeong Lee @ 2026-08-01 9:42 UTC (permalink / raw) To: alibuda, dust.li, sidraya, wenjia, kuba, davem, edumazet, pabeni Cc: horms, mjambigi, tonylu, guwen, guangguan.wang, kees, gustavoars, netdev, linux-rdma, linux-s390, linux-hardening, linux-kernel, Yehyeong Lee An LLC message longer than the 44-byte union smc_llc_msg arrives either whole in the receive buffer or split into the link group's shared v2 buffer, and both consumers of the tail rebuild that layout themselves. Copy the tail into the queue entry instead, so its length and its lifetime are those of the message that arrived, and declare the rkeys that do fit inline as a member of the union rather than reaching them through a cast of a shorter type. The bound the previous patch placed on links without a shared v2 receive buffer is no longer needed here: the extension is read from the qentry, whose length is the length of the message that arrived. A DELETE_RKEY_V2 is now bounded by what arrived rather than by the buffer it landed in: a 44-byte message declaring 255 rkeys processed 255 of them before, and processes the 9 that fit now. Suggested-by: D. Wythe <alibuda@linux.alibaba.com> Signed-off-by: Yehyeong Lee <yhlee@isslab.korea.ac.kr> --- Measured over rxe with KASAN: a DELETE_RKEY_V2 carrying 12 rkeys over a link with a shared v2 receive buffer round-trips all 12 values, the last three coming from the copied tail; 8, 9 and 10 rkeys and a 44-byte message declaring 10 give 8, 9, 10 and 9 processed rkeys respectively. kmemleak reports nothing over the link-addition path, and does report the queue entry when the free added by patch 1 is removed again. net/smc/smc_llc.c | 106 ++++++++++++++++++++++++++++++---------------- 1 file changed, 69 insertions(+), 37 deletions(-) diff --git a/net/smc/smc_llc.c b/net/smc/smc_llc.c index 02561f39d6d8..1b153173dd51 100644 --- a/net/smc/smc_llc.c +++ b/net/smc/smc_llc.c @@ -157,6 +157,7 @@ struct smc_llc_msg_confirm_rkey { /* type 0x06 */ }; #define SMC_LLC_DEL_RKEY_MAX 8 +#define SMC_LLC_DEL_RKEY_V2_INLINE 9 #define SMC_LLC_FLAG_RKEY_RETRY 0x10 #define SMC_LLC_FLAG_RKEY_NEG 0x20 @@ -177,6 +178,15 @@ struct smc_llc_msg_delete_rkey_v2 { /* type 0x29 */ __be32 rkey[]; }; +/* the leading rkeys of a DELETE_RKEY_V2 fit into union smc_llc_msg */ +struct smc_llc_msg_delete_rkey_v2_inline { /* type 0x29 */ + struct smc_llc_hdr hd; + u8 num_rkeys; + u8 num_inval_rkeys; + u8 reserved[2]; + __be32 rkey[SMC_LLC_DEL_RKEY_V2_INLINE]; +}; + union smc_llc_msg { struct smc_llc_msg_confirm_link confirm_link; struct smc_llc_msg_add_link add_link; @@ -186,6 +196,7 @@ union smc_llc_msg { struct smc_llc_msg_confirm_rkey confirm_rkey; struct smc_llc_msg_delete_rkey delete_rkey; + struct smc_llc_msg_delete_rkey_v2_inline delete_rkey_v2; struct smc_llc_msg_test_link test_link; struct { @@ -194,15 +205,23 @@ union smc_llc_msg { } raw; }; +static_assert(SMC_LLC_DEL_RKEY_V2_INLINE == + (sizeof(union smc_llc_msg) - + offsetof(struct smc_llc_msg_delete_rkey_v2, rkey)) / + sizeof(__be32)); + #define SMC_LLC_FLAG_RESP 0x80 struct smc_llc_qentry { struct list_head list; struct smc_link *link; + u16 body_len; union smc_llc_msg msg; + u8 body[] __counted_by(body_len); }; -static void smc_llc_enqueue(struct smc_link *link, union smc_llc_msg *llc); +static void smc_llc_enqueue(struct smc_link *link, union smc_llc_msg *llc, + u32 byte_len); struct smc_llc_qentry *smc_llc_flow_qentry_clr(struct smc_llc_flow *flow) { @@ -998,22 +1017,19 @@ static int smc_llc_cli_conf_link(struct smc_link *link, static void smc_llc_save_add_link_rkeys(struct smc_link *link, struct smc_link *link_new, - u8 *llc_msg) + struct smc_llc_qentry *qentry) { const u32 rt_off = offsetof(struct smc_llc_msg_add_link_v2_ext, rt); struct smc_llc_msg_add_link_v2_ext *ext; struct smc_link_group *lgr = link->lgr; int max, i; - /* Without a shared v2 receive buffer the extension is not copied - * into the queue entry, so not even ext->num_rkeys is there. - */ - if (!smc_link_shared_v2_rxbuf(link)) + /* the rkey count itself is only there if enough bytes arrived */ + if (qentry->body_len < rt_off) return; - ext = (struct smc_llc_msg_add_link_v2_ext *)(llc_msg + - SMC_WR_TX_SIZE); + ext = (struct smc_llc_msg_add_link_v2_ext *)qentry->body; max = min_t(u8, ext->num_rkeys, SMC_LLC_RKEYS_PER_MSG_V2); - max = min_t(u32, max, (SMC_WR_BUF_V2_SIZE - SMC_WR_TX_SIZE - rt_off) / + max = min_t(u32, max, (qentry->body_len - rt_off) / sizeof(ext->rt[0])); down_write(&lgr->rmbs_lock); for (i = 0; i < max; i++) { @@ -1107,9 +1123,7 @@ int smc_llc_cli_add_link(struct smc_link *link, struct smc_llc_qentry *qentry) if (rc) goto out_clear_lnk; if (lgr->smc_version == SMC_V2) { - u8 *llc_msg = smc_link_shared_v2_rxbuf(link) ? - (u8 *)lgr->wr_rx_buf_v2 : (u8 *)llc; - smc_llc_save_add_link_rkeys(link, lnk_new, llc_msg); + smc_llc_save_add_link_rkeys(link, lnk_new, qentry); } else { rc = smc_llc_cli_rkey_exchange(link, lnk_new); if (rc) { @@ -1510,9 +1524,7 @@ int smc_llc_srv_add_link(struct smc_link *link, if (rc) goto out_err; if (lgr->smc_version == SMC_V2) { - u8 *llc_msg = smc_link_shared_v2_rxbuf(link) ? - (u8 *)lgr->wr_rx_buf_v2 : (u8 *)add_llc; - smc_llc_save_add_link_rkeys(link, link_new, llc_msg); + smc_llc_save_add_link_rkeys(link, link_new, qentry); } else { rc = smc_llc_srv_rkey_exchange(link, link_new); if (rc) @@ -1563,7 +1575,8 @@ void smc_llc_add_link_local(struct smc_link *link) add_llc.hd.common.llc_type = SMC_LLC_ADD_LINK; smc_llc_init_msg_hdr(&add_llc.hd, link->lgr, sizeof(add_llc)); /* no dev and port needed */ - smc_llc_enqueue(link, (union smc_llc_msg *)&add_llc); + smc_llc_enqueue(link, (union smc_llc_msg *)&add_llc, + sizeof(union smc_llc_msg)); } /* worker to process an add link message */ @@ -1599,7 +1612,8 @@ void smc_llc_srv_delete_link_local(struct smc_link *link, u8 del_link_id) del_llc.link_num = del_link_id; del_llc.reason = htonl(SMC_LLC_DEL_LOST_PATH); del_llc.hd.flags |= SMC_LLC_FLAG_DEL_LINK_ORDERLY; - smc_llc_enqueue(link, (union smc_llc_msg *)&del_llc); + smc_llc_enqueue(link, (union smc_llc_msg *)&del_llc, + sizeof(union smc_llc_msg)); } static void smc_llc_process_cli_delete_link(struct smc_link_group *lgr) @@ -1821,27 +1835,28 @@ static void smc_llc_rmt_delete_rkey(struct smc_link_group *lgr) link = qentry->link; if (lgr->smc_version == SMC_V2) { - const u32 rkey_off = - offsetof(struct smc_llc_msg_delete_rkey_v2, rkey); - struct smc_llc_msg_delete_rkey_v2 *llcv2; - u32 buf_len; - - if (smc_link_shared_v2_rxbuf(link)) { - memcpy(lgr->wr_rx_buf_v2, llc, sizeof(*llc)); - llcv2 = (struct smc_llc_msg_delete_rkey_v2 *)lgr->wr_rx_buf_v2; - buf_len = SMC_WR_BUF_V2_SIZE; - } else { - llcv2 = (struct smc_llc_msg_delete_rkey_v2 *)llc; - buf_len = sizeof(qentry->msg); - } + struct smc_llc_msg_delete_rkey_v2_inline *llcv2; + + /* The leading SMC_LLC_DEL_RKEY_V2_INLINE rkeys are declared in + * the message itself, any further ones were received into + * qentry->body. + */ + llcv2 = &qentry->msg.delete_rkey_v2; llcv2->num_inval_rkeys = 0; max = min_t(u8, llcv2->num_rkeys, SMC_LLC_RKEYS_PER_MSG_V2); - /* bound by the buffer llcv2 points at */ - max = min_t(u32, max, (buf_len - rkey_off) / - sizeof(llcv2->rkey[0])); + max = min_t(u32, max, SMC_LLC_DEL_RKEY_V2_INLINE + + qentry->body_len / sizeof(__be32)); for (i = 0; i < max; i++) { - if (smc_rtoken_delete(link, llcv2->rkey[i])) + __be32 rkey; + + if (i < SMC_LLC_DEL_RKEY_V2_INLINE) + rkey = llcv2->rkey[i]; + else + memcpy(&rkey, qentry->body + + (i - SMC_LLC_DEL_RKEY_V2_INLINE) * + sizeof(rkey), sizeof(rkey)); + if (smc_rtoken_delete(link, rkey)) llcv2->num_inval_rkeys++; } memset(&llc->rkey[0], 0, sizeof(llc->rkey)); @@ -2082,18 +2097,35 @@ static void smc_llc_rx_response(struct smc_link *link, wake_up(&link->lgr->llc_msg_waiter); } -static void smc_llc_enqueue(struct smc_link *link, union smc_llc_msg *llc) +static void smc_llc_enqueue(struct smc_link *link, union smc_llc_msg *llc, + u32 byte_len) { struct smc_link_group *lgr = link->lgr; struct smc_llc_qentry *qentry; unsigned long flags; + u16 body_len = 0; - qentry = kmalloc_obj(*qentry, GFP_ATOMIC); + /* V2 messages can be longer than the inline union smc_llc_msg. Carry + * the remainder in the qentry itself, so that its lifetime and its + * length match the message the peer actually sent. + */ + if (lgr->smc_version == SMC_V2 && byte_len > SMC_WR_TX_SIZE) + body_len = min_t(u32, byte_len, SMC_WR_BUF_V2_SIZE) - + SMC_WR_TX_SIZE; + + qentry = kmalloc_flex(*qentry, body, body_len, GFP_ATOMIC); if (!qentry) return; + qentry->body_len = body_len; qentry->link = link; INIT_LIST_HEAD(&qentry->list); memcpy(&qentry->msg, llc, sizeof(union smc_llc_msg)); + if (body_len) { + u8 *src = smc_link_shared_v2_rxbuf(link) ? + (u8 *)lgr->wr_rx_buf_v2 : (u8 *)llc; + + memcpy(qentry->body, src + SMC_WR_TX_SIZE, body_len); + } /* process responses immediately */ if ((llc->raw.hdr.flags & SMC_LLC_FLAG_RESP) && @@ -2125,7 +2157,7 @@ static void smc_llc_rx_handler(struct ib_wc *wc, void *buf) return; /* invalid message */ } - smc_llc_enqueue(link, llc); + smc_llc_enqueue(link, llc, wc->byte_len); } /***************************** worker, utils *********************************/ -- 2.43.0 ^ permalink raw reply related [flat|nested] 10+ messages in thread
* Re: [PATCH net v5 3/3] net/smc: carry oversized SMC-Rv2 LLC messages in the queue entry 2026-08-01 9:42 ` [PATCH net v5 3/3] net/smc: carry oversized SMC-Rv2 LLC messages in the queue entry Yehyeong Lee @ 2026-08-02 9:42 ` sashiko-bot 2026-08-05 12:13 ` Simon Horman 1 sibling, 0 replies; 10+ messages in thread From: sashiko-bot @ 2026-08-02 9:42 UTC (permalink / raw) To: Yehyeong Lee; +Cc: Alexander Gordeev, Vasily Gorbik, linux-s390, Heiko Carstens Thank you for your contribution! Sashiko AI review found 1 potential issue(s) to consider: Pre-existing issues: - [High] Remote DoS via memory leak of dynamically allocated `qentry` during LLC flow termination -- --- Patch [3]: [PATCH net v5 3/3] net/smc: carry oversized SMC-Rv2 LLC messages in the queue entry --- commit 55107205f45488de7fb2933646d94dc31343b612 Author: Yehyeong Lee <yhlee@isslab.korea.ac.kr> Subject: net/smc: carry oversized SMC-Rv2 LLC messages in the queue entry This commit modifies how oversized SMC-Rv2 LLC messages are handled by copying the tail of the message directly into the queue entry. It avoids rebuilding the message layout in multiple consumers and bounds the DELETE_RKEY_V2 processing by the actual message length that arrived. > diff --git a/net/smc/smc_llc.c b/net/smc/smc_llc.c > index c9bf938f1ee2a..ba60cc0f1690b 100644 > --- a/net/smc/smc_llc.c > +++ b/net/smc/smc_llc.c [ ... ] > @@ -2083,18 +2098,35 @@ static void smc_llc_rx_response(struct smc_link *link, > wake_up(&link->lgr->llc_msg_waiter); > } [Severity: High] This is a pre-existing issue, but can this leak dynamically allocated qentry objects? If a peer sends a duplicate or delayed LLC response (like SMC_LLC_ADD_LINK) while the local LLC flow is still active but after the local node has already cleared flow->qentry, smc_llc_rx_response() will assign the newly allocated qentry to flow->qentry via smc_llc_flow_qentry_set() without taking a lock: net/smc/smc_llc.c:smc_llc_rx_response() { ... assign: /* assign responses to the local flow, we requested them */ smc_llc_flow_qentry_set(&link->lgr->llc_flow_lcl, qentry); wake_up(&link->lgr->llc_msg_waiter); } When the flow eventually terminates, smc_llc_flow_stop() clears the flow: net/smc/smc_llc.c:smc_llc_flow_stop() { ... spin_lock_bh(&lgr->llc_flow_lock); memset(flow, 0, sizeof(*flow)); ... } This memset() erases the flow->qentry pointer without calling kfree(), permanently leaking the buffer. Could this allow a remote peer to cause OOM by intentionally sending delayed or duplicate responses? > -static void smc_llc_enqueue(struct smc_link *link, union smc_llc_msg *llc) > +static void smc_llc_enqueue(struct smc_link *link, union smc_llc_msg *llc, > + u32 byte_len) > { > struct smc_link_group *lgr = link->lgr; > struct smc_llc_qentry *qentry; > unsigned long flags; > + u16 body_len = 0; > > - qentry = kmalloc_obj(*qentry, GFP_ATOMIC); > + /* V2 messages can be longer than the inline union smc_llc_msg. Carry > + * the remainder in the qentry itself, so that its lifetime and its > + * length match the message the peer actually sent. > + */ [ ... ] -- Sashiko AI review · https://sashiko.dev/#/patchset/20260801094208.1937951-1-yhlee@isslab.korea.ac.kr?part=3 ^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [PATCH net v5 3/3] net/smc: carry oversized SMC-Rv2 LLC messages in the queue entry 2026-08-01 9:42 ` [PATCH net v5 3/3] net/smc: carry oversized SMC-Rv2 LLC messages in the queue entry Yehyeong Lee 2026-08-02 9:42 ` sashiko-bot @ 2026-08-05 12:13 ` Simon Horman 1 sibling, 0 replies; 10+ messages in thread From: Simon Horman @ 2026-08-05 12:13 UTC (permalink / raw) To: Yehyeong Lee Cc: alibuda, dust.li, sidraya, wenjia, kuba, davem, edumazet, pabeni, mjambigi, tonylu, guwen, guangguan.wang, kees, gustavoars, netdev, linux-rdma, linux-s390, linux-hardening, linux-kernel On Sat, Aug 01, 2026 at 06:42:08PM +0900, Yehyeong Lee wrote: > An LLC message longer than the 44-byte union smc_llc_msg arrives either > whole in the receive buffer or split into the link group's shared v2 > buffer, and both consumers of the tail rebuild that layout themselves. > Copy the tail into the queue entry instead, so its length and its lifetime > are those of the message that arrived, and declare the rkeys that do fit > inline as a member of the union rather than reaching them through a cast of > a shorter type. > > The bound the previous patch placed on links without a shared v2 receive > buffer is no longer needed here: the extension is read from the qentry, > whose length is the length of the message that arrived. > > A DELETE_RKEY_V2 is now bounded by what arrived rather than by the buffer > it landed in: a 44-byte message declaring 255 rkeys processed 255 of them > before, and processes the 9 that fit now. > > Suggested-by: D. Wythe <alibuda@linux.alibaba.com> > Signed-off-by: Yehyeong Lee <yhlee@isslab.korea.ac.kr> > --- > Measured over rxe with KASAN: a DELETE_RKEY_V2 carrying 12 rkeys over a link > with a shared v2 receive buffer round-trips all 12 values, the last three > coming from the copied tail; 8, 9 and 10 rkeys and a 44-byte message declaring > 10 give 8, 9, 10 and 9 processed rkeys respectively. kmemleak reports nothing > over the link-addition path, and does report the queue entry when the free > added by patch 1 is removed again. There is an AI generated review of this patch-set available at https://netdev-ai.bots.linux.dev/sashiko/#/patchset/20260801094208.1937951-1-yhlee%40isslab.korea.ac.kr Of that review, I think the following warrants particular consideration. TL;DR: to ensure complete backports, maybe add this tag to this patch, as it has been added to patch 2/3. Fixes: 27ef6a9981fe ("net/smc: support SMC-R V2 for rdma devices with max_recv_sge equals to 1") The text of the AI-generated review: Should this patch carry a Fixes: tag and Cc: stable as well? Both predecessors in the series do, and this is the patch that changes behaviour in two places. First, the early return this hunk replaces: if (!smc_link_shared_v2_rxbuf(link)) return; On a device with max_recv_sge == 1 that means the peer's rkeys in the ADD_LINK v2 extension are never installed into lgr->rtokens for the new link, even though those bytes do arrive on the link. Only the qentry->body_len bound added here reaches them. Second, in smc_llc_rmt_delete_rkey() the shared-v2 path was bounded by the capacity of the per-lgr buffer rather than by what the peer sent: llcv2 = (struct smc_llc_msg_delete_rkey_v2 *)lgr->wr_rx_buf_v2; buf_len = SMC_WR_BUF_V2_SIZE; ... max = min_t(u32, max, (buf_len - rkey_off) / sizeof(llcv2->rkey[0])); So a 44-byte DELETE_RKEY_V2 declaring num_rkeys = 255 walks rkey[9..254] out of whatever an earlier oversized peer message left in lgr->wr_rx_buf_v2 and passes each value to smc_rtoken_delete(), which can clear a valid rtoken of an unrelated connection in the same link group. The changelog describes both as consequences rather than as fixes: The bound the previous patch placed on links without a shared v2 receive buffer is no longer needed here A DELETE_RKEY_V2 is now bounded by what arrived rather than by the buffer it landed in: a 44-byte message declaring 255 rkeys processed 255 of them before, and processes the 9 that fit now. If a stable tree takes the first two patches of the series but not this one, does it end up with the ADD_LINK v2 extension ignored on max_recv_sge == 1 devices and the stale-rkey deletion still present? ^ permalink raw reply [flat|nested] 10+ messages in thread
end of thread, other threads:[~2026-08-05 13:58 UTC | newest] Thread overview: 10+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2026-08-01 9:42 [PATCH net v5 0/3] net/smc: fix out-of-bounds and use-after-free in SMC-Rv2 LLC processing Yehyeong Lee 2026-08-01 9:42 ` [PATCH net v5 1/3] net/smc: fix use-after-free of the LLC qentry in smc_llc_srv_add_link() Yehyeong Lee 2026-08-02 9:42 ` sashiko-bot 2026-08-05 13:57 ` Breno Leitao 2026-08-01 9:42 ` [PATCH net v5 2/3] net/smc: bound the peer rkey counts in SMC-Rv2 LLC messages Yehyeong Lee 2026-08-02 9:42 ` sashiko-bot 2026-08-03 3:41 ` Yehyeong Lee 2026-08-01 9:42 ` [PATCH net v5 3/3] net/smc: carry oversized SMC-Rv2 LLC messages in the queue entry Yehyeong Lee 2026-08-02 9:42 ` sashiko-bot 2026-08-05 12:13 ` Simon Horman
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox