* RE: [PATCH net] staging: fsl-dpaa2: ethsw: Add missing netdevice check
From: Ioana Ciornei @ 2019-02-23 8:45 UTC (permalink / raw)
To: Florian Fainelli, netdev@vger.kernel.org
Cc: Ioana Ciocoi Radulescu, Greg Kroah-Hartman,
open list:DPAA2 ETHERNET SWITCH DRIVER,
open list:STAGING SUBSYSTEM
In-Reply-To: <20190222220214.25401-1-f.fainelli@gmail.com>
> Subject: [PATCH net] staging: fsl-dpaa2: ethsw: Add missing netdevice check
>
> port_switchdev_event() does not check that the target network device is
> actually backed by the ethsw driver, this could be problematic in a stacked
> environment case.
>
Just FYI, I sent a patch set containing a similar patch verifying if the netdev is backed by the ethsw:
https://lkml.org/lkml/2019/2/6/216
I sent the entire patch set against the staging tree.
Ioana C
> Fixes: 44baaa43d7cc ("staging: fsl-dpaa2/ethsw: Add Freescale DPAA2 Ethernet
> Switch driver")
> Signed-off-by: Florian Fainelli <f.fainelli@gmail.com>
> ---
> drivers/staging/fsl-dpaa2/ethsw/ethsw.c | 3 +++
> 1 file changed, 3 insertions(+)
>
> diff --git a/drivers/staging/fsl-dpaa2/ethsw/ethsw.c b/drivers/staging/fsl-
> dpaa2/ethsw/ethsw.c
> index daabaceeea52..2edd82f5229a 100644
> --- a/drivers/staging/fsl-dpaa2/ethsw/ethsw.c
> +++ b/drivers/staging/fsl-dpaa2/ethsw/ethsw.c
> @@ -1047,6 +1047,9 @@ static int port_switchdev_event(struct notifier_block
> *unused,
> struct ethsw_switchdev_event_work *switchdev_work;
> struct switchdev_notifier_fdb_info *fdb_info = ptr;
>
> + if (!ethsw_port_dev_check(dev))
> + return NOTIFY_DONE;
> +
> switchdev_work = kzalloc(sizeof(*switchdev_work), GFP_ATOMIC);
> if (!switchdev_work)
> return NOTIFY_BAD;
> --
> 2.17.1
^ permalink raw reply
* [PATCH 0/3] soc: fsl: dpio: enable and configure cache stashing
From: Ioana Ciornei @ 2019-02-23 8:48 UTC (permalink / raw)
To: Leo Li
Cc: Roy Pledge, Ioana Ciocoi Radulescu, Laurentiu Tudor, Horia Geanta,
brouer@redhat.com, netdev@vger.kernel.org,
linux-kernel@vger.kernel.org, Ioana Ciornei
The first two patches enable cache stashing and configure the core cluster
destination per software portal while the third patch is the one
configuring the amount of stashing on a queue.
Ioana Ciornei (3):
soc: fsl: dpio: enable frame data cache stashing per software portal
soc: fsl: dpio: configure cache stashing destination
dpaa2-eth: configure the cache stashing amount on a queue
drivers/net/ethernet/freescale/dpaa2/dpaa2-eth.c | 7 +++-
drivers/soc/fsl/Kconfig | 1 +
drivers/soc/fsl/dpio/dpio-cmd.h | 5 +++
drivers/soc/fsl/dpio/dpio-driver.c | 52 ++++++++++++++++++++++++
drivers/soc/fsl/dpio/dpio.c | 16 ++++++++
drivers/soc/fsl/dpio/dpio.h | 5 +++
drivers/soc/fsl/dpio/qbman-portal.c | 4 +-
7 files changed, 87 insertions(+), 3 deletions(-)
--
1.9.1
^ permalink raw reply
* [PATCH 1/3] soc: fsl: dpio: enable frame data cache stashing per software portal
From: Ioana Ciornei @ 2019-02-23 8:48 UTC (permalink / raw)
To: Leo Li
Cc: Roy Pledge, Ioana Ciocoi Radulescu, Laurentiu Tudor, Horia Geanta,
brouer@redhat.com, netdev@vger.kernel.org,
linux-kernel@vger.kernel.org, Ioana Ciornei
In-Reply-To: <20190223084816.28985-1-ioana.ciornei@nxp.com>
Enable cache stashing on the frame data dequeued using this software
portal. Also, enable dropping a stash request transaction when the
target request queue is almost full.
Signed-off-by: Ioana Ciornei <ioana.ciornei@nxp.com>
---
drivers/soc/fsl/dpio/qbman-portal.c | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/drivers/soc/fsl/dpio/qbman-portal.c b/drivers/soc/fsl/dpio/qbman-portal.c
index 5a73397..d020135 100644
--- a/drivers/soc/fsl/dpio/qbman-portal.c
+++ b/drivers/soc/fsl/dpio/qbman-portal.c
@@ -169,9 +169,9 @@ struct qbman_swp *qbman_swp_init(const struct qbman_swp_desc *d)
3, /* RPM: Valid bit mode, RCR in array mode */
2, /* DCM: Discrete consumption ack mode */
3, /* EPM: Valid bit mode, EQCR in array mode */
- 0, /* mem stashing drop enable == FALSE */
+ 1, /* mem stashing drop enable == TRUE */
1, /* mem stashing priority == TRUE */
- 0, /* mem stashing enable == FALSE */
+ 1, /* mem stashing enable == TRUE */
1, /* dequeue stashing priority == TRUE */
0, /* dequeue stashing enable == FALSE */
0); /* EQCR_CI stashing priority == FALSE */
--
1.9.1
^ permalink raw reply related
* [PATCH 2/3] soc: fsl: dpio: configure cache stashing destination
From: Ioana Ciornei @ 2019-02-23 8:48 UTC (permalink / raw)
To: Leo Li
Cc: Roy Pledge, Ioana Ciocoi Radulescu, Laurentiu Tudor, Horia Geanta,
brouer@redhat.com, netdev@vger.kernel.org,
linux-kernel@vger.kernel.org, Ioana Ciornei
In-Reply-To: <20190223084816.28985-1-ioana.ciornei@nxp.com>
Depending on the SoC version and the CPU id, configure the cache
stashing destination for a specific dpio.
Signed-off-by: Ioana Ciornei <ioana.ciornei@nxp.com>
---
drivers/soc/fsl/Kconfig | 1 +
drivers/soc/fsl/dpio/dpio-cmd.h | 5 ++++
drivers/soc/fsl/dpio/dpio-driver.c | 52 ++++++++++++++++++++++++++++++++++++++
drivers/soc/fsl/dpio/dpio.c | 16 ++++++++++++
drivers/soc/fsl/dpio/dpio.h | 5 ++++
5 files changed, 79 insertions(+)
diff --git a/drivers/soc/fsl/Kconfig b/drivers/soc/fsl/Kconfig
index 8f80e8b..61f8e14 100644
--- a/drivers/soc/fsl/Kconfig
+++ b/drivers/soc/fsl/Kconfig
@@ -22,6 +22,7 @@ config FSL_GUTS
config FSL_MC_DPIO
tristate "QorIQ DPAA2 DPIO driver"
depends on FSL_MC_BUS
+ select SOC_BUS
help
Driver for the DPAA2 DPIO object. A DPIO provides queue and
buffer management facilities for software to interact with
diff --git a/drivers/soc/fsl/dpio/dpio-cmd.h b/drivers/soc/fsl/dpio/dpio-cmd.h
index 5814d2f..e13fd3a 100644
--- a/drivers/soc/fsl/dpio/dpio-cmd.h
+++ b/drivers/soc/fsl/dpio/dpio-cmd.h
@@ -26,6 +26,7 @@
#define DPIO_CMDID_DISABLE DPIO_CMD(0x003)
#define DPIO_CMDID_GET_ATTR DPIO_CMD(0x004)
#define DPIO_CMDID_RESET DPIO_CMD(0x005)
+#define DPIO_CMDID_SET_STASHING_DEST DPIO_CMD(0x120)
struct dpio_cmd_open {
__le32 dpio_id;
@@ -47,4 +48,8 @@ struct dpio_rsp_get_attr {
__le32 qbman_version;
};
+struct dpio_stashing_dest {
+ u8 sdest;
+};
+
#endif /* _FSL_DPIO_CMD_H */
diff --git a/drivers/soc/fsl/dpio/dpio-driver.c b/drivers/soc/fsl/dpio/dpio-driver.c
index a28799b..c0cdc89 100644
--- a/drivers/soc/fsl/dpio/dpio-driver.c
+++ b/drivers/soc/fsl/dpio/dpio-driver.c
@@ -14,6 +14,7 @@
#include <linux/dma-mapping.h>
#include <linux/delay.h>
#include <linux/io.h>
+#include <linux/sys_soc.h>
#include <linux/fsl/mc.h>
#include <soc/fsl/dpaa2-io.h>
@@ -32,6 +33,46 @@ struct dpio_priv {
static cpumask_var_t cpus_unused_mask;
+static const struct soc_device_attribute ls1088a_soc[] = {
+ {.family = "QorIQ LS1088A"},
+ { /* sentinel */ }
+};
+
+static const struct soc_device_attribute ls2080a_soc[] = {
+ {.family = "QorIQ LS2080A"},
+ { /* sentinel */ }
+};
+
+static const struct soc_device_attribute ls2088a_soc[] = {
+ {.family = "QorIQ LS2088A"},
+ { /* sentinel */ }
+};
+
+static const struct soc_device_attribute lx2160a_soc[] = {
+ {.family = "QorIQ LX2160A"},
+ { /* sentinel */ }
+};
+
+static int dpaa2_dpio_get_cluster_sdest(struct fsl_mc_device *dpio_dev, int cpu)
+{
+ int cluster_base, cluster_size;
+
+ if (soc_device_match(ls1088a_soc)) {
+ cluster_base = 2;
+ cluster_size = 4;
+ } else if (soc_device_match(ls2080a_soc) ||
+ soc_device_match(ls2088a_soc) ||
+ soc_device_match(lx2160a_soc)) {
+ cluster_base = 0;
+ cluster_size = 2;
+ } else {
+ dev_err(&dpio_dev->dev, "unknown SoC version\n");
+ return -1;
+ }
+
+ return cluster_base + cpu / cluster_size;
+}
+
static irqreturn_t dpio_irq_handler(int irq_num, void *arg)
{
struct device *dev = (struct device *)arg;
@@ -89,6 +130,7 @@ static int dpaa2_dpio_probe(struct fsl_mc_device *dpio_dev)
int err = -ENOMEM;
struct device *dev = &dpio_dev->dev;
int possible_next_cpu;
+ int sdest;
priv = devm_kzalloc(dev, sizeof(*priv), GFP_KERNEL);
if (!priv)
@@ -145,6 +187,16 @@ static int dpaa2_dpio_probe(struct fsl_mc_device *dpio_dev)
desc.cpu = possible_next_cpu;
cpumask_clear_cpu(possible_next_cpu, cpus_unused_mask);
+ sdest = dpaa2_dpio_get_cluster_sdest(dpio_dev, desc.cpu);
+ if (sdest >= 0) {
+ err = dpio_set_stashing_destination(dpio_dev->mc_io, 0,
+ dpio_dev->mc_handle,
+ sdest);
+ if (err)
+ dev_err(dev, "dpio_set_stashing_destination failed for cpu%d\n",
+ desc.cpu);
+ }
+
/*
* Set the CENA regs to be the cache inhibited area of the portal to
* avoid coherency issues if a user migrates to another core.
diff --git a/drivers/soc/fsl/dpio/dpio.c b/drivers/soc/fsl/dpio/dpio.c
index 521bc69..af74c59 100644
--- a/drivers/soc/fsl/dpio/dpio.c
+++ b/drivers/soc/fsl/dpio/dpio.c
@@ -166,6 +166,22 @@ int dpio_get_attributes(struct fsl_mc_io *mc_io,
return 0;
}
+int dpio_set_stashing_destination(struct fsl_mc_io *mc_io,
+ u32 cmd_flags,
+ u16 token,
+ u8 sdest)
+{
+ struct fsl_mc_command cmd = { 0 };
+ struct dpio_stashing_dest *dpio_cmd;
+
+ cmd.header = mc_encode_cmd_header(DPIO_CMDID_SET_STASHING_DEST,
+ cmd_flags, token);
+ dpio_cmd = (struct dpio_stashing_dest *)cmd.params;
+ dpio_cmd->sdest = sdest;
+
+ return mc_send_command(mc_io, &cmd);
+}
+
/**
* dpio_get_api_version - Get Data Path I/O API version
* @mc_io: Pointer to MC portal's DPIO object
diff --git a/drivers/soc/fsl/dpio/dpio.h b/drivers/soc/fsl/dpio/dpio.h
index b2ac4ba..da06f72 100644
--- a/drivers/soc/fsl/dpio/dpio.h
+++ b/drivers/soc/fsl/dpio/dpio.h
@@ -75,6 +75,11 @@ int dpio_get_attributes(struct fsl_mc_io *mc_io,
u16 token,
struct dpio_attr *attr);
+int dpio_set_stashing_destination(struct fsl_mc_io *mc_io,
+ u32 cmd_flags,
+ u16 token,
+ u8 dest);
+
int dpio_get_api_version(struct fsl_mc_io *mc_io,
u32 cmd_flags,
u16 *major_ver,
--
1.9.1
^ permalink raw reply related
* [PATCH 3/3] dpaa2-eth: configure the cache stashing amount on a queue
From: Ioana Ciornei @ 2019-02-23 8:48 UTC (permalink / raw)
To: Leo Li
Cc: Roy Pledge, Ioana Ciocoi Radulescu, Laurentiu Tudor, Horia Geanta,
brouer@redhat.com, netdev@vger.kernel.org,
linux-kernel@vger.kernel.org, Ioana Ciornei
In-Reply-To: <20190223084816.28985-1-ioana.ciornei@nxp.com>
Configure the amount of 64 bytes of frame, annotation and context data
that will be cache stashed for a specific frame queue. Since the frame
context is not used, configure that only 64 bytes of frame data and 64
bytes of annotation will be stashed.
Signed-off-by: Ioana Ciornei <ioana.ciornei@nxp.com>
---
drivers/net/ethernet/freescale/dpaa2/dpaa2-eth.c | 7 ++++++-
1 file changed, 6 insertions(+), 1 deletion(-)
diff --git a/drivers/net/ethernet/freescale/dpaa2/dpaa2-eth.c b/drivers/net/ethernet/freescale/dpaa2/dpaa2-eth.c
index c500ea7..3c03fca8 100644
--- a/drivers/net/ethernet/freescale/dpaa2/dpaa2-eth.c
+++ b/drivers/net/ethernet/freescale/dpaa2/dpaa2-eth.c
@@ -2303,9 +2303,14 @@ static int setup_rx_flow(struct dpaa2_eth_priv *priv,
queue.destination.type = DPNI_DEST_DPCON;
queue.destination.priority = 1;
queue.user_context = (u64)(uintptr_t)fq;
+ queue.flc.stash_control = 1;
+ queue.flc.value &= 0xFFFFFFFFFFFFFFC0;
+ /* 01 01 00 - data, annotation, flow context */
+ queue.flc.value |= 0x14;
err = dpni_set_queue(priv->mc_io, 0, priv->mc_token,
DPNI_QUEUE_RX, 0, fq->flowid,
- DPNI_QUEUE_OPT_USER_CTX | DPNI_QUEUE_OPT_DEST,
+ DPNI_QUEUE_OPT_USER_CTX | DPNI_QUEUE_OPT_DEST |
+ DPNI_QUEUE_OPT_FLC,
&queue);
if (err) {
dev_err(dev, "dpni_set_queue(RX) failed\n");
--
1.9.1
^ permalink raw reply related
* Re: [PATCH] net: phy: realtek: Dummy IRQ calls for RTL8366RB
From: Heiner Kallweit @ 2019-02-23 9:00 UTC (permalink / raw)
To: Linus Walleij, Andrew Lunn, Florian Fainelli; +Cc: netdev
In-Reply-To: <20190223023639.27038-1-linus.walleij@linaro.org>
On 23.02.2019 03:36, Linus Walleij wrote:
> This fixes a regression introduced by
> commit 0d2e778e38e0ddffab4bb2b0e9ed2ad5165c4bf7
> "net: phy: replace PHY_HAS_INTERRUPT with a check for
> config_intr and ack_interrupt".
>
> This assumes that a PHY cannot trigger interrupt unless
> it has .config_intr() or .ack_interrupt() implemented.
> A later patch makes the code assume both need to be
> implemented for interrupts to be present.
>
> But this PHY (which is inside a DSA) will happily
> fire interrupts without either callback.
>
> Implement a dummy callback for .config_intr() and
> .ack_interrupt() as a workaround.
>
> Tested on the RTL8366RB on D-Link DIR-685.
>
> Fixes: 0d2e778e38e0 ("net: phy: replace PHY_HAS_INTERRUPT with a check for config_intr and ack_interrupt")
> Cc: Heiner Kallweit <hkallweit1@gmail.com>
> Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
> ---
> drivers/net/phy/realtek.c | 13 +++++++++++++
> 1 file changed, 13 insertions(+)
>
> diff --git a/drivers/net/phy/realtek.c b/drivers/net/phy/realtek.c
> index c6010fb1aa0f..31372be44570 100644
> --- a/drivers/net/phy/realtek.c
> +++ b/drivers/net/phy/realtek.c
> @@ -211,6 +211,17 @@ static int rtl8366rb_config_init(struct phy_device *phydev)
> return ret;
> }
>
> +static int rtl8366rb_ack_interrupt(struct phy_device *phydev)
> +{
> + return 0;
> +}
> +
> +static int rtl8366rb_config_intr(struct phy_device *phydev)
> +{
> + /* Dummy function to make sure we get interrupts */
> + return 0;
> +}
> +
Maybe we should place these dummy calls in the core. We have this for
other cases already, see e.g. genphy_no_soft_reset. Then these dummies
can be re-used by other drivers that may have the need to do so.
Names could be:
genphy_no_ack_interrupt
genphy_no_config_intr
> static struct phy_driver realtek_drvs[] = {
> {
> PHY_ID_MATCH_EXACT(0x00008201),
> @@ -282,6 +293,8 @@ static struct phy_driver realtek_drvs[] = {
> .name = "RTL8366RB Gigabit Ethernet",
> .features = PHY_GBIT_FEATURES,
> .config_init = &rtl8366rb_config_init,
> + .ack_interrupt = &rtl8366rb_ack_interrupt,
> + .config_intr = &rtl8366rb_config_intr,
> .suspend = genphy_suspend,
> .resume = genphy_resume,
> },
>
^ permalink raw reply
* Re: [PATCH iproute2-next v1 04/19] rdma: Provide parent context index for all objects except CM_ID
From: Leon Romanovsky @ 2019-02-23 9:03 UTC (permalink / raw)
To: Steve Wise
Cc: 'David Ahern', 'netdev',
'RDMA mailing list', 'Stephen Hemminger'
In-Reply-To: <01d401d4ca21$bfad6390$3f082ab0$@opengridcomputing.com>
[-- Attachment #1: Type: text/plain, Size: 8063 bytes --]
On Thu, Feb 21, 2019 at 02:12:19PM -0600, Steve Wise wrote:
>
>
> > -----Original Message-----
> > From: linux-rdma-owner@vger.kernel.org <linux-rdma-
> > owner@vger.kernel.org> On Behalf Of Leon Romanovsky
> > Sent: Wednesday, February 20, 2019 1:21 AM
> > To: David Ahern <dsahern@gmail.com>
> > Cc: Leon Romanovsky <leonro@mellanox.com>; netdev
> > <netdev@vger.kernel.org>; RDMA mailing list <linux-
> > rdma@vger.kernel.org>; Stephen Hemminger
> > <stephen@networkplumber.org>
> > Subject: [PATCH iproute2-next v1 04/19] rdma: Provide parent context index
> > for all objects except CM_ID
> >
> > From: Leon Romanovsky <leonro@mellanox.com>
> >
> > Allow users to correlate allocated object with relevant parent
> >
> > [leonro@server ~]$ rdma res show pd
> > dev mlx5_0 users 5 pid 0 comm [ib_core] pdn 1
> > dev mlx5_0 users 7 pid 0 comm [ib_ipoib] pdn 2
> > dev mlx5_0 users 0 pid 0 comm [mlx5_ib] pdn 3
> > dev mlx5_0 users 2 pid 548 comm ibv_rc_pingpong ctxn 0 pdn 4
> >
> > [leonro@server ~]$ rdma res show cq cqn 0-100
> > dev mlx5_0 cqe 2047 users 6 poll-ctx UNBOUND_WORKQUEUE pid 0 comm
> > [ib_core] cqn 2
> > dev mlx5_0 cqe 255 users 2 poll-ctx SOFTIRQ pid 0 comm [mlx5_ib] cqn 3
> > dev mlx5_0 cqe 511 users 1 poll-ctx DIRECT pid 0 comm [ib_ipoib] cqn 4
> > dev mlx5_0 cqe 255 users 1 poll-ctx DIRECT pid 0 comm [ib_ipoib] cqn 5
> > dev mlx5_0 cqe 255 users 0 poll-ctx SOFTIRQ pid 0 comm [mlx5_ib] cqn 6
> > dev mlx5_0 cqe 511 users 2 pid 548 comm ibv_rc_pingpong cqn 7 ctxn 0
> >
> > [leonro@server ~]$ rdma res show mr
> > dev mlx5_0 mrlen 4096 pid 548 comm ibv_rc_pingpong mrn 4 pdn 0
> >
> > [leonro@nps-server-14-015 ~]$ /images/leonro/src/iproute2/rdma/rdma res
> > show qp
> > link mlx5_0/1 lqpn 0 type SMI state RTS sq-psn 0 pid 0 comm [ib_core]
> > link mlx5_0/1 lqpn 1 type GSI state RTS sq-psn 0 pid 0 comm [ib_core]
> > link mlx5_0/1 lqpn 7 type UD state RTS sq-psn 0 pid 0 comm [ib_core]
> > link mlx5_0/1 lqpn 8 type UD state RTS sq-psn 0 pid 0 comm [ib_ipoib]
> > link mlx5_0/1 lqpn 9 pdn 4 rqpn 0 type RC state INIT rq-psn 0 sq-psn 0
> path-
> > mig-state MIGRATED pid 548 comm ibv_rc_pingpong
> >
> > Signed-off-by: Leon Romanovsky <leonro@mellanox.com>
> > ---
> > rdma/res.c | 110 +++++++++++++++++++++++++++++++++++----------------
> > --
> > 1 file changed, 72 insertions(+), 38 deletions(-)
> >
> > diff --git a/rdma/res.c b/rdma/res.c
> > index f941de5c..308f66c0 100644
> > --- a/rdma/res.c
> > +++ b/rdma/res.c
> > @@ -320,6 +320,22 @@ static char *get_task_name(uint32_t pid)
> > return comm;
> > }
> >
> > +static 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);
> > +}
> > +
> > +static 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] = {};
> > @@ -343,6 +359,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;
> >
> > @@ -369,6 +386,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))
> > @@ -428,6 +450,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);
> > @@ -549,22 +573,6 @@ static int ss_ntop(struct nlattr *nla_line, char
> > *addr_str, uint16_t *port)
> > return 0;
> > }
> >
> > -static 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);
> > -}
> > -
> > -static 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_cm_id_parse_cb(const struct nlmsghdr *nlh, void *data)
> > {
> > struct nlattr *tb[RDMA_NLDEV_ATTR_MAX] = {};
> > @@ -768,6 +776,7 @@ static int res_cq_parse_cb(const struct nlmsghdr *nlh,
> > void *data)
> > char *comm = NULL;
> > uint32_t pid = 0;
> > uint8_t poll_ctx = 0;
> > + uint32_t ctxn = 0;
> > uint32_t cqn = 0;
> > uint64_t users;
> > uint32_t cqe;
> > @@ -815,6 +824,12 @@ static int res_cq_parse_cb(const struct nlmsghdr
> > *nlh, void *data)
> > if (rd_check_is_filtered(rd, "cqn", cqn))
> > continue;
> >
> > + if (nla_line[RDMA_NLDEV_ATTR_RES_CTXN])
> > + ctxn = mnl_attr_get_u32(
> > + nla_line[RDMA_NLDEV_ATTR_RES_CTXN]);
> > + if (rd_check_is_filtered(rd, "ctxn", ctxn))
> > + continue;
> > +
> > if (nla_line[RDMA_NLDEV_ATTR_RES_KERN_NAME])
> > /* discard const from mnl_attr_get_str */
> > comm = (char *)mnl_attr_get_str(
> > @@ -833,6 +848,8 @@ static int res_cq_parse_cb(const struct nlmsghdr *nlh,
> > void *data)
> >
> > if (nla_line[RDMA_NLDEV_ATTR_RES_CQN])
> > res_print_uint(rd, "cqn", cqn);
> > + if (nla_line[RDMA_NLDEV_ATTR_RES_CTXN])
> > + res_print_uint(rd, "ctxn", ctxn);
> >
> > if (nla_line[RDMA_NLDEV_ATTR_RES_PID])
> > free(comm);
> > @@ -866,6 +883,7 @@ static int res_mr_parse_cb(const struct nlmsghdr
> > *nlh, void *data)
> > uint32_t rkey = 0, lkey = 0;
> > uint64_t iova = 0, mrlen;
> > char *comm = NULL;
> > + uint32_t pdn = 0;
> > uint32_t mrn = 0;
> > uint32_t pid = 0;
> > int err;
> > @@ -911,6 +929,12 @@ static int res_mr_parse_cb(const struct nlmsghdr
> > *nlh, void *data)
> > if (rd_check_is_filtered(rd, "mrn", mrn))
> > 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_KERN_NAME])
> > /* discard const from mnl_attr_get_str */
> > comm = (char *)mnl_attr_get_str(
> > @@ -933,6 +957,9 @@ static int res_mr_parse_cb(const struct nlmsghdr
> > *nlh, void *data)
> > if (nla_line[RDMA_NLDEV_ATTR_RES_MRN])
> > res_print_uint(rd, "mrn", mrn);
> >
> > + if (nla_line[RDMA_NLDEV_ATTR_RES_PDN])
> > + res_print_uint(rd, "pdn", pdn);
> > +
> > if (nla_line[RDMA_NLDEV_ATTR_RES_PID])
> > free(comm);
> >
> > @@ -964,6 +991,7 @@ static int res_pd_parse_cb(const struct nlmsghdr
> > *nlh, void *data)
> > uint32_t local_dma_lkey = 0, unsafe_global_rkey = 0;
> > struct nlattr *nla_line[RDMA_NLDEV_ATTR_MAX] = {};
> > char *comm = NULL;
> > + uint32_t ctxn = 0;
> > uint32_t pid = 0;
> > uint32_t pdn = 0;
> > uint64_t users;
> > @@ -997,7 +1025,13 @@ static int res_pd_parse_cb(const struct nlmsghdr
> > *nlh, void *data)
> > comm = get_task_name(pid);
> > }
> >
> > - if (rd_check_is_filtered(rd, "pid", pid))
> > + if (rd_check_is_filtered(rd, "pid", pid))
>
> Did this add some whitespace problem?
It is how git prepared patch :(, i tried to remove this change now, but
it didn't work.
>
> Reviewed-by: Steve Wise <swise@opengridcomputing.com>
>
>
[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 801 bytes --]
^ permalink raw reply
* Re: [PATCH iproute2-next v1 05/19] rdma: Move resource PD logic to separate file
From: Leon Romanovsky @ 2019-02-23 9:05 UTC (permalink / raw)
To: Steve Wise
Cc: 'David Ahern', 'netdev',
'RDMA mailing list', 'Stephen Hemminger'
In-Reply-To: <01d601d4ca22$28f83140$7ae893c0$@opengridcomputing.com>
[-- Attachment #1: Type: text/plain, Size: 1103 bytes --]
On Thu, Feb 21, 2019 at 02:15:16PM -0600, Steve Wise wrote:
>
>
> > -----Original Message-----
> > From: linux-rdma-owner@vger.kernel.org <linux-rdma-
> > owner@vger.kernel.org> On Behalf Of Leon Romanovsky
> > Sent: Wednesday, February 20, 2019 1:21 AM
> > To: David Ahern <dsahern@gmail.com>
> > Cc: Leon Romanovsky <leonro@mellanox.com>; netdev
> > <netdev@vger.kernel.org>; RDMA mailing list <linux-
> > rdma@vger.kernel.org>; Stephen Hemminger
> > <stephen@networkplumber.org>
> > Subject: [PATCH iproute2-next v1 05/19] rdma: Move resource PD logic to
> > separate file
> >
> > From: Leon Romanovsky <leonro@mellanox.com>
> >
> > Logically separate resource PD logic to separate file,
> > in order to make PD specific logic self-contained.
> >
> > Signed-off-by: Leon Romanovsky <leonro@mellanox.com>
> > ---
>
> Why does it need to be self contained?
The main res.c file was so large that at least for me wasn't clear
how and what to refactor. Such separation allowed me to start code
cleanup by identification of duplicate places.
>
> Reviewed-by: Steve Wise <swise@opengridcomputing.com>
>
>
[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 801 bytes --]
^ permalink raw reply
* Re: [PATCH net-next] route: Add a new fib_multipath_hash_policy base on cpu id for tunnel packet
From: Ido Schimmel @ 2019-02-23 9:14 UTC (permalink / raw)
To: David Ahern; +Cc: wenxu@ucloud.cn, davem@davemloft.net, netdev@vger.kernel.org
In-Reply-To: <593cc423-c510-b67b-de43-be6cac662bc1@gmail.com>
On Fri, Feb 22, 2019 at 10:19:41PM -0500, David Ahern wrote:
> On 2/21/19 10:52 PM, wenxu@ucloud.cn wrote:
> > From: wenxu <wenxu@ucloud.cn>
> >
> > Current fib_multipath_hash_policy can make hash based on the L3 or
> > L4. But it only work on the outer IP. So a specific tunnel always
> > has the same hash value. But a specific tunnel may contain so many
> > inner connection. However there is no good ways for tunnel packet.
> > A specific tunnel route based on the percpu dst_cache, It will not
> > lookup route table each packet.
> >
> > This patch provide a based cpu id hash policy. The different
> > connection run on differnt cpu and There will differnet hash
> > value for percpu dst_cache.
> >
> > Signed-off-by: wenxu <wenxu@ucloud.cn>
> > ---
> > net/ipv4/route.c | 6 ++++++
> > net/ipv4/sysctl_net_ipv4.c | 2 +-
> > 2 files changed, 7 insertions(+), 1 deletion(-)
> >
>
> This multipath hash policy is global - for all fib lookups, not just
> tunnels.
>
> The suggestion by Nik is worth exploring - an option to add the mark to
> the hash (e.g., L3 header + mark) which makes this more generic.
>
> If the policy options are changed, the call to call_netevent_notifiers
> needs to be updated to handle a failure. For example, the mlxsw handler
> needs to be able to veto an option it does not support.
Did the author consider using a UDP-based tunnel like FOU? Then L4 mode
should work just fine. I believe most hardware routers do not take inner
headers into account either.
https://lwn.net/Articles/614348/
https://people.netfilter.org/pablo/netdev0.1/papers/UDP-Encapsulation-in-Linux.pdf
^ permalink raw reply
* [PATCH iproute2-next v2 00/19] Export object IDs to users
From: Leon Romanovsky @ 2019-02-23 9:15 UTC (permalink / raw)
To: David Ahern
Cc: Leon Romanovsky, netdev, RDMA mailing list, Stephen Hemminger,
Steve Wise
From: Leon Romanovsky <leonro@mellanox.com>
Changelog:
v1->v2:
* Fixed commit messages
* Added Steve's ROB
v0->v1:
* Rebased to latest iproute2-next
* Added latest rdma_netlink.h and updated commit message to point
to kernel SHA commit.
This series adds ability to present and query all known to rdmatool
object by their respective, unique IDs (e.g. pdn. mrn, cqn e.t.c).
All objects which have "parent" object has this information too.
Thanks
Leon Romanovsky (19):
rdma: update uapi headers
rdma: Remove duplicated print code
rdma: Provide unique indexes for all visible objects
rdma: Provide parent context index for all objects except CM_ID
rdma: Move resource PD logic to separate file
rdma: Refactor out resource MR logic to separate file
rdma: Move out resource CQ logic to separate file
rdma: Move out resource CM-ID logic to separate file
rdma: Move resource QP logic to separate file
rdma: Properly mark RDMAtool license
rdma: Simplify code to reuse existing functions
rdma: Simplify CM_ID print code
rdma: Refactor CQ prints
rdma: Move MR code to be suitable for per-line parsing
rdma: Place PD parsing print routine into separate function
rdma: Move QP code to separate function
rdma: Unify netlink attribute checks prior to prints
rdma: Perform single .doit call to query specific objects
rdma: Provide and reuse filter functions
rdma/Makefile | 5 +-
rdma/dev.c | 7 +-
rdma/include/uapi/rdma/rdma_netlink.h | 64 +-
rdma/link.c | 7 +-
rdma/rdma.c | 7 +-
rdma/rdma.h | 24 +-
rdma/res-cmid.c | 275 ++++++++
rdma/res-cq.c | 160 +++++
rdma/res-mr.c | 133 ++++
rdma/res-pd.c | 136 ++++
rdma/res-qp.c | 240 +++++++
rdma/res.c | 932 ++------------------------
rdma/res.h | 148 ++++
rdma/utils.c | 53 +-
14 files changed, 1257 insertions(+), 934 deletions(-)
create mode 100644 rdma/res-cmid.c
create mode 100644 rdma/res-cq.c
create mode 100644 rdma/res-mr.c
create mode 100644 rdma/res-pd.c
create mode 100644 rdma/res-qp.c
create mode 100644 rdma/res.h
--
2.19.1
^ permalink raw reply
* [PATCH iproute2-next v2 02/19] rdma: Remove duplicated print code
From: Leon Romanovsky @ 2019-02-23 9:15 UTC (permalink / raw)
To: David Ahern
Cc: Leon Romanovsky, netdev, RDMA mailing list, Stephen Hemminger,
Steve Wise
In-Reply-To: <20190223091528.8509-1-leon@kernel.org>
From: Leon Romanovsky <leonro@mellanox.com>
There is no need to keep same print functions for
uint32_t and uint64_t, unify them into one function.
Reviewed-by: Steve Wise <swise@opengridcomputing.com>
Signed-off-by: Leon Romanovsky <leonro@mellanox.com>
---
rdma/res.c | 22 +++++++---------------
1 file changed, 7 insertions(+), 15 deletions(-)
diff --git a/rdma/res.c b/rdma/res.c
index 6b0f5fe3..87865ec8 100644
--- a/rdma/res.c
+++ b/rdma/res.c
@@ -808,28 +808,20 @@ static int res_cq_parse_cb(const struct nlmsghdr *nlh, void *data)
return MNL_CB_OK;
}
-static void print_key(struct rd *rd, const char *name, uint32_t val)
+static 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%x ", name, val);
+ pr_out("%s 0x%" PRIx64 " ", name, val);
}
-static void print_iova(struct rd *rd, uint64_t val)
+static void res_print_uint(struct rd *rd, const char *name, uint64_t val)
{
if (rd->json_output)
- jsonw_xint_field(rd->jw, "iova", val);
+ jsonw_uint_field(rd->jw, name, 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);
+ pr_out("%s %" PRIu64 " ", name, val);
}
static int res_mr_parse_cb(const struct nlmsghdr *nlh, void *data)
@@ -907,8 +899,8 @@ static int res_mr_parse_cb(const struct nlmsghdr *nlh, void *data)
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_key(rd, "iova", iova);
+ res_print_uint(rd, "mrlen", mrlen);
print_pid(rd, pid);
print_comm(rd, comm, nla_line);
--
2.19.1
^ permalink raw reply related
* [PATCH iproute2-next v2 03/19] rdma: Provide unique indexes for all visible objects
From: Leon Romanovsky @ 2019-02-23 9:15 UTC (permalink / raw)
To: David Ahern
Cc: Leon Romanovsky, netdev, RDMA mailing list, Stephen Hemminger,
Steve Wise
In-Reply-To: <20190223091528.8509-1-leon@kernel.org>
From: Leon Romanovsky <leonro@mellanox.com>
Reviewed-by: Steve Wise <swise@opengridcomputing.com>
Signed-off-by: Leon Romanovsky <leonro@mellanox.com>
---
rdma/res.c | 83 +++++++++++++++++++++++++++++++++++++++++-------------
1 file changed, 63 insertions(+), 20 deletions(-)
diff --git a/rdma/res.c b/rdma/res.c
index 87865ec8..f941de5c 100644
--- a/rdma/res.c
+++ b/rdma/res.c
@@ -549,6 +549,22 @@ static int ss_ntop(struct nlattr *nla_line, char *addr_str, uint16_t *port)
return 0;
}
+static 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);
+}
+
+static 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_cm_id_parse_cb(const struct nlmsghdr *nlh, void *data)
{
struct nlattr *tb[RDMA_NLDEV_ATTR_MAX] = {};
@@ -574,6 +590,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;
@@ -651,6 +668,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(
@@ -669,6 +692,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);
@@ -743,6 +768,7 @@ static int res_cq_parse_cb(const struct nlmsghdr *nlh, void *data)
char *comm = NULL;
uint32_t pid = 0;
uint8_t poll_ctx = 0;
+ uint32_t cqn = 0;
uint64_t users;
uint32_t cqe;
int err;
@@ -783,6 +809,12 @@ static int res_cq_parse_cb(const struct nlmsghdr *nlh, void *data)
continue;
}
+ if (nla_line[RDMA_NLDEV_ATTR_RES_CQN])
+ cqn = mnl_attr_get_u32(
+ nla_line[RDMA_NLDEV_ATTR_RES_CQN]);
+ if (rd_check_is_filtered(rd, "cqn", cqn))
+ continue;
+
if (nla_line[RDMA_NLDEV_ATTR_RES_KERN_NAME])
/* discard const from mnl_attr_get_str */
comm = (char *)mnl_attr_get_str(
@@ -799,6 +831,9 @@ static int res_cq_parse_cb(const struct nlmsghdr *nlh, void *data)
print_pid(rd, pid);
print_comm(rd, comm, nla_line);
+ if (nla_line[RDMA_NLDEV_ATTR_RES_CQN])
+ res_print_uint(rd, "cqn", cqn);
+
if (nla_line[RDMA_NLDEV_ATTR_RES_PID])
free(comm);
@@ -808,22 +843,6 @@ static int res_cq_parse_cb(const struct nlmsghdr *nlh, void *data)
return MNL_CB_OK;
}
-static 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);
-}
-
-static 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_mr_parse_cb(const struct nlmsghdr *nlh, void *data)
{
struct nlattr *tb[RDMA_NLDEV_ATTR_MAX] = {};
@@ -847,6 +866,7 @@ static int res_mr_parse_cb(const struct nlmsghdr *nlh, void *data)
uint32_t rkey = 0, lkey = 0;
uint64_t iova = 0, mrlen;
char *comm = NULL;
+ uint32_t mrn = 0;
uint32_t pid = 0;
int err;
@@ -885,6 +905,12 @@ static int res_mr_parse_cb(const struct nlmsghdr *nlh, void *data)
continue;
}
+ if (nla_line[RDMA_NLDEV_ATTR_RES_MRN])
+ mrn = mnl_attr_get_u32(
+ nla_line[RDMA_NLDEV_ATTR_RES_MRN]);
+ if (rd_check_is_filtered(rd, "mrn", mrn))
+ continue;
+
if (nla_line[RDMA_NLDEV_ATTR_RES_KERN_NAME])
/* discard const from mnl_attr_get_str */
comm = (char *)mnl_attr_get_str(
@@ -904,6 +930,9 @@ static int res_mr_parse_cb(const struct nlmsghdr *nlh, void *data)
print_pid(rd, pid);
print_comm(rd, comm, nla_line);
+ if (nla_line[RDMA_NLDEV_ATTR_RES_MRN])
+ res_print_uint(rd, "mrn", mrn);
+
if (nla_line[RDMA_NLDEV_ATTR_RES_PID])
free(comm);
@@ -936,6 +965,7 @@ static int res_pd_parse_cb(const struct nlmsghdr *nlh, void *data)
struct nlattr *nla_line[RDMA_NLDEV_ATTR_MAX] = {};
char *comm = NULL;
uint32_t pid = 0;
+ uint32_t pdn = 0;
uint64_t users;
int err;
@@ -970,6 +1000,12 @@ static int res_pd_parse_cb(const struct nlmsghdr *nlh, void *data)
if (rd_check_is_filtered(rd, "pid", pid))
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_KERN_NAME])
/* discard const from mnl_attr_get_str */
comm = (char *)mnl_attr_get_str(
@@ -987,6 +1023,9 @@ static int res_pd_parse_cb(const struct nlmsghdr *nlh, void *data)
print_pid(rd, pid);
print_comm(rd, comm, nla_line);
+ if (nla_line[RDMA_NLDEV_ATTR_RES_PDN])
+ res_print_uint(rd, "pdn", pdn);
+
if (nla_line[RDMA_NLDEV_ATTR_RES_PID])
free(comm);
@@ -1033,7 +1072,8 @@ 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);
@@ -1043,7 +1083,8 @@ 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 }
+ { .name = "pid", .is_number = true },
+ { .name = "cqn", .is_number = true }
};
RES_FUNC(res_cq, RDMA_NLDEV_CMD_RES_CQ_GET, cq_valid_filters, true);
@@ -1054,7 +1095,8 @@ struct filters mr_valid_filters[MAX_NUMBER_OF_FILTERS] = {
{ .name = "rkey", .is_number = true },
{ .name = "lkey", .is_number = true },
{ .name = "mrlen", .is_number = true },
- { .name = "pid", .is_number = true }
+ { .name = "pid", .is_number = true },
+ { .name = "mrn", .is_number = true }
};
RES_FUNC(res_mr, RDMA_NLDEV_CMD_RES_MR_GET, mr_valid_filters, true);
@@ -1063,7 +1105,8 @@ 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 }
+ { .name = "pid", .is_number = true },
+ { .name = "pdn", .is_number = true }
};
RES_FUNC(res_pd, RDMA_NLDEV_CMD_RES_PD_GET, pd_valid_filters, true);
--
2.19.1
^ permalink raw reply related
* [PATCH iproute2-next v2 04/19] rdma: Provide parent context index for all objects except CM_ID
From: Leon Romanovsky @ 2019-02-23 9:15 UTC (permalink / raw)
To: David Ahern
Cc: Leon Romanovsky, netdev, RDMA mailing list, Stephen Hemminger,
Steve Wise
In-Reply-To: <20190223091528.8509-1-leon@kernel.org>
From: Leon Romanovsky <leonro@mellanox.com>
Allow users to correlate allocated object with relevant parent
[leonro@server ~]$ rdma res show pd
dev mlx5_0 users 5 pid 0 comm [ib_core] pdn 1
dev mlx5_0 users 7 pid 0 comm [ib_ipoib] pdn 2
dev mlx5_0 users 0 pid 0 comm [mlx5_ib] pdn 3
dev mlx5_0 users 2 pid 548 comm ibv_rc_pingpong ctxn 0 pdn 4
[leonro@server ~]$ rdma res show cq cqn 0-100
dev mlx5_0 cqe 2047 users 6 poll-ctx UNBOUND_WORKQUEUE pid 0 comm [ib_core] cqn 2
dev mlx5_0 cqe 255 users 2 poll-ctx SOFTIRQ pid 0 comm [mlx5_ib] cqn 3
dev mlx5_0 cqe 511 users 1 poll-ctx DIRECT pid 0 comm [ib_ipoib] cqn 4
dev mlx5_0 cqe 255 users 1 poll-ctx DIRECT pid 0 comm [ib_ipoib] cqn 5
dev mlx5_0 cqe 255 users 0 poll-ctx SOFTIRQ pid 0 comm [mlx5_ib] cqn 6
dev mlx5_0 cqe 511 users 2 pid 548 comm ibv_rc_pingpong cqn 7 ctxn 0
[leonro@server ~]$ rdma res show mr
dev mlx5_0 mrlen 4096 pid 548 comm ibv_rc_pingpong mrn 4 pdn 0
[leonro@nps-server-14-015 ~]$ /images/leonro/src/iproute2/rdma/rdma res show qp
link mlx5_0/1 lqpn 0 type SMI state RTS sq-psn 0 pid 0 comm [ib_core]
link mlx5_0/1 lqpn 1 type GSI state RTS sq-psn 0 pid 0 comm [ib_core]
link mlx5_0/1 lqpn 7 type UD state RTS sq-psn 0 pid 0 comm [ib_core]
link mlx5_0/1 lqpn 8 type UD state RTS sq-psn 0 pid 0 comm [ib_ipoib]
link mlx5_0/1 lqpn 9 pdn 4 rqpn 0 type RC state INIT rq-psn 0 sq-psn 0 path-mig-state MIGRATED pid 548 comm ibv_rc_pingpong
Reviewed-by: Steve Wise <swise@opengridcomputing.com>
Signed-off-by: Leon Romanovsky <leonro@mellanox.com>
---
rdma/res.c | 110 +++++++++++++++++++++++++++++++++++------------------
1 file changed, 72 insertions(+), 38 deletions(-)
diff --git a/rdma/res.c b/rdma/res.c
index f941de5c..308f66c0 100644
--- a/rdma/res.c
+++ b/rdma/res.c
@@ -320,6 +320,22 @@ static char *get_task_name(uint32_t pid)
return comm;
}
+static 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);
+}
+
+static 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] = {};
@@ -343,6 +359,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;
@@ -369,6 +386,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))
@@ -428,6 +450,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);
@@ -549,22 +573,6 @@ static int ss_ntop(struct nlattr *nla_line, char *addr_str, uint16_t *port)
return 0;
}
-static 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);
-}
-
-static 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_cm_id_parse_cb(const struct nlmsghdr *nlh, void *data)
{
struct nlattr *tb[RDMA_NLDEV_ATTR_MAX] = {};
@@ -768,6 +776,7 @@ static int res_cq_parse_cb(const struct nlmsghdr *nlh, void *data)
char *comm = NULL;
uint32_t pid = 0;
uint8_t poll_ctx = 0;
+ uint32_t ctxn = 0;
uint32_t cqn = 0;
uint64_t users;
uint32_t cqe;
@@ -815,6 +824,12 @@ static int res_cq_parse_cb(const struct nlmsghdr *nlh, void *data)
if (rd_check_is_filtered(rd, "cqn", cqn))
continue;
+ if (nla_line[RDMA_NLDEV_ATTR_RES_CTXN])
+ ctxn = mnl_attr_get_u32(
+ nla_line[RDMA_NLDEV_ATTR_RES_CTXN]);
+ if (rd_check_is_filtered(rd, "ctxn", ctxn))
+ continue;
+
if (nla_line[RDMA_NLDEV_ATTR_RES_KERN_NAME])
/* discard const from mnl_attr_get_str */
comm = (char *)mnl_attr_get_str(
@@ -833,6 +848,8 @@ static int res_cq_parse_cb(const struct nlmsghdr *nlh, void *data)
if (nla_line[RDMA_NLDEV_ATTR_RES_CQN])
res_print_uint(rd, "cqn", cqn);
+ if (nla_line[RDMA_NLDEV_ATTR_RES_CTXN])
+ res_print_uint(rd, "ctxn", ctxn);
if (nla_line[RDMA_NLDEV_ATTR_RES_PID])
free(comm);
@@ -866,6 +883,7 @@ static int res_mr_parse_cb(const struct nlmsghdr *nlh, void *data)
uint32_t rkey = 0, lkey = 0;
uint64_t iova = 0, mrlen;
char *comm = NULL;
+ uint32_t pdn = 0;
uint32_t mrn = 0;
uint32_t pid = 0;
int err;
@@ -911,6 +929,12 @@ static int res_mr_parse_cb(const struct nlmsghdr *nlh, void *data)
if (rd_check_is_filtered(rd, "mrn", mrn))
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_KERN_NAME])
/* discard const from mnl_attr_get_str */
comm = (char *)mnl_attr_get_str(
@@ -933,6 +957,9 @@ static int res_mr_parse_cb(const struct nlmsghdr *nlh, void *data)
if (nla_line[RDMA_NLDEV_ATTR_RES_MRN])
res_print_uint(rd, "mrn", mrn);
+ if (nla_line[RDMA_NLDEV_ATTR_RES_PDN])
+ res_print_uint(rd, "pdn", pdn);
+
if (nla_line[RDMA_NLDEV_ATTR_RES_PID])
free(comm);
@@ -964,6 +991,7 @@ static int res_pd_parse_cb(const struct nlmsghdr *nlh, void *data)
uint32_t local_dma_lkey = 0, unsafe_global_rkey = 0;
struct nlattr *nla_line[RDMA_NLDEV_ATTR_MAX] = {};
char *comm = NULL;
+ uint32_t ctxn = 0;
uint32_t pid = 0;
uint32_t pdn = 0;
uint64_t users;
@@ -997,7 +1025,13 @@ static int res_pd_parse_cb(const struct nlmsghdr *nlh, void *data)
comm = get_task_name(pid);
}
- if (rd_check_is_filtered(rd, "pid", pid))
+ if (rd_check_is_filtered(rd, "pid", pid))
+ continue;
+
+ if (nla_line[RDMA_NLDEV_ATTR_RES_CTXN])
+ ctxn = mnl_attr_get_u32(nla_line[RDMA_NLDEV_ATTR_RES_CTXN]);
+
+ if (rd_check_is_filtered(rd, "ctxn", ctxn))
continue;
if (nla_line[RDMA_NLDEV_ATTR_RES_PDN])
@@ -1022,6 +1056,8 @@ static int res_pd_parse_cb(const struct nlmsghdr *nlh, void *data)
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_CTXN])
+ res_print_uint(rd, "ctxn", ctxn);
if (nla_line[RDMA_NLDEV_ATTR_RES_PDN])
res_print_uint(rd, "pdn", pdn);
@@ -1038,24 +1074,18 @@ static int res_pd_parse_cb(const struct nlmsghdr *nlh, void *data)
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);
@@ -1084,7 +1114,8 @@ struct filters cq_valid_filters[MAX_NUMBER_OF_FILTERS] = {
{ .name = "users", .is_number = true },
{ .name = "poll-ctx", .is_number = false },
{ .name = "pid", .is_number = true },
- { .name = "cqn", .is_number = true }
+ { .name = "cqn", .is_number = true },
+ { .name = "ctxn", .is_number = true }
};
RES_FUNC(res_cq, RDMA_NLDEV_CMD_RES_CQ_GET, cq_valid_filters, true);
@@ -1096,7 +1127,8 @@ struct filters mr_valid_filters[MAX_NUMBER_OF_FILTERS] = {
{ .name = "lkey", .is_number = true },
{ .name = "mrlen", .is_number = true },
{ .name = "pid", .is_number = true },
- { .name = "mrn", .is_number = true }
+ { .name = "mrn", .is_number = true },
+ { .name = "pdn", .is_number = true }
};
RES_FUNC(res_mr, RDMA_NLDEV_CMD_RES_MR_GET, mr_valid_filters, true);
@@ -1106,7 +1138,9 @@ struct filters pd_valid_filters[MAX_NUMBER_OF_FILTERS] = {
{ .name = "dev", .is_number = false },
{ .name = "users", .is_number = true },
{ .name = "pid", .is_number = true },
- { .name = "pdn", .is_number = true }
+ { .name = "ctxn", .is_number = true },
+ { .name = "pdn", .is_number = true },
+ { .name = "ctxn", .is_number = true }
};
RES_FUNC(res_pd, RDMA_NLDEV_CMD_RES_PD_GET, pd_valid_filters, true);
--
2.19.1
^ permalink raw reply related
* [PATCH iproute2-next v2 05/19] rdma: Move resource PD logic to separate file
From: Leon Romanovsky @ 2019-02-23 9:15 UTC (permalink / raw)
To: David Ahern
Cc: Leon Romanovsky, netdev, RDMA mailing list, Stephen Hemminger,
Steve Wise
In-Reply-To: <20190223091528.8509-1-leon@kernel.org>
From: Leon Romanovsky <leonro@mellanox.com>
Logically separate resource PD logic to separate file,
in order to make PD specific logic self-contained.
Reviewed-by: Steve Wise <swise@opengridcomputing.com>
Signed-off-by: Leon Romanovsky <leonro@mellanox.com>
---
rdma/Makefile | 2 +-
rdma/res-pd.c | 110 ++++++++++++++++++++++++++++++++++++
rdma/res.c | 154 +++-----------------------------------------------
rdma/res.h | 55 ++++++++++++++++++
4 files changed, 175 insertions(+), 146 deletions(-)
create mode 100644 rdma/res-pd.c
create mode 100644 rdma/res.h
diff --git a/rdma/Makefile b/rdma/Makefile
index 0498994f..9c2fb203 100644
--- a/rdma/Makefile
+++ b/rdma/Makefile
@@ -6,7 +6,7 @@ TARGETS :=
ifeq ($(HAVE_MNL),y)
CFLAGS += -I./include/uapi/
-RDMA_OBJ = rdma.o utils.o dev.o link.o res.o
+RDMA_OBJ = rdma.o utils.o dev.o link.o res.o res-pd.o
TARGETS += rdma
endif
diff --git a/rdma/res-pd.c b/rdma/res-pd.c
new file mode 100644
index 00000000..d879a21a
--- /dev/null
+++ b/rdma/res-pd.c
@@ -0,0 +1,110 @@
+// SPDX-License-Identifier: GPL-2.0 OR Linux-OpenIB
+/*
+ * res-pd.c RDMA tool
+ * Authors: Leon Romanovsky <leonro@mellanox.com>
+ */
+
+#include "res.h"
+#include <inttypes.h>
+
+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 ctxn = 0;
+ uint32_t pid = 0;
+ uint32_t pdn = 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_CTXN])
+ ctxn = mnl_attr_get_u32(
+ nla_line[RDMA_NLDEV_ATTR_RES_CTXN]);
+
+ if (rd_check_is_filtered(rd, "ctxn", ctxn))
+ 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_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_CTXN])
+ res_print_uint(rd, "ctxn", ctxn);
+
+ if (nla_line[RDMA_NLDEV_ATTR_RES_PDN])
+ res_print_uint(rd, "pdn", pdn);
+
+ 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;
+}
diff --git a/rdma/res.c b/rdma/res.c
index 308f66c0..494a82e4 100644
--- a/rdma/res.c
+++ b/rdma/res.c
@@ -9,7 +9,7 @@
* Authors: Leon Romanovsky <leonro@mellanox.com>
*/
-#include "rdma.h"
+#include "res.h"
#include <inttypes.h>
static int res_help(struct rd *rd)
@@ -92,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;
@@ -119,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",
@@ -244,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);
@@ -252,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];
@@ -271,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);
@@ -299,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;
@@ -320,7 +298,7 @@ static char *get_task_name(uint32_t pid)
return comm;
}
-static void print_key(struct rd *rd, const char *name, uint64_t val)
+void print_key(struct rd *rd, const char *name, uint64_t val)
{
if (rd->json_output)
jsonw_xint_field(rd->jw, name, val);
@@ -328,7 +306,7 @@ static void print_key(struct rd *rd, const char *name, uint64_t val)
pr_out("%s 0x%" PRIx64 " ", name, val);
}
-static void res_print_uint(struct rd *rd, const char *name, uint64_t 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);
@@ -725,7 +703,7 @@ static void print_cqe(struct rd *rd, uint32_t val)
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);
@@ -969,108 +947,6 @@ static int res_mr_parse_cb(const struct nlmsghdr *nlh, void *data)
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 ctxn = 0;
- uint32_t pid = 0;
- uint32_t pdn = 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_CTXN])
- ctxn = mnl_attr_get_u32(nla_line[RDMA_NLDEV_ATTR_RES_CTXN]);
-
- if (rd_check_is_filtered(rd, "ctxn", ctxn))
- 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_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_CTXN])
- res_print_uint(rd, "ctxn", ctxn);
-
- if (nla_line[RDMA_NLDEV_ATTR_RES_PDN])
- res_print_uint(rd, "pdn", pdn);
-
- 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
@@ -1133,18 +1009,6 @@ struct filters mr_valid_filters[MAX_NUMBER_OF_FILTERS] = {
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 },
- { .name = "ctxn", .is_number = true },
- { .name = "pdn", .is_number = true },
- { .name = "ctxn", .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[] = {
diff --git a/rdma/res.h b/rdma/res.h
new file mode 100644
index 00000000..dd01b803
--- /dev/null
+++ b/rdma/res.h
@@ -0,0 +1,55 @@
+/* SPDX-License-Identifier: GPL-2.0 OR Linux-OpenIB */
+/*
+ * res.h RDMA tool
+ * Authors: Leon Romanovsky <leonro@mellanox.com>
+ */
+#ifndef _RDMA_TOOL_RES_H_
+#define _RDMA_TOOL_RES_H_
+
+#include "rdma.h"
+
+int _res_send_msg(struct rd *rd, uint32_t command, mnl_cb_t callback);
+int res_pd_parse_cb(const struct nlmsghdr *nlh, void *data);
+
+#define RES_FUNC(name, command, valid_filters, strict_port) \
+ static inline int _##name(struct rd *rd)\
+ { \
+ return _res_send_msg(rd, command, name##_parse_cb); \
+ } \
+ static inline 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
+struct filters pd_valid_filters[MAX_NUMBER_OF_FILTERS] = {
+ { .name = "dev", .is_number = false },
+ { .name = "users", .is_number = true },
+ { .name = "pid", .is_number = true },
+ { .name = "ctxn", .is_number = true },
+ { .name = "pdn", .is_number = true },
+ { .name = "ctxn", .is_number = true }
+};
+
+RES_FUNC(res_pd, RDMA_NLDEV_CMD_RES_PD_GET, pd_valid_filters, true);
+
+char *get_task_name(uint32_t pid);
+void print_dev(struct rd *rd, uint32_t idx, const char *name);
+void print_users(struct rd *rd, uint64_t val);
+void print_key(struct rd *rd, const char *name, uint64_t val);
+void res_print_uint(struct rd *rd, const char *name, uint64_t val);
+void print_pid(struct rd *rd, uint32_t val);
+void print_comm(struct rd *rd, const char *str, struct nlattr **nla_line);
+
+#endif /* _RDMA_TOOL_RES_H_ */
--
2.19.1
^ permalink raw reply related
* [PATCH iproute2-next v2 06/19] rdma: Refactor out resource MR logic to separate file
From: Leon Romanovsky @ 2019-02-23 9:15 UTC (permalink / raw)
To: David Ahern
Cc: Leon Romanovsky, netdev, RDMA mailing list, Stephen Hemminger,
Steve Wise
In-Reply-To: <20190223091528.8509-1-leon@kernel.org>
From: Leon Romanovsky <leonro@mellanox.com>
Logically separate resource MR logic to separate file,
in order to make MR specific logic self-contained.
Reviewed-by: Steve Wise <swise@opengridcomputing.com>
Signed-off-by: Leon Romanovsky <leonro@mellanox.com>
---
rdma/Makefile | 2 +-
rdma/res-mr.c | 117 +++++++++++++++++++++++++++++++++++++++++++++++
rdma/res.c | 122 --------------------------------------------------
rdma/res.h | 14 ++++++
4 files changed, 132 insertions(+), 123 deletions(-)
create mode 100644 rdma/res-mr.c
diff --git a/rdma/Makefile b/rdma/Makefile
index 9c2fb203..0b4e1eef 100644
--- a/rdma/Makefile
+++ b/rdma/Makefile
@@ -6,7 +6,7 @@ TARGETS :=
ifeq ($(HAVE_MNL),y)
CFLAGS += -I./include/uapi/
-RDMA_OBJ = rdma.o utils.o dev.o link.o res.o res-pd.o
+RDMA_OBJ = rdma.o utils.o dev.o link.o res.o res-pd.o res-mr.o
TARGETS += rdma
endif
diff --git a/rdma/res-mr.c b/rdma/res-mr.c
new file mode 100644
index 00000000..dae5def2
--- /dev/null
+++ b/rdma/res-mr.c
@@ -0,0 +1,117 @@
+// SPDX-License-Identifier: GPL-2.0 OR Linux-OpenIB
+/*
+ * res-mr.c RDMA tool
+ * Authors: Leon Romanovsky <leonro@mellanox.com>
+ */
+
+#include "res.h"
+#include <inttypes.h>
+
+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 pdn = 0;
+ uint32_t mrn = 0;
+ 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_MRN])
+ mrn = mnl_attr_get_u32(
+ nla_line[RDMA_NLDEV_ATTR_RES_MRN]);
+ if (rd_check_is_filtered(rd, "mrn", mrn))
+ 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_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_key(rd, "iova", iova);
+ res_print_uint(rd, "mrlen", mrlen);
+ print_pid(rd, pid);
+ print_comm(rd, comm, nla_line);
+
+ if (nla_line[RDMA_NLDEV_ATTR_RES_MRN])
+ res_print_uint(rd, "mrn", mrn);
+
+ if (nla_line[RDMA_NLDEV_ATTR_RES_PDN])
+ res_print_uint(rd, "pdn", pdn);
+
+ 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;
+}
+
diff --git a/rdma/res.c b/rdma/res.c
index 494a82e4..1de8c797 100644
--- a/rdma/res.c
+++ b/rdma/res.c
@@ -838,115 +838,6 @@ static int res_cq_parse_cb(const struct nlmsghdr *nlh, void *data)
return MNL_CB_OK;
}
-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 pdn = 0;
- uint32_t mrn = 0;
- 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_MRN])
- mrn = mnl_attr_get_u32(
- nla_line[RDMA_NLDEV_ATTR_RES_MRN]);
- if (rd_check_is_filtered(rd, "mrn", mrn))
- 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_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_key(rd, "iova", iova);
- res_print_uint(rd, "mrlen", mrlen);
- print_pid(rd, pid);
- print_comm(rd, comm, nla_line);
-
- if (nla_line[RDMA_NLDEV_ATTR_RES_MRN])
- res_print_uint(rd, "mrn", mrn);
-
- if (nla_line[RDMA_NLDEV_ATTR_RES_PDN])
- res_print_uint(rd, "pdn", pdn);
-
- 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
@@ -996,19 +887,6 @@ struct filters cq_valid_filters[MAX_NUMBER_OF_FILTERS] = {
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 },
- { .name = "mrn", .is_number = true },
- { .name = "pdn", .is_number = true }
-};
-
-RES_FUNC(res_mr, RDMA_NLDEV_CMD_RES_MR_GET, mr_valid_filters, true);
-
static int res_show(struct rd *rd)
{
const struct rd_cmd cmds[] = {
diff --git a/rdma/res.h b/rdma/res.h
index dd01b803..e3619773 100644
--- a/rdma/res.h
+++ b/rdma/res.h
@@ -10,6 +10,7 @@
int _res_send_msg(struct rd *rd, uint32_t command, mnl_cb_t callback);
int res_pd_parse_cb(const struct nlmsghdr *nlh, void *data);
+int res_mr_parse_cb(const struct nlmsghdr *nlh, void *data);
#define RES_FUNC(name, command, valid_filters, strict_port) \
static inline int _##name(struct rd *rd)\
@@ -44,6 +45,19 @@ struct filters pd_valid_filters[MAX_NUMBER_OF_FILTERS] = {
RES_FUNC(res_pd, RDMA_NLDEV_CMD_RES_PD_GET, pd_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 },
+ { .name = "mrn", .is_number = true },
+ { .name = "pdn", .is_number = true }
+};
+
+RES_FUNC(res_mr, RDMA_NLDEV_CMD_RES_MR_GET, mr_valid_filters, true);
+
char *get_task_name(uint32_t pid);
void print_dev(struct rd *rd, uint32_t idx, const char *name);
void print_users(struct rd *rd, uint64_t val);
--
2.19.1
^ permalink raw reply related
* [PATCH iproute2-next v2 07/19] rdma: Move out resource CQ logic to separate file
From: Leon Romanovsky @ 2019-02-23 9:15 UTC (permalink / raw)
To: David Ahern
Cc: Leon Romanovsky, netdev, RDMA mailing list, Stephen Hemminger,
Steve Wise
In-Reply-To: <20190223091528.8509-1-leon@kernel.org>
From: Leon Romanovsky <leonro@mellanox.com>
Logically separate resource CQ logic to separate file,
in order to make CQ specific logic self-contained.
Reviewed-by: Steve Wise <swise@opengridcomputing.com>
Signed-off-by: Leon Romanovsky <leonro@mellanox.com>
---
rdma/Makefile | 2 +-
rdma/res-cq.c | 143 ++++++++++++++++++++++++++++++++++++++++++++++++
rdma/res.c | 147 --------------------------------------------------
rdma/res.h | 13 +++++
4 files changed, 157 insertions(+), 148 deletions(-)
create mode 100644 rdma/res-cq.c
diff --git a/rdma/Makefile b/rdma/Makefile
index 0b4e1eef..e32ccd18 100644
--- a/rdma/Makefile
+++ b/rdma/Makefile
@@ -6,7 +6,7 @@ TARGETS :=
ifeq ($(HAVE_MNL),y)
CFLAGS += -I./include/uapi/
-RDMA_OBJ = rdma.o utils.o dev.o link.o res.o res-pd.o res-mr.o
+RDMA_OBJ = rdma.o utils.o dev.o link.o res.o res-pd.o res-mr.o res-cq.o
TARGETS += rdma
endif
diff --git a/rdma/res-cq.c b/rdma/res-cq.c
new file mode 100644
index 00000000..fbfe593b
--- /dev/null
+++ b/rdma/res-cq.c
@@ -0,0 +1,143 @@
+// SPDX-License-Identifier: GPL-2.0 OR Linux-OpenIB
+/*
+ * res-cq.c RDMA tool
+ * Authors: Leon Romanovsky <leonro@mellanox.com>
+ */
+
+#include "res.h"
+#include <inttypes.h>
+
+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 const char *poll_ctx_to_str(uint8_t idx)
+{
+ static const char * const cm_id_states_str[] = {
+ "DIRECT", "SOFTIRQ", "WORKQUEUE", "UNBOUND_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));
+}
+
+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;
+ uint32_t ctxn = 0;
+ uint32_t cqn = 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_CQN])
+ cqn = mnl_attr_get_u32(
+ nla_line[RDMA_NLDEV_ATTR_RES_CQN]);
+ if (rd_check_is_filtered(rd, "cqn", cqn))
+ continue;
+
+ if (nla_line[RDMA_NLDEV_ATTR_RES_CTXN])
+ ctxn = mnl_attr_get_u32(
+ nla_line[RDMA_NLDEV_ATTR_RES_CTXN]);
+ if (rd_check_is_filtered(rd, "ctxn", ctxn))
+ 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_CQN])
+ res_print_uint(rd, "cqn", cqn);
+ if (nla_line[RDMA_NLDEV_ATTR_RES_CTXN])
+ res_print_uint(rd, "ctxn", ctxn);
+
+ 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;
+}
+
diff --git a/rdma/res.c b/rdma/res.c
index 1de8c797..7956882e 100644
--- a/rdma/res.c
+++ b/rdma/res.c
@@ -695,14 +695,6 @@ 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);
-}
-
void print_users(struct rd *rd, uint64_t val)
{
if (rd->json_output)
@@ -711,133 +703,6 @@ 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", "UNBOUND_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;
- uint32_t ctxn = 0;
- uint32_t cqn = 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_CQN])
- cqn = mnl_attr_get_u32(
- nla_line[RDMA_NLDEV_ATTR_RES_CQN]);
- if (rd_check_is_filtered(rd, "cqn", cqn))
- continue;
-
- if (nla_line[RDMA_NLDEV_ATTR_RES_CTXN])
- ctxn = mnl_attr_get_u32(
- nla_line[RDMA_NLDEV_ATTR_RES_CTXN]);
- if (rd_check_is_filtered(rd, "ctxn", ctxn))
- 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_CQN])
- res_print_uint(rd, "cqn", cqn);
- if (nla_line[RDMA_NLDEV_ATTR_RES_CTXN])
- res_print_uint(rd, "ctxn", ctxn);
-
- 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
@@ -875,18 +740,6 @@ struct filters cm_id_valid_filters[MAX_NUMBER_OF_FILTERS] = {
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 },
- { .name = "cqn", .is_number = true },
- { .name = "ctxn", .is_number = true }
-};
-
-RES_FUNC(res_cq, RDMA_NLDEV_CMD_RES_CQ_GET, cq_valid_filters, true);
-
static int res_show(struct rd *rd)
{
const struct rd_cmd cmds[] = {
diff --git a/rdma/res.h b/rdma/res.h
index e3619773..19f0d420 100644
--- a/rdma/res.h
+++ b/rdma/res.h
@@ -11,6 +11,7 @@
int _res_send_msg(struct rd *rd, uint32_t command, mnl_cb_t callback);
int res_pd_parse_cb(const struct nlmsghdr *nlh, void *data);
int res_mr_parse_cb(const struct nlmsghdr *nlh, void *data);
+int res_cq_parse_cb(const struct nlmsghdr *nlh, void *data);
#define RES_FUNC(name, command, valid_filters, strict_port) \
static inline int _##name(struct rd *rd)\
@@ -58,6 +59,18 @@ struct filters mr_valid_filters[MAX_NUMBER_OF_FILTERS] = {
RES_FUNC(res_mr, RDMA_NLDEV_CMD_RES_MR_GET, mr_valid_filters, true);
+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 },
+ { .name = "cqn", .is_number = true },
+ { .name = "ctxn", .is_number = true }
+};
+
+RES_FUNC(res_cq, RDMA_NLDEV_CMD_RES_CQ_GET, cq_valid_filters, true);
+
char *get_task_name(uint32_t pid);
void print_dev(struct rd *rd, uint32_t idx, const char *name);
void print_users(struct rd *rd, uint64_t val);
--
2.19.1
^ permalink raw reply related
* [PATCH iproute2-next v2 01/19] rdma: update uapi headers
From: Leon Romanovsky @ 2019-02-23 9:15 UTC (permalink / raw)
To: David Ahern
Cc: Leon Romanovsky, netdev, RDMA mailing list, Stephen Hemminger,
Steve Wise
In-Reply-To: <20190223091528.8509-1-leon@kernel.org>
From: Leon Romanovsky <leonro@mellanox.com>
Update rdma_netlink.h file upto kernel commit
f2a0e45f36b0 RDMA/nldev: Don't expose number of not-visible entries
Reviewed-by: Steve Wise <swise@opengridcomputing.com>
Signed-off-by: Leon Romanovsky <leonro@mellanox.com>
---
rdma/include/uapi/rdma/rdma_netlink.h | 64 +++++++++++++++++++++------
1 file changed, 50 insertions(+), 14 deletions(-)
diff --git a/rdma/include/uapi/rdma/rdma_netlink.h b/rdma/include/uapi/rdma/rdma_netlink.h
index 04c80ceb..5027c627 100644
--- a/rdma/include/uapi/rdma/rdma_netlink.h
+++ b/rdma/include/uapi/rdma/rdma_netlink.h
@@ -5,8 +5,7 @@
#include <linux/types.h>
enum {
- RDMA_NL_RDMA_CM = 1,
- RDMA_NL_IWCM,
+ RDMA_NL_IWCM = 2,
RDMA_NL_RSVD,
RDMA_NL_LS, /* RDMA Local Services */
RDMA_NL_NLDEV, /* RDMA device interface */
@@ -14,8 +13,7 @@ enum {
};
enum {
- RDMA_NL_GROUP_CM = 1,
- RDMA_NL_GROUP_IWPM,
+ RDMA_NL_GROUP_IWPM = 2,
RDMA_NL_GROUP_LS,
RDMA_NL_NUM_GROUPS
};
@@ -24,15 +22,17 @@ enum {
#define RDMA_NL_GET_OP(type) (type & ((1 << 10) - 1))
#define RDMA_NL_GET_TYPE(client, op) ((client << 10) + op)
-enum {
- RDMA_NL_RDMA_CM_ID_STATS = 0,
- RDMA_NL_RDMA_CM_NUM_OPS
-};
+/* The minimum version that the iwpm kernel supports */
+#define IWPM_UABI_VERSION_MIN 3
+/* The latest version that the iwpm kernel supports */
+#define IWPM_UABI_VERSION 4
+
+/* iwarp port mapper message flags */
enum {
- RDMA_NL_RDMA_CM_ATTR_SRC_ADDR = 1,
- RDMA_NL_RDMA_CM_ATTR_DST_ADDR,
- RDMA_NL_RDMA_CM_NUM_ATTR,
+
+ /* Do not map the port for this IWPM request */
+ IWPM_FLAGS_NO_PORT_MAP = (1 << 0),
};
/* iwarp port mapper op-codes */
@@ -45,6 +45,7 @@ enum {
RDMA_NL_IWPM_HANDLE_ERR,
RDMA_NL_IWPM_MAPINFO,
RDMA_NL_IWPM_MAPINFO_NUM,
+ RDMA_NL_IWPM_HELLO,
RDMA_NL_IWPM_NUM_OPS
};
@@ -83,20 +84,38 @@ enum {
IWPM_NLA_MANAGE_MAPPING_UNSPEC = 0,
IWPM_NLA_MANAGE_MAPPING_SEQ,
IWPM_NLA_MANAGE_ADDR,
- IWPM_NLA_MANAGE_MAPPED_LOC_ADDR,
+ IWPM_NLA_MANAGE_FLAGS,
+ IWPM_NLA_MANAGE_MAPPING_MAX
+};
+
+enum {
+ IWPM_NLA_RMANAGE_MAPPING_UNSPEC = 0,
+ IWPM_NLA_RMANAGE_MAPPING_SEQ,
+ IWPM_NLA_RMANAGE_ADDR,
+ IWPM_NLA_RMANAGE_MAPPED_LOC_ADDR,
+ /* The following maintains bisectability of rdma-core */
+ IWPM_NLA_MANAGE_MAPPED_LOC_ADDR = IWPM_NLA_RMANAGE_MAPPED_LOC_ADDR,
IWPM_NLA_RMANAGE_MAPPING_ERR,
IWPM_NLA_RMANAGE_MAPPING_MAX
};
-#define IWPM_NLA_MANAGE_MAPPING_MAX 3
-#define IWPM_NLA_QUERY_MAPPING_MAX 4
#define IWPM_NLA_MAPINFO_SEND_MAX 3
+#define IWPM_NLA_REMOVE_MAPPING_MAX 3
enum {
IWPM_NLA_QUERY_MAPPING_UNSPEC = 0,
IWPM_NLA_QUERY_MAPPING_SEQ,
IWPM_NLA_QUERY_LOCAL_ADDR,
IWPM_NLA_QUERY_REMOTE_ADDR,
+ IWPM_NLA_QUERY_FLAGS,
+ IWPM_NLA_QUERY_MAPPING_MAX,
+};
+
+enum {
+ IWPM_NLA_RQUERY_MAPPING_UNSPEC = 0,
+ IWPM_NLA_RQUERY_MAPPING_SEQ,
+ IWPM_NLA_RQUERY_LOCAL_ADDR,
+ IWPM_NLA_RQUERY_REMOTE_ADDR,
IWPM_NLA_RQUERY_MAPPED_LOC_ADDR,
IWPM_NLA_RQUERY_MAPPED_REM_ADDR,
IWPM_NLA_RQUERY_MAPPING_ERR,
@@ -114,6 +133,7 @@ enum {
IWPM_NLA_MAPINFO_UNSPEC = 0,
IWPM_NLA_MAPINFO_LOCAL_ADDR,
IWPM_NLA_MAPINFO_MAPPED_ADDR,
+ IWPM_NLA_MAPINFO_FLAGS,
IWPM_NLA_MAPINFO_MAX
};
@@ -132,6 +152,12 @@ enum {
IWPM_NLA_ERR_MAX
};
+enum {
+ IWPM_NLA_HELLO_UNSPEC = 0,
+ IWPM_NLA_HELLO_ABI_VERSION,
+ IWPM_NLA_HELLO_MAX
+};
+
/*
* Local service operations:
* RESOLVE - The client requests the local service to resolve a path.
@@ -430,6 +456,16 @@ enum rdma_nldev_attr {
RDMA_NLDEV_ATTR_DRIVER_S64, /* s64 */
RDMA_NLDEV_ATTR_DRIVER_U64, /* u64 */
+ /*
+ * Indexes to get/set secific entry,
+ * for QP use RDMA_NLDEV_ATTR_RES_LQPN
+ */
+ RDMA_NLDEV_ATTR_RES_PDN, /* u32 */
+ RDMA_NLDEV_ATTR_RES_CQN, /* u32 */
+ RDMA_NLDEV_ATTR_RES_MRN, /* u32 */
+ RDMA_NLDEV_ATTR_RES_CM_IDN, /* u32 */
+ RDMA_NLDEV_ATTR_RES_CTXN, /* u32 */
+
/*
* Always the end
*/
--
2.19.1
^ permalink raw reply related
* [PATCH iproute2-next v2 09/19] rdma: Move resource QP logic to separate file
From: Leon Romanovsky @ 2019-02-23 9:15 UTC (permalink / raw)
To: David Ahern
Cc: Leon Romanovsky, netdev, RDMA mailing list, Stephen Hemminger,
Steve Wise
In-Reply-To: <20190223091528.8509-1-leon@kernel.org>
From: Leon Romanovsky <leonro@mellanox.com>
Logically separate resource QP logic to separate file,
in order to make PD specific logic self-contained.
Reviewed-by: Steve Wise <swise@opengridcomputing.com>
Signed-off-by: Leon Romanovsky <leonro@mellanox.com>
---
rdma/Makefile | 2 +-
rdma/res-qp.c | 234 +++++++++++++++++++++++++++++++++++++++++++++++++
rdma/res.c | 236 --------------------------------------------------
rdma/res.h | 17 ++++
4 files changed, 252 insertions(+), 237 deletions(-)
create mode 100644 rdma/res-qp.c
diff --git a/rdma/Makefile b/rdma/Makefile
index ef240404..ad7f4177 100644
--- a/rdma/Makefile
+++ b/rdma/Makefile
@@ -7,7 +7,7 @@ ifeq ($(HAVE_MNL),y)
CFLAGS += -I./include/uapi/
RDMA_OBJ = rdma.o utils.o dev.o link.o res.o res-pd.o res-mr.o res-cq.o \
- res-cmid.o
+ res-cmid.o res-qp.o
TARGETS += rdma
endif
diff --git a/rdma/res-qp.c b/rdma/res-qp.c
new file mode 100644
index 00000000..85725fea
--- /dev/null
+++ b/rdma/res-qp.c
@@ -0,0 +1,234 @@
+// SPDX-License-Identifier: GPL-2.0 OR Linux-OpenIB
+/*
+ * res-qp.c RDMA tool
+ * Authors: Leon Romanovsky <leonro@mellanox.com>
+ */
+
+#include "res.h"
+#include <inttypes.h>
+
+static const char *path_mig_to_str(uint8_t idx)
+{
+ static const char *const path_mig_str[] = { "MIGRATED", "REARM",
+ "ARMED" };
+
+ if (idx < ARRAY_SIZE(path_mig_str))
+ return path_mig_str[idx];
+ return "UNKNOWN";
+}
+
+static const char *qp_states_to_str(uint8_t idx)
+{
+ static const char *const qp_states_str[] = { "RESET", "INIT", "RTR",
+ "RTS", "SQD", "SQE",
+ "ERR" };
+
+ if (idx < ARRAY_SIZE(qp_states_str))
+ return qp_states_str[idx];
+ return "UNKNOWN";
+}
+
+static void print_rqpn(struct rd *rd, uint32_t val, struct nlattr **nla_line)
+{
+ if (!nla_line[RDMA_NLDEV_ATTR_RES_RQPN])
+ return;
+
+ if (rd->json_output)
+ jsonw_uint_field(rd->jw, "rqpn", val);
+ else
+ pr_out("rqpn %u ", val);
+}
+
+static void print_type(struct rd *rd, uint32_t val)
+{
+ if (rd->json_output)
+ jsonw_string_field(rd->jw, "type", qp_types_to_str(val));
+ else
+ pr_out("type %s ", qp_types_to_str(val));
+}
+
+static void print_state(struct rd *rd, uint32_t val)
+{
+ if (rd->json_output)
+ jsonw_string_field(rd->jw, "state", qp_states_to_str(val));
+ else
+ pr_out("state %s ", qp_states_to_str(val));
+}
+
+static void print_rqpsn(struct rd *rd, uint32_t val, struct nlattr **nla_line)
+{
+ if (!nla_line[RDMA_NLDEV_ATTR_RES_RQ_PSN])
+ return;
+
+ if (rd->json_output)
+ jsonw_uint_field(rd->jw, "rq-psn", val);
+ else
+ pr_out("rq-psn %u ", val);
+}
+
+static void print_sqpsn(struct rd *rd, uint32_t val)
+{
+ if (rd->json_output)
+ jsonw_uint_field(rd->jw, "sq-psn", val);
+ else
+ pr_out("sq-psn %u ", val);
+}
+
+static void print_pathmig(struct rd *rd, uint32_t val, struct nlattr **nla_line)
+{
+ if (!nla_line[RDMA_NLDEV_ATTR_RES_PATH_MIG_STATE])
+ return;
+
+ if (rd->json_output)
+ jsonw_string_field(rd->jw, "path-mig-state",
+ path_mig_to_str(val));
+ else
+ pr_out("path-mig-state %s ", path_mig_to_str(val));
+}
+
+int res_qp_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_QP])
+ 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_QP];
+
+ mnl_attr_for_each_nested(nla_entry, nla_table) {
+ struct nlattr *nla_line[RDMA_NLDEV_ATTR_MAX] = {};
+ 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;
+
+ 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_LQPN] ||
+ !nla_line[RDMA_NLDEV_ATTR_RES_SQ_PSN] ||
+ !nla_line[RDMA_NLDEV_ATTR_RES_TYPE] ||
+ !nla_line[RDMA_NLDEV_ATTR_RES_STATE] ||
+ (!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_PORT_INDEX])
+ port = mnl_attr_get_u32(
+ nla_line[RDMA_NLDEV_ATTR_PORT_INDEX]);
+
+ if (port != rd->port_idx)
+ continue;
+
+ lqpn = mnl_attr_get_u32(nla_line[RDMA_NLDEV_ATTR_RES_LQPN]);
+ 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))
+ continue;
+ } else {
+ if (rd_check_is_key_exist(rd, "rqpn"))
+ continue;
+ }
+
+ if (nla_line[RDMA_NLDEV_ATTR_RES_RQ_PSN]) {
+ rq_psn = mnl_attr_get_u32(
+ nla_line[RDMA_NLDEV_ATTR_RES_RQ_PSN]);
+ if (rd_check_is_filtered(rd, "rq-psn", rq_psn))
+ continue;
+ } else {
+ if (rd_check_is_key_exist(rd, "rq-psn"))
+ continue;
+ }
+
+ sq_psn = mnl_attr_get_u32(nla_line[RDMA_NLDEV_ATTR_RES_SQ_PSN]);
+ if (rd_check_is_filtered(rd, "sq-psn", sq_psn))
+ continue;
+
+ if (nla_line[RDMA_NLDEV_ATTR_RES_PATH_MIG_STATE]) {
+ path_mig_state = mnl_attr_get_u8(
+ nla_line[RDMA_NLDEV_ATTR_RES_PATH_MIG_STATE]);
+ if (rd_check_is_string_filtered(
+ rd, "path-mig-state",
+ path_mig_to_str(path_mig_state)))
+ continue;
+ } else {
+ if (rd_check_is_key_exist(rd, "path-mig-state"))
+ continue;
+ }
+
+ type = mnl_attr_get_u8(nla_line[RDMA_NLDEV_ATTR_RES_TYPE]);
+ if (rd_check_is_string_filtered(rd, "type",
+ qp_types_to_str(type)))
+ continue;
+
+ state = mnl_attr_get_u8(nla_line[RDMA_NLDEV_ATTR_RES_STATE]);
+ if (rd_check_is_string_filtered(rd, "state",
+ qp_states_to_str(state)))
+ 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_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);
+ print_state(rd, state);
+
+ print_rqpsn(rd, rq_psn, nla_line);
+ print_sqpsn(rd, sq_psn);
+
+ print_pathmig(rd, path_mig_state, nla_line);
+ 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;
+}
diff --git a/rdma/res.c b/rdma/res.c
index d5ae60e1..6d4da38c 100644
--- a/rdma/res.c
+++ b/rdma/res.c
@@ -119,27 +119,6 @@ int _res_send_msg(struct rd *rd, uint32_t command, mnl_cb_t callback)
return ret;
}
-static const char *path_mig_to_str(uint8_t idx)
-{
- static const char * const path_mig_str[] = { "MIGRATED",
- "REARM", "ARMED" };
-
- if (idx < ARRAY_SIZE(path_mig_str))
- return path_mig_str[idx];
- return "UNKNOWN";
-}
-
-static const char *qp_states_to_str(uint8_t idx)
-{
- static const char * const qp_states_str[] = { "RESET", "INIT",
- "RTR", "RTS", "SQD",
- "SQE", "ERR" };
-
- if (idx < ARRAY_SIZE(qp_states_str))
- return qp_states_str[idx];
- return "UNKNOWN";
-}
-
const char *qp_types_to_str(uint8_t idx)
{
static const char * const qp_types_str[] = { "SMI", "GSI", "RC",
@@ -161,68 +140,6 @@ void print_lqpn(struct rd *rd, uint32_t val)
pr_out("lqpn %u ", val);
}
-static void print_rqpn(struct rd *rd, uint32_t val, struct nlattr **nla_line)
-{
- if (!nla_line[RDMA_NLDEV_ATTR_RES_RQPN])
- return;
-
- if (rd->json_output)
- jsonw_uint_field(rd->jw, "rqpn", val);
- else
- pr_out("rqpn %u ", val);
-}
-
-static void print_type(struct rd *rd, uint32_t val)
-{
- if (rd->json_output)
- jsonw_string_field(rd->jw, "type",
- qp_types_to_str(val));
- else
- pr_out("type %s ", qp_types_to_str(val));
-}
-
-static void print_state(struct rd *rd, uint32_t val)
-{
- if (rd->json_output)
- jsonw_string_field(rd->jw, "state",
- qp_states_to_str(val));
- else
- pr_out("state %s ", qp_states_to_str(val));
-}
-
-static void print_rqpsn(struct rd *rd, uint32_t val, struct nlattr **nla_line)
-{
- if (!nla_line[RDMA_NLDEV_ATTR_RES_RQ_PSN])
- return;
-
- if (rd->json_output)
- jsonw_uint_field(rd->jw, "rq-psn", val);
- else
- pr_out("rq-psn %u ", val);
-}
-
-static void print_sqpsn(struct rd *rd, uint32_t val)
-{
- if (rd->json_output)
- jsonw_uint_field(rd->jw, "sq-psn", val);
- else
- pr_out("sq-psn %u ", val);
-}
-
-static void print_pathmig(struct rd *rd, uint32_t val,
- struct nlattr **nla_line)
-{
- if (!nla_line[RDMA_NLDEV_ATTR_RES_PATH_MIG_STATE])
- return;
-
- if (rd->json_output)
- jsonw_string_field(rd->jw,
- "path-mig-state",
- path_mig_to_str(val));
- else
- pr_out("path-mig-state %s ", path_mig_to_str(val));
-}
-
void print_pid(struct rd *rd, uint32_t val)
{
if (rd->json_output)
@@ -314,143 +231,6 @@ void res_print_uint(struct rd *rd, const char *name, uint64_t val)
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] = {};
- 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_QP])
- 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_QP];
-
- mnl_attr_for_each_nested(nla_entry, nla_table) {
- struct nlattr *nla_line[RDMA_NLDEV_ATTR_MAX] = {};
- 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;
-
- 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_LQPN] ||
- !nla_line[RDMA_NLDEV_ATTR_RES_SQ_PSN] ||
- !nla_line[RDMA_NLDEV_ATTR_RES_TYPE] ||
- !nla_line[RDMA_NLDEV_ATTR_RES_STATE] ||
- (!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_PORT_INDEX])
- port = mnl_attr_get_u32(nla_line[RDMA_NLDEV_ATTR_PORT_INDEX]);
-
- if (port != rd->port_idx)
- continue;
-
- lqpn = mnl_attr_get_u32(nla_line[RDMA_NLDEV_ATTR_RES_LQPN]);
- 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))
- continue;
- } else {
- if (rd_check_is_key_exist(rd, "rqpn"))
- continue;
- }
-
- if (nla_line[RDMA_NLDEV_ATTR_RES_RQ_PSN]) {
- rq_psn = mnl_attr_get_u32(nla_line[RDMA_NLDEV_ATTR_RES_RQ_PSN]);
- if (rd_check_is_filtered(rd, "rq-psn", rq_psn))
- continue;
- } else {
- if (rd_check_is_key_exist(rd, "rq-psn"))
- continue;
- }
-
- sq_psn = mnl_attr_get_u32(nla_line[RDMA_NLDEV_ATTR_RES_SQ_PSN]);
- if (rd_check_is_filtered(rd, "sq-psn", sq_psn))
- continue;
-
- if (nla_line[RDMA_NLDEV_ATTR_RES_PATH_MIG_STATE]) {
- path_mig_state = mnl_attr_get_u8(nla_line[RDMA_NLDEV_ATTR_RES_PATH_MIG_STATE]);
- if (rd_check_is_string_filtered(rd, "path-mig-state", path_mig_to_str(path_mig_state)))
- continue;
- } else {
- if (rd_check_is_key_exist(rd, "path-mig-state"))
- continue;
- }
-
- type = mnl_attr_get_u8(nla_line[RDMA_NLDEV_ATTR_RES_TYPE]);
- if (rd_check_is_string_filtered(rd, "type", qp_types_to_str(type)))
- continue;
-
- state = mnl_attr_get_u8(nla_line[RDMA_NLDEV_ATTR_RES_STATE]);
- if (rd_check_is_string_filtered(rd, "state", qp_states_to_str(state)))
- 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_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);
- print_state(rd, state);
-
- print_rqpsn(rd, rq_psn, nla_line);
- print_sqpsn(rd, sq_psn);
-
- print_pathmig(rd, path_mig_state, nla_line);
- 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;
-}
-
void print_users(struct rd *rd, uint64_t val)
{
if (rd->json_output)
@@ -461,22 +241,6 @@ void print_users(struct rd *rd, uint64_t val)
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 },
- { .name = "pdn", .is_number = true },
-};
-
-RES_FUNC(res_qp, RDMA_NLDEV_CMD_RES_QP_GET, qp_valid_filters, false);
-
static int res_show(struct rd *rd)
{
const struct rd_cmd cmds[] = {
diff --git a/rdma/res.h b/rdma/res.h
index e9d0d12e..95d88a3a 100644
--- a/rdma/res.h
+++ b/rdma/res.h
@@ -13,6 +13,7 @@ int res_pd_parse_cb(const struct nlmsghdr *nlh, void *data);
int res_mr_parse_cb(const struct nlmsghdr *nlh, void *data);
int res_cq_parse_cb(const struct nlmsghdr *nlh, void *data);
int res_cm_id_parse_cb(const struct nlmsghdr *nlh, void *data);
+int res_qp_parse_cb(const struct nlmsghdr *nlh, void *data);
#define RES_FUNC(name, command, valid_filters, strict_port) \
static inline int _##name(struct rd *rd)\
@@ -91,6 +92,22 @@ struct filters cm_id_valid_filters[MAX_NUMBER_OF_FILTERS] = {
RES_FUNC(res_cm_id, RDMA_NLDEV_CMD_RES_CM_ID_GET, cm_id_valid_filters, false);
+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 },
+ { .name = "pdn", .is_number = true },
+};
+
+RES_FUNC(res_qp, RDMA_NLDEV_CMD_RES_QP_GET, qp_valid_filters, false);
+
char *get_task_name(uint32_t pid);
void print_dev(struct rd *rd, uint32_t idx, const char *name);
void print_link(struct rd *rd, uint32_t idx, const char *name, uint32_t port,
--
2.19.1
^ permalink raw reply related
* [PATCH iproute2-next v2 10/19] rdma: Properly mark RDMAtool license
From: Leon Romanovsky @ 2019-02-23 9:15 UTC (permalink / raw)
To: David Ahern
Cc: Leon Romanovsky, netdev, RDMA mailing list, Stephen Hemminger,
Steve Wise
In-Reply-To: <20190223091528.8509-1-leon@kernel.org>
From: Leon Romanovsky <leonro@mellanox.com>
RDMA subsystem is dual-licensed with "GPL-2.0 OR Linux-OpenIB" proper
license and Mellanox submission are supposed to have this type of license.
Reviewed-by: Steve Wise <swise@opengridcomputing.com>
Signed-off-by: Leon Romanovsky <leonro@mellanox.com>
---
rdma/Makefile | 2 +-
rdma/dev.c | 7 +------
rdma/link.c | 7 +------
rdma/rdma.c | 7 +------
rdma/rdma.h | 7 +------
rdma/res.c | 7 +------
rdma/utils.c | 7 +------
7 files changed, 7 insertions(+), 37 deletions(-)
diff --git a/rdma/Makefile b/rdma/Makefile
index ad7f4177..6a424234 100644
--- a/rdma/Makefile
+++ b/rdma/Makefile
@@ -1,4 +1,4 @@
-# SPDX-License-Identifier: GPL-2.0
+# SPDX-License-Identifier: GPL-2.0 OR Linux-OpenIB
include ../config.mk
TARGETS :=
diff --git a/rdma/dev.c b/rdma/dev.c
index 60ff4b31..954e0015 100644
--- a/rdma/dev.c
+++ b/rdma/dev.c
@@ -1,11 +1,6 @@
+// SPDX-License-Identifier: GPL-2.0 OR Linux-OpenIB
/*
* dev.c RDMA tool
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version
- * 2 of the License, or (at your option) any later version.
- *
* Authors: Leon Romanovsky <leonro@mellanox.com>
*/
diff --git a/rdma/link.c b/rdma/link.c
index c064be62..89e81b84 100644
--- a/rdma/link.c
+++ b/rdma/link.c
@@ -1,11 +1,6 @@
+// SPDX-License-Identifier: GPL-2.0 OR Linux-OpenIB
/*
* link.c RDMA tool
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version
- * 2 of the License, or (at your option) any later version.
- *
* Authors: Leon Romanovsky <leonro@mellanox.com>
*/
diff --git a/rdma/rdma.c b/rdma/rdma.c
index 010e9837..676e03c2 100644
--- a/rdma/rdma.c
+++ b/rdma/rdma.c
@@ -1,11 +1,6 @@
+// SPDX-License-Identifier: GPL-2.0 OR Linux-OpenIB
/*
* rdma.c RDMA tool
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version
- * 2 of the License, or (at your option) any later version.
- *
* Authors: Leon Romanovsky <leonro@mellanox.com>
*/
diff --git a/rdma/rdma.h b/rdma/rdma.h
index 547bb574..d2559e7c 100644
--- a/rdma/rdma.h
+++ b/rdma/rdma.h
@@ -1,11 +1,6 @@
+/* SPDX-License-Identifier: GPL-2.0 OR Linux-OpenIB */
/*
* rdma.c RDMA tool
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version
- * 2 of the License, or (at your option) any later version.
- *
* Authors: Leon Romanovsky <leonro@mellanox.com>
*/
#ifndef _RDMA_TOOL_H_
diff --git a/rdma/res.c b/rdma/res.c
index 6d4da38c..f621afa8 100644
--- a/rdma/res.c
+++ b/rdma/res.c
@@ -1,11 +1,6 @@
+// SPDX-License-Identifier: GPL-2.0 OR Linux-OpenIB
/*
* res.c RDMA tool
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version
- * 2 of the License, or (at your option) any later version.
- *
* Authors: Leon Romanovsky <leonro@mellanox.com>
*/
diff --git a/rdma/utils.c b/rdma/utils.c
index 069d44fe..bce052d5 100644
--- a/rdma/utils.c
+++ b/rdma/utils.c
@@ -1,11 +1,6 @@
+// SPDX-License-Identifier: GPL-2.0 OR Linux-OpenIB
/*
* utils.c RDMA tool
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version
- * 2 of the License, or (at your option) any later version.
- *
* Authors: Leon Romanovsky <leonro@mellanox.com>
*/
--
2.19.1
^ permalink raw reply related
* [PATCH iproute2-next v2 11/19] rdma: Simplify code to reuse existing functions
From: Leon Romanovsky @ 2019-02-23 9:15 UTC (permalink / raw)
To: David Ahern
Cc: Leon Romanovsky, netdev, RDMA mailing list, Stephen Hemminger,
Steve Wise
In-Reply-To: <20190223091528.8509-1-leon@kernel.org>
From: Leon Romanovsky <leonro@mellanox.com>
Remove duplicated functions in favour general res_print_uint() call.
Reviewed-by: Steve Wise <swise@opengridcomputing.com>
Signed-off-by: Leon Romanovsky <leonro@mellanox.com>
---
rdma/res-cmid.c | 4 ++--
rdma/res-cq.c | 14 +++-----------
rdma/res-mr.c | 2 +-
rdma/res-pd.c | 4 ++--
rdma/res-qp.c | 14 +++-----------
rdma/res.c | 34 ++--------------------------------
rdma/res.h | 3 ---
7 files changed, 13 insertions(+), 62 deletions(-)
diff --git a/rdma/res-cmid.c b/rdma/res-cmid.c
index b63634a3..5eea7a6b 100644
--- a/rdma/res-cmid.c
+++ b/rdma/res-cmid.c
@@ -227,12 +227,12 @@ int res_cm_id_parse_cb(const struct nlmsghdr *nlh, void *data)
print_link(rd, idx, name, port, nla_line);
if (nla_line[RDMA_NLDEV_ATTR_RES_LQPN])
- print_lqpn(rd, lqpn);
+ res_print_uint(rd, "lqpn", lqpn);
if (nla_line[RDMA_NLDEV_ATTR_RES_TYPE])
print_qp_type(rd, type);
print_cm_id_state(rd, state);
print_ps(rd, ps);
- print_pid(rd, pid);
+ res_print_uint(rd, "pid", pid);
print_comm(rd, comm, nla_line);
if (nla_line[RDMA_NLDEV_ATTR_RES_CM_IDN])
res_print_uint(rd, "cm-idn", cm_idn);
diff --git a/rdma/res-cq.c b/rdma/res-cq.c
index fbfe593b..93c18251 100644
--- a/rdma/res-cq.c
+++ b/rdma/res-cq.c
@@ -7,14 +7,6 @@
#include "res.h"
#include <inttypes.h>
-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 const char *poll_ctx_to_str(uint8_t idx)
{
static const char * const cm_id_states_str[] = {
@@ -120,11 +112,11 @@ int res_cq_parse_cb(const struct nlmsghdr *nlh, void *data)
jsonw_start_array(rd->jw);
print_dev(rd, idx, name);
- print_cqe(rd, cqe);
- print_users(rd, users);
+ res_print_uint(rd, "cqe", cqe);
+ res_print_uint(rd, "users", users);
if (nla_line[RDMA_NLDEV_ATTR_RES_POLL_CTX])
print_poll_ctx(rd, poll_ctx);
- print_pid(rd, pid);
+ res_print_uint(rd, "pid", pid);
print_comm(rd, comm, nla_line);
if (nla_line[RDMA_NLDEV_ATTR_RES_CQN])
diff --git a/rdma/res-mr.c b/rdma/res-mr.c
index dae5def2..e373035a 100644
--- a/rdma/res-mr.c
+++ b/rdma/res-mr.c
@@ -97,7 +97,7 @@ int res_mr_parse_cb(const struct nlmsghdr *nlh, void *data)
if (nla_line[RDMA_NLDEV_ATTR_RES_IOVA])
print_key(rd, "iova", iova);
res_print_uint(rd, "mrlen", mrlen);
- print_pid(rd, pid);
+ res_print_uint(rd, "pid", pid);
print_comm(rd, comm, nla_line);
if (nla_line[RDMA_NLDEV_ATTR_RES_MRN])
diff --git a/rdma/res-pd.c b/rdma/res-pd.c
index d879a21a..24ac7f1b 100644
--- a/rdma/res-pd.c
+++ b/rdma/res-pd.c
@@ -89,10 +89,10 @@ int res_pd_parse_cb(const struct nlmsghdr *nlh, void *data)
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);
+ res_print_uint(rd, "users", users);
if (nla_line[RDMA_NLDEV_ATTR_RES_UNSAFE_GLOBAL_RKEY])
print_key(rd, "unsafe_global_rkey", unsafe_global_rkey);
- print_pid(rd, pid);
+ res_print_uint(rd, "pid", pid);
print_comm(rd, comm, nla_line);
if (nla_line[RDMA_NLDEV_ATTR_RES_CTXN])
res_print_uint(rd, "ctxn", ctxn);
diff --git a/rdma/res-qp.c b/rdma/res-qp.c
index 85725fea..ecd2cbd6 100644
--- a/rdma/res-qp.c
+++ b/rdma/res-qp.c
@@ -66,14 +66,6 @@ static void print_rqpsn(struct rd *rd, uint32_t val, struct nlattr **nla_line)
pr_out("rq-psn %u ", val);
}
-static void print_sqpsn(struct rd *rd, uint32_t val)
-{
- if (rd->json_output)
- jsonw_uint_field(rd->jw, "sq-psn", val);
- else
- pr_out("sq-psn %u ", val);
-}
-
static void print_pathmig(struct rd *rd, uint32_t val, struct nlattr **nla_line)
{
if (!nla_line[RDMA_NLDEV_ATTR_RES_PATH_MIG_STATE])
@@ -209,7 +201,7 @@ int res_qp_parse_cb(const struct nlmsghdr *nlh, void *data)
print_link(rd, idx, name, port, nla_line);
- print_lqpn(rd, lqpn);
+ res_print_uint(rd, "lqpn", lqpn);
if (nla_line[RDMA_NLDEV_ATTR_RES_PDN])
res_print_uint(rd, "pdn", pdn);
print_rqpn(rd, rqpn, nla_line);
@@ -218,10 +210,10 @@ int res_qp_parse_cb(const struct nlmsghdr *nlh, void *data)
print_state(rd, state);
print_rqpsn(rd, rq_psn, nla_line);
- print_sqpsn(rd, sq_psn);
+ res_print_uint(rd, "sq-psn", sq_psn);
print_pathmig(rd, path_mig_state, nla_line);
- print_pid(rd, pid);
+ res_print_uint(rd, "pid", pid);
print_comm(rd, comm, nla_line);
if (nla_line[RDMA_NLDEV_ATTR_RES_PID])
diff --git a/rdma/res.c b/rdma/res.c
index f621afa8..140c0908 100644
--- a/rdma/res.c
+++ b/rdma/res.c
@@ -35,7 +35,6 @@ static int res_print_summary(struct rd *rd, struct nlattr **tb)
mnl_attr_for_each_nested(nla_entry, nla_table) {
struct nlattr *nla_line[RDMA_NLDEV_ATTR_MAX] = {};
- char json_name[32];
err = mnl_attr_parse_nested(nla_entry, rd_attr_cb, nla_line);
if (err != MNL_CB_OK)
@@ -48,12 +47,7 @@ static int res_print_summary(struct rd *rd, struct nlattr **tb)
name = mnl_attr_get_str(nla_line[RDMA_NLDEV_ATTR_RES_SUMMARY_ENTRY_NAME]);
curr = mnl_attr_get_u64(nla_line[RDMA_NLDEV_ATTR_RES_SUMMARY_ENTRY_CURR]);
- if (rd->json_output) {
- snprintf(json_name, 32, "%s", name);
- jsonw_lluint_field(rd->jw, json_name, curr);
- } else {
- pr_out("%s %"PRId64 " ", name, curr);
- }
+ res_print_uint(rd, name, curr);
}
return 0;
}
@@ -127,22 +121,6 @@ const char *qp_types_to_str(uint8_t idx)
return "UNKNOWN";
}
-void print_lqpn(struct rd *rd, uint32_t val)
-{
- if (rd->json_output)
- jsonw_uint_field(rd->jw, "lqpn", val);
- else
- pr_out("lqpn %u ", val);
-}
-
-void print_pid(struct rd *rd, uint32_t val)
-{
- if (rd->json_output)
- jsonw_uint_field(rd->jw, "pid", val);
- else
- pr_out("pid %u ", val);
-}
-
void print_comm(struct rd *rd, const char *str, struct nlattr **nla_line)
{
char tmp[18];
@@ -221,19 +199,11 @@ void print_key(struct rd *rd, const char *name, uint64_t 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);
+ jsonw_u64_field(rd->jw, name, val);
else
pr_out("%s %" PRIu64 " ", name, val);
}
-void print_users(struct rd *rd, uint64_t val)
-{
- if (rd->json_output)
- jsonw_uint_field(rd->jw, "users", val);
- else
- pr_out("users %" PRIu64 " ", val);
-}
-
RES_FUNC(res_no_args, RDMA_NLDEV_CMD_RES_GET, NULL, true);
static int res_show(struct rd *rd)
diff --git a/rdma/res.h b/rdma/res.h
index 95d88a3a..89dd818a 100644
--- a/rdma/res.h
+++ b/rdma/res.h
@@ -112,12 +112,9 @@ char *get_task_name(uint32_t pid);
void print_dev(struct rd *rd, uint32_t idx, const char *name);
void print_link(struct rd *rd, uint32_t idx, const char *name, uint32_t port,
struct nlattr **nla_line);
-void print_users(struct rd *rd, uint64_t val);
void print_key(struct rd *rd, const char *name, uint64_t val);
void res_print_uint(struct rd *rd, const char *name, uint64_t val);
-void print_pid(struct rd *rd, uint32_t val);
void print_comm(struct rd *rd, const char *str, struct nlattr **nla_line);
const char *qp_types_to_str(uint8_t idx);
-void print_lqpn(struct rd *rd, uint32_t val);
#endif /* _RDMA_TOOL_RES_H_ */
--
2.19.1
^ permalink raw reply related
* [PATCH iproute2-next v2 12/19] rdma: Simplify CM_ID print code
From: Leon Romanovsky @ 2019-02-23 9:15 UTC (permalink / raw)
To: David Ahern
Cc: Leon Romanovsky, netdev, RDMA mailing list, Stephen Hemminger,
Steve Wise
In-Reply-To: <20190223091528.8509-1-leon@kernel.org>
From: Leon Romanovsky <leonro@mellanox.com>
Refactor our the CM_ID print code.
Reviewed-by: Steve Wise <swise@opengridcomputing.com>
Signed-off-by: Leon Romanovsky <leonro@mellanox.com>
---
rdma/res-cmid.c | 246 ++++++++++++++++++++++++------------------------
1 file changed, 124 insertions(+), 122 deletions(-)
diff --git a/rdma/res-cmid.c b/rdma/res-cmid.c
index 5eea7a6b..12d1acee 100644
--- a/rdma/res-cmid.c
+++ b/rdma/res-cmid.c
@@ -108,11 +108,130 @@ static int ss_ntop(struct nlattr *nla_line, char *addr_str, uint16_t *port)
return 0;
}
+static int res_cm_id_line(struct rd *rd, const char *name, int idx,
+ struct nlattr *nla_entry)
+{
+ struct nlattr *nla_line[RDMA_NLDEV_ATTR_MAX] = {};
+ char src_addr_str[INET6_ADDRSTRLEN];
+ char dst_addr_str[INET6_ADDRSTRLEN];
+ uint16_t src_port, dst_port;
+ 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;
+
+ 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_STATE] ||
+ !nla_line[RDMA_NLDEV_ATTR_RES_PS] ||
+ (!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_PORT_INDEX])
+ port = mnl_attr_get_u32(nla_line[RDMA_NLDEV_ATTR_PORT_INDEX]);
+
+ if (port && port != rd->port_idx)
+ goto out;
+
+ if (nla_line[RDMA_NLDEV_ATTR_RES_LQPN]) {
+ lqpn = mnl_attr_get_u32(nla_line[RDMA_NLDEV_ATTR_RES_LQPN]);
+ if (rd_check_is_filtered(rd, "lqpn", lqpn))
+ goto out;
+ }
+ if (nla_line[RDMA_NLDEV_ATTR_RES_TYPE]) {
+ type = mnl_attr_get_u8(nla_line[RDMA_NLDEV_ATTR_RES_TYPE]);
+ if (rd_check_is_string_filtered(rd, "qp-type",
+ qp_types_to_str(type)))
+ goto out;
+ }
+
+ ps = mnl_attr_get_u32(nla_line[RDMA_NLDEV_ATTR_RES_PS]);
+ if (rd_check_is_string_filtered(rd, "ps", cm_id_ps_to_str(ps)))
+ goto out;
+
+ state = mnl_attr_get_u8(nla_line[RDMA_NLDEV_ATTR_RES_STATE]);
+ if (rd_check_is_string_filtered(rd, "state", cm_id_state_to_str(state)))
+ goto out;
+
+ if (nla_line[RDMA_NLDEV_ATTR_RES_SRC_ADDR]) {
+ if (ss_ntop(nla_line[RDMA_NLDEV_ATTR_RES_SRC_ADDR],
+ src_addr_str, &src_port))
+ goto out;
+ if (rd_check_is_string_filtered(rd, "src-addr", src_addr_str))
+ goto out;
+ if (rd_check_is_filtered(rd, "src-port", src_port))
+ goto out;
+ }
+
+ if (nla_line[RDMA_NLDEV_ATTR_RES_DST_ADDR]) {
+ if (ss_ntop(nla_line[RDMA_NLDEV_ATTR_RES_DST_ADDR],
+ dst_addr_str, &dst_port))
+ goto out;
+ if (rd_check_is_string_filtered(rd, "dst-addr", dst_addr_str))
+ goto out;
+ if (rd_check_is_filtered(rd, "dst-port", dst_port))
+ goto out;
+ }
+
+ 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))
+ goto out;
+
+ 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))
+ goto out;
+
+ 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_link(rd, idx, name, port, nla_line);
+ if (nla_line[RDMA_NLDEV_ATTR_RES_LQPN])
+ res_print_uint(rd, "lqpn", lqpn);
+ if (nla_line[RDMA_NLDEV_ATTR_RES_TYPE])
+ print_qp_type(rd, type);
+ print_cm_id_state(rd, state);
+ print_ps(rd, ps);
+ res_print_uint(rd, "pid", 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);
+ if (nla_line[RDMA_NLDEV_ATTR_RES_DST_ADDR])
+ print_ipaddr(rd, "dst-addr", dst_addr_str, dst_port);
+
+ print_driver_table(rd, nla_line[RDMA_NLDEV_ATTR_DRIVER]);
+ newline(rd);
+
+out: if (nla_line[RDMA_NLDEV_ATTR_RES_PID])
+ free(comm);
+ return MNL_CB_OK;
+}
+
int res_cm_id_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;
+ int ret = MNL_CB_OK;
const char *name;
int idx;
@@ -124,129 +243,12 @@ int res_cm_id_parse_cb(const struct nlmsghdr *nlh, void *data)
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_CM_ID];
+
mnl_attr_for_each_nested(nla_entry, nla_table) {
- struct nlattr *nla_line[RDMA_NLDEV_ATTR_MAX] = {};
- char src_addr_str[INET6_ADDRSTRLEN];
- char dst_addr_str[INET6_ADDRSTRLEN];
- uint16_t src_port, dst_port;
- 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;
-
- err = mnl_attr_parse_nested(nla_entry, rd_attr_cb, nla_line);
- if (err != MNL_CB_OK)
- return -EINVAL;
+ ret = res_cm_id_line(rd, name, idx, nla_entry);
- if (!nla_line[RDMA_NLDEV_ATTR_RES_STATE] ||
- !nla_line[RDMA_NLDEV_ATTR_RES_PS] ||
- (!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_PORT_INDEX])
- port = mnl_attr_get_u32(
- nla_line[RDMA_NLDEV_ATTR_PORT_INDEX]);
-
- if (port && port != rd->port_idx)
- continue;
-
- if (nla_line[RDMA_NLDEV_ATTR_RES_LQPN]) {
- lqpn = mnl_attr_get_u32(
- nla_line[RDMA_NLDEV_ATTR_RES_LQPN]);
- if (rd_check_is_filtered(rd, "lqpn", lqpn))
- continue;
- }
- if (nla_line[RDMA_NLDEV_ATTR_RES_TYPE]) {
- type = mnl_attr_get_u8(
- nla_line[RDMA_NLDEV_ATTR_RES_TYPE]);
- if (rd_check_is_string_filtered(rd, "qp-type",
- qp_types_to_str(type)))
- continue;
- }
-
- ps = mnl_attr_get_u32(nla_line[RDMA_NLDEV_ATTR_RES_PS]);
- if (rd_check_is_string_filtered(rd, "ps", cm_id_ps_to_str(ps)))
- continue;
-
- state = mnl_attr_get_u8(nla_line[RDMA_NLDEV_ATTR_RES_STATE]);
- if (rd_check_is_string_filtered(rd, "state",
- cm_id_state_to_str(state)))
- continue;
-
- if (nla_line[RDMA_NLDEV_ATTR_RES_SRC_ADDR]) {
- if (ss_ntop(nla_line[RDMA_NLDEV_ATTR_RES_SRC_ADDR],
- src_addr_str, &src_port))
- continue;
- 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]) {
- if (ss_ntop(nla_line[RDMA_NLDEV_ATTR_RES_DST_ADDR],
- dst_addr_str, &dst_port))
- continue;
- 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 (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_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(
- nla_line[RDMA_NLDEV_ATTR_RES_KERN_NAME]);
- }
-
- if (rd->json_output)
- jsonw_start_array(rd->jw);
-
- print_link(rd, idx, name, port, nla_line);
- if (nla_line[RDMA_NLDEV_ATTR_RES_LQPN])
- res_print_uint(rd, "lqpn", lqpn);
- if (nla_line[RDMA_NLDEV_ATTR_RES_TYPE])
- print_qp_type(rd, type);
- print_cm_id_state(rd, state);
- print_ps(rd, ps);
- res_print_uint(rd, "pid", 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);
- if (nla_line[RDMA_NLDEV_ATTR_RES_DST_ADDR])
- print_ipaddr(rd, "dst-addr", dst_addr_str, dst_port);
-
- if (nla_line[RDMA_NLDEV_ATTR_RES_PID])
- free(comm);
-
- print_driver_table(rd, nla_line[RDMA_NLDEV_ATTR_DRIVER]);
- newline(rd);
+ if (ret != MNL_CB_OK)
+ break;
}
- return MNL_CB_OK;
+ return ret;
}
--
2.19.1
^ permalink raw reply related
* [PATCH iproute2-next v2 13/19] rdma: Refactor CQ prints
From: Leon Romanovsky @ 2019-02-23 9:15 UTC (permalink / raw)
To: David Ahern
Cc: Leon Romanovsky, netdev, RDMA mailing list, Stephen Hemminger,
Steve Wise
In-Reply-To: <20190223091528.8509-1-leon@kernel.org>
From: Leon Romanovsky <leonro@mellanox.com>
Reviewed-by: Steve Wise <swise@opengridcomputing.com>
Signed-off-by: Leon Romanovsky <leonro@mellanox.com>
---
rdma/res-cq.c | 177 ++++++++++++++++++++++++++------------------------
1 file changed, 91 insertions(+), 86 deletions(-)
diff --git a/rdma/res-cq.c b/rdma/res-cq.c
index 93c18251..e50d76ce 100644
--- a/rdma/res-cq.c
+++ b/rdma/res-cq.c
@@ -27,11 +27,97 @@ static void print_poll_ctx(struct rd *rd, uint8_t poll_ctx)
pr_out("poll-ctx %s ", poll_ctx_to_str(poll_ctx));
}
+static int res_cq_line(struct rd *rd, const char *name, int idx,
+ struct nlattr *nla_entry)
+{
+ struct nlattr *nla_line[RDMA_NLDEV_ATTR_MAX] = {};
+ char *comm = NULL;
+ uint32_t pid = 0;
+ uint8_t poll_ctx = 0;
+ uint32_t ctxn = 0;
+ uint32_t cqn = 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))
+ goto out;
+
+ 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)))
+ goto out;
+ }
+
+ 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))
+ goto out;
+
+ if (nla_line[RDMA_NLDEV_ATTR_RES_CQN])
+ cqn = mnl_attr_get_u32(nla_line[RDMA_NLDEV_ATTR_RES_CQN]);
+ if (rd_check_is_filtered(rd, "cqn", cqn))
+ goto out;
+
+ if (nla_line[RDMA_NLDEV_ATTR_RES_CTXN])
+ ctxn = mnl_attr_get_u32(nla_line[RDMA_NLDEV_ATTR_RES_CTXN]);
+ if (rd_check_is_filtered(rd, "ctxn", ctxn))
+ goto out;
+
+ 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);
+ res_print_uint(rd, "cqe", cqe);
+ res_print_uint(rd, "users", users);
+ if (nla_line[RDMA_NLDEV_ATTR_RES_POLL_CTX])
+ print_poll_ctx(rd, poll_ctx);
+ res_print_uint(rd, "pid", pid);
+ print_comm(rd, comm, nla_line);
+
+ if (nla_line[RDMA_NLDEV_ATTR_RES_CQN])
+ res_print_uint(rd, "cqn", cqn);
+ if (nla_line[RDMA_NLDEV_ATTR_RES_CTXN])
+ res_print_uint(rd, "ctxn", ctxn);
+
+ print_driver_table(rd, nla_line[RDMA_NLDEV_ATTR_DRIVER]);
+ newline(rd);
+
+out: if (nla_line[RDMA_NLDEV_ATTR_RES_PID])
+ free(comm);
+ return MNL_CB_OK;
+}
+
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;
+ int ret = MNL_CB_OK;
const char *name;
uint32_t idx;
@@ -45,91 +131,10 @@ int res_cq_parse_cb(const struct nlmsghdr *nlh, void *data)
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;
- uint32_t ctxn = 0;
- uint32_t cqn = 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_CQN])
- cqn = mnl_attr_get_u32(
- nla_line[RDMA_NLDEV_ATTR_RES_CQN]);
- if (rd_check_is_filtered(rd, "cqn", cqn))
- continue;
-
- if (nla_line[RDMA_NLDEV_ATTR_RES_CTXN])
- ctxn = mnl_attr_get_u32(
- nla_line[RDMA_NLDEV_ATTR_RES_CTXN]);
- if (rd_check_is_filtered(rd, "ctxn", ctxn))
- 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);
- res_print_uint(rd, "cqe", cqe);
- res_print_uint(rd, "users", users);
- if (nla_line[RDMA_NLDEV_ATTR_RES_POLL_CTX])
- print_poll_ctx(rd, poll_ctx);
- res_print_uint(rd, "pid", pid);
- print_comm(rd, comm, nla_line);
-
- if (nla_line[RDMA_NLDEV_ATTR_RES_CQN])
- res_print_uint(rd, "cqn", cqn);
- if (nla_line[RDMA_NLDEV_ATTR_RES_CTXN])
- res_print_uint(rd, "ctxn", ctxn);
-
- if (nla_line[RDMA_NLDEV_ATTR_RES_PID])
- free(comm);
-
- print_driver_table(rd, nla_line[RDMA_NLDEV_ATTR_DRIVER]);
- newline(rd);
+ ret = res_cq_line(rd, name, idx, nla_entry);
+
+ if (ret != MNL_CB_OK)
+ break;
}
- return MNL_CB_OK;
+ return ret;
}
-
--
2.19.1
^ permalink raw reply related
* [PATCH iproute2-next v2 14/19] rdma: Move MR code to be suitable for per-line parsing
From: Leon Romanovsky @ 2019-02-23 9:15 UTC (permalink / raw)
To: David Ahern
Cc: Leon Romanovsky, netdev, RDMA mailing list, Stephen Hemminger,
Steve Wise
In-Reply-To: <20190223091528.8509-1-leon@kernel.org>
From: Leon Romanovsky <leonro@mellanox.com>
Reviewed-by: Steve Wise <swise@opengridcomputing.com>
Signed-off-by: Leon Romanovsky <leonro@mellanox.com>
---
rdma/res-mr.c | 178 +++++++++++++++++++++++++-------------------------
1 file changed, 90 insertions(+), 88 deletions(-)
diff --git a/rdma/res-mr.c b/rdma/res-mr.c
index e373035a..36993b5e 100644
--- a/rdma/res-mr.c
+++ b/rdma/res-mr.c
@@ -7,11 +7,96 @@
#include "res.h"
#include <inttypes.h>
+static int res_mr_line(struct rd *rd, const char *name, int idx,
+ struct nlattr *nla_entry)
+{
+ struct nlattr *nla_line[RDMA_NLDEV_ATTR_MAX] = {};
+ uint32_t rkey = 0, lkey = 0;
+ uint64_t iova = 0, mrlen;
+ char *comm = NULL;
+ uint32_t pdn = 0;
+ uint32_t mrn = 0;
+ 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))
+ goto out;
+
+ 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))
+ goto out;
+
+ if (nla_line[RDMA_NLDEV_ATTR_RES_MRN])
+ mrn = mnl_attr_get_u32(nla_line[RDMA_NLDEV_ATTR_RES_MRN]);
+ if (rd_check_is_filtered(rd, "mrn", mrn))
+ goto out;
+
+ 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))
+ goto out;
+
+ 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_key(rd, "iova", iova);
+ res_print_uint(rd, "mrlen", mrlen);
+ res_print_uint(rd, "pid", pid);
+ print_comm(rd, comm, nla_line);
+
+ if (nla_line[RDMA_NLDEV_ATTR_RES_MRN])
+ res_print_uint(rd, "mrn", mrn);
+
+ if (nla_line[RDMA_NLDEV_ATTR_RES_PDN])
+ res_print_uint(rd, "pdn", pdn);
+
+ print_driver_table(rd, nla_line[RDMA_NLDEV_ATTR_DRIVER]);
+ newline(rd);
+
+out:
+ if (nla_line[RDMA_NLDEV_ATTR_RES_PID])
+ free(comm);
+ return MNL_CB_OK;
+}
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;
+ int ret = MNL_CB_OK;
const char *name;
uint32_t idx;
@@ -25,93 +110,10 @@ int res_mr_parse_cb(const struct nlmsghdr *nlh, void *data)
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 pdn = 0;
- uint32_t mrn = 0;
- 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_MRN])
- mrn = mnl_attr_get_u32(
- nla_line[RDMA_NLDEV_ATTR_RES_MRN]);
- if (rd_check_is_filtered(rd, "mrn", mrn))
- 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_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_key(rd, "iova", iova);
- res_print_uint(rd, "mrlen", mrlen);
- res_print_uint(rd, "pid", pid);
- print_comm(rd, comm, nla_line);
-
- if (nla_line[RDMA_NLDEV_ATTR_RES_MRN])
- res_print_uint(rd, "mrn", mrn);
-
- if (nla_line[RDMA_NLDEV_ATTR_RES_PDN])
- res_print_uint(rd, "pdn", pdn);
-
- if (nla_line[RDMA_NLDEV_ATTR_RES_PID])
- free(comm);
-
- print_driver_table(rd, nla_line[RDMA_NLDEV_ATTR_DRIVER]);
- newline(rd);
+ ret = res_mr_line(rd, name, idx, nla_entry);
+
+ if (ret != MNL_CB_OK)
+ break;
}
- return MNL_CB_OK;
+ return ret;
}
-
--
2.19.1
^ permalink raw reply related
* [PATCH iproute2-next v2 08/19] rdma: Move out resource CM-ID logic to separate file
From: Leon Romanovsky @ 2019-02-23 9:15 UTC (permalink / raw)
To: David Ahern
Cc: Leon Romanovsky, netdev, RDMA mailing list, Stephen Hemminger,
Steve Wise
In-Reply-To: <20190223091528.8509-1-leon@kernel.org>
From: Leon Romanovsky <leonro@mellanox.com>
Logically separate resource CM-ID logic to separate file,
in order to make CM-ID specific logic self-contained.
Reviewed-by: Steve Wise <swise@opengridcomputing.com>
Signed-off-by: Leon Romanovsky <leonro@mellanox.com>
---
rdma/Makefile | 3 +-
rdma/res-cmid.c | 252 ++++++++++++++++++++++++++++++++++++++++++++
rdma/res.c | 271 +-----------------------------------------------
rdma/res.h | 24 +++++
4 files changed, 282 insertions(+), 268 deletions(-)
create mode 100644 rdma/res-cmid.c
diff --git a/rdma/Makefile b/rdma/Makefile
index e32ccd18..ef240404 100644
--- a/rdma/Makefile
+++ b/rdma/Makefile
@@ -6,7 +6,8 @@ TARGETS :=
ifeq ($(HAVE_MNL),y)
CFLAGS += -I./include/uapi/
-RDMA_OBJ = rdma.o utils.o dev.o link.o res.o res-pd.o res-mr.o res-cq.o
+RDMA_OBJ = rdma.o utils.o dev.o link.o res.o res-pd.o res-mr.o res-cq.o \
+ res-cmid.o
TARGETS += rdma
endif
diff --git a/rdma/res-cmid.c b/rdma/res-cmid.c
new file mode 100644
index 00000000..b63634a3
--- /dev/null
+++ b/rdma/res-cmid.c
@@ -0,0 +1,252 @@
+// SPDX-License-Identifier: GPL-2.0 OR Linux-OpenIB
+/*
+ * res-cmid.c RDMA tool
+ * Authors: Leon Romanovsky <leonro@mellanox.com>
+ */
+
+#include "res.h"
+#include <inttypes.h>
+
+static void print_qp_type(struct rd *rd, uint32_t val)
+{
+ if (rd->json_output)
+ jsonw_string_field(rd->jw, "qp-type", qp_types_to_str(val));
+ else
+ pr_out("qp-type %s ", qp_types_to_str(val));
+}
+
+static const char *cm_id_state_to_str(uint8_t idx)
+{
+ static const char *const cm_id_states_str[] = {
+ "IDLE", "ADDR_QUERY", "ADDR_RESOLVED",
+ "ROUTE_QUERY", "ROUTE_RESOLVED", "CONNECT",
+ "DISCONNECT", "ADDR_BOUND", "LISTEN",
+ "DEVICE_REMOVAL", "DESTROYING"
+ };
+
+ if (idx < ARRAY_SIZE(cm_id_states_str))
+ return cm_id_states_str[idx];
+ return "UNKNOWN";
+}
+
+static const char *cm_id_ps_to_str(uint32_t ps)
+{
+ switch (ps) {
+ case RDMA_PS_IPOIB:
+ return "IPoIB";
+ case RDMA_PS_IB:
+ return "IPoIB";
+ case RDMA_PS_TCP:
+ return "TCP";
+ case RDMA_PS_UDP:
+ return "UDP";
+ default:
+ return "---";
+ }
+}
+
+static void print_cm_id_state(struct rd *rd, uint8_t state)
+{
+ if (rd->json_output) {
+ jsonw_string_field(rd->jw, "state", cm_id_state_to_str(state));
+ return;
+ }
+ pr_out("state %s ", cm_id_state_to_str(state));
+}
+
+static void print_ps(struct rd *rd, uint32_t ps)
+{
+ if (rd->json_output) {
+ jsonw_string_field(rd->jw, "ps", cm_id_ps_to_str(ps));
+ return;
+ }
+ pr_out("ps %s ", cm_id_ps_to_str(ps));
+}
+
+static void print_ipaddr(struct rd *rd, const char *key, char *addrstr,
+ uint16_t port)
+{
+ if (rd->json_output) {
+ int name_size = INET6_ADDRSTRLEN + strlen(":65535");
+ char json_name[name_size];
+
+ snprintf(json_name, name_size, "%s:%u", addrstr, port);
+ jsonw_string_field(rd->jw, key, json_name);
+ return;
+ }
+ pr_out("%s %s:%u ", key, addrstr, port);
+}
+
+static int ss_ntop(struct nlattr *nla_line, char *addr_str, uint16_t *port)
+{
+ struct __kernel_sockaddr_storage *addr;
+
+ addr = (struct __kernel_sockaddr_storage *)mnl_attr_get_payload(
+ nla_line);
+ switch (addr->ss_family) {
+ case AF_INET: {
+ struct sockaddr_in *sin = (struct sockaddr_in *)addr;
+
+ if (!inet_ntop(AF_INET, (const void *)&sin->sin_addr, addr_str,
+ INET6_ADDRSTRLEN))
+ return -EINVAL;
+ *port = ntohs(sin->sin_port);
+ break;
+ }
+ case AF_INET6: {
+ struct sockaddr_in6 *sin6 = (struct sockaddr_in6 *)addr;
+
+ if (!inet_ntop(AF_INET6, (const void *)&sin6->sin6_addr,
+ addr_str, INET6_ADDRSTRLEN))
+ return -EINVAL;
+ *port = ntohs(sin6->sin6_port);
+ break;
+ }
+ default:
+ return -EINVAL;
+ }
+ return 0;
+}
+
+int res_cm_id_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;
+ int 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_CM_ID])
+ 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_CM_ID];
+ mnl_attr_for_each_nested(nla_entry, nla_table) {
+ struct nlattr *nla_line[RDMA_NLDEV_ATTR_MAX] = {};
+ char src_addr_str[INET6_ADDRSTRLEN];
+ char dst_addr_str[INET6_ADDRSTRLEN];
+ uint16_t src_port, dst_port;
+ 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;
+
+ err = mnl_attr_parse_nested(nla_entry, rd_attr_cb, nla_line);
+ if (err != MNL_CB_OK)
+ return -EINVAL;
+
+ if (!nla_line[RDMA_NLDEV_ATTR_RES_STATE] ||
+ !nla_line[RDMA_NLDEV_ATTR_RES_PS] ||
+ (!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_PORT_INDEX])
+ port = mnl_attr_get_u32(
+ nla_line[RDMA_NLDEV_ATTR_PORT_INDEX]);
+
+ if (port && port != rd->port_idx)
+ continue;
+
+ if (nla_line[RDMA_NLDEV_ATTR_RES_LQPN]) {
+ lqpn = mnl_attr_get_u32(
+ nla_line[RDMA_NLDEV_ATTR_RES_LQPN]);
+ if (rd_check_is_filtered(rd, "lqpn", lqpn))
+ continue;
+ }
+ if (nla_line[RDMA_NLDEV_ATTR_RES_TYPE]) {
+ type = mnl_attr_get_u8(
+ nla_line[RDMA_NLDEV_ATTR_RES_TYPE]);
+ if (rd_check_is_string_filtered(rd, "qp-type",
+ qp_types_to_str(type)))
+ continue;
+ }
+
+ ps = mnl_attr_get_u32(nla_line[RDMA_NLDEV_ATTR_RES_PS]);
+ if (rd_check_is_string_filtered(rd, "ps", cm_id_ps_to_str(ps)))
+ continue;
+
+ state = mnl_attr_get_u8(nla_line[RDMA_NLDEV_ATTR_RES_STATE]);
+ if (rd_check_is_string_filtered(rd, "state",
+ cm_id_state_to_str(state)))
+ continue;
+
+ if (nla_line[RDMA_NLDEV_ATTR_RES_SRC_ADDR]) {
+ if (ss_ntop(nla_line[RDMA_NLDEV_ATTR_RES_SRC_ADDR],
+ src_addr_str, &src_port))
+ continue;
+ 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]) {
+ if (ss_ntop(nla_line[RDMA_NLDEV_ATTR_RES_DST_ADDR],
+ dst_addr_str, &dst_port))
+ continue;
+ 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 (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_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(
+ nla_line[RDMA_NLDEV_ATTR_RES_KERN_NAME]);
+ }
+
+ if (rd->json_output)
+ jsonw_start_array(rd->jw);
+
+ print_link(rd, idx, name, port, nla_line);
+ if (nla_line[RDMA_NLDEV_ATTR_RES_LQPN])
+ print_lqpn(rd, lqpn);
+ if (nla_line[RDMA_NLDEV_ATTR_RES_TYPE])
+ print_qp_type(rd, type);
+ print_cm_id_state(rd, state);
+ 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);
+ if (nla_line[RDMA_NLDEV_ATTR_RES_DST_ADDR])
+ print_ipaddr(rd, "dst-addr", dst_addr_str, dst_port);
+
+ 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;
+}
diff --git a/rdma/res.c b/rdma/res.c
index 7956882e..d5ae60e1 100644
--- a/rdma/res.c
+++ b/rdma/res.c
@@ -140,7 +140,7 @@ static const char *qp_states_to_str(uint8_t idx)
return "UNKNOWN";
}
-static const char *qp_types_to_str(uint8_t idx)
+const char *qp_types_to_str(uint8_t idx)
{
static const char * const qp_types_str[] = { "SMI", "GSI", "RC",
"UC", "UD", "RAW_IPV6",
@@ -153,7 +153,7 @@ static const char *qp_types_to_str(uint8_t idx)
return "UNKNOWN";
}
-static void print_lqpn(struct rd *rd, uint32_t val)
+void print_lqpn(struct rd *rd, uint32_t val)
{
if (rd->json_output)
jsonw_uint_field(rd->jw, "lqpn", val);
@@ -259,8 +259,8 @@ void print_dev(struct rd *rd, uint32_t idx, const char *name)
}
}
-static void print_link(struct rd *rd, uint32_t idx, const char *name,
- uint32_t port, struct nlattr **nla_line)
+void print_link(struct rd *rd, uint32_t idx, const char *name, uint32_t port,
+ struct nlattr **nla_line)
{
if (rd->json_output) {
jsonw_uint_field(rd->jw, "ifindex", idx);
@@ -451,250 +451,6 @@ static int res_qp_parse_cb(const struct nlmsghdr *nlh, void *data)
return MNL_CB_OK;
}
-static void print_qp_type(struct rd *rd, uint32_t val)
-{
- if (rd->json_output)
- jsonw_string_field(rd->jw, "qp-type",
- qp_types_to_str(val));
- else
- pr_out("qp-type %s ", qp_types_to_str(val));
-}
-
-static const char *cm_id_state_to_str(uint8_t idx)
-{
- static const char * const cm_id_states_str[] = {
- "IDLE", "ADDR_QUERY", "ADDR_RESOLVED", "ROUTE_QUERY",
- "ROUTE_RESOLVED", "CONNECT", "DISCONNECT", "ADDR_BOUND",
- "LISTEN", "DEVICE_REMOVAL", "DESTROYING" };
-
- if (idx < ARRAY_SIZE(cm_id_states_str))
- return cm_id_states_str[idx];
- return "UNKNOWN";
-}
-
-static const char *cm_id_ps_to_str(uint32_t ps)
-{
- switch (ps) {
- case RDMA_PS_IPOIB:
- return "IPoIB";
- case RDMA_PS_IB:
- return "IPoIB";
- case RDMA_PS_TCP:
- return "TCP";
- case RDMA_PS_UDP:
- return "UDP";
- default:
- return "---";
- }
-}
-
-static void print_cm_id_state(struct rd *rd, uint8_t state)
-{
- if (rd->json_output) {
- jsonw_string_field(rd->jw, "state", cm_id_state_to_str(state));
- return;
- }
- pr_out("state %s ", cm_id_state_to_str(state));
-}
-
-static void print_ps(struct rd *rd, uint32_t ps)
-{
- if (rd->json_output) {
- jsonw_string_field(rd->jw, "ps", cm_id_ps_to_str(ps));
- return;
- }
- pr_out("ps %s ", cm_id_ps_to_str(ps));
-}
-
-static void print_ipaddr(struct rd *rd, const char *key, char *addrstr,
- uint16_t port)
-{
- if (rd->json_output) {
- int name_size = INET6_ADDRSTRLEN+strlen(":65535");
- char json_name[name_size];
-
- snprintf(json_name, name_size, "%s:%u", addrstr, port);
- jsonw_string_field(rd->jw, key, json_name);
- return;
- }
- pr_out("%s %s:%u ", key, addrstr, port);
-}
-
-static int ss_ntop(struct nlattr *nla_line, char *addr_str, uint16_t *port)
-{
- struct __kernel_sockaddr_storage *addr;
-
- addr = (struct __kernel_sockaddr_storage *)
- mnl_attr_get_payload(nla_line);
- switch (addr->ss_family) {
- case AF_INET: {
- struct sockaddr_in *sin = (struct sockaddr_in *)addr;
-
- if (!inet_ntop(AF_INET, (const void *)&sin->sin_addr, addr_str,
- INET6_ADDRSTRLEN))
- return -EINVAL;
- *port = ntohs(sin->sin_port);
- break;
- }
- case AF_INET6: {
- struct sockaddr_in6 *sin6 = (struct sockaddr_in6 *)addr;
-
- if (!inet_ntop(AF_INET6, (const void *)&sin6->sin6_addr,
- addr_str, INET6_ADDRSTRLEN))
- return -EINVAL;
- *port = ntohs(sin6->sin6_port);
- break;
- }
- default:
- return -EINVAL;
- }
- return 0;
-}
-
-static int res_cm_id_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;
- int 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_CM_ID])
- 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_CM_ID];
- mnl_attr_for_each_nested(nla_entry, nla_table) {
- struct nlattr *nla_line[RDMA_NLDEV_ATTR_MAX] = {};
- char src_addr_str[INET6_ADDRSTRLEN];
- char dst_addr_str[INET6_ADDRSTRLEN];
- uint16_t src_port, dst_port;
- 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;
-
- err = mnl_attr_parse_nested(nla_entry, rd_attr_cb, nla_line);
- if (err != MNL_CB_OK)
- return -EINVAL;
-
- if (!nla_line[RDMA_NLDEV_ATTR_RES_STATE] ||
- !nla_line[RDMA_NLDEV_ATTR_RES_PS] ||
- (!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_PORT_INDEX])
- port = mnl_attr_get_u32(
- nla_line[RDMA_NLDEV_ATTR_PORT_INDEX]);
-
- if (port && port != rd->port_idx)
- continue;
-
- if (nla_line[RDMA_NLDEV_ATTR_RES_LQPN]) {
- lqpn = mnl_attr_get_u32(
- nla_line[RDMA_NLDEV_ATTR_RES_LQPN]);
- if (rd_check_is_filtered(rd, "lqpn", lqpn))
- continue;
- }
- if (nla_line[RDMA_NLDEV_ATTR_RES_TYPE]) {
- type = mnl_attr_get_u8(
- nla_line[RDMA_NLDEV_ATTR_RES_TYPE]);
- if (rd_check_is_string_filtered(rd, "qp-type",
- qp_types_to_str(type)))
- continue;
- }
-
- ps = mnl_attr_get_u32(nla_line[RDMA_NLDEV_ATTR_RES_PS]);
- if (rd_check_is_string_filtered(rd, "ps", cm_id_ps_to_str(ps)))
- continue;
-
- state = mnl_attr_get_u8(nla_line[RDMA_NLDEV_ATTR_RES_STATE]);
- if (rd_check_is_string_filtered(rd, "state",
- cm_id_state_to_str(state)))
- continue;
-
- if (nla_line[RDMA_NLDEV_ATTR_RES_SRC_ADDR]) {
- if (ss_ntop(nla_line[RDMA_NLDEV_ATTR_RES_SRC_ADDR],
- src_addr_str, &src_port))
- continue;
- 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]) {
- if (ss_ntop(nla_line[RDMA_NLDEV_ATTR_RES_DST_ADDR],
- dst_addr_str, &dst_port))
- continue;
- 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 (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_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(
- nla_line[RDMA_NLDEV_ATTR_RES_KERN_NAME]);
- }
-
- if (rd->json_output)
- jsonw_start_array(rd->jw);
-
- print_link(rd, idx, name, port, nla_line);
- if (nla_line[RDMA_NLDEV_ATTR_RES_LQPN])
- print_lqpn(rd, lqpn);
- if (nla_line[RDMA_NLDEV_ATTR_RES_TYPE])
- print_qp_type(rd, type);
- print_cm_id_state(rd, state);
- 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);
- if (nla_line[RDMA_NLDEV_ATTR_RES_DST_ADDR])
- print_ipaddr(rd, "dst-addr", dst_addr_str, dst_port);
-
- 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;
-}
-
void print_users(struct rd *rd, uint64_t val)
{
if (rd->json_output)
@@ -721,25 +477,6 @@ filters qp_valid_filters[MAX_NUMBER_OF_FILTERS] = {
RES_FUNC(res_qp, RDMA_NLDEV_CMD_RES_QP_GET, qp_valid_filters, false);
-static const
-struct filters cm_id_valid_filters[MAX_NUMBER_OF_FILTERS] = {
- { .name = "link", .is_number = false },
- { .name = "lqpn", .is_number = true },
- { .name = "qp-type", .is_number = false },
- { .name = "state", .is_number = false },
- { .name = "ps", .is_number = false },
- { .name = "dev-type", .is_number = false },
- { .name = "transport-type", .is_number = false },
- { .name = "pid", .is_number = true },
- { .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 = "cm-idn", .is_number = true }
-};
-
-RES_FUNC(res_cm_id, RDMA_NLDEV_CMD_RES_CM_ID_GET, cm_id_valid_filters, false);
-
static int res_show(struct rd *rd)
{
const struct rd_cmd cmds[] = {
diff --git a/rdma/res.h b/rdma/res.h
index 19f0d420..e9d0d12e 100644
--- a/rdma/res.h
+++ b/rdma/res.h
@@ -12,6 +12,7 @@ int _res_send_msg(struct rd *rd, uint32_t command, mnl_cb_t callback);
int res_pd_parse_cb(const struct nlmsghdr *nlh, void *data);
int res_mr_parse_cb(const struct nlmsghdr *nlh, void *data);
int res_cq_parse_cb(const struct nlmsghdr *nlh, void *data);
+int res_cm_id_parse_cb(const struct nlmsghdr *nlh, void *data);
#define RES_FUNC(name, command, valid_filters, strict_port) \
static inline int _##name(struct rd *rd)\
@@ -71,12 +72,35 @@ struct filters cq_valid_filters[MAX_NUMBER_OF_FILTERS] = {
RES_FUNC(res_cq, RDMA_NLDEV_CMD_RES_CQ_GET, cq_valid_filters, true);
+static const
+struct filters cm_id_valid_filters[MAX_NUMBER_OF_FILTERS] = {
+ { .name = "link", .is_number = false },
+ { .name = "lqpn", .is_number = true },
+ { .name = "qp-type", .is_number = false },
+ { .name = "state", .is_number = false },
+ { .name = "ps", .is_number = false },
+ { .name = "dev-type", .is_number = false },
+ { .name = "transport-type", .is_number = false },
+ { .name = "pid", .is_number = true },
+ { .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 = "cm-idn", .is_number = true }
+};
+
+RES_FUNC(res_cm_id, RDMA_NLDEV_CMD_RES_CM_ID_GET, cm_id_valid_filters, false);
+
char *get_task_name(uint32_t pid);
void print_dev(struct rd *rd, uint32_t idx, const char *name);
+void print_link(struct rd *rd, uint32_t idx, const char *name, uint32_t port,
+ struct nlattr **nla_line);
void print_users(struct rd *rd, uint64_t val);
void print_key(struct rd *rd, const char *name, uint64_t val);
void res_print_uint(struct rd *rd, const char *name, uint64_t val);
void print_pid(struct rd *rd, uint32_t val);
void print_comm(struct rd *rd, const char *str, struct nlattr **nla_line);
+const char *qp_types_to_str(uint8_t idx);
+void print_lqpn(struct rd *rd, uint32_t val);
#endif /* _RDMA_TOOL_RES_H_ */
--
2.19.1
^ permalink raw reply related
* [PATCH iproute2-next v2 16/19] rdma: Move QP code to separate function
From: Leon Romanovsky @ 2019-02-23 9:15 UTC (permalink / raw)
To: David Ahern
Cc: Leon Romanovsky, netdev, RDMA mailing list, Stephen Hemminger,
Steve Wise
In-Reply-To: <20190223091528.8509-1-leon@kernel.org>
From: Leon Romanovsky <leonro@mellanox.com>
Reviewed-by: Steve Wise <swise@opengridcomputing.com>
Signed-off-by: Leon Romanovsky <leonro@mellanox.com>
---
rdma/res-qp.c | 253 +++++++++++++++++++++++++-------------------------
1 file changed, 127 insertions(+), 126 deletions(-)
diff --git a/rdma/res-qp.c b/rdma/res-qp.c
index ecd2cbd6..e74c8b01 100644
--- a/rdma/res-qp.c
+++ b/rdma/res-qp.c
@@ -78,11 +78,133 @@ static void print_pathmig(struct rd *rd, uint32_t val, struct nlattr **nla_line)
pr_out("path-mig-state %s ", path_mig_to_str(val));
}
+static int res_qp_line(struct rd *rd, const char *name, int idx,
+ struct nlattr *nla_entry)
+{
+ struct nlattr *nla_line[RDMA_NLDEV_ATTR_MAX] = {};
+ 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;
+
+ 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_LQPN] ||
+ !nla_line[RDMA_NLDEV_ATTR_RES_SQ_PSN] ||
+ !nla_line[RDMA_NLDEV_ATTR_RES_TYPE] ||
+ !nla_line[RDMA_NLDEV_ATTR_RES_STATE] ||
+ (!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_PORT_INDEX])
+ port = mnl_attr_get_u32(nla_line[RDMA_NLDEV_ATTR_PORT_INDEX]);
+
+ if (port != rd->port_idx)
+ goto out;
+
+ lqpn = mnl_attr_get_u32(nla_line[RDMA_NLDEV_ATTR_RES_LQPN]);
+ if (rd_check_is_filtered(rd, "lqpn", lqpn))
+ goto out;
+
+ 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))
+ goto out;
+
+ 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))
+ goto out;
+ } else {
+ if (rd_check_is_key_exist(rd, "rqpn"))
+ goto out;
+ }
+
+ if (nla_line[RDMA_NLDEV_ATTR_RES_RQ_PSN]) {
+ rq_psn = mnl_attr_get_u32(nla_line[RDMA_NLDEV_ATTR_RES_RQ_PSN]);
+ if (rd_check_is_filtered(rd, "rq-psn", rq_psn))
+ goto out;
+ } else {
+ if (rd_check_is_key_exist(rd, "rq-psn"))
+ goto out;
+ }
+
+ sq_psn = mnl_attr_get_u32(nla_line[RDMA_NLDEV_ATTR_RES_SQ_PSN]);
+ if (rd_check_is_filtered(rd, "sq-psn", sq_psn))
+ goto out;
+
+ if (nla_line[RDMA_NLDEV_ATTR_RES_PATH_MIG_STATE]) {
+ path_mig_state = mnl_attr_get_u8(
+ nla_line[RDMA_NLDEV_ATTR_RES_PATH_MIG_STATE]);
+ if (rd_check_is_string_filtered(rd, "path-mig-state",
+ path_mig_to_str(path_mig_state)))
+ goto out;
+ } else {
+ if (rd_check_is_key_exist(rd, "path-mig-state"))
+ goto out;
+ }
+
+ type = mnl_attr_get_u8(nla_line[RDMA_NLDEV_ATTR_RES_TYPE]);
+ if (rd_check_is_string_filtered(rd, "type", qp_types_to_str(type)))
+ goto out;
+
+ state = mnl_attr_get_u8(nla_line[RDMA_NLDEV_ATTR_RES_STATE]);
+ if (rd_check_is_string_filtered(rd, "state", qp_states_to_str(state)))
+ goto out;
+
+ 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))
+ goto out;
+
+ 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_link(rd, idx, name, port, nla_line);
+
+ res_print_uint(rd, "lqpn", 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);
+ print_state(rd, state);
+
+ print_rqpsn(rd, rq_psn, nla_line);
+ res_print_uint(rd, "sq-psn", sq_psn);
+
+ print_pathmig(rd, path_mig_state, nla_line);
+ res_print_uint(rd, "pid", pid);
+ print_comm(rd, comm, nla_line);
+
+ print_driver_table(rd, nla_line[RDMA_NLDEV_ATTR_DRIVER]);
+ newline(rd);
+out:
+ if (nla_line[RDMA_NLDEV_ATTR_RES_PID])
+ free(comm);
+ return MNL_CB_OK;
+}
+
int res_qp_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;
+ int ret = MNL_CB_OK;
const char *name;
uint32_t idx;
@@ -96,131 +218,10 @@ int res_qp_parse_cb(const struct nlmsghdr *nlh, void *data)
nla_table = tb[RDMA_NLDEV_ATTR_RES_QP];
mnl_attr_for_each_nested(nla_entry, nla_table) {
- struct nlattr *nla_line[RDMA_NLDEV_ATTR_MAX] = {};
- 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;
-
- 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_LQPN] ||
- !nla_line[RDMA_NLDEV_ATTR_RES_SQ_PSN] ||
- !nla_line[RDMA_NLDEV_ATTR_RES_TYPE] ||
- !nla_line[RDMA_NLDEV_ATTR_RES_STATE] ||
- (!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_PORT_INDEX])
- port = mnl_attr_get_u32(
- nla_line[RDMA_NLDEV_ATTR_PORT_INDEX]);
-
- if (port != rd->port_idx)
- continue;
-
- lqpn = mnl_attr_get_u32(nla_line[RDMA_NLDEV_ATTR_RES_LQPN]);
- 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))
- continue;
- } else {
- if (rd_check_is_key_exist(rd, "rqpn"))
- continue;
- }
-
- if (nla_line[RDMA_NLDEV_ATTR_RES_RQ_PSN]) {
- rq_psn = mnl_attr_get_u32(
- nla_line[RDMA_NLDEV_ATTR_RES_RQ_PSN]);
- if (rd_check_is_filtered(rd, "rq-psn", rq_psn))
- continue;
- } else {
- if (rd_check_is_key_exist(rd, "rq-psn"))
- continue;
- }
-
- sq_psn = mnl_attr_get_u32(nla_line[RDMA_NLDEV_ATTR_RES_SQ_PSN]);
- if (rd_check_is_filtered(rd, "sq-psn", sq_psn))
- continue;
-
- if (nla_line[RDMA_NLDEV_ATTR_RES_PATH_MIG_STATE]) {
- path_mig_state = mnl_attr_get_u8(
- nla_line[RDMA_NLDEV_ATTR_RES_PATH_MIG_STATE]);
- if (rd_check_is_string_filtered(
- rd, "path-mig-state",
- path_mig_to_str(path_mig_state)))
- continue;
- } else {
- if (rd_check_is_key_exist(rd, "path-mig-state"))
- continue;
- }
-
- type = mnl_attr_get_u8(nla_line[RDMA_NLDEV_ATTR_RES_TYPE]);
- if (rd_check_is_string_filtered(rd, "type",
- qp_types_to_str(type)))
- continue;
-
- state = mnl_attr_get_u8(nla_line[RDMA_NLDEV_ATTR_RES_STATE]);
- if (rd_check_is_string_filtered(rd, "state",
- qp_states_to_str(state)))
- 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_link(rd, idx, name, port, nla_line);
-
- res_print_uint(rd, "lqpn", 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);
- print_state(rd, state);
-
- print_rqpsn(rd, rq_psn, nla_line);
- res_print_uint(rd, "sq-psn", sq_psn);
-
- print_pathmig(rd, path_mig_state, nla_line);
- res_print_uint(rd, "pid", 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);
+ ret = res_qp_line(rd, name, idx, nla_entry);
+
+ if (ret != MNL_CB_OK)
+ break;
}
- return MNL_CB_OK;
+ return ret;
}
--
2.19.1
^ permalink raw reply related
page: next (older) | prev (newer) | latest
- recent:[subjects (threaded)|topics (new)|topics (active)]
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox