smc: switch to usage of IB_PD_UNSAFE_GLOBAL_RKEY
Currently, SMC enables remote access to physical memory when a user has successfully configured and established an SMC-connection until ten minutes after the last SMC connection is closed. Because this is considered a security risk, drivers are supposed to use IB_PD_UNSAFE_GLOBAL_RKEY in such a case. This patch changes the current SMC code to use IB_PD_UNSAFE_GLOBAL_RKEY. This improves user awareness, but does not remove the security risk itself. Signed-off-by: Ursula Braun <ubraun@linux.vnet.ibm.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
bcfc7d3311
commit
263eec9b2a
|
@ -204,7 +204,7 @@ int smc_clc_send_confirm(struct smc_sock *smc)
|
||||||
memcpy(&cclc.lcl.mac, &link->smcibdev->mac[link->ibport - 1], ETH_ALEN);
|
memcpy(&cclc.lcl.mac, &link->smcibdev->mac[link->ibport - 1], ETH_ALEN);
|
||||||
hton24(cclc.qpn, link->roce_qp->qp_num);
|
hton24(cclc.qpn, link->roce_qp->qp_num);
|
||||||
cclc.rmb_rkey =
|
cclc.rmb_rkey =
|
||||||
htonl(conn->rmb_desc->mr_rx[SMC_SINGLE_LINK]->rkey);
|
htonl(conn->rmb_desc->rkey[SMC_SINGLE_LINK]);
|
||||||
cclc.conn_idx = 1; /* for now: 1 RMB = 1 RMBE */
|
cclc.conn_idx = 1; /* for now: 1 RMB = 1 RMBE */
|
||||||
cclc.rmbe_alert_token = htonl(conn->alert_token_local);
|
cclc.rmbe_alert_token = htonl(conn->alert_token_local);
|
||||||
cclc.qp_mtu = min(link->path_mtu, link->peer_mtu);
|
cclc.qp_mtu = min(link->path_mtu, link->peer_mtu);
|
||||||
|
@ -256,7 +256,7 @@ int smc_clc_send_accept(struct smc_sock *new_smc, int srv_first_contact)
|
||||||
memcpy(&aclc.lcl.mac, link->smcibdev->mac[link->ibport - 1], ETH_ALEN);
|
memcpy(&aclc.lcl.mac, link->smcibdev->mac[link->ibport - 1], ETH_ALEN);
|
||||||
hton24(aclc.qpn, link->roce_qp->qp_num);
|
hton24(aclc.qpn, link->roce_qp->qp_num);
|
||||||
aclc.rmb_rkey =
|
aclc.rmb_rkey =
|
||||||
htonl(conn->rmb_desc->mr_rx[SMC_SINGLE_LINK]->rkey);
|
htonl(conn->rmb_desc->rkey[SMC_SINGLE_LINK]);
|
||||||
aclc.conn_idx = 1; /* as long as 1 RMB = 1 RMBE */
|
aclc.conn_idx = 1; /* as long as 1 RMB = 1 RMBE */
|
||||||
aclc.rmbe_alert_token = htonl(conn->alert_token_local);
|
aclc.rmbe_alert_token = htonl(conn->alert_token_local);
|
||||||
aclc.qp_mtu = link->path_mtu;
|
aclc.qp_mtu = link->path_mtu;
|
||||||
|
|
|
@ -613,19 +613,8 @@ int smc_rmb_create(struct smc_sock *smc)
|
||||||
rmb_desc = NULL;
|
rmb_desc = NULL;
|
||||||
continue; /* if mapping failed, try smaller one */
|
continue; /* if mapping failed, try smaller one */
|
||||||
}
|
}
|
||||||
rc = smc_ib_get_memory_region(lgr->lnk[SMC_SINGLE_LINK].roce_pd,
|
rmb_desc->rkey[SMC_SINGLE_LINK] =
|
||||||
IB_ACCESS_REMOTE_WRITE |
|
lgr->lnk[SMC_SINGLE_LINK].roce_pd->unsafe_global_rkey;
|
||||||
IB_ACCESS_LOCAL_WRITE,
|
|
||||||
&rmb_desc->mr_rx[SMC_SINGLE_LINK]);
|
|
||||||
if (rc) {
|
|
||||||
smc_ib_buf_unmap(lgr->lnk[SMC_SINGLE_LINK].smcibdev,
|
|
||||||
tmp_bufsize, rmb_desc,
|
|
||||||
DMA_FROM_DEVICE);
|
|
||||||
kfree(rmb_desc->cpu_addr);
|
|
||||||
kfree(rmb_desc);
|
|
||||||
rmb_desc = NULL;
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
rmb_desc->used = 1;
|
rmb_desc->used = 1;
|
||||||
write_lock_bh(&lgr->rmbs_lock);
|
write_lock_bh(&lgr->rmbs_lock);
|
||||||
list_add(&rmb_desc->list,
|
list_add(&rmb_desc->list,
|
||||||
|
@ -668,6 +657,7 @@ int smc_rmb_rtoken_handling(struct smc_connection *conn,
|
||||||
|
|
||||||
for (i = 0; i < SMC_RMBS_PER_LGR_MAX; i++) {
|
for (i = 0; i < SMC_RMBS_PER_LGR_MAX; i++) {
|
||||||
if ((lgr->rtokens[i][SMC_SINGLE_LINK].rkey == rkey) &&
|
if ((lgr->rtokens[i][SMC_SINGLE_LINK].rkey == rkey) &&
|
||||||
|
(lgr->rtokens[i][SMC_SINGLE_LINK].dma_addr == dma_addr) &&
|
||||||
test_bit(i, lgr->rtokens_used_mask)) {
|
test_bit(i, lgr->rtokens_used_mask)) {
|
||||||
conn->rtoken_idx = i;
|
conn->rtoken_idx = i;
|
||||||
return 0;
|
return 0;
|
||||||
|
|
|
@ -93,7 +93,7 @@ struct smc_buf_desc {
|
||||||
u64 dma_addr[SMC_LINKS_PER_LGR_MAX];
|
u64 dma_addr[SMC_LINKS_PER_LGR_MAX];
|
||||||
/* mapped address of buffer */
|
/* mapped address of buffer */
|
||||||
void *cpu_addr; /* virtual address of buffer */
|
void *cpu_addr; /* virtual address of buffer */
|
||||||
struct ib_mr *mr_rx[SMC_LINKS_PER_LGR_MAX];
|
u32 rkey[SMC_LINKS_PER_LGR_MAX];
|
||||||
/* for rmb only:
|
/* for rmb only:
|
||||||
* rkey provided to peer
|
* rkey provided to peer
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -37,24 +37,6 @@ u8 local_systemid[SMC_SYSTEMID_LEN] = SMC_LOCAL_SYSTEMID_RESET; /* unique system
|
||||||
* identifier
|
* identifier
|
||||||
*/
|
*/
|
||||||
|
|
||||||
int smc_ib_get_memory_region(struct ib_pd *pd, int access_flags,
|
|
||||||
struct ib_mr **mr)
|
|
||||||
{
|
|
||||||
int rc;
|
|
||||||
|
|
||||||
if (*mr)
|
|
||||||
return 0; /* already done */
|
|
||||||
|
|
||||||
/* obtain unique key -
|
|
||||||
* next invocation of get_dma_mr returns a different key!
|
|
||||||
*/
|
|
||||||
*mr = pd->device->get_dma_mr(pd, access_flags);
|
|
||||||
rc = PTR_ERR_OR_ZERO(*mr);
|
|
||||||
if (IS_ERR(*mr))
|
|
||||||
*mr = NULL;
|
|
||||||
return rc;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int smc_ib_modify_qp_init(struct smc_link *lnk)
|
static int smc_ib_modify_qp_init(struct smc_link *lnk)
|
||||||
{
|
{
|
||||||
struct ib_qp_attr qp_attr;
|
struct ib_qp_attr qp_attr;
|
||||||
|
@ -210,7 +192,8 @@ int smc_ib_create_protection_domain(struct smc_link *lnk)
|
||||||
{
|
{
|
||||||
int rc;
|
int rc;
|
||||||
|
|
||||||
lnk->roce_pd = ib_alloc_pd(lnk->smcibdev->ibdev, 0);
|
lnk->roce_pd = ib_alloc_pd(lnk->smcibdev->ibdev,
|
||||||
|
IB_PD_UNSAFE_GLOBAL_RKEY);
|
||||||
rc = PTR_ERR_OR_ZERO(lnk->roce_pd);
|
rc = PTR_ERR_OR_ZERO(lnk->roce_pd);
|
||||||
if (IS_ERR(lnk->roce_pd))
|
if (IS_ERR(lnk->roce_pd))
|
||||||
lnk->roce_pd = NULL;
|
lnk->roce_pd = NULL;
|
||||||
|
|
|
@ -61,8 +61,6 @@ void smc_ib_dealloc_protection_domain(struct smc_link *lnk);
|
||||||
int smc_ib_create_protection_domain(struct smc_link *lnk);
|
int smc_ib_create_protection_domain(struct smc_link *lnk);
|
||||||
void smc_ib_destroy_queue_pair(struct smc_link *lnk);
|
void smc_ib_destroy_queue_pair(struct smc_link *lnk);
|
||||||
int smc_ib_create_queue_pair(struct smc_link *lnk);
|
int smc_ib_create_queue_pair(struct smc_link *lnk);
|
||||||
int smc_ib_get_memory_region(struct ib_pd *pd, int access_flags,
|
|
||||||
struct ib_mr **mr);
|
|
||||||
int smc_ib_ready_link(struct smc_link *lnk);
|
int smc_ib_ready_link(struct smc_link *lnk);
|
||||||
int smc_ib_modify_qp_rts(struct smc_link *lnk);
|
int smc_ib_modify_qp_rts(struct smc_link *lnk);
|
||||||
int smc_ib_modify_qp_reset(struct smc_link *lnk);
|
int smc_ib_modify_qp_reset(struct smc_link *lnk);
|
||||||
|
|
Loading…
Reference in New Issue