Commit a4e3ee7d authored by David S. Miller's avatar David S. Miller

Merge branch 'net-smc-show-unique-rsn-code-for-exceeded-max-dmb-count'

Karsten Graul says:

====================
net/smc: show unique rsn code for exceeded max dmb count

Resolve some confusion at the user side when the reason code shows
out-of-memory but actually there is enough memory left.
====================
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parents d21a06d5 72b7f6c4
...@@ -231,7 +231,7 @@ static int ism_alloc_dmb(struct ism_dev *ism, struct smcd_dmb *dmb) ...@@ -231,7 +231,7 @@ static int ism_alloc_dmb(struct ism_dev *ism, struct smcd_dmb *dmb)
bit = find_next_zero_bit(ism->sba_bitmap, ISM_NR_DMBS, bit = find_next_zero_bit(ism->sba_bitmap, ISM_NR_DMBS,
ISM_DMB_BIT_OFFSET); ISM_DMB_BIT_OFFSET);
if (bit == ISM_NR_DMBS) if (bit == ISM_NR_DMBS)
return -ENOMEM; return -ENOSPC;
dmb->sba_idx = bit; dmb->sba_idx = bit;
} }
......
...@@ -719,8 +719,11 @@ static int smc_connect_ism(struct smc_sock *smc, ...@@ -719,8 +719,11 @@ static int smc_connect_ism(struct smc_sock *smc,
} }
/* Create send and receive buffers */ /* Create send and receive buffers */
if (smc_buf_create(smc, true)) rc = smc_buf_create(smc, true);
return smc_connect_abort(smc, SMC_CLC_DECL_MEM, if (rc)
return smc_connect_abort(smc, (rc == -ENOSPC) ?
SMC_CLC_DECL_MAX_DMB :
SMC_CLC_DECL_MEM,
ini->cln_first_contact); ini->cln_first_contact);
smc_conn_save_peer_info(smc, aclc); smc_conn_save_peer_info(smc, aclc);
...@@ -1200,12 +1203,14 @@ static int smc_listen_ism_init(struct smc_sock *new_smc, ...@@ -1200,12 +1203,14 @@ static int smc_listen_ism_init(struct smc_sock *new_smc,
} }
/* Create send and receive buffers */ /* Create send and receive buffers */
if (smc_buf_create(new_smc, true)) { rc = smc_buf_create(new_smc, true);
if (rc) {
if (ini->cln_first_contact == SMC_FIRST_CONTACT) if (ini->cln_first_contact == SMC_FIRST_CONTACT)
smc_lgr_cleanup_early(&new_smc->conn); smc_lgr_cleanup_early(&new_smc->conn);
else else
smc_conn_free(&new_smc->conn); smc_conn_free(&new_smc->conn);
return SMC_CLC_DECL_MEM; return (rc == -ENOSPC) ? SMC_CLC_DECL_MAX_DMB :
SMC_CLC_DECL_MEM;
} }
return 0; return 0;
......
...@@ -48,6 +48,7 @@ ...@@ -48,6 +48,7 @@
#define SMC_CLC_DECL_NOACTLINK 0x030a0000 /* no active smc-r link in lgr */ #define SMC_CLC_DECL_NOACTLINK 0x030a0000 /* no active smc-r link in lgr */
#define SMC_CLC_DECL_NOSRVLINK 0x030b0000 /* SMC-R link from srv not found */ #define SMC_CLC_DECL_NOSRVLINK 0x030b0000 /* SMC-R link from srv not found */
#define SMC_CLC_DECL_VERSMISMAT 0x030c0000 /* SMC version mismatch */ #define SMC_CLC_DECL_VERSMISMAT 0x030c0000 /* SMC version mismatch */
#define SMC_CLC_DECL_MAX_DMB 0x030d0000 /* SMC-D DMB limit exceeded */
#define SMC_CLC_DECL_SYNCERR 0x04000000 /* synchronization error */ #define SMC_CLC_DECL_SYNCERR 0x04000000 /* synchronization error */
#define SMC_CLC_DECL_PEERDECL 0x05000000 /* peer declined during handshake */ #define SMC_CLC_DECL_PEERDECL 0x05000000 /* peer declined during handshake */
#define SMC_CLC_DECL_INTERR 0x09990000 /* internal error */ #define SMC_CLC_DECL_INTERR 0x09990000 /* internal error */
......
...@@ -1614,7 +1614,7 @@ static struct smc_buf_desc *smcd_new_buf_create(struct smc_link_group *lgr, ...@@ -1614,7 +1614,7 @@ static struct smc_buf_desc *smcd_new_buf_create(struct smc_link_group *lgr,
rc = smc_ism_register_dmb(lgr, bufsize, buf_desc); rc = smc_ism_register_dmb(lgr, bufsize, buf_desc);
if (rc) { if (rc) {
kfree(buf_desc); kfree(buf_desc);
return ERR_PTR(-EAGAIN); return (rc == -ENOMEM) ? ERR_PTR(-EAGAIN) : ERR_PTR(rc);
} }
buf_desc->pages = virt_to_page(buf_desc->cpu_addr); buf_desc->pages = virt_to_page(buf_desc->cpu_addr);
/* CDC header stored in buf. So, pretend it was smaller */ /* CDC header stored in buf. So, pretend it was smaller */
...@@ -1688,7 +1688,7 @@ static int __smc_buf_create(struct smc_sock *smc, bool is_smcd, bool is_rmb) ...@@ -1688,7 +1688,7 @@ static int __smc_buf_create(struct smc_sock *smc, bool is_smcd, bool is_rmb)
} }
if (IS_ERR(buf_desc)) if (IS_ERR(buf_desc))
return -ENOMEM; return PTR_ERR(buf_desc);
if (!is_smcd) { if (!is_smcd) {
if (smcr_buf_map_usable_links(lgr, buf_desc, is_rmb)) { if (smcr_buf_map_usable_links(lgr, buf_desc, is_rmb)) {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment