Skip to content

Commit e458a9a

Browse files
author
Paolo Abeni
committed
Merge branch 'net-smc-smc-intra-os-shortcut-with-loopback-ism'
Wen Gu says: ==================== net/smc: SMC intra-OS shortcut with loopback-ism This patch set acts as the second part of the new version of [1] (The first part can be referred from [2]), the updated things of this version are listed at the end. - Background SMC-D is now used in IBM z with ISM function to optimize network interconnect for intra-CPC communications. Inspired by this, we try to make SMC-D available on the non-s390 architecture through a software-implemented Emulated-ISM device, that is the loopback-ism device here, to accelerate inter-process or inter-containers communication within the same OS instance. - Design This patch set includes 3 parts: - Patch #1: some prepare work for loopback-ism. - Patch #2-#7: implement loopback-ism device and adapt SMC-D for it. loopback-ism now serves only SMC and no userspace interfaces exposed. - Patch #8-#11: memory copy optimization for intra-OS scenario. The loopback-ism device is designed as an ISMv2 device and not be limited to a specific net namespace, ends of both inter-process connection (1/1' in diagram below) or inter-container connection (2/2' in diagram below) can find the same available loopback-ism and choose it during the CLC handshake. Container 1 (ns1) Container 2 (ns2) +-----------------------------------------+ +-------------------------+ | +-------+ +-------+ +-------+ | | +-------+ | | | App A | | App B | | App C | | | | App D |<-+ | | +-------+ +---^---+ +-------+ | | +-------+ |(2') | | |127.0.0.1 (1')| |192.168.0.11 192.168.0.12| | | (1)| +--------+ | +--------+ |(2) | | +--------+ +--------+ | | `-->| lo |-` | eth0 |<-` | | | lo | | eth0 | | +---------+--|---^-+---+-----|--+---------+ +-+--------+---+-^------+-+ | | | | Kernel | | | | +----+-------v---+-----------v----------------------------------+---+----+ | | TCP | | | | | | | +--------------------------------------------------------------+ | | | | +--------------+ | | | smc loopback | | +---------------------------+--------------+-----------------------------+ loopback-ism device creates DMBs (shared memory) for each connection peer. Since data transfer occurs within the same kernel, the sndbuf of each peer is only a descriptor and point to the same memory region as peer DMB, so that the data copy from sndbuf to peer DMB can be avoided in loopback-ism case. Container 1 (ns1) Container 2 (ns2) +-----------------------------------------+ +-------------------------+ | +-------+ | | +-------+ | | | App C |-----+ | | | App D | | | +-------+ | | | +-^-----+ | | | | | | | | (2) | | | (2') | | | | | | | | +---------------|-------------------------+ +----------|--------------+ | | Kernel | | +---------------|-----------------------------------------|--------------+ | +--------+ +--v-----+ +--------+ +--------+ | | |dmb_desc| |snd_desc| |dmb_desc| |snd_desc| | | +-----|--+ +--|-----+ +-----|--+ +--------+ | | +-----|--+ | +-----|--+ | | | DMB C | +---------------------------------| DMB D | | | +--------+ +--------+ | | | | +--------------+ | | | smc loopback | | +---------------------------+--------------+-----------------------------+ - Benchmark Test * Test environments: - VM with Intel Xeon Platinum 8 core 2.50GHz, 16 GiB mem. - SMC sndbuf/DMB size 1MB. * Test object: - TCP: run on TCP loopback. - SMC lo: run on SMC loopback-ism. 1. ipc-benchmark (see [3]) - ./<foo> -c 1000000 -s 100 TCP SMC-lo Message rate (msg/s) 84991 151293(+78.01%) 2. sockperf - serv: <smc_run> sockperf sr --tcp - clnt: <smc_run> sockperf { tp | pp } --tcp --msg-size={ 64000 for tp | 14 for pp } -i 127.0.0.1 -t 30 TCP SMC-lo Bandwidth(MBps) 5033.569 7987.732(+58.69%) Latency(us) 5.986 3.398(-43.23%) 3. nginx/wrk - serv: <smc_run> nginx - clnt: <smc_run> wrk -t 8 -c 1000 -d 30 http://127.0.0.1:80 TCP SMC-lo Requests/s 187951.76 267107.90(+42.12%) 4. redis-benchmark - serv: <smc_run> redis-server - clnt: <smc_run> redis-benchmark -h 127.0.0.1 -q -t set,get -n 400000 -c 200 -d 1024 TCP SMC-lo GET(Requests/s) 86132.64 118133.49(+37.15%) SET(Requests/s) 87374.40 122887.86(+40.65%) Change log: v7->v6 - Patch #2: minor: remove unnecessary 'return' of inline smc_loopback_exit(). - Patch #10: minor: directly return 0 instead of 'rc' in smcd_cdc_msg_send(). - all: collect the Reviewed-by tags. v6->RFC v5 Link: https://lore.kernel.org/netdev/20240414040304.54255-1-guwen@linux.alibaba.com/ - Patch #2: make the use of CONFIG_SMC_LO cleaner. - Patch #5: mark some smcd_ops that loopback-ism doesn't support as optional and check for the support when they are called. - Patch #7: keep loopback-ism at the beginning of the SMC-D device list. - Some expression changes in commit logs and comments. RFC v5->RFC v4: Link: https://lore.kernel.org/netdev/20240324135522.108564-1-guwen@linux.alibaba.com/ - Patch #2: minor changes in description of config SMC_LO and comments. - Patch #10: minor changes in comments and if(smc_ism_support_dmb_nocopy()) check in smcd_cdc_msg_send(). - Patch #3: change smc_lo_generate_id() to smc_lo_generate_ids() and SMC_LO_CHID to SMC_LO_RESERVED_CHID. - Patch #5: memcpy while holding the ldev->dmb_ht_lock. - Some expression changes in commit logs. RFC v4->v3: Link: https://lore.kernel.org/netdev/20240317100545.96663-1-guwen@linux.alibaba.com/ - The merge window of v6.9 is open, so post this series as an RFC. - Patch #6: since some information fed back by smc_nl_handle_smcd_dev() dose not apply to Emulated-ISM (including loopback-ism here), loopback-ism is not exposed through smc netlink for the time being. we may refactor this part when smc netlink interface is updated. v3->v2: Link: https://lore.kernel.org/netdev/20240312142743.41406-1-guwen@linux.alibaba.com/ - Patch #11: use tasklet_schedule(&conn->rx_tsklet) instead of smcd_cdc_rx_handler() to avoid possible recursive locking of conn->send_lock and use {read|write}_lock_bh() to acquire dmb_ht_lock. v2->v1: Link: https://lore.kernel.org/netdev/20240307095536.29648-1-guwen@linux.alibaba.com/ - All the patches: changed the term virtual-ISM to Emulated-ISM as defined by SMCv2.1. - Patch #3: optimized the description of SMC_LO config. Avoid exposing loopback-ism to sysfs and remove all the knobs until future definition clear. - Patch #3: try to make lockdep happy by using read_lock_bh() in smc_lo_move_data(). - Patch #6: defaultly use physical contiguous DMB buffers. - Patch #11: defaultly enable DMB no-copy for loopback-ism and free the DMB in unregister_dmb or detach_dmb when dmb_node->refcnt reaches 0, instead of using wait_event to keep waiting in unregister_dmb. v1->RFC: Link: https://lore.kernel.org/netdev/20240111120036.109903-1-guwen@linux.alibaba.com/ - Patch #9: merge rx_bytes and tx_bytes as xfer_bytes statistics: /sys/devices/virtual/smc/loopback-ism/xfer_bytes - Patch #10: add support_dmb_nocopy operation to check if SMC-D device supports merging sndbuf with peer DMB. - Patch #13 & #14: introduce loopback-ism device control of DMB memory type and control of whether to merge sndbuf and DMB. They can be respectively set by: /sys/devices/virtual/smc/loopback-ism/dmb_type /sys/devices/virtual/smc/loopback-ism/dmb_copy The motivation for these two control is that a performance bottleneck was found when using vzalloced DMB and sndbuf is merged with DMB, and there are many CPUs and CONFIG_HARDENED_USERCOPY is set [4]. The bottleneck is caused by the lock contention in vmap_area_lock [5] which is involved in memcpy_from_msg() or memcpy_to_msg(). Currently, Uladzislau Rezki is working on mitigating the vmap lock contention [6]. It has significant effects, but using virtual memory still has additional overhead compared to using physical memory. So this new version provides controls of dmb_type and dmb_copy to suit different scenarios. - Some minor changes and comments improvements. RFC->old version([1]): Link: https://lore.kernel.org/netdev/1702214654-32069-1-git-send-email-guwen@linux.alibaba.com/ - Patch #1: improve the loopback-ism dump, it shows as follows now: # smcd d FID Type PCI-ID PCHID InUse #LGs PNET-ID 0000 0 loopback-ism ffff No 0 - Patch #3: introduce the smc_ism_set_v2_capable() helper and set smc_ism_v2_capable when ISMv2 or virtual ISM is registered, regardless of whether there is already a device in smcd device list. - Patch #3: loopback-ism will be added into /sys/devices/virtual/smc/loopback-ism/. - Patch #8: introduce the runtime switch /sys/devices/virtual/smc/loopback-ism/active to activate or deactivate the loopback-ism. - Patch #9: introduce the statistics of loopback-ism by /sys/devices/virtual/smc/loopback-ism/{{tx|rx}_tytes|dmbs_cnt}. - Some minor changes and comments improvements. [1] https://lore.kernel.org/netdev/1695568613-125057-1-git-send-email-guwen@linux.alibaba.com/ [2] https://lore.kernel.org/netdev/20231219142616.80697-1-guwen@linux.alibaba.com/ [3] https://github.com/goldsborough/ipc-bench [4] https://lore.kernel.org/all/3189e342-c38f-6076-b730-19a6efd732a5@linux.alibaba.com/ [5] https://lore.kernel.org/all/238e63cd-e0e8-4fbf-852f-bc4d5bc35d5a@linux.alibaba.com/ [6] https://lore.kernel.org/all/20240102184633.748113-1-urezki@gmail.com/ ==================== Link: https://lore.kernel.org/r/20240428060738.60843-1-guwen@linux.alibaba.com Signed-off-by: Paolo Abeni <pabeni@redhat.com>
2 parents e5c5f35 + c3a910f commit e458a9a

12 files changed

Lines changed: 721 additions & 28 deletions

File tree

drivers/s390/net/ism_drv.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -745,7 +745,7 @@ static int smcd_query_rgid(struct smcd_dev *smcd, struct smcd_gid *rgid,
745745
}
746746

747747
static int smcd_register_dmb(struct smcd_dev *smcd, struct smcd_dmb *dmb,
748-
struct ism_client *client)
748+
void *client)
749749
{
750750
return ism_register_dmb(smcd->priv, (struct ism_dmb *)dmb, client);
751751
}

include/net/smc.h

Lines changed: 13 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,6 @@ struct smcd_dmb {
4747
#define ISM_ERROR 0xFFFF
4848

4949
struct smcd_dev;
50-
struct ism_client;
5150

5251
struct smcd_gid {
5352
u64 gid;
@@ -58,26 +57,32 @@ struct smcd_ops {
5857
int (*query_remote_gid)(struct smcd_dev *dev, struct smcd_gid *rgid,
5958
u32 vid_valid, u32 vid);
6059
int (*register_dmb)(struct smcd_dev *dev, struct smcd_dmb *dmb,
61-
struct ism_client *client);
60+
void *client);
6261
int (*unregister_dmb)(struct smcd_dev *dev, struct smcd_dmb *dmb);
63-
int (*add_vlan_id)(struct smcd_dev *dev, u64 vlan_id);
64-
int (*del_vlan_id)(struct smcd_dev *dev, u64 vlan_id);
65-
int (*set_vlan_required)(struct smcd_dev *dev);
66-
int (*reset_vlan_required)(struct smcd_dev *dev);
67-
int (*signal_event)(struct smcd_dev *dev, struct smcd_gid *rgid,
68-
u32 trigger_irq, u32 event_code, u64 info);
6962
int (*move_data)(struct smcd_dev *dev, u64 dmb_tok, unsigned int idx,
7063
bool sf, unsigned int offset, void *data,
7164
unsigned int size);
7265
int (*supports_v2)(void);
7366
void (*get_local_gid)(struct smcd_dev *dev, struct smcd_gid *gid);
7467
u16 (*get_chid)(struct smcd_dev *dev);
7568
struct device* (*get_dev)(struct smcd_dev *dev);
69+
70+
/* optional operations */
71+
int (*add_vlan_id)(struct smcd_dev *dev, u64 vlan_id);
72+
int (*del_vlan_id)(struct smcd_dev *dev, u64 vlan_id);
73+
int (*set_vlan_required)(struct smcd_dev *dev);
74+
int (*reset_vlan_required)(struct smcd_dev *dev);
75+
int (*signal_event)(struct smcd_dev *dev, struct smcd_gid *rgid,
76+
u32 trigger_irq, u32 event_code, u64 info);
77+
int (*support_dmb_nocopy)(struct smcd_dev *dev);
78+
int (*attach_dmb)(struct smcd_dev *dev, struct smcd_dmb *dmb);
79+
int (*detach_dmb)(struct smcd_dev *dev, u64 token);
7680
};
7781

7882
struct smcd_dev {
7983
const struct smcd_ops *ops;
8084
void *priv;
85+
void *client;
8186
struct list_head list;
8287
spinlock_t lock;
8388
struct smc_connection **conn;

net/smc/Kconfig

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,3 +20,16 @@ config SMC_DIAG
2020
smcss.
2121

2222
if unsure, say Y.
23+
24+
config SMC_LO
25+
bool "SMC intra-OS shortcut with loopback-ism"
26+
depends on SMC
27+
default n
28+
help
29+
SMC_LO enables the creation of an Emulated-ISM device named
30+
loopback-ism in SMC and makes use of it for transferring data
31+
when communication occurs within the same OS. This helps in
32+
convenient testing of SMC-D since loopback-ism is independent
33+
of architecture or hardware.
34+
35+
if unsure, say N.

net/smc/Makefile

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,3 +6,4 @@ smc-y := af_smc.o smc_pnet.o smc_ib.o smc_clc.o smc_core.o smc_wr.o smc_llc.o
66
smc-y += smc_cdc.o smc_tx.o smc_rx.o smc_close.o smc_ism.o smc_netlink.o smc_stats.o
77
smc-y += smc_tracepoint.o
88
smc-$(CONFIG_SYSCTL) += smc_sysctl.o
9+
smc-$(CONFIG_SMC_LO) += smc_loopback.o

net/smc/af_smc.c

Lines changed: 27 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,7 @@
5353
#include "smc_stats.h"
5454
#include "smc_tracepoint.h"
5555
#include "smc_sysctl.h"
56+
#include "smc_loopback.h"
5657

5758
static DEFINE_MUTEX(smc_server_lgr_pending); /* serialize link group
5859
* creation on server
@@ -1435,6 +1436,14 @@ static int smc_connect_ism(struct smc_sock *smc,
14351436
}
14361437

14371438
smc_conn_save_peer_info(smc, aclc);
1439+
1440+
if (smc_ism_support_dmb_nocopy(smc->conn.lgr->smcd)) {
1441+
rc = smcd_buf_attach(smc);
1442+
if (rc) {
1443+
rc = SMC_CLC_DECL_MEM; /* try to fallback */
1444+
goto connect_abort;
1445+
}
1446+
}
14381447
smc_close_init(smc);
14391448
smc_rx_init(smc);
14401449
smc_tx_init(smc);
@@ -2539,6 +2548,14 @@ static void smc_listen_work(struct work_struct *work)
25392548
mutex_unlock(&smc_server_lgr_pending);
25402549
}
25412550
smc_conn_save_peer_info(new_smc, cclc);
2551+
2552+
if (ini->is_smcd &&
2553+
smc_ism_support_dmb_nocopy(new_smc->conn.lgr->smcd)) {
2554+
rc = smcd_buf_attach(new_smc);
2555+
if (rc)
2556+
goto out_decl;
2557+
}
2558+
25422559
smc_listen_out_connected(new_smc);
25432560
SMC_STAT_SERV_SUCC_INC(sock_net(newclcsock->sk), ini);
25442561
goto out_free;
@@ -3555,15 +3572,23 @@ static int __init smc_init(void)
35553572
goto out_sock;
35563573
}
35573574

3575+
rc = smc_loopback_init();
3576+
if (rc) {
3577+
pr_err("%s: smc_loopback_init fails with %d\n", __func__, rc);
3578+
goto out_ib;
3579+
}
3580+
35583581
rc = tcp_register_ulp(&smc_ulp_ops);
35593582
if (rc) {
35603583
pr_err("%s: tcp_ulp_register fails with %d\n", __func__, rc);
3561-
goto out_ib;
3584+
goto out_lo;
35623585
}
35633586

35643587
static_branch_enable(&tcp_have_smc);
35653588
return 0;
35663589

3590+
out_lo:
3591+
smc_loopback_exit();
35673592
out_ib:
35683593
smc_ib_unregister_client();
35693594
out_sock:
@@ -3601,6 +3626,7 @@ static void __exit smc_exit(void)
36013626
tcp_unregister_ulp(&smc_ulp_ops);
36023627
sock_unregister(PF_SMC);
36033628
smc_core_exit();
3629+
smc_loopback_exit();
36043630
smc_ib_unregister_client();
36053631
smc_ism_exit();
36063632
destroy_workqueue(smc_close_wq);

net/smc/smc_cdc.c

Lines changed: 34 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
#include "smc_tx.h"
1919
#include "smc_rx.h"
2020
#include "smc_close.h"
21+
#include "smc_ism.h"
2122

2223
/********************************** send *************************************/
2324

@@ -255,6 +256,14 @@ int smcd_cdc_msg_send(struct smc_connection *conn)
255256
return rc;
256257
smc_curs_copy(&conn->rx_curs_confirmed, &curs, conn);
257258
conn->local_rx_ctrl.prod_flags.cons_curs_upd_req = 0;
259+
260+
if (smc_ism_support_dmb_nocopy(conn->lgr->smcd))
261+
/* if local sndbuf shares the same memory region with
262+
* peer DMB, then don't update the tx_curs_fin
263+
* and sndbuf_space until peer has consumed the data.
264+
*/
265+
return 0;
266+
258267
/* Calculate transmitted data and increment free send buffer space */
259268
diff = smc_curs_diff(conn->sndbuf_desc->len, &conn->tx_curs_fin,
260269
&conn->tx_curs_sent);
@@ -266,7 +275,7 @@ int smcd_cdc_msg_send(struct smc_connection *conn)
266275
smc_curs_copy(&conn->tx_curs_fin, &conn->tx_curs_sent, conn);
267276

268277
smc_tx_sndbuf_nonfull(smc);
269-
return rc;
278+
return 0;
270279
}
271280

272281
/********************************* receive ***********************************/
@@ -323,7 +332,7 @@ static void smc_cdc_msg_recv_action(struct smc_sock *smc,
323332
{
324333
union smc_host_cursor cons_old, prod_old;
325334
struct smc_connection *conn = &smc->conn;
326-
int diff_cons, diff_prod;
335+
int diff_cons, diff_prod, diff_tx;
327336

328337
smc_curs_copy(&prod_old, &conn->local_rx_ctrl.prod, conn);
329338
smc_curs_copy(&cons_old, &conn->local_rx_ctrl.cons, conn);
@@ -339,6 +348,29 @@ static void smc_cdc_msg_recv_action(struct smc_sock *smc,
339348
atomic_add(diff_cons, &conn->peer_rmbe_space);
340349
/* guarantee 0 <= peer_rmbe_space <= peer_rmbe_size */
341350
smp_mb__after_atomic();
351+
352+
/* if local sndbuf shares the same memory region with
353+
* peer RMB, then update tx_curs_fin and sndbuf_space
354+
* here since peer has already consumed the data.
355+
*/
356+
if (conn->lgr->is_smcd &&
357+
smc_ism_support_dmb_nocopy(conn->lgr->smcd)) {
358+
/* Calculate consumed data and
359+
* increment free send buffer space.
360+
*/
361+
diff_tx = smc_curs_diff(conn->sndbuf_desc->len,
362+
&conn->tx_curs_fin,
363+
&conn->local_rx_ctrl.cons);
364+
/* increase local sndbuf space and fin_curs */
365+
smp_mb__before_atomic();
366+
atomic_add(diff_tx, &conn->sndbuf_space);
367+
/* guarantee 0 <= sndbuf_space <= sndbuf_desc->len */
368+
smp_mb__after_atomic();
369+
smc_curs_copy(&conn->tx_curs_fin,
370+
&conn->local_rx_ctrl.cons, conn);
371+
372+
smc_tx_sndbuf_nonfull(smc);
373+
}
342374
}
343375

344376
diff_prod = smc_curs_diff(conn->rmb_desc->len, &prod_old,

net/smc/smc_core.c

Lines changed: 60 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1149,6 +1149,20 @@ static void smcr_buf_unuse(struct smc_buf_desc *buf_desc, bool is_rmb,
11491149
}
11501150
}
11511151

1152+
static void smcd_buf_detach(struct smc_connection *conn)
1153+
{
1154+
struct smcd_dev *smcd = conn->lgr->smcd;
1155+
u64 peer_token = conn->peer_token;
1156+
1157+
if (!conn->sndbuf_desc)
1158+
return;
1159+
1160+
smc_ism_detach_dmb(smcd, peer_token);
1161+
1162+
kfree(conn->sndbuf_desc);
1163+
conn->sndbuf_desc = NULL;
1164+
}
1165+
11521166
static void smc_buf_unuse(struct smc_connection *conn,
11531167
struct smc_link_group *lgr)
11541168
{
@@ -1192,6 +1206,8 @@ void smc_conn_free(struct smc_connection *conn)
11921206
if (lgr->is_smcd) {
11931207
if (!list_empty(&lgr->list))
11941208
smc_ism_unset_conn(conn);
1209+
if (smc_ism_support_dmb_nocopy(lgr->smcd))
1210+
smcd_buf_detach(conn);
11951211
tasklet_kill(&conn->rx_tsklet);
11961212
} else {
11971213
smc_cdc_wait_pend_tx_wr(conn);
@@ -1445,6 +1461,8 @@ static void smc_conn_kill(struct smc_connection *conn, bool soft)
14451461
smc_sk_wake_ups(smc);
14461462
if (conn->lgr->is_smcd) {
14471463
smc_ism_unset_conn(conn);
1464+
if (smc_ism_support_dmb_nocopy(conn->lgr->smcd))
1465+
smcd_buf_detach(conn);
14481466
if (soft)
14491467
tasklet_kill(&conn->rx_tsklet);
14501468
else
@@ -2464,12 +2482,18 @@ int smc_buf_create(struct smc_sock *smc, bool is_smcd)
24642482
int rc;
24652483

24662484
/* create send buffer */
2485+
if (is_smcd &&
2486+
smc_ism_support_dmb_nocopy(smc->conn.lgr->smcd))
2487+
goto create_rmb;
2488+
24672489
rc = __smc_buf_create(smc, is_smcd, false);
24682490
if (rc)
24692491
return rc;
2492+
2493+
create_rmb:
24702494
/* create rmb */
24712495
rc = __smc_buf_create(smc, is_smcd, true);
2472-
if (rc) {
2496+
if (rc && smc->conn.sndbuf_desc) {
24732497
down_write(&smc->conn.lgr->sndbufs_lock);
24742498
list_del(&smc->conn.sndbuf_desc->list);
24752499
up_write(&smc->conn.lgr->sndbufs_lock);
@@ -2479,6 +2503,41 @@ int smc_buf_create(struct smc_sock *smc, bool is_smcd)
24792503
return rc;
24802504
}
24812505

2506+
int smcd_buf_attach(struct smc_sock *smc)
2507+
{
2508+
struct smc_connection *conn = &smc->conn;
2509+
struct smcd_dev *smcd = conn->lgr->smcd;
2510+
u64 peer_token = conn->peer_token;
2511+
struct smc_buf_desc *buf_desc;
2512+
int rc;
2513+
2514+
buf_desc = kzalloc(sizeof(*buf_desc), GFP_KERNEL);
2515+
if (!buf_desc)
2516+
return -ENOMEM;
2517+
2518+
/* The ghost sndbuf_desc describes the same memory region as
2519+
* peer RMB. Its lifecycle is consistent with the connection's
2520+
* and it will be freed with the connections instead of the
2521+
* link group.
2522+
*/
2523+
rc = smc_ism_attach_dmb(smcd, peer_token, buf_desc);
2524+
if (rc)
2525+
goto free;
2526+
2527+
smc->sk.sk_sndbuf = buf_desc->len;
2528+
buf_desc->cpu_addr =
2529+
(u8 *)buf_desc->cpu_addr + sizeof(struct smcd_cdc_msg);
2530+
buf_desc->len -= sizeof(struct smcd_cdc_msg);
2531+
conn->sndbuf_desc = buf_desc;
2532+
conn->sndbuf_desc->used = 1;
2533+
atomic_set(&conn->sndbuf_space, conn->sndbuf_desc->len);
2534+
return 0;
2535+
2536+
free:
2537+
kfree(buf_desc);
2538+
return rc;
2539+
}
2540+
24822541
static inline int smc_rmb_reserve_rtoken_idx(struct smc_link_group *lgr)
24832542
{
24842543
int i;

net/smc/smc_core.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -557,6 +557,7 @@ void smc_smcd_terminate(struct smcd_dev *dev, struct smcd_gid *peer_gid,
557557
void smc_smcd_terminate_all(struct smcd_dev *dev);
558558
void smc_smcr_terminate_all(struct smc_ib_device *smcibdev);
559559
int smc_buf_create(struct smc_sock *smc, bool is_smcd);
560+
int smcd_buf_attach(struct smc_sock *smc);
560561
int smc_uncompress_bufsize(u8 compressed);
561562
int smc_rmb_rtoken_handling(struct smc_connection *conn, struct smc_link *link,
562563
struct smc_clc_msg_accept_confirm *clc);

0 commit comments

Comments
 (0)