X-Git-Url: https://git.proxmox.com/?a=blobdiff_plain;f=rdma%2Fres.c;h=7956882ebbea25e4b26940f4b7d97edb7cb8d911;hb=fcdd2e0c68f2589e5d5c325f07f0e38afddbab6c;hp=074b9929a38b2f9e94fd301470a8815c3488be91;hpb=17678d3059ade722eeab4e4f51d50445b87c0a61;p=mirror_iproute2.git diff --git a/rdma/res.c b/rdma/res.c index 074b9929..7956882e 100644 --- a/rdma/res.c +++ b/rdma/res.c @@ -9,20 +9,24 @@ * Authors: Leon Romanovsky */ -#include "rdma.h" +#include "res.h" #include static int res_help(struct rd *rd) { pr_out("Usage: %s resource\n", rd->filename); pr_out(" resource show [DEV]\n"); - pr_out(" resource show [qp|cm_id]\n"); + pr_out(" resource show [qp|cm_id|pd|mr|cq]\n"); pr_out(" resource show qp link [DEV/PORT]\n"); pr_out(" resource show qp link [DEV/PORT] [FILTER-NAME FILTER-VALUE]\n"); pr_out(" resource show cm_id link [DEV/PORT]\n"); pr_out(" resource show cm_id link [DEV/PORT] [FILTER-NAME FILTER-VALUE]\n"); pr_out(" resource show cq link [DEV/PORT]\n"); pr_out(" resource show cq link [DEV/PORT] [FILTER-NAME FILTER-VALUE]\n"); + pr_out(" resource show pd dev [DEV]\n"); + pr_out(" resource show pd dev [DEV] [FILTER-NAME FILTER-VALUE]\n"); + pr_out(" resource show mr dev [DEV]\n"); + pr_out(" resource show mr dev [DEV] [FILTER-NAME FILTER-VALUE]\n"); return 0; } @@ -88,7 +92,7 @@ static int res_no_args_parse_cb(const struct nlmsghdr *nlh, void *data) return MNL_CB_OK; } -static int _res_send_msg(struct rd *rd, uint32_t command, mnl_cb_t callback) +int _res_send_msg(struct rd *rd, uint32_t command, mnl_cb_t callback) { uint32_t flags = NLM_F_REQUEST | NLM_F_ACK; uint32_t seq; @@ -115,27 +119,6 @@ static int _res_send_msg(struct rd *rd, uint32_t command, mnl_cb_t callback) return ret; } -#define RES_FUNC(name, command, valid_filters, strict_port) \ - static int _##name(struct rd *rd)\ - { \ - return _res_send_msg(rd, command, name##_parse_cb); \ - } \ - static int name(struct rd *rd) \ - {\ - int ret = rd_build_filter(rd, valid_filters); \ - if (ret) \ - return ret; \ - if ((uintptr_t)valid_filters != (uintptr_t)NULL) { \ - ret = rd_set_arg_to_devname(rd); \ - if (ret) \ - return ret;\ - } \ - if (strict_port) \ - return rd_exec_dev(rd, _##name); \ - else \ - return rd_exec_link(rd, _##name, strict_port); \ - } - static const char *path_mig_to_str(uint8_t idx) { static const char * const path_mig_str[] = { "MIGRATED", @@ -240,7 +223,7 @@ static void print_pathmig(struct rd *rd, uint32_t val, pr_out("path-mig-state %s ", path_mig_to_str(val)); } -static void print_pid(struct rd *rd, uint32_t val) +void print_pid(struct rd *rd, uint32_t val) { if (rd->json_output) jsonw_uint_field(rd->jw, "pid", val); @@ -248,8 +231,7 @@ static void print_pid(struct rd *rd, uint32_t val) pr_out("pid %u ", val); } -static void print_comm(struct rd *rd, const char *str, - struct nlattr **nla_line) +void print_comm(struct rd *rd, const char *str, struct nlattr **nla_line) { char tmp[18]; @@ -267,7 +249,7 @@ static void print_comm(struct rd *rd, const char *str, pr_out("comm %s ", tmp); } -static void print_dev(struct rd *rd, uint32_t idx, const char *name) +void print_dev(struct rd *rd, uint32_t idx, const char *name) { if (rd->json_output) { jsonw_uint_field(rd->jw, "ifindex", idx); @@ -295,7 +277,7 @@ static void print_link(struct rd *rd, uint32_t idx, const char *name, } } -static char *get_task_name(uint32_t pid) +char *get_task_name(uint32_t pid) { char *comm; FILE *f; @@ -316,6 +298,22 @@ static char *get_task_name(uint32_t pid) return comm; } +void print_key(struct rd *rd, const char *name, uint64_t val) +{ + if (rd->json_output) + jsonw_xint_field(rd->jw, name, val); + else + pr_out("%s 0x%" PRIx64 " ", name, val); +} + +void res_print_uint(struct rd *rd, const char *name, uint64_t val) +{ + if (rd->json_output) + jsonw_uint_field(rd->jw, name, val); + else + pr_out("%s %" PRIu64 " ", name, val); +} + static int res_qp_parse_cb(const struct nlmsghdr *nlh, void *data) { struct nlattr *tb[RDMA_NLDEV_ATTR_MAX] = {}; @@ -339,6 +337,7 @@ static int res_qp_parse_cb(const struct nlmsghdr *nlh, void *data) uint32_t lqpn, rqpn = 0, rq_psn = 0, sq_psn; uint8_t type, state, path_mig_state = 0; uint32_t port = 0, pid = 0; + uint32_t pdn = 0; char *comm = NULL; int err; @@ -365,6 +364,11 @@ static int res_qp_parse_cb(const struct nlmsghdr *nlh, void *data) if (rd_check_is_filtered(rd, "lqpn", lqpn)) continue; + if (nla_line[RDMA_NLDEV_ATTR_RES_PDN]) + pdn = mnl_attr_get_u32(nla_line[RDMA_NLDEV_ATTR_RES_PDN]); + if (rd_check_is_filtered(rd, "pdn", pdn)) + continue; + if (nla_line[RDMA_NLDEV_ATTR_RES_RQPN]) { rqpn = mnl_attr_get_u32(nla_line[RDMA_NLDEV_ATTR_RES_RQPN]); if (rd_check_is_filtered(rd, "rqpn", rqpn)) @@ -424,6 +428,8 @@ static int res_qp_parse_cb(const struct nlmsghdr *nlh, void *data) print_link(rd, idx, name, port, nla_line); print_lqpn(rd, lqpn); + if (nla_line[RDMA_NLDEV_ATTR_RES_PDN]) + res_print_uint(rd, "pdn", pdn); print_rqpn(rd, rqpn, nla_line); print_type(rd, type); @@ -570,6 +576,7 @@ static int res_cm_id_parse_cb(const struct nlmsghdr *nlh, void *data) uint32_t port = 0, pid = 0; uint8_t type = 0, state; uint32_t lqpn = 0, ps; + uint32_t cm_idn = 0; char *comm = NULL; int err; @@ -621,6 +628,8 @@ static int res_cm_id_parse_cb(const struct nlmsghdr *nlh, void *data) if (rd_check_is_string_filtered(rd, "src-addr", src_addr_str)) continue; + if (rd_check_is_filtered(rd, "src-port", src_port)) + continue; } if (nla_line[RDMA_NLDEV_ATTR_RES_DST_ADDR]) { @@ -630,14 +639,10 @@ static int res_cm_id_parse_cb(const struct nlmsghdr *nlh, void *data) if (rd_check_is_string_filtered(rd, "dst-addr", dst_addr_str)) continue; + if (rd_check_is_filtered(rd, "dst-port", dst_port)) + continue; } - if (rd_check_is_filtered(rd, "src-port", src_port)) - continue; - - if (rd_check_is_filtered(rd, "dst-port", dst_port)) - continue; - if (nla_line[RDMA_NLDEV_ATTR_RES_PID]) { pid = mnl_attr_get_u32( nla_line[RDMA_NLDEV_ATTR_RES_PID]); @@ -649,6 +654,12 @@ static int res_cm_id_parse_cb(const struct nlmsghdr *nlh, void *data) continue; } + if (nla_line[RDMA_NLDEV_ATTR_RES_CM_IDN]) + cm_idn = mnl_attr_get_u32( + nla_line[RDMA_NLDEV_ATTR_RES_CM_IDN]); + if (rd_check_is_filtered(rd, "cm-idn", cm_idn)) + continue; + if (nla_line[RDMA_NLDEV_ATTR_RES_KERN_NAME]) { /* discard const from mnl_attr_get_str */ comm = (char *)mnl_attr_get_str( @@ -667,6 +678,8 @@ static int res_cm_id_parse_cb(const struct nlmsghdr *nlh, void *data) print_ps(rd, ps); print_pid(rd, pid); print_comm(rd, comm, nla_line); + if (nla_line[RDMA_NLDEV_ATTR_RES_CM_IDN]) + res_print_uint(rd, "cm-idn", cm_idn); if (nla_line[RDMA_NLDEV_ATTR_RES_SRC_ADDR]) print_ipaddr(rd, "src-addr", src_addr_str, src_port); @@ -682,15 +695,7 @@ static int res_cm_id_parse_cb(const struct nlmsghdr *nlh, void *data) return MNL_CB_OK; } -static void print_cqe(struct rd *rd, uint32_t val) -{ - if (rd->json_output) - jsonw_uint_field(rd->jw, "cqe", val); - else - pr_out("cqe %u ", val); -} - -static void print_users(struct rd *rd, uint64_t val) +void print_users(struct rd *rd, uint64_t val) { if (rd->json_output) jsonw_uint_field(rd->jw, "users", val); @@ -698,331 +703,21 @@ static void print_users(struct rd *rd, uint64_t val) pr_out("users %" PRIu64 " ", val); } -static const char *poll_ctx_to_str(uint8_t idx) -{ - static const char * const cm_id_states_str[] = { - "DIRECT", "SOFTIRQ", "WORKQUEUE"}; - - if (idx < ARRAY_SIZE(cm_id_states_str)) - return cm_id_states_str[idx]; - return "UNKNOWN"; -} - -static void print_poll_ctx(struct rd *rd, uint8_t poll_ctx) -{ - if (rd->json_output) { - jsonw_string_field(rd->jw, "poll-ctx", - poll_ctx_to_str(poll_ctx)); - return; - } - pr_out("poll-ctx %s ", poll_ctx_to_str(poll_ctx)); -} - -static int res_cq_parse_cb(const struct nlmsghdr *nlh, void *data) -{ - struct nlattr *tb[RDMA_NLDEV_ATTR_MAX] = {}; - struct nlattr *nla_table, *nla_entry; - struct rd *rd = data; - const char *name; - uint32_t idx; - - mnl_attr_parse(nlh, 0, rd_attr_cb, tb); - if (!tb[RDMA_NLDEV_ATTR_DEV_INDEX] || - !tb[RDMA_NLDEV_ATTR_DEV_NAME] || - !tb[RDMA_NLDEV_ATTR_RES_CQ]) - return MNL_CB_ERROR; - - name = mnl_attr_get_str(tb[RDMA_NLDEV_ATTR_DEV_NAME]); - idx = mnl_attr_get_u32(tb[RDMA_NLDEV_ATTR_DEV_INDEX]); - nla_table = tb[RDMA_NLDEV_ATTR_RES_CQ]; - - mnl_attr_for_each_nested(nla_entry, nla_table) { - struct nlattr *nla_line[RDMA_NLDEV_ATTR_MAX] = {}; - char *comm = NULL; - uint32_t pid = 0; - uint8_t poll_ctx = 0; - uint64_t users; - uint32_t cqe; - int err; - - err = mnl_attr_parse_nested(nla_entry, rd_attr_cb, nla_line); - if (err != MNL_CB_OK) - return MNL_CB_ERROR; - - if (!nla_line[RDMA_NLDEV_ATTR_RES_CQE] || - !nla_line[RDMA_NLDEV_ATTR_RES_USECNT] || - (!nla_line[RDMA_NLDEV_ATTR_RES_PID] && - !nla_line[RDMA_NLDEV_ATTR_RES_KERN_NAME])) { - return MNL_CB_ERROR; - } - - cqe = mnl_attr_get_u32(nla_line[RDMA_NLDEV_ATTR_RES_CQE]); - - users = mnl_attr_get_u64(nla_line[RDMA_NLDEV_ATTR_RES_USECNT]); - if (rd_check_is_filtered(rd, "users", users)) - continue; - - if (nla_line[RDMA_NLDEV_ATTR_RES_POLL_CTX]) { - poll_ctx = mnl_attr_get_u8( - nla_line[RDMA_NLDEV_ATTR_RES_POLL_CTX]); - if (rd_check_is_string_filtered(rd, "poll-ctx", - poll_ctx_to_str(poll_ctx))) - continue; - } - - if (nla_line[RDMA_NLDEV_ATTR_RES_PID]) { - pid = mnl_attr_get_u32( - nla_line[RDMA_NLDEV_ATTR_RES_PID]); - comm = get_task_name(pid); - } - - if (rd_check_is_filtered(rd, "pid", pid)) { - free(comm); - continue; - } - - if (nla_line[RDMA_NLDEV_ATTR_RES_KERN_NAME]) - /* discard const from mnl_attr_get_str */ - comm = (char *)mnl_attr_get_str( - nla_line[RDMA_NLDEV_ATTR_RES_KERN_NAME]); - - if (rd->json_output) - jsonw_start_array(rd->jw); - - print_dev(rd, idx, name); - print_cqe(rd, cqe); - print_users(rd, users); - if (nla_line[RDMA_NLDEV_ATTR_RES_POLL_CTX]) - print_poll_ctx(rd, poll_ctx); - print_pid(rd, pid); - print_comm(rd, comm, nla_line); - - if (nla_line[RDMA_NLDEV_ATTR_RES_PID]) - free(comm); - - print_driver_table(rd, nla_line[RDMA_NLDEV_ATTR_DRIVER]); - newline(rd); - } - return MNL_CB_OK; -} - -static void print_key(struct rd *rd, const char *name, uint32_t val) -{ - if (rd->json_output) - jsonw_xint_field(rd->jw, name, val); - else - pr_out("%s 0x%x ", name, val); -} - -static void print_iova(struct rd *rd, uint64_t val) -{ - if (rd->json_output) - jsonw_xint_field(rd->jw, "iova", val); - else - pr_out("iova 0x%" PRIx64 " ", val); -} - -static void print_mrlen(struct rd *rd, uint64_t val) -{ - if (rd->json_output) - jsonw_uint_field(rd->jw, "mrlen", val); - else - pr_out("mrlen %" PRIu64 " ", val); -} - -static int res_mr_parse_cb(const struct nlmsghdr *nlh, void *data) -{ - struct nlattr *tb[RDMA_NLDEV_ATTR_MAX] = {}; - struct nlattr *nla_table, *nla_entry; - struct rd *rd = data; - const char *name; - uint32_t idx; - - mnl_attr_parse(nlh, 0, rd_attr_cb, tb); - if (!tb[RDMA_NLDEV_ATTR_DEV_INDEX] || - !tb[RDMA_NLDEV_ATTR_DEV_NAME] || - !tb[RDMA_NLDEV_ATTR_RES_MR]) - return MNL_CB_ERROR; - - name = mnl_attr_get_str(tb[RDMA_NLDEV_ATTR_DEV_NAME]); - idx = mnl_attr_get_u32(tb[RDMA_NLDEV_ATTR_DEV_INDEX]); - nla_table = tb[RDMA_NLDEV_ATTR_RES_MR]; - - mnl_attr_for_each_nested(nla_entry, nla_table) { - struct nlattr *nla_line[RDMA_NLDEV_ATTR_MAX] = {}; - uint32_t rkey = 0, lkey = 0; - uint64_t iova = 0, mrlen; - char *comm = NULL; - uint32_t pid = 0; - int err; - - err = mnl_attr_parse_nested(nla_entry, rd_attr_cb, nla_line); - if (err != MNL_CB_OK) - return MNL_CB_ERROR; - - if (!nla_line[RDMA_NLDEV_ATTR_RES_MRLEN] || - (!nla_line[RDMA_NLDEV_ATTR_RES_PID] && - !nla_line[RDMA_NLDEV_ATTR_RES_KERN_NAME])) { - return MNL_CB_ERROR; - } - - if (nla_line[RDMA_NLDEV_ATTR_RES_RKEY]) - rkey = mnl_attr_get_u32( - nla_line[RDMA_NLDEV_ATTR_RES_RKEY]); - if (nla_line[RDMA_NLDEV_ATTR_RES_LKEY]) - lkey = mnl_attr_get_u32( - nla_line[RDMA_NLDEV_ATTR_RES_LKEY]); - if (nla_line[RDMA_NLDEV_ATTR_RES_IOVA]) - iova = mnl_attr_get_u64( - nla_line[RDMA_NLDEV_ATTR_RES_IOVA]); - - mrlen = mnl_attr_get_u64(nla_line[RDMA_NLDEV_ATTR_RES_MRLEN]); - if (rd_check_is_filtered(rd, "mrlen", mrlen)) - continue; - - if (nla_line[RDMA_NLDEV_ATTR_RES_PID]) { - pid = mnl_attr_get_u32( - nla_line[RDMA_NLDEV_ATTR_RES_PID]); - comm = get_task_name(pid); - } - - if (rd_check_is_filtered(rd, "pid", pid)) { - free(comm); - continue; - } - - if (nla_line[RDMA_NLDEV_ATTR_RES_KERN_NAME]) - /* discard const from mnl_attr_get_str */ - comm = (char *)mnl_attr_get_str( - nla_line[RDMA_NLDEV_ATTR_RES_KERN_NAME]); - - if (rd->json_output) - jsonw_start_array(rd->jw); - - print_dev(rd, idx, name); - if (nla_line[RDMA_NLDEV_ATTR_RES_RKEY]) - print_key(rd, "rkey", rkey); - if (nla_line[RDMA_NLDEV_ATTR_RES_LKEY]) - print_key(rd, "lkey", lkey); - if (nla_line[RDMA_NLDEV_ATTR_RES_IOVA]) - print_iova(rd, iova); - print_mrlen(rd, mrlen); - print_pid(rd, pid); - print_comm(rd, comm, nla_line); - - if (nla_line[RDMA_NLDEV_ATTR_RES_PID]) - free(comm); - - print_driver_table(rd, nla_line[RDMA_NLDEV_ATTR_DRIVER]); - newline(rd); - } - return MNL_CB_OK; -} - -static int res_pd_parse_cb(const struct nlmsghdr *nlh, void *data) -{ - struct nlattr *tb[RDMA_NLDEV_ATTR_MAX] = {}; - struct nlattr *nla_table, *nla_entry; - struct rd *rd = data; - const char *name; - uint32_t idx; - - mnl_attr_parse(nlh, 0, rd_attr_cb, tb); - if (!tb[RDMA_NLDEV_ATTR_DEV_INDEX] || - !tb[RDMA_NLDEV_ATTR_DEV_NAME] || - !tb[RDMA_NLDEV_ATTR_RES_PD]) - return MNL_CB_ERROR; - - name = mnl_attr_get_str(tb[RDMA_NLDEV_ATTR_DEV_NAME]); - idx = mnl_attr_get_u32(tb[RDMA_NLDEV_ATTR_DEV_INDEX]); - nla_table = tb[RDMA_NLDEV_ATTR_RES_PD]; - - mnl_attr_for_each_nested(nla_entry, nla_table) { - uint32_t local_dma_lkey = 0, unsafe_global_rkey = 0; - struct nlattr *nla_line[RDMA_NLDEV_ATTR_MAX] = {}; - char *comm = NULL; - uint32_t pid = 0; - uint64_t users; - int err; - - err = mnl_attr_parse_nested(nla_entry, rd_attr_cb, nla_line); - if (err != MNL_CB_OK) - return MNL_CB_ERROR; - - if (!nla_line[RDMA_NLDEV_ATTR_RES_USECNT] || - (!nla_line[RDMA_NLDEV_ATTR_RES_PID] && - !nla_line[RDMA_NLDEV_ATTR_RES_KERN_NAME])) { - return MNL_CB_ERROR; - } - - if (nla_line[RDMA_NLDEV_ATTR_RES_LOCAL_DMA_LKEY]) - local_dma_lkey = mnl_attr_get_u32( - nla_line[RDMA_NLDEV_ATTR_RES_LOCAL_DMA_LKEY]); - - users = mnl_attr_get_u64(nla_line[RDMA_NLDEV_ATTR_RES_USECNT]); - if (rd_check_is_filtered(rd, "users", users)) - continue; - - if (nla_line[RDMA_NLDEV_ATTR_RES_UNSAFE_GLOBAL_RKEY]) - unsafe_global_rkey = mnl_attr_get_u32( - nla_line[RDMA_NLDEV_ATTR_RES_UNSAFE_GLOBAL_RKEY]); - - if (nla_line[RDMA_NLDEV_ATTR_RES_PID]) { - pid = mnl_attr_get_u32( - nla_line[RDMA_NLDEV_ATTR_RES_PID]); - comm = get_task_name(pid); - } - - if (rd_check_is_filtered(rd, "pid", pid)) - continue; - - if (nla_line[RDMA_NLDEV_ATTR_RES_KERN_NAME]) - /* discard const from mnl_attr_get_str */ - comm = (char *)mnl_attr_get_str( - nla_line[RDMA_NLDEV_ATTR_RES_KERN_NAME]); - - if (rd->json_output) - jsonw_start_array(rd->jw); - - print_dev(rd, idx, name); - if (nla_line[RDMA_NLDEV_ATTR_RES_LOCAL_DMA_LKEY]) - print_key(rd, "local_dma_lkey", local_dma_lkey); - print_users(rd, users); - if (nla_line[RDMA_NLDEV_ATTR_RES_UNSAFE_GLOBAL_RKEY]) - print_key(rd, "unsafe_global_rkey", unsafe_global_rkey); - print_pid(rd, pid); - print_comm(rd, comm, nla_line); - - if (nla_line[RDMA_NLDEV_ATTR_RES_PID]) - free(comm); - - print_driver_table(rd, nla_line[RDMA_NLDEV_ATTR_DRIVER]); - newline(rd); - } - return MNL_CB_OK; -} - RES_FUNC(res_no_args, RDMA_NLDEV_CMD_RES_GET, NULL, true); static const struct -filters qp_valid_filters[MAX_NUMBER_OF_FILTERS] = {{ .name = "link", - .is_number = false }, - { .name = "lqpn", - .is_number = true }, - { .name = "rqpn", - .is_number = true }, - { .name = "pid", - .is_number = true }, - { .name = "sq-psn", - .is_number = true }, - { .name = "rq-psn", - .is_number = true }, - { .name = "type", - .is_number = false }, - { .name = "path-mig-state", - .is_number = false }, - { .name = "state", - .is_number = false } }; +filters qp_valid_filters[MAX_NUMBER_OF_FILTERS] = { + { .name = "link", .is_number = false }, + { .name = "lqpn", .is_number = true }, + { .name = "rqpn", .is_number = true }, + { .name = "pid", .is_number = true }, + { .name = "sq-psn", .is_number = true }, + { .name = "rq-psn", .is_number = true }, + { .name = "type", .is_number = false }, + { .name = "path-mig-state", .is_number = false }, + { .name = "state", .is_number = false }, + { .name = "pdn", .is_number = true }, +}; RES_FUNC(res_qp, RDMA_NLDEV_CMD_RES_QP_GET, qp_valid_filters, false); @@ -1039,41 +734,12 @@ struct filters cm_id_valid_filters[MAX_NUMBER_OF_FILTERS] = { { .name = "src-addr", .is_number = false }, { .name = "src-port", .is_number = true }, { .name = "dst-addr", .is_number = false }, - { .name = "dst-port", .is_number = true } + { .name = "dst-port", .is_number = true }, + { .name = "cm-idn", .is_number = true } }; RES_FUNC(res_cm_id, RDMA_NLDEV_CMD_RES_CM_ID_GET, cm_id_valid_filters, false); -static const -struct filters cq_valid_filters[MAX_NUMBER_OF_FILTERS] = { - { .name = "dev", .is_number = false }, - { .name = "users", .is_number = true }, - { .name = "poll-ctx", .is_number = false }, - { .name = "pid", .is_number = true } -}; - -RES_FUNC(res_cq, RDMA_NLDEV_CMD_RES_CQ_GET, cq_valid_filters, true); - -static const -struct filters mr_valid_filters[MAX_NUMBER_OF_FILTERS] = { - { .name = "dev", .is_number = false }, - { .name = "rkey", .is_number = true }, - { .name = "lkey", .is_number = true }, - { .name = "mrlen", .is_number = true }, - { .name = "pid", .is_number = true } -}; - -RES_FUNC(res_mr, RDMA_NLDEV_CMD_RES_MR_GET, mr_valid_filters, true); - -static const -struct filters pd_valid_filters[MAX_NUMBER_OF_FILTERS] = { - { .name = "dev", .is_number = false }, - { .name = "users", .is_number = true }, - { .name = "pid", .is_number = true } -}; - -RES_FUNC(res_pd, RDMA_NLDEV_CMD_RES_PD_GET, pd_valid_filters, true); - static int res_show(struct rd *rd) { const struct rd_cmd cmds[] = {