From patchwork Fri Aug 31 09:57:28 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Adrien Mazarguil X-Patchwork-Id: 44081 Return-Path: X-Original-To: patchwork@dpdk.org Delivered-To: patchwork@dpdk.org Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id 4212E4C9D; Fri, 31 Aug 2018 11:57:46 +0200 (CEST) Received: from mail-wm0-f66.google.com (mail-wm0-f66.google.com [74.125.82.66]) by dpdk.org (Postfix) with ESMTP id D080E4C90 for ; Fri, 31 Aug 2018 11:57:44 +0200 (CEST) Received: by mail-wm0-f66.google.com with SMTP id y2-v6so4651149wma.1 for ; Fri, 31 Aug 2018 02:57:44 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=6wind-com.20150623.gappssmtp.com; s=20150623; h=date:from:to:cc:subject:message-id:references:mime-version :content-disposition:in-reply-to; bh=qWS7v5uSqkMAKw3w1FV0YuFOdRJ3wxulqB9LQSxnVdA=; b=gPoj0noHqhlGr7/eM0tluaLaTIQtL8rgOsTf+/G4tHeyePJxrB5Hv6BChrKOG0Hj/x sZOoC+1RyYPmfZngy/Wz0ISLx99XEPEY8Y02+UhzDjQP7Vpzm6AE7HagrsdDgzLgYKns dppQQmMeaNtPwemBkOwS6LOeIUB8pvEk6KfHxe2qkM4yV47+F4vMibdm9d2QxfikWjkH t6CJspCOV7HNkHCeMdNdNzrEcoGdcx++TKm3k63/hS/RhK5Ej1IOc0THOfYgNbtX7eSw 5blkysQOIoeIiCIQ0nsm6/Ir/sV9vQS3at4d3uB5KNsnPLTVtukA+Q3h0Ajp4oLRT7BP 642Q== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:date:from:to:cc:subject:message-id:references :mime-version:content-disposition:in-reply-to; bh=qWS7v5uSqkMAKw3w1FV0YuFOdRJ3wxulqB9LQSxnVdA=; b=NVsP/S8TvczdzP1PHw26AgPZq4hz4C3b/aNHHhgr2qdX7MCmUqAGpaafndBZjwQRSd lv9YcACe307DgWtnWCXLu0DFr8unr5WzhXxt5fHePd57GMT2JdJ/fSxeua4DfNRSdrQx NMortKlJXpjP3TR2XdW2tGpESk4NWzOQlxSzRdcfLrZ6tKsCO7JjpVOhksBT7xBtV200 tO6xvHqjIiJh7s/ktvbakmqkzcJA9URan4H6jyDhggDo3U8XH6Om2lixmrcGHop8EkAP c/yBj9uJFO1JI7EWGF5IJT7FRK3ONP1V2QsqgXAooM5L+A3mE7M1cH/3wa7Ox/bzvc0J k7nA== X-Gm-Message-State: APzg51DfyxSZM/6rn1onCZpOlEpyDipunv85cD5FxF+tlMSvPiVWGOJD 6ZYcPByJ/R+075xj7Hn+a63E+1e8NH51sA== X-Google-Smtp-Source: ANB0VdYUOqgqcGI9k/ByN5C+zzJmrPSS73l6+y6r8BXNCC7GR8uAuFxZoFjwsixOTikawBa3dgj7AA== X-Received: by 2002:a1c:2351:: with SMTP id j78-v6mr4281894wmj.68.1535709464412; Fri, 31 Aug 2018 02:57:44 -0700 (PDT) Received: from 6wind.com (host.78.145.23.62.rev.coltfrance.com. [62.23.145.78]) by smtp.gmail.com with ESMTPSA id h73-v6sm11677905wma.11.2018.08.31.02.57.43 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Fri, 31 Aug 2018 02:57:43 -0700 (PDT) Date: Fri, 31 Aug 2018 11:57:28 +0200 From: Adrien Mazarguil To: Shahaf Shuler , Yongseok Koh , Slava Ovsiienko Cc: dev@dpdk.org Message-ID: <20180831092038.23051-2-adrien.mazarguil@6wind.com> References: <20180831092038.23051-1-adrien.mazarguil@6wind.com> MIME-Version: 1.0 Content-Disposition: inline In-Reply-To: <20180831092038.23051-1-adrien.mazarguil@6wind.com> X-Mailer: git-send-email 2.11.0 Subject: [dpdk-dev] [PATCH 1/8] net/mlx5: speed up interface index retrieval for flow rules X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org Sender: "dev" rte_eth_dev_info_get() can be avoided since the underlying device type and data structure are known. Caching the index before creating any flow rules avoids a number of redundant system calls later since users are not expected to destroy the associated network interface while PMD is bound and running. Signed-off-by: Adrien Mazarguil --- drivers/net/mlx5/mlx5.c | 48 ++++++++++++++++++------------------- drivers/net/mlx5/mlx5.h | 1 + drivers/net/mlx5/mlx5_ethdev.c | 4 +--- drivers/net/mlx5/mlx5_flow.c | 6 ++--- drivers/net/mlx5/mlx5_nl.c | 9 +++---- 5 files changed, 32 insertions(+), 36 deletions(-) diff --git a/drivers/net/mlx5/mlx5.c b/drivers/net/mlx5/mlx5.c index a8ae2b5d3..55b73a03b 100644 --- a/drivers/net/mlx5/mlx5.c +++ b/drivers/net/mlx5/mlx5.c @@ -736,6 +736,7 @@ mlx5_dev_spawn(struct rte_device *dpdk_dev, struct ether_addr mac; char name[RTE_ETH_NAME_MAX_LEN]; int own_domain_id = 0; + struct rte_flow_error flow_error; unsigned int i; /* Determine if this port representor is supposed to be spawned. */ @@ -959,6 +960,8 @@ mlx5_dev_spawn(struct rte_device *dpdk_dev, priv->domain_id = RTE_ETH_DEV_SWITCH_DOMAIN_ID_INVALID; priv->representor_id = switch_info->representor ? switch_info->port_name : -1; + /* Interface index will be known once eth_dev is allocated. */ + priv->ifindex = 0; /* * Look for sibling devices in order to reuse their switch domain * if any, otherwise allocate one. @@ -1087,6 +1090,16 @@ mlx5_dev_spawn(struct rte_device *dpdk_dev, err = rte_errno; goto error; } + /* + * Cache associated interface index since lookups are expensive. + * It is not expected to change while a PMD instance is bound and + * running. + */ + priv->ifindex = mlx5_ifindex(eth_dev); + if (!priv->ifindex) + DRV_LOG(WARNING, + "cannot retrieve network interface index: %s", + strerror(rte_errno)); /* Configure the first MAC address by default. */ if (mlx5_get_mac(eth_dev, &mac.addr_bytes)) { DRV_LOG(ERR, @@ -1131,32 +1144,19 @@ mlx5_dev_spawn(struct rte_device *dpdk_dev, if (vf && config.vf_nl_en) mlx5_nl_mac_addr_sync(eth_dev); priv->mnl_socket = mlx5_nl_flow_socket_create(); - if (!priv->mnl_socket) { - err = -rte_errno; + if (!priv->mnl_socket || + !priv->ifindex || + mlx5_nl_flow_init(priv->mnl_socket, priv->ifindex, &flow_error)) { + if (!priv->mnl_socket) { + flow_error.message = "cannot open libmnl socket"; + } else if (!priv->ifindex) { + rte_errno = ENXIO; + flow_error.message = "unknown network interface index"; + } DRV_LOG(WARNING, "flow rules relying on switch offloads will not be" - " supported: cannot open libmnl socket: %s", - strerror(rte_errno)); - } else { - struct rte_flow_error error; - unsigned int ifindex = mlx5_ifindex(eth_dev); - - if (!ifindex) { - err = -rte_errno; - error.message = - "cannot retrieve network interface index"; - } else { - err = mlx5_nl_flow_init(priv->mnl_socket, ifindex, - &error); - } - if (err) { - DRV_LOG(WARNING, - "flow rules relying on switch offloads will" - " not be supported: %s: %s", - error.message, strerror(rte_errno)); - mlx5_nl_flow_socket_destroy(priv->mnl_socket); - priv->mnl_socket = NULL; - } + " supported: %s: %s", + flow_error.message, strerror(rte_errno)); } TAILQ_INIT(&priv->flows); TAILQ_INIT(&priv->ctrl_flows); diff --git a/drivers/net/mlx5/mlx5.h b/drivers/net/mlx5/mlx5.h index 35a196e76..4c2dec644 100644 --- a/drivers/net/mlx5/mlx5.h +++ b/drivers/net/mlx5/mlx5.h @@ -183,6 +183,7 @@ struct priv { unsigned int representor:1; /* Device is a port representor. */ uint16_t domain_id; /* Switch domain identifier. */ int32_t representor_id; /* Port representor identifier. */ + unsigned int ifindex; /* Interface index associated with device. */ /* RX/TX queues. */ unsigned int rxqs_n; /* RX queues array size. */ unsigned int txqs_n; /* TX queues array size. */ diff --git a/drivers/net/mlx5/mlx5_ethdev.c b/drivers/net/mlx5/mlx5_ethdev.c index 34c5b95ee..cf0b415b2 100644 --- a/drivers/net/mlx5/mlx5_ethdev.c +++ b/drivers/net/mlx5/mlx5_ethdev.c @@ -511,7 +511,6 @@ mlx5_dev_infos_get(struct rte_eth_dev *dev, struct rte_eth_dev_info *info) struct priv *priv = dev->data->dev_private; struct mlx5_dev_config *config = &priv->config; unsigned int max; - char ifname[IF_NAMESIZE]; /* FIXME: we should ask the device for these values. */ info->min_rx_bufsize = 32; @@ -532,8 +531,7 @@ mlx5_dev_infos_get(struct rte_eth_dev *dev, struct rte_eth_dev_info *info) info->rx_offload_capa = (mlx5_get_rx_port_offloads() | info->rx_queue_offload_capa); info->tx_offload_capa = mlx5_get_tx_port_offloads(dev); - if (mlx5_get_ifname(dev, &ifname) == 0) - info->if_index = if_nametoindex(ifname); + info->if_index = priv->ifindex; info->reta_size = priv->reta_idx_n ? priv->reta_idx_n : config->ind_table_max_size; info->hash_key_size = MLX5_RSS_HASH_KEY_LEN; diff --git a/drivers/net/mlx5/mlx5_flow.c b/drivers/net/mlx5/mlx5_flow.c index 3f548a9a4..f093a5ed0 100644 --- a/drivers/net/mlx5/mlx5_flow.c +++ b/drivers/net/mlx5/mlx5_flow.c @@ -2466,13 +2466,13 @@ mlx5_flow_merge_switch(struct rte_eth_dev *dev, n = RTE_MIN(mlx5_dev_to_port_id(dev->device, port_id, n), n); } for (i = 0; i != n; ++i) { - struct rte_eth_dev_info dev_info; + struct rte_eth_dev *i_dev = &rte_eth_devices[port_id[i]]; + struct priv *i_priv = i_dev->data->dev_private; - rte_eth_dev_info_get(port_id[i], &dev_info); if (port_id[i] == dev->data->port_id) own = i; ptoi[i].port_id = port_id[i]; - ptoi[i].ifindex = dev_info.if_index; + ptoi[i].ifindex = i_priv->ifindex; } /* Ensure first entry of ptoi[] is the current device. */ if (own) { diff --git a/drivers/net/mlx5/mlx5_nl.c b/drivers/net/mlx5/mlx5_nl.c index d61826aea..a298db68c 100644 --- a/drivers/net/mlx5/mlx5_nl.c +++ b/drivers/net/mlx5/mlx5_nl.c @@ -362,7 +362,6 @@ mlx5_nl_mac_addr_list(struct rte_eth_dev *dev, struct ether_addr (*mac)[], int *mac_n) { struct priv *priv = dev->data->dev_private; - unsigned int iface_idx = mlx5_ifindex(dev); struct { struct nlmsghdr hdr; struct ifinfomsg ifm; @@ -374,7 +373,7 @@ mlx5_nl_mac_addr_list(struct rte_eth_dev *dev, struct ether_addr (*mac)[], }, .ifm = { .ifi_family = PF_BRIDGE, - .ifi_index = iface_idx, + .ifi_index = priv->ifindex, }, }; struct mlx5_nl_mac_addr data = { @@ -421,7 +420,6 @@ mlx5_nl_mac_addr_modify(struct rte_eth_dev *dev, struct ether_addr *mac, int add) { struct priv *priv = dev->data->dev_private; - unsigned int iface_idx = mlx5_ifindex(dev); struct { struct nlmsghdr hdr; struct ndmsg ndm; @@ -437,7 +435,7 @@ mlx5_nl_mac_addr_modify(struct rte_eth_dev *dev, struct ether_addr *mac, .ndm = { .ndm_family = PF_BRIDGE, .ndm_state = NUD_NOARP | NUD_PERMANENT, - .ndm_ifindex = iface_idx, + .ndm_ifindex = priv->ifindex, .ndm_flags = NTF_SELF, }, .rta = { @@ -600,7 +598,6 @@ static int mlx5_nl_device_flags(struct rte_eth_dev *dev, uint32_t flags, int enable) { struct priv *priv = dev->data->dev_private; - unsigned int iface_idx = mlx5_ifindex(dev); struct { struct nlmsghdr hdr; struct ifinfomsg ifi; @@ -613,7 +610,7 @@ mlx5_nl_device_flags(struct rte_eth_dev *dev, uint32_t flags, int enable) .ifi = { .ifi_flags = enable ? flags : 0, .ifi_change = flags, - .ifi_index = iface_idx, + .ifi_index = priv->ifindex, }, }; int fd;