Skip to content

Commit 465d6b4

Browse files
PatrisiousHaddadrleon
authored andcommitted
RDMA/core: Add support to set privileged QKEY parameter
Add netlink command that enables/disables privileged QKEY by default. It is disabled by default, since according to IB spec only privileged users are allowed to use privileged QKEY. According to the IB specification rel-1.6, section 3.5.3: "QKEYs with the most significant bit set are considered controlled QKEYs, and a HCA does not allow a consumer to arbitrarily specify a controlled QKEY." Using rdma tool, $rdma system set privileged-qkey on When enabled non-privileged users would be able to use controlled QKEYs which are considered privileged. Using rdma tool, $rdma system set privileged-qkey off When disabled only privileged users would be able to use controlled QKEYs. You can also use the command below to check the parameter state: $rdma system show netns shared privileged-qkey off copy-on-fork on Signed-off-by: Patrisious Haddad <[email protected]> Link: https://lore.kernel.org/r/90398be70a9d23d2aa9d0f9fd11d2c264c1be534.1696848201.git.leon@kernel.org Signed-off-by: Leon Romanovsky <[email protected]>
1 parent 45cfa88 commit 465d6b4

File tree

4 files changed

+60
-9
lines changed

4 files changed

+60
-9
lines changed

drivers/infiniband/core/core_priv.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -373,4 +373,5 @@ void rdma_umap_priv_init(struct rdma_umap_priv *priv,
373373

374374
void ib_cq_pool_cleanup(struct ib_device *dev);
375375

376+
bool rdma_nl_get_privileged_qkey(void);
376377
#endif /* _CORE_PRIV_H */

drivers/infiniband/core/nldev.c

Lines changed: 55 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,13 @@
4343
#include "restrack.h"
4444
#include "uverbs.h"
4545

46+
/*
47+
* This determines whether a non-privileged user is allowed to specify a
48+
* controlled QKEY or not, when true non-privileged user is allowed to specify
49+
* a controlled QKEY.
50+
*/
51+
static bool privileged_qkey;
52+
4653
typedef int (*res_fill_func_t)(struct sk_buff*, bool,
4754
struct rdma_restrack_entry*, uint32_t);
4855

@@ -156,6 +163,7 @@ static const struct nla_policy nldev_policy[RDMA_NLDEV_ATTR_MAX] = {
156163
[RDMA_NLDEV_SYS_ATTR_COPY_ON_FORK] = { .type = NLA_U8 },
157164
[RDMA_NLDEV_ATTR_STAT_HWCOUNTER_INDEX] = { .type = NLA_U32 },
158165
[RDMA_NLDEV_ATTR_STAT_HWCOUNTER_DYNAMIC] = { .type = NLA_U8 },
166+
[RDMA_NLDEV_SYS_ATTR_PRIVILEGED_QKEY_MODE] = { .type = NLA_U8 },
159167
};
160168

161169
static int put_driver_name_print_type(struct sk_buff *msg, const char *name,
@@ -237,6 +245,12 @@ int rdma_nl_put_driver_u64_hex(struct sk_buff *msg, const char *name, u64 value)
237245
}
238246
EXPORT_SYMBOL(rdma_nl_put_driver_u64_hex);
239247

248+
bool rdma_nl_get_privileged_qkey(void)
249+
{
250+
return privileged_qkey || capable(CAP_NET_RAW);
251+
}
252+
EXPORT_SYMBOL(rdma_nl_get_privileged_qkey);
253+
240254
static int fill_nldev_handle(struct sk_buff *msg, struct ib_device *device)
241255
{
242256
if (nla_put_u32(msg, RDMA_NLDEV_ATTR_DEV_INDEX, device->index))
@@ -1901,6 +1915,12 @@ static int nldev_sys_get_doit(struct sk_buff *skb, struct nlmsghdr *nlh,
19011915
return err;
19021916
}
19031917

1918+
err = nla_put_u8(msg, RDMA_NLDEV_SYS_ATTR_PRIVILEGED_QKEY_MODE,
1919+
(u8)privileged_qkey);
1920+
if (err) {
1921+
nlmsg_free(msg);
1922+
return err;
1923+
}
19041924
/*
19051925
* Copy-on-fork is supported.
19061926
* See commits:
@@ -1917,18 +1937,11 @@ static int nldev_sys_get_doit(struct sk_buff *skb, struct nlmsghdr *nlh,
19171937
return rdma_nl_unicast(sock_net(skb->sk), msg, NETLINK_CB(skb).portid);
19181938
}
19191939

1920-
static int nldev_set_sys_set_doit(struct sk_buff *skb, struct nlmsghdr *nlh,
1921-
struct netlink_ext_ack *extack)
1940+
static int nldev_set_sys_set_netns_doit(struct nlattr *tb[])
19221941
{
1923-
struct nlattr *tb[RDMA_NLDEV_ATTR_MAX];
19241942
u8 enable;
19251943
int err;
19261944

1927-
err = nlmsg_parse(nlh, 0, tb, RDMA_NLDEV_ATTR_MAX - 1,
1928-
nldev_policy, extack);
1929-
if (err || !tb[RDMA_NLDEV_SYS_ATTR_NETNS_MODE])
1930-
return -EINVAL;
1931-
19321945
enable = nla_get_u8(tb[RDMA_NLDEV_SYS_ATTR_NETNS_MODE]);
19331946
/* Only 0 and 1 are supported */
19341947
if (enable > 1)
@@ -1938,6 +1951,40 @@ static int nldev_set_sys_set_doit(struct sk_buff *skb, struct nlmsghdr *nlh,
19381951
return err;
19391952
}
19401953

1954+
static int nldev_set_sys_set_pqkey_doit(struct nlattr *tb[])
1955+
{
1956+
u8 enable;
1957+
1958+
enable = nla_get_u8(tb[RDMA_NLDEV_SYS_ATTR_PRIVILEGED_QKEY_MODE]);
1959+
/* Only 0 and 1 are supported */
1960+
if (enable > 1)
1961+
return -EINVAL;
1962+
1963+
privileged_qkey = enable;
1964+
return 0;
1965+
}
1966+
1967+
static int nldev_set_sys_set_doit(struct sk_buff *skb, struct nlmsghdr *nlh,
1968+
struct netlink_ext_ack *extack)
1969+
{
1970+
struct nlattr *tb[RDMA_NLDEV_ATTR_MAX];
1971+
int err;
1972+
1973+
err = nlmsg_parse(nlh, 0, tb, RDMA_NLDEV_ATTR_MAX - 1,
1974+
nldev_policy, extack);
1975+
if (err)
1976+
return -EINVAL;
1977+
1978+
if (tb[RDMA_NLDEV_SYS_ATTR_NETNS_MODE])
1979+
return nldev_set_sys_set_netns_doit(tb);
1980+
1981+
if (tb[RDMA_NLDEV_SYS_ATTR_PRIVILEGED_QKEY_MODE])
1982+
return nldev_set_sys_set_pqkey_doit(tb);
1983+
1984+
return -EINVAL;
1985+
}
1986+
1987+
19411988
static int nldev_stat_set_mode_doit(struct sk_buff *msg,
19421989
struct netlink_ext_ack *extack,
19431990
struct nlattr *tb[],

drivers/infiniband/core/uverbs_cmd.c

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1851,7 +1851,8 @@ static int modify_qp(struct uverbs_attr_bundle *attrs,
18511851
if (cmd->base.attr_mask & IB_QP_PATH_MIG_STATE)
18521852
attr->path_mig_state = cmd->base.path_mig_state;
18531853
if (cmd->base.attr_mask & IB_QP_QKEY) {
1854-
if (cmd->base.qkey & IB_QP_SET_QKEY && !capable(CAP_NET_RAW)) {
1854+
if (cmd->base.qkey & IB_QP_SET_QKEY &&
1855+
!rdma_nl_get_privileged_qkey()) {
18551856
ret = -EPERM;
18561857
goto release_qp;
18571858
}

include/uapi/rdma/rdma_netlink.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -556,6 +556,8 @@ enum rdma_nldev_attr {
556556
RDMA_NLDEV_ATTR_STAT_HWCOUNTER_INDEX, /* u32 */
557557
RDMA_NLDEV_ATTR_STAT_HWCOUNTER_DYNAMIC, /* u8 */
558558

559+
RDMA_NLDEV_SYS_ATTR_PRIVILEGED_QKEY_MODE, /* u8 */
560+
559561
/*
560562
* Always the end
561563
*/

0 commit comments

Comments
 (0)