Introduce Microsoft Azure Network Adatper (MANA) PMD
Subsystems (2)
v4 cover Introduce Microsoft Azure Network Adatper (MANA) PMD
From: Long Li <[email protected]>
MANA is a network interface card to be used in the Azure cloud environment. MANA provides safe access to user memory through memory registration. It has IOMMU built into the hardware.
MANA uses IB verbs and RDMA layer to configure hardware resources. It requires the corresponding RDMA kernel-mode and user-mode drivers.
The MANA RDMA kernel-mode driver is being reviewed at:
https://patchwork.kernel.org/project/netdevbpf/cover/[email protected]/
The MANA RDMA user-mode driver is being reviewed at:
https://github.com/linux-rdma/rdma-core/pull/1177
Long Li (17):
net/mana: add basic driver, build environment and doc net/mana: add device configuration and stop net/mana: add function to report support ptypes net/mana: add link update
net/mana: add function for device removal interrupts net/mana: add device info
net/mana: add function to configure RSS net/mana: add function to configure RX queues net/mana: add function to configure TX queues net/mana: implement memory registration net/mana: implement the hardware layer operations net/mana: add function to start/stop TX queues net/mana: add function to start/stop RX queues net/mana: add function to receive packets net/mana: add function to send packets net/mana: add function to start/stop device net/mana: add function to report queue stats
MAINTAINERS | 6 + doc/guides/nics/features/mana.ini | 20 + doc/guides/nics/index.rst | 1 + doc/guides/nics/mana.rst | 66 ++ drivers/net/mana/gdma.c | 284 ++++++ drivers/net/mana/mana.c | 1351 +++++++++++++++++++++++++++++ drivers/net/mana/mana.h | 544 ++++++++++++ drivers/net/mana/meson.build | 48 + drivers/net/mana/mp.c | 323 +++++++ drivers/net/mana/mr.c | 324 +++++++ drivers/net/mana/rx.c | 450 ++++++++++ drivers/net/mana/tx.c | 398 +++++++++ drivers/net/mana/version.map | 3 + drivers/net/meson.build | 1 + 14 files changed, 3819 insertions(+) create mode 100644 doc/guides/nics/features/mana.ini create mode 100644 doc/guides/nics/mana.rst create mode 100644 drivers/net/mana/gdma.c create mode 100644 drivers/net/mana/mana.c create mode 100644 drivers/net/mana/mana.h create mode 100644 drivers/net/mana/meson.build create mode 100644 drivers/net/mana/mp.c create mode 100644 drivers/net/mana/mr.c create mode 100644 drivers/net/mana/rx.c create mode 100644 drivers/net/mana/tx.c create mode 100644 drivers/net/mana/version.map
Signature · 1 line
2.17.1
PATCH v4 1/17 net/mana: add basic driver, build environment and doc
From: Long Li <[email protected]>
MANA is a PCI device. It uses IB verbs to access hardware through the kernel RDMA layer. This patch introduces build environment and basic device probe functions.
---
Change log:
v2:
Fix typos.
Make the driver build only on x86-64 and Linux.
Remove unused header files.
Change port definition to uint16_t or uint8_t (for IB).
Use getline() in place of fgets() to read and truncate a line. v3:
Add meson build check for required functions from RDMA direct verb header file v4:
Remove extra "\n" in logging code.
Use "r" in place of "rb" in fopen() to read text files.
MAINTAINERS | 6 + doc/guides/nics/features/mana.ini | 10 + doc/guides/nics/index.rst | 1 + doc/guides/nics/mana.rst | 66 +++ drivers/net/mana/mana.c | 704 ++++++++++++++++++++++++++++++ drivers/net/mana/mana.h | 210 +++++++++ drivers/net/mana/meson.build | 44 ++ drivers/net/mana/mp.c | 235 ++++++++++ drivers/net/mana/version.map | 3 + drivers/net/meson.build | 1 + 10 files changed, 1280 insertions(+) create mode 100644 doc/guides/nics/features/mana.ini create mode 100644 doc/guides/nics/mana.rst create mode 100644 drivers/net/mana/mana.c create mode 100644 drivers/net/mana/mana.h create mode 100644 drivers/net/mana/meson.build create mode 100644 drivers/net/mana/mp.c create mode 100644 drivers/net/mana/version.map
MAINTAINERS +6 -0
@@ -837,6 +837,12 @@ F: buildtools/options-ibverbs-static.sh F: doc/guides/nics/mlx5.rst F: doc/guides/nics/features/mlx5.ini +Microsoft mana +M: Long Li <[email protected]> +F: drivers/net/mana +F: doc/guides/nics/mana.rst +F: doc/guides/nics/features/mana.ini + Microsoft vdev_netvsc - EXPERIMENTAL M: Matan Azrad <[email protected]> F: drivers/net/vdev_netvsc/
doc/guides/nics/features/mana.ini new file +10 -0
@@ -0,0 +1,10 @@ +; +; Supported features of the 'mana' network poll mode driver. +; +; Refer to default.ini for the full list of available PMD features. +; +[Features] +Linux = Y +Multiprocess aware = Y +Usage doc = Y +x86-64 = Y
doc/guides/nics/index.rst +1 -0
@@ -41,6 +41,7 @@ Network Interface Controller Drivers intel_vf kni liquidio + mana memif mlx4 mlx5
doc/guides/nics/mana.rst new file +66 -0
66 lines not on this page · raw message
drivers/net/mana/mana.c new file +704 -0
704 lines not on this page · raw message
drivers/net/mana/mana.h new file +210 -0
210 lines not on this page · raw message
drivers/net/mana/meson.build new file +44 -0
44 lines not on this page · raw message
drivers/net/mana/mp.c new file +235 -0
235 lines not on this page · raw message
drivers/net/mana/version.map new file +3 -0
@@ -0,0 +1,3 @@ +DPDK_22 { + local: *; +};
drivers/net/meson.build +1 -0
@@ -34,6 +34,7 @@ drivers = [ 'ixgbe', 'kni', 'liquidio', + 'mana', 'memif', 'mlx4', 'mlx5',
Signature · 1 line
2.17.1
Re: [Patch v4 01/17] net/mana: add basic driver, build environment and doc
Quoted 24 lines · On 7/9/2022 12:49 AM, [email protected] wrote:
CAUTION: This message has originated from an External Source. Please use proper judgment and caution when opening attachments, clicking links, or responding to this email.
From: Long Li <[email protected]>
MANA is a PCI device. It uses IB verbs to access hardware through the kernel RDMA layer. This patch introduces build environment and basic device probe functions.
Signed-off-by Long Li <[email protected]>---
Change log:
v2:
Fix typos.
Make the driver build only on x86-64 and Linux.
Remove unused header files.
Change port definition touint16_toruint8_t(for IB).
Usegetline()in place offgets()to read and truncate a line. v3:
Add meson build check for required functions from RDMA direct verb header file v4:
Remove extra "\n" in logging code.
Use "r" in place of "rb" infopen()to read text files.
<...>
doc/guides/nics/mana.rst line 9
Quoted 12 lines
doc/guides/nics/mana.rst new file +9
-0@@ -0,0 +1,66 @@ +.. SPDX-License-Identifier: BSD-3-Clause + Copyright 2022 Microsoft Corporation + +MANA poll mode driver library +============================= + +The MANA poll mode driver library (**librte_net_mana**) implements support +for Microsoft Azure Network Adapter VF in SR-IOV context. +
Can you please provide any link to an official product description? As a reference point for anybody interested more with the product details.
<..>
doc/guides/nics/mana.rst line 11
Quoted 2 lines
doc/guides/nics/mana.rst new file +2
-0+ +Netvsc PMD arguments > +--------------------
'Netvsc'? Do you mean 'MANA'?
j
doc/guides/nics/mana.rst line 66
Quoted 9 lines
doc/guides/nics/mana.rst new file +9
-0+ +The user can specify below argument in devargs. + +#. ``mac``: + + Specify the MAC address for this device. If it is set, the driver + probes and loads the NIC with a matching mac address. If it is not + set, the driver probes on all the NICs on the PCI device. The default + value is not set, meaning all the NICs will be probed and loaded.
Code accepts up to 8 mac value, should this be documented?
Also why this devarg is needed?
Quoted 20 lines
drivers/net/mana/mana.c new file +14
-0@@ -0,0 +1,704 @@ +/* SPDX-License-Identifier: BSD-3-Clause +* Copyright 2022 Microsoft Corporation +*/ + +#include <unistd.h> +#include <dirent.h> +#include <fcntl.h> +#include <sys/mman.h> + +#include <ethdev_driver.h> +#include <ethdev_pci.h> +#include <rte_kvargs.h> +#include <rte_eal_paging.h> +
drivers/net/mana/mana.c line 24
Quoted 10 lines
drivers/net/mana/mana.c new file +10
-0+#include <infiniband/verbs.h> +#include <infiniband/manadv.h> + +#include <assert.h> + +#include "mana.h" + +/* Shared memory between primary/secondary processes, per driver */ +struct mana_shared_data *mana_shared_data; +const struct rte_memzone *mana_shared_mz;
If these global variables are not used by other compilation units, please try to make them static as much as possible.
drivers/net/mana/mana.c line 28
Quoted 4 lines
drivers/net/mana/mana.c new file +4
-0+static const char *MZ_MANA_SHARED_DATA ="mana_shared_data" ; + +struct mana_shared_data mana_local_data; +
Can you put some comment to this global variables?
Quoted 9 lines
drivers/net/mana/mana.c new file +9
-0+/* Spinlock for mana_shared_data */ +static rte_spinlock_t mana_shared_data_lock =RTE_SPINLOCK_INITIALIZER ; + +/* Allocate a buffer on the stack and fill it with a printf format string. */ +#define MKSTR (name, ...) \ + int mkstr_size_##name = snprintf(NULL, 0, "" __VA_ARGS__); \ + char name[mkstr_size_##name + 1]; \ + \ + memset(name, 0, mkstr_size_##name + 1); \
drivers/net/mana/mana.c line 47
Quoted 10 lines
drivers/net/mana/mana.c new file +10
-0+ snprintf(name, sizeof(name), "" __VA_ARGS__) + +int mana_logtype_driver; +int mana_logtype_init; + +const struct eth_dev_ops mana_dev_ops = { +}; + +const struct eth_dev_ops mana_dev_sec_ops = { +};
It may be better to expand 'sec' to secondary to not confuse with security etc...
Quoted 23 lines
drivers/net/mana/mana.c new file +23
-0+ +uint16_t +mana_rx_burst_removed(void *dpdk_rxq __rte_unused, + struct rte_mbuf **pkts __rte_unused, + uint16_t pkts_n __rte_unused) +{ +rte_mb (); +return 0 ; +} + +uint16_t +mana_tx_burst_removed(void *dpdk_rxq __rte_unused, + struct rte_mbuf **pkts __rte_unused, + uint16_t pkts_n __rte_unused) +{ +rte_mb (); +return 0 ; +} + +static const char *mana_init_args[] = { +"mac" , +NULL , +};
drivers/net/mana/mana.c line 80
Quoted 10 lines
drivers/net/mana/mana.c new file +10
-0+ +/* Support of parsing up to 8 mac address from EAL command line */ +#define MAX_NUM_ADDRESS 8 +struct mana_conf { +struct rte_ether_addr mac_array[MAX_NUM_ADDRESS ]; +unsigned int index; +}; + +static int mana_arg_parse_callback (const char *key,const char *val, +void *private)
Since this is new driver, better to follow the coding convention:
https://doc.dpdk.org/guides/contributing/coding_style.html
Please put return type to another line:
static intmana_arg_parse_callback(const char *key, const char *val, void *private)
Quoted 22 lines
drivers/net/mana/mana.c new file +22
-0+{ +struct mana_conf *conf = (struct mana_conf *)private; +int ret; + +DRV_LOG (INFO ,"key=%s value=%s index=%d" , key, val, conf->index); + +if (conf->index >=MAX_NUM_ADDRESS ) { +DRV_LOG (ERR ,"Exceeding max MAC address" ); +return 1 ; + } + + ret =rte_ether_unformat_addr (val, &conf->mac_array[conf->index]); +if (ret) { +DRV_LOG (ERR ,"Invalid MAC address %s" , val); +return ret; + } + + conf->index++; + +return 0 ; +} +
<...>
Quoted 30 lines
drivers/net/mana/mana.c new file +30
-0+static int get_port_mac (struct ibv_device *device,unsigned int port, +struct rte_ether_addr *addr) +{ +FILE *file; +int ret =0 ; +DIR *dir; +struct dirent *dent; +unsigned int dev_port; +char mac[20 ]; + +MKSTR (path,"%s/device/net" , device->ibdev_path); + + dir =opendir (path); +if (!dir) +return -ENOENT ; + +while ((dent =readdir (dir))) { +char *name = dent->d_name; + +MKSTR (filepath,"%s/%s/dev_port" , path, name); + +/* Ignore . and .. */ +if ((name[0 ] =='.' ) && + ((name[1 ] =='\0' ) || + ((name[1 ] =='.' ) && (name[2 ] =='\0' )))) +continue ; + + file =fopen (filepath,"r" ); +if (!file) +continue ;
drivers/net/mana/mana.c line 171
Quoted 10 lines
drivers/net/mana/mana.c new file +10
-0+ + ret =fscanf (file,"%u" , &dev_port); +fclose (file); + +if (ret !=1 ) +continue ; + +/* Ethernet ports start at 0, IB port start at 1 */ +if (dev_port == port -1 ) { +MKSTR (filepath,"%s/%s/address" , path, name);
'MKSTR' macro adds two variables related with first argument, 'filepath' already used above. Yes there is a new scope but better to not define new variables, can you select a new name here?
<...>
drivers/net/mana/mana.c line 351
Quoted 2 lines
drivers/net/mana/mana.c new file +2
-0+ +static int mana_pci_probe_mac(struct rte_pci_driver *pci_drv __rte_unused,
This is a static function, if you don't use 'pci_drv', why not drop it from the argument list.
Quoted 22 lines
drivers/net/mana/mana.c new file +22
-0+struct rte_pci_device *pci_dev, + struct rte_ether_addr *mac_addr) +{ + struct ibv_device **ibv_list; +int ibv_idx; +struct ibv_context *ctx; +struct ibv_device_attr_ex dev_attr; +int num_devices; +int ret =0 ; +uint8_t port; +struct mana_priv *priv =NULL ; +struct rte_eth_dev *eth_dev =NULL ; +bool found_port; + + ibv_list =ibv_get_device_list (&num_devices); +for (ibv_idx =0 ; ibv_idx < num_devices; ibv_idx++) { +struct ibv_device *ibdev = ibv_list[ibv_idx]; +struct rte_pci_addr pci_addr; + +DRV_LOG (INFO ,"Probe device name %s dev_name %s ibdev_path %s" , + ibdev->name, ibdev->dev_name, ibdev->ibdev_path); +
drivers/net/mana/mana.c line 383
Quoted 10 lines
drivers/net/mana/mana.c new file +10
-0+if (mana_ibv_device_to_pci_addr (ibdev, &pci_addr)) +continue ; + +/* Ignore if this IB device is not this PCI device */ +if (pci_dev->addr.domain != pci_addr.domain || + pci_dev->addr.bus != pci_addr.bus || + pci_dev->addr.devid != pci_addr.devid || + pci_dev->addr.function != pci_addr.function) +continue ; +
As far as I understand, intention of this loop is to find 'ibdev' matching this device, code gooes through all "ibv device list" for this, I wonder if there is a easy way for doing this, like a sysfs entry to help getting this information? And how mlx4/5 does this?
Quoted 5 lines
drivers/net/mana/mana.c new file +5
-0+ ctx =ibv_open_device (ibdev); +if (!ctx) { +DRV_LOG (ERR ,"Failed to open IB device %s" , + ibdev->name); +continue ;
drivers/net/mana/mana.c line 398
Quoted 10 lines
drivers/net/mana/mana.c new file +10
-0+ } + + ret =ibv_query_device_ex (ctx,NULL , &dev_attr); +DRV_LOG (INFO ,"dev_attr.orig_attr.phys_port_cnt %u" , + dev_attr.orig_attr.phys_port_cnt); + found_port = false; + +for (port =1 ; port <= dev_attr.orig_attr.phys_port_cnt; + port++) { +struct ibv_parent_domain_init_attr attr = {};
"= { 0 };" for portability.
<...>
drivers/net/mana/mana.c line 596
Quoted 5 lines
drivers/net/mana/mana.c new file +5
-0+static int mana_pci_probe(struct rte_pci_driver *pci_drv __rte_unused, +struct rte_pci_device *pci_dev) +{ +struct rte_devargs *args = pci_dev->device.devargs; +struct mana_conf conf = {};
afaik, this is not part of c spec yet, why not initialize as " = {0}".
drivers/net/mana/mana.c line 600
Quoted 4 lines
drivers/net/mana/mana.c new file +4
-0+unsigned int i; +int ret; + +if (args && args->args) {
You can prefer 'args->drv_str', which is newer name of the args.
<...>
drivers/net/mana/mana.c line 682
Quoted 5 lines
drivers/net/mana/mana.c new file +5
-0+static const struct rte_pci_id mana_pci_id_map[] = { + { +RTE_PCI_DEVICE (PCI_VENDOR_ID_MICROSOFT , +PCI_DEVICE_ID_MICROSOFT_MANA ) + },
PCI ID list should be terminated with ".vendor_id = 0", otherwise PCI bus scan loop may behave unexpectedly.
drivers/net/mana/mana.c line 687
Quoted 5 lines
drivers/net/mana/mana.c new file +5
-0+}; + +static struct rte_pci_driver mana_pci_driver = { + .driver = { + .name ="mana_pci" ,
driver names are mostly like 'net_<driver_name>', is there a reason to diverge from it? Also if you use 'RTE_PMD_REGISTER_PCI' macro, it will be standardised anyway.
drivers/net/mana/mana.c line 699
Quoted 12 lines
drivers/net/mana/mana.c new file +12
-0+ }, + .id_table = mana_pci_id_map, + .probe = mana_pci_probe, + .remove = mana_pci_remove, + .drv_flags = RTE_PCI_DRV_INTR_RMV, +}; + +RTE_INIT (rte_mana_pmd_init) +{ +rte_pci_register (&mana_pci_driver); +} +
Why not using 'RTE_PMD_REGISTER_PCI()' macro instead?
Quoted 28 lines
drivers/net/mana/mana.c new file +5
-0+RTE_PMD_EXPORT_NAME (net_mana, __COUNTER__); +RTE_PMD_REGISTER_PCI_TABLE (net_mana, mana_pci_id_map); +RTE_PMD_REGISTER_KMOD_DEP (net_mana,"* ib_uverbs & mana_ib" ); +RTE_LOG_REGISTER_SUFFIX (mana_logtype_init, init,NOTICE ); +RTE_LOG_REGISTER_SUFFIX (mana_logtype_driver, driver,NOTICE );drivers/net/mana/mana.h new file +17
-0@@ -0,0 +1,210 @@ +/* SPDX-License-Identifier: BSD-3-Clause +* Copyright 2022 Microsoft Corporation +*/ + +#ifndef __MANA_H__ +#define __MANA_H__ + +enum { +PCI_VENDOR_ID_MICROSOFT =0x1414 , +}; + +enum { +PCI_DEVICE_ID_MICROSOFT_MANA =0x00ba , +}; + +/* Shared data between primary/secondary processes */ +struct mana_shared_data {
drivers/net/mana/mana.h line 27
Quoted 10 lines
drivers/net/mana/mana.h new file +10
-0+rte_spinlock_t lock; +int init_done; +unsigned int primary_cnt; +unsigned int secondary_cnt; +}; + +#define MIN_RX_BUF_SIZE 1024 +#define MAX_FRAME_SIZE RTE_ETHER_MAX_LEN +#define BNIC_MAX_MAC_ADDR 1 +
What 'BNIC_' prefix stands for? If it is related to the PMD, what do you think to use 'MANA_' as prefix? Same for multiple macros below.
<...>
drivers/net/mana/mana.h line 172
Quoted 5 lines
drivers/net/mana/mana.h new file +5
-0+ +#define PMD_INIT_FUNC_TRACE () PMD_INIT_LOG(DEBUG, " >>") + +const uint32_t *mana_supported_ptypes (struct rte_eth_dev *dev); +
This function is not defined in this patch, so can drop declarataion.
<...>
drivers/net/mana/version.map line 1
Quoted 7 lines
drivers/net/mana/version.map new file +1
-0@@ -0,0 +1,3 @@ +DPDK_22 {
It is 'DPDK_23' now.
Re: [Patch v4 01/17] net/mana: add basic driver, build environment and doc
Quoted 28 lines · Ferruh Yigit
Quoted 28 lines
+ struct
rte_pci_device*pci_dev, + structrte_ether_addr*mac_addr)drivers/net/mana/mana.c new file +18
-0+{ + struct ibv_device **ibv_list; + int ibv_idx; + struct ibv_context *ctx; + struct ibv_device_attr_ex dev_attr; + int num_devices; + int ret = 0; + uint8_t port; + struct mana_priv *priv = NULL; + struct rte_eth_dev *eth_dev = NULL; + bool found_port; + + ibv_list = ibv_get_device_list(&num_devices); + for (ibv_idx = 0; ibv_idx < num_devices; ibv_idx++) { + struct ibv_device *ibdev = ibv_list[ibv_idx]; + struct rte_pci_addr pci_addr; + + DRV_LOG(INFO, "Probe device name %s dev_name %s
ibdev_path%s",
+ibdev->name,ibdev->dev_name,ibdev->ibdev_path);drivers/net/mana/mana.c new file +6
-0+ + if (mana_ibv_device_to_pci_addr(ibdev, &pci_addr)) + continue; + + /* Ignore if this IB device is not this PCI device */ + if (pci_dev->addr.domain != pci_addr.domain ||
Quoted 8 lines
Quoted 5 lines
+
pci_dev->addr.bus!= pci_addr.bus || +pci_dev->addr.devid!= pci_addr.devid || +pci_dev->addr.function!= pci_addr.function) + continue;
+As far as I understand, intention of this loop is to find 'ibdev' matching this device, code gooes through all "ibv device list" for this, I wonder if there is a easy way for doing this, like a sysfs entry to help getting this information? And how mlx4/5 does this?
Since there are multiple RDMA devices now, does it make sense to have RDMA bus driver, which can hide some PCIe details under bus, and driver can get PCI and ibdev information during probe?
RE: [Patch v4 01/17] net/mana: add basic driver, build environment and doc
Quoted 44 lines
Subject: Re: [Patch v4 01/17] net/mana: add basic driver, build environment and doc
Quoted 31 lines · Ferruh Yigit
Quoted 31 lines
+ struct
rte_pci_device*pci_dev, + structrte_ether_addr*mac_addr) { + structibv_device**ibv_list;
+ intibv_idx;
+ structibv_context*ctx;
+ structibv_device_attr_exdev_attr;
+ intnum_devices;
+ int ret = 0;
+uint8_tport;
+ structmana_priv*priv = NULL;
+ structrte_eth_dev*eth_dev= NULL;
+ boolfound_port;drivers/net/mana/mana.c new file +7
-0+ + ibv_list = ibv_get_device_list(&num_devices); + for (ibv_idx = 0; ibv_idx < num_devices; ibv_idx++) { + struct ibv_device *ibdev = ibv_list[ibv_idx]; + struct rte_pci_addr pci_addr; + + DRV_LOG(INFO, "Probe device name %s dev_name %s
ibdev_path%s",
+ibdev->name,ibdev->dev_name,drivers/net/mana/mana.c new file +10
-0+ibdev->ibdev_path); + + if (mana_ibv_device_to_pci_addr(ibdev, &pci_addr)) + continue; + + /* Ignore if this IB device is not this PCI device */ + if (pci_dev->addr.domain != pci_addr.domain || + pci_dev->addr.bus != pci_addr.bus || + pci_dev->addr.devid != pci_addr.devid || + pci_dev->addr.function != pci_addr.function)Quoted 8 lines
Quoted 2 lines
+ continue;
+As far as I understand, intention of this loop is to find 'ibdev' matching this device, code gooes through all "ibv device list" for this, I wonder if there is a easy way for doing this, like a sysfs entry to help getting this information?
And how mlx4/5 does this?
Quoted 3 lines
Since there are multiple RDMA devices now, does it make sense to have RDMA bus driver, which can hide some PCIe details under bus, and driver can get PCI and ibdev information during probe?
Mellanox drivers use a similar way to go through the list of IB devices.
Matan, Viacheslav, what are your thoughts on implementing a bus for RDMA devices?
Re: [Patch v4 01/17] net/mana: add basic driver, build environment and doc
22/08/2022 20:27, Long Li:
Quoted 44 lines
Quoted 44 lines
Subject: Re: [Patch v4 01/17] net/mana: add basic driver, build environment and doc
Quoted 39 lines · Ferruh Yigit
Quoted 23 lines
drivers/net/mana/mana.c new file +19
-0+struct rte_pci_device *pci_dev, + struct rte_ether_addr *mac_addr) { + struct ibv_device **ibv_list; +int ibv_idx; +struct ibv_context *ctx; +struct ibv_device_attr_ex dev_attr; +int num_devices; +int ret =0 ; +uint8_t port; +struct mana_priv *priv =NULL ; +struct rte_eth_dev *eth_dev =NULL ; +bool found_port; + + ibv_list =ibv_get_device_list (&num_devices); +for (ibv_idx =0 ; ibv_idx < num_devices; ibv_idx++) { +struct ibv_device *ibdev = ibv_list[ibv_idx]; +struct rte_pci_addr pci_addr; + + DRV_LOG(INFO, "Probe device name %s dev_name %s
ibdev_path%s",drivers/net/mana/mana.c new file +3
-0+ ibdev->name, ibdev->dev_name, +ibdev->ibdev_path); +drivers/net/mana/mana.c line 383
Quoted 10 lines
drivers/net/mana/mana.c new file +10
-0+if (mana_ibv_device_to_pci_addr (ibdev, &pci_addr)) +continue ; + +/* Ignore if this IB device is not this PCI device */ +if (pci_dev->addr.domain != pci_addr.domain || + pci_dev->addr.bus != pci_addr.bus || + pci_dev->addr.devid != pci_addr.devid || + pci_dev->addr.function != pci_addr.function) +continue ; +As far as I understand, intention of this loop is to find 'ibdev' matching this device, code gooes through all "ibv device list" for this, I wonder if there is a easy way for doing this, like a sysfs entry to help getting this information?
And how mlx4/5 does this?
Quoted 7 lines
Quoted 3 lines
Since there are multiple RDMA devices now, does it make sense to have RDMA bus driver, which can hide some PCIe details under bus, and driver can get PCI and ibdev information during probe?
Mellanox drivers use a similar way to go through the list of IB devices.
Matan, Viacheslav, what are your thoughts on implementing a bus for RDMA devices?
These are PCI devices first.
Is it a good idea to have a bus driver on top of another one? What would be the responsibility of such a bus driver?
Re: [Patch v4 01/17] net/mana: add basic driver, build environment and doc
Quoted 49 lines · Thomas Monjalon
22/08/2022 20:27, Long Li:
Quoted 48 lines
Quoted 47 lines
Subject: Re: [Patch v4 01/17] net/mana: add basic driver, build environment and doc
Quoted 31 lines · Ferruh Yigit
Quoted 31 lines
drivers/net/mana/mana.c new file +19
-0+struct rte_pci_device *pci_dev, + struct rte_ether_addr *mac_addr) { + struct ibv_device **ibv_list; +int ibv_idx; +struct ibv_context *ctx; +struct ibv_device_attr_ex dev_attr; +int num_devices; +int ret =0 ; +uint8_t port; +struct mana_priv *priv =NULL ; +struct rte_eth_dev *eth_dev =NULL ; +bool found_port; + + ibv_list =ibv_get_device_list (&num_devices); +for (ibv_idx =0 ; ibv_idx < num_devices; ibv_idx++) { +struct ibv_device *ibdev = ibv_list[ibv_idx]; +struct rte_pci_addr pci_addr; + + DRV_LOG(INFO, "Probe device name %s dev_name %s
ibdev_path%s",drivers/net/mana/mana.c new file +11
-0+ ibdev->name, ibdev->dev_name, +ibdev->ibdev_path); + +if (mana_ibv_device_to_pci_addr (ibdev, &pci_addr)) +continue ; + +/* Ignore if this IB device is not this PCI device */ +if (pci_dev->addr.domain != pci_addr.domain || + pci_dev->addr.bus != pci_addr.bus || + pci_dev->addr.devid != pci_addr.devid || + pci_dev->addr.function != pci_addr.function)Quoted 8 lines
Review
Quoted 2 lines
(quoted diff) +2
-0+ continue; +As far as I understand, intention of this loop is to find 'ibdev' matching this device, code gooes through all "ibv device list" for this, I wonder if there is a easy way for doing this, like a sysfs entry to help getting this information?
And how mlx4/5 does this?Since there are multiple RDMA devices now, does it make sense to have RDMA bus driver, which can hide some PCIe details under bus, and driver can get PCI and ibdev information during probe?
Quoted 8 lines
Quoted 3 lines
Mellanox drivers use a similar way to go through the list of IB devices.
Matan, Viacheslav, what are your thoughts on implementing a bus for RDMA devices?
These are PCI devices first.
Is it a good idea to have a bus driver on top of another one? What would be the responsibility of such a bus driver?
As far as I can see a 'ibdev' device struct is required to be able to configure the device, so rdma bus can be on top of PCI and find matching 'ibdev' device for it, and driver probe can get pci and ibdev information directly, instead of each rdma device driver walking through all ibdev devices (ibv_get_device_list()).
Re: [Patch v4 01/17] net/mana: add basic driver, build environment and doc
Slava, Matan, what do you think?
29/08/2022 10:51, Ferruh Yigit:
Quoted 37 lines · Thomas Monjalon
Quoted 22 lines
22/08/2022 20:27, Long Li:
Quoted 21 lines
Quoted 20 lines · Ferruh Yigit
Quoted 7 lines
Quoted 7 lines
drivers/net/mana/mana.c new file +6
-0+ ibv_list =ibv_get_device_list (&num_devices); +for (ibv_idx =0 ; ibv_idx < num_devices; ibv_idx++) { +struct ibv_device *ibdev = ibv_list[ibv_idx]; +struct rte_pci_addr pci_addr; + + DRV_LOG(INFO, "Probe device name %s dev_name %s
ibdev_path%s",Quoted 8 lines
Review
Quoted 2 lines
(quoted diff) +2
-0+ ibdev->name, ibdev->dev_name, +ibdev->ibdev_path);As far as I understand, intention of this loop is to find 'ibdev' matching this device, code gooes through all "ibv device list" for this, I wonder if there is a easy way for doing this, like a sysfs entry to help getting this information?
And how mlx4/5 does this?Since there are multiple RDMA devices now, does it make sense to have RDMA bus driver, which can hide some PCIe details under bus, and driver can get PCI and ibdev information during probe?
Quoted 8 lines
Quoted 3 lines
Mellanox drivers use a similar way to go through the list of IB devices.
Matan, Viacheslav, what are your thoughts on implementing a bus for RDMA devices?
These are PCI devices first.
Is it a good idea to have a bus driver on top of another one? What would be the responsibility of such a bus driver?As far as I can see a 'ibdev' device struct is required to be able to configure the device, so rdma bus can be on top of PCI and find matching 'ibdev' device for it, and driver probe can get pci and ibdev information directly, instead of each rdma device driver walking through all ibdev devices (
ibv_get_device_list()).
RE: [Patch v4 01/17] net/mana: add basic driver, build environment and doc
In reply to Ferruh YigitQuoted 34 lines
Subject: Re: [Patch v4 01/17] net/mana: add basic driver, build environment and doc
Quoted 1 line · On 7/9/2022 12:49 AM, [email protected] wrote:
CAUTION: This message has originated from an External Source. Please use
proper judgment and caution when opening attachments, clicking links, or responding to this email.
Quoted 24 lines
From: Long Li <[email protected]>
MANA is a PCI device. It uses IB verbs to access hardware through the kernel RDMA layer. This patch introduces build environment and basic device probe functions.
Signed-off-by Long Li <[email protected]>---
Change log:
v2:
Fix typos.
Make the driver build only on x86-64 and Linux.
Remove unused header files.
Change port definition touint16_toruint8_t(for IB). Usegetline()in place offgets()to read and truncate a line. v3:
Add meson build check for required functions from RDMA direct verb header file
v4:
Remove extra "\n" in logging code.
Use "r" in place of "rb" infopen()to read text files.<...>
Quoted 15 lines
doc/guides/nics/mana.rst line 9
Quoted 12 lines
doc/guides/nics/mana.rst new file +9
-0@@ -0,0 +1,66 @@ +.. SPDX-License-Identifier: BSD-3-Clause + Copyright 2022 Microsoft Corporation + +MANA poll mode driver library +============================= + +The MANA poll mode driver library (**librte_net_mana**) implements +support for Microsoft Azure Network Adapter VF in SR-IOV context. +Can you please provide any link to an official product description? As a reference point for anybody interested more with the product details.
As of today, we don't have an official page about the product. I will add a link as soon as the public product page is made available.
Quoted 8 lines
<..>
doc/guides/nics/mana.rst
Quoted 2 lines
doc/guides/nics/mana.rst new file +2
-0+ +Netvsc PMD arguments > +--------------------'Netvsc'? Do you mean 'MANA'?
It's a typo. Will fix this.
Quoted 13 lines
j
doc/guides/nics/mana.rst line 66
Quoted 9 lines
doc/guides/nics/mana.rst new file +9
-0+ +The user can specify below argument in devargs. + +#. ``mac``: + + Specify the MAC address for this device. If it is set, the driver + probes and loads the NIC with a matching mac address. If it is not + set, the driver probes on all the NICs on the PCI device. The default + value is not set, meaning all the NICs will be probed and loaded.Code accepts up to 8 mac value, should this be documented?
Yes, I will document this.
Quoted 2 lines
Also why this devarg is needed?
Because a PCI device may expose multiple NICs (ports), this devarg is used to specify which NIC to use. MANA doesn't support creating multiple hardware flows on the same NIC. The user needs to configure the system in a way that the same NIC is not actively used in the kernel. This NIC can be specified and passed to DPDK.
Quoted 26 lines
Quoted 26 lines
drivers/net/mana/mana.c new file +19
-0@@ -0,0 +1,704 @@ +/* SPDX-License-Identifier: BSD-3-Clause +* Copyright 2022 Microsoft Corporation +*/ + +#include <unistd.h> +#include <dirent.h> +#include <fcntl.h> +#include <sys/mman.h> + +#include <ethdev_driver.h> +#include <ethdev_pci.h> +#include <rte_kvargs.h> +#include <rte_eal_paging.h> + +#include <infiniband/verbs.h> +#include <infiniband/manadv.h> + +#include <assert.h> +
Quoted 8 lines
drivers/net/mana/mana.c line 24
Quoted 5 lines
drivers/net/mana/mana.c new file +5
-0+#include "mana.h" + +/* Shared memory between primary/secondary processes, per driver */ +struct mana_shared_data *mana_shared_data; +const struct rte_memzone *mana_shared_mz;If these global variables are not used by other compilation units, please try to make them static as much as possible.
Sure, will change mana_shared_mz to static. mana_shared_data will be used in mp.c, so keep it unchanged.
Quoted 7 lines
drivers/net/mana/mana.c line 28
Quoted 5 lines
drivers/net/mana/mana.c new file +4
-0+static const char *MZ_MANA_SHARED_DATA ="mana_shared_data" ; + +struct mana_shared_data mana_local_data; +Can you put some comment to this global variables?
Yes, will add.
Quoted 16 lines
drivers/net/mana/mana.c line 30
Quoted 3 lines
drivers/net/mana/mana.c new file +2
-0+/* Spinlock for mana_shared_data */ +static rte_spinlock_t mana_shared_data_lock =
RTE_SPINLOCK_INITIALIZER;Quoted 12 lines
drivers/net/mana/mana.c new file +12
-0+ +/* Allocate a buffer on the stack and fill it with a printf format string. */ +#define MKSTR (name, ...) \ + int mkstr_size_##name = snprintf(NULL, 0, "" __VA_ARGS__); \ + char name[mkstr_size_##name + 1]; \ + \ + memset(name, 0, mkstr_size_##name + 1); \ + snprintf(name, sizeof(name), "" __VA_ARGS__) + +int mana_logtype_driver; +int mana_logtype_init; +
Quoted 8 lines
drivers/net/mana/mana.c line 47
Quoted 5 lines
drivers/net/mana/mana.c new file +5
-0+const struct eth_dev_ops mana_dev_ops = { +}; + +const struct eth_dev_ops mana_dev_sec_ops = { +};It may be better to expand 'sec' to secondary to not confuse with security etc...
Will change this.
Quoted 44 lines
Quoted 24 lines
drivers/net/mana/mana.c new file +23
-0+ +uint16_t +mana_rx_burst_removed(void *dpdk_rxq __rte_unused, + struct rte_mbuf **pkts __rte_unused, + uint16_t pkts_n __rte_unused) +{ +rte_mb (); +return 0 ; +} + +uint16_t +mana_tx_burst_removed(void *dpdk_rxq __rte_unused, + struct rte_mbuf **pkts __rte_unused, + uint16_t pkts_n __rte_unused) +{ +rte_mb (); +return 0 ; +} + +static const char *mana_init_args[] = { +"mac" , +NULL , +};drivers/net/mana/mana.c line 80
Quoted 10 lines
drivers/net/mana/mana.c new file +10
-0+ +/* Support of parsing up to 8 mac address from EAL command line */ +#define MAX_NUM_ADDRESS 8 +struct mana_conf { +struct rte_ether_addr mac_array[MAX_NUM_ADDRESS ]; +unsigned int index; +}; + +static int mana_arg_parse_callback (const char *key,const char *val, +void *private)Since this is new driver, better to follow the coding convention:
https://nam06.safelinks.protection.outlook.com/?url=https%3A%2F%2Fdoc.
dpdk.org%2Fguides%2Fcontributing%2Fcoding_style.html&data=05%7C 01%7Clongli%40microsoft.com%7Ccd41ac9636a7472eabf408da844f861e%7C7 2f988bf86f141af91ab2d7cd011db47%7C1%7C0%7C637967774356090060%7CU nknown%7CTWFpbGZsb3d8eyJWIjoiMC4wLjAwMDAiLCJQIjoiV2luMzIiLCJBTiI 6Ik1haWwiLCJXVCI6Mn0%3D%7C3000%7C%7C%7C&sdata=qTHvw4H%2 FGVn6DVyFZaSQNhDVqBxyGTSPHKDwSCLxarw%3D&reserved=0
Quoted 4 lines
Please put return type to another line:
static int
mana_arg_parse_callback(const char *key, const char *val, void *private)
Will fix all the styling issues.
Quoted 63 lines
Quoted 23 lines
drivers/net/mana/mana.c new file +22
-0+{ +struct mana_conf *conf = (struct mana_conf *)private; +int ret; + +DRV_LOG (INFO ,"key=%s value=%s index=%d" , key, val, conf->index); + +if (conf->index >=MAX_NUM_ADDRESS ) { +DRV_LOG (ERR ,"Exceeding max MAC address" ); +return 1 ; + } + + ret =rte_ether_unformat_addr (val, &conf->mac_array[conf->index]); +if (ret) { +DRV_LOG (ERR ,"Invalid MAC address %s" , val); +return ret; + } + + conf->index++; + +return 0 ; +} +<...>
Quoted 37 lines
drivers/net/mana/mana.c new file +37
-0+static int get_port_mac (struct ibv_device *device,unsigned int port, +struct rte_ether_addr *addr) +{ +FILE *file; +int ret =0 ; +DIR *dir; +struct dirent *dent; +unsigned int dev_port; +char mac[20 ]; + +MKSTR (path,"%s/device/net" , device->ibdev_path); + + dir =opendir (path); +if (!dir) +return -ENOENT ; + +while ((dent =readdir (dir))) { +char *name = dent->d_name; + +MKSTR (filepath,"%s/%s/dev_port" , path, name); + +/* Ignore . and .. */ +if ((name[0 ] =='.' ) && + ((name[1 ] =='\0' ) || + ((name[1 ] =='.' ) && (name[2 ] =='\0' )))) +continue ; + + file =fopen (filepath,"r" ); +if (!file) +continue ; + + ret =fscanf (file,"%u" , &dev_port); +fclose (file); + +if (ret !=1 ) +continue ; +
Quoted 8 lines
drivers/net/mana/mana.c line 171
Quoted 3 lines
drivers/net/mana/mana.c new file +3
-0+/* Ethernet ports start at 0, IB port start at 1 */ +if (dev_port == port -1 ) { +MKSTR (filepath,"%s/%s/address" , path, name);'MKSTR' macro adds two variables related with first argument, 'filepath' already used above. Yes there is a new scope but better to not define new variables, can you select a new name here?
Will change this.
Quoted 9 lines
<...>
drivers/net/mana/mana.c
Quoted 2 lines
drivers/net/mana/mana.c new file +2
-0+ +static int mana_pci_probe_mac(struct rte_pci_driver *pci_drv
__rte_unused,This is a static function, if you don't use '
pci_drv', why not drop it from the argument list.
Yes, dropping it.
Quoted 61 lines
Quoted 11 lines
drivers/net/mana/mana.c new file +10
-0+struct rte_pci_device *pci_dev, + struct rte_ether_addr *mac_addr) +{ + struct ibv_device **ibv_list; +int ibv_idx; +struct ibv_context *ctx; +struct ibv_device_attr_ex dev_attr; +int num_devices; +int ret =0 ; +uint8_t port;drivers/net/mana/mana.c
Quoted 10 lines
drivers/net/mana/mana.c new file +10
-0+struct mana_priv *priv =NULL ; +struct rte_eth_dev *eth_dev =NULL ; +bool found_port; + + ibv_list =ibv_get_device_list (&num_devices); +for (ibv_idx =0 ; ibv_idx < num_devices; ibv_idx++) { +struct ibv_device *ibdev = ibv_list[ibv_idx]; +struct rte_pci_addr pci_addr; + + DRV_LOG(INFO, "Probe device name %s dev_name %s
ibdev_path%s",drivers/net/mana/mana.c line 383
Quoted 12 lines
drivers/net/mana/mana.c new file +12
-0+ ibdev->name, ibdev->dev_name, ibdev->ibdev_path); + +if (mana_ibv_device_to_pci_addr (ibdev, &pci_addr)) +continue ; + +/* Ignore if this IB device is not this PCI device */ +if (pci_dev->addr.domain != pci_addr.domain || + pci_dev->addr.bus != pci_addr.bus || + pci_dev->addr.devid != pci_addr.devid || + pci_dev->addr.function != pci_addr.function) +continue ; +As far as I understand, intention of this loop is to find 'ibdev' matching this device, code gooes through all "ibv device list" for this, I wonder if there is a easy way for doing this, like a sysfs entry to help getting this information?
And how mlx4/5 does this?Quoted 5 lines
drivers/net/mana/mana.c new file +5
-0+ ctx =ibv_open_device (ibdev); +if (!ctx) { +DRV_LOG (ERR ,"Failed to open IB device %s" , + ibdev->name); +continue ;drivers/net/mana/mana.c line 398
Quoted 10 lines
drivers/net/mana/mana.c new file +10
-0+ } + + ret =ibv_query_device_ex (ctx,NULL , &dev_attr); +DRV_LOG (INFO ,"dev_attr.orig_attr.phys_port_cnt %u" , + dev_attr.orig_attr.phys_port_cnt); + found_port = false; + +for (port =1 ; port <= dev_attr.orig_attr.phys_port_cnt; + port++) { +struct ibv_parent_domain_init_attr attr = {};"= { 0 };" for portability.
<...>
Quoted 7 lines
drivers/net/mana/mana.c line 596
Quoted 5 lines
drivers/net/mana/mana.c new file +5
-0+static int mana_pci_probe(struct rte_pci_driver *pci_drv __rte_unused, +struct rte_pci_device *pci_dev) +{ +struct rte_devargs *args = pci_dev->device.devargs; +struct mana_conf conf = {};afaik, this is not part of c spec yet, why not initialize as " = {0}".
Will fix this.
Quoted 7 lines
drivers/net/mana/mana.c line 600
Quoted 5 lines
drivers/net/mana/mana.c new file +4
-0+unsigned int i; +int ret; + +if (args && args->args) {You can prefer '
args->drv_str', which is newer name of the args.
Will change this.
Quoted 11 lines
<...>
drivers/net/mana/mana.c line 682
Quoted 5 lines
drivers/net/mana/mana.c new file +5
-0+static const struct rte_pci_id mana_pci_id_map[] = { + { +RTE_PCI_DEVICE (PCI_VENDOR_ID_MICROSOFT , +PCI_DEVICE_ID_MICROSOFT_MANA ) + },PCI ID list should be terminated with ".vendor_id = 0", otherwise PCI bus scan loop may behave unexpectedly.
Thank you!
Quoted 12 lines
drivers/net/mana/mana.c line 687
Quoted 6 lines
drivers/net/mana/mana.c new file +5
-0+}; + +static struct rte_pci_driver mana_pci_driver = { + .driver = { + .name ="mana_pci" ,driver names are mostly like 'net_<driver_name>', is there a reason to diverge from it?
Also if you use 'RTE_PMD_REGISTER_PCI' macro, it will be standardised anyway.
Quoted 14 lines
drivers/net/mana/mana.c line 699
Quoted 12 lines
drivers/net/mana/mana.c new file +12
-0+ }, + .id_table = mana_pci_id_map, + .probe = mana_pci_probe, + .remove = mana_pci_remove, + .drv_flags = RTE_PCI_DRV_INTR_RMV, +}; + +RTE_INIT (rte_mana_pmd_init) +{ +rte_pci_register (&mana_pci_driver); +} +Why not using '
RTE_PMD_REGISTER_PCI()' macro instead?
Will fix this.
Quoted 35 lines
Quoted 35 lines
drivers/net/mana/mana.c new file +5
-0+RTE_PMD_EXPORT_NAME (net_mana, __COUNTER__); +RTE_PMD_REGISTER_PCI_TABLE (net_mana, mana_pci_id_map); +RTE_PMD_REGISTER_KMOD_DEP (net_mana,"* ib_uverbs & mana_ib" ); +RTE_LOG_REGISTER_SUFFIX (mana_logtype_init, init,NOTICE ); +RTE_LOG_REGISTER_SUFFIX (mana_logtype_driver, driver,NOTICE );drivers/net/mana/mana.h new file +23
-0@@ -0,0 +1,210 @@ +/* SPDX-License-Identifier: BSD-3-Clause +* Copyright 2022 Microsoft Corporation +*/ + +#ifndef __MANA_H__ +#define __MANA_H__ + +enum { +PCI_VENDOR_ID_MICROSOFT =0x1414 , +}; + +enum { +PCI_DEVICE_ID_MICROSOFT_MANA =0x00ba , +}; + +/* Shared data between primary/secondary processes */ +struct mana_shared_data { +rte_spinlock_t lock; +int init_done; +unsigned int primary_cnt; +unsigned int secondary_cnt; +}; +
Quoted 8 lines
drivers/net/mana/mana.h line 27
Quoted 4 lines
drivers/net/mana/mana.h new file +4
-0+#define MIN_RX_BUF_SIZE 1024 +#define MAX_FRAME_SIZE RTE_ETHER_MAX_LEN +#define BNIC_MAX_MAC_ADDR 1 +What '
BNIC_' prefix stands for? If it is related to the PMD, what do you think to use 'MANA_' as prefix?
Same for multiple macros below.
Yes, will change those to MANA_.
Quoted 10 lines
<...>
drivers/net/mana/mana.h line 172
Quoted 5 lines
drivers/net/mana/mana.h new file +5
-0+ +#define PMD_INIT_FUNC_TRACE () PMD_INIT_LOG(DEBUG, " >>") + +const uint32_t *mana_supported_ptypes (struct rte_eth_dev *dev); +This function is not defined in this patch, so can drop declarataion.
Yes, moving it to a later patch.
Quoted 5 lines
<...>
Review
Quoted 1 line
(quoted diff) +0
-0b/drivers/net/mana/version.map
Quoted 8 lines
drivers/net/mana/version.map line 1
Quoted 6 lines
new file mode 100644
index 0000000000..c2e0723b4cdrivers/net/mana/version.map new file +1
-0@@ -0,0 +1,3 @@ +DPDK_22 {It is '
DPDK_23' now.
Will change this along with other fixes.
Long
PATCH v4 2/17 net/mana: add device configuration and stop
In reply to [email protected]From: Long Li <[email protected]>
MANA defines its memory allocation functions to override IB layer default functions to allocate device queues. This patch adds the code for device configuration and stop.
---
Change log:
v2:
Removed validation for offload settings in mana_dev_configure().
drivers/net/mana/mana.c | 75 +++++++++++++++++++++++++++++++++++++++-- drivers/net/mana/mana.h | 3 ++ 2 files changed, 76 insertions(+), 2 deletions(-)
drivers/net/mana/mana.c +73 -2
@@ -40,7 +40,79 @@ static rte_spinlock_t mana_shared_data_lock = RTE_SPINLOCK_INITIALIZER;int mana_logtype_driver;int mana_logtype_init; +void *mana_alloc_verbs_buf (size_t size,void *data) +{ +void *ret; +size_t alignment =rte_mem_page_size (); +int socket = (int )(uintptr_t )data; + +DRV_LOG (DEBUG ,"size=%zu socket=%d" , size, socket); + +if (alignment == (size_t )-1 ) { +DRV_LOG (ERR ,"Failed to get mem page size" ); + rte_errno =ENOMEM ; +return NULL ; + } + + ret =rte_zmalloc_socket ("mana_verb_buf" , size, alignment, socket); +if (!ret && size) + rte_errno =ENOMEM ; +return ret; +} + +void mana_free_verbs_buf(void *ptr, void *data __rte_unused) +{ +rte_free (ptr); +} + +static int mana_dev_configure (struct rte_eth_dev *dev) +{ +struct mana_priv *priv = dev->data->dev_private; +struct rte_eth_conf *dev_conf = &dev->data->dev_conf; + +if (dev_conf->rxmode.mq_mode Ð_MQ_RX_RSS_FLAG ) + dev_conf->rxmode.offloads |=DEV_RX_OFFLOAD_RSS_HASH ; + +if (dev->data->nb_rx_queues != dev->data->nb_tx_queues) { +DRV_LOG (ERR ,"Only support equal number of rx/tx queues" ); +return -EINVAL ; + } + +if (!rte_is_power_of_2 (dev->data->nb_rx_queues)) { +DRV_LOG (ERR ,"number of TX/RX queues must be power of 2" ); +return -EINVAL ; + } + + priv->num_queues = dev->data->nb_rx_queues; + +manadv_set_context_attr (priv->ib_ctx,MANADV_CTX_ATTR_BUF_ALLOCATORS , + (void *)((uintptr_t )&(struct manadv_ctx_allocators ){ + .alloc = &mana_alloc_verbs_buf, + .free = &mana_free_verbs_buf, + .data =0 , + })); + +return 0 ; +} + +static int +mana_dev_close (struct rte_eth_dev *dev) +{ +struct mana_priv *priv = dev->data->dev_private; +int ret; + + ret =ibv_close_device (priv->ib_ctx); +if (ret) { + ret = errno; +return ret; + } + +return 0 ; +} +const struct eth_dev_ops mana_dev_ops = { + .dev_configure = mana_dev_configure, + .dev_close = mana_dev_close, };const struct eth_dev_ops mana_dev_sec_ops = {
@@ -627,8 +699,7 @@ static int mana_pci_probe(struct rte_pci_driver *pci_drv __rte_unused,static int mana_dev_uninit (struct rte_eth_dev *dev) { -RTE_SET_USED (dev); -return 0 ; +return mana_dev_close (dev); }static int mana_pci_remove (struct rte_pci_device *pci_dev)
drivers/net/mana/mana.h +3 -0
@@ -207,4 +207,7 @@ int mana_mp_req_verbs_cmd_fd(struct rte_eth_dev *dev);void mana_mp_req_on_rxtx (struct rte_eth_dev *dev,enum mana_mp_req_type type); +void *mana_alloc_verbs_buf (size_t size,void *data); +void mana_free_verbs_buf(void *ptr, void *data __rte_unused); +#endif
Signature · 1 line
2.17.1
PATCH v4 3/17 net/mana: add function to report support ptypes
In reply to [email protected]From: Long Li <[email protected]>
Report supported protocol types.
--- drivers/net/mana/mana.c | 16 ++++++++++++++++ drivers/net/mana/mana.h | 2 -- 2 files changed, 16 insertions(+), 2 deletions(-)
drivers/net/mana/mana.c +16 -0
@@ -110,9 +110,25 @@ mana_dev_close(struct rte_eth_dev *dev)return 0 ; } +static const uint32_t *mana_supported_ptypes(struct rte_eth_dev *dev __rte_unused) +{ +static const uint32_t ptypes[] = { +RTE_PTYPE_L2_ETHER , +RTE_PTYPE_L3_IPV4_EXT_UNKNOWN , +RTE_PTYPE_L3_IPV6_EXT_UNKNOWN , +RTE_PTYPE_L4_FRAG , +RTE_PTYPE_L4_TCP , +RTE_PTYPE_L4_UDP , +RTE_PTYPE_UNKNOWN + }; + +return ptypes; +} +const struct eth_dev_ops mana_dev_ops = { .dev_configure = mana_dev_configure, .dev_close = mana_dev_close, + .dev_supported_ptypes_get = mana_supported_ptypes, };const struct eth_dev_ops mana_dev_sec_ops = {
drivers/net/mana/mana.h +0 -2
@@ -168,8 +168,6 @@ extern int mana_logtype_init;#define PMD_INIT_FUNC_TRACE () PMD_INIT_LOG(DEBUG, " >>") -const uint32_t *mana_supported_ptypes (struct rte_eth_dev *dev); -uint16_t mana_rx_burst_removed (void *dpdk_rxq,struct rte_mbuf **pkts,uint16_t pkts_n);
Signature · 1 line
2.17.1
PATCH v4 4/17 net/mana: add link update
In reply to [email protected]From: Long Li <[email protected]>
The carrier state is managed by the Azure host. MANA runs as a VF and always reports "up".
--- doc/guides/nics/features/mana.ini | 1 + drivers/net/mana/mana.c | 17 +++++++++++++++++ 2 files changed, 18 insertions(+)
doc/guides/nics/features/mana.ini +1 -0
@@ -4,6 +4,7 @@ ; Refer to default.ini for the full list of available PMD features. ; [Features] +Link status = P Linux = Y Multiprocess aware = Y Usage doc = Y
drivers/net/mana/mana.c +17 -0
@@ -125,10 +125,27 @@ static const uint32_t *mana_supported_ptypes(struct rte_eth_dev *dev __rte_unusereturn ptypes; } +static int mana_dev_link_update (struct rte_eth_dev *dev, + int wait_to_complete __rte_unused) +{ +struct rte_eth_link link; + +/* MANA has no concept of carrier state, always reporting UP */ + link = (struct rte_eth_link ) { + .link_duplex =RTE_ETH_LINK_FULL_DUPLEX , + .link_autoneg =RTE_ETH_LINK_SPEED_FIXED , + .link_speed =RTE_ETH_SPEED_NUM_200G , + .link_status =RTE_ETH_LINK_UP , + }; + +return rte_eth_linkstatus_set (dev, &link); +} +const struct eth_dev_ops mana_dev_ops = { .dev_configure = mana_dev_configure, .dev_close = mana_dev_close, .dev_supported_ptypes_get = mana_supported_ptypes, + .link_update = mana_dev_link_update, };const struct eth_dev_ops mana_dev_sec_ops = {
Signature · 1 line
2.17.1
PATCH v4 5/17 net/mana: add function for device removal interrupts
In reply to [email protected]From: Long Li <[email protected]>
MANA supports PCI hot plug events. Add this interrupt to DPDK core so its parent PMD can detect device removal during Azure servicing or live migration.
--- doc/guides/nics/features/mana.ini | 1 + drivers/net/mana/mana.c | 97 +++++++++++++++++++++++++++++++ drivers/net/mana/mana.h | 1 + 3 files changed, 99 insertions(+)
doc/guides/nics/features/mana.ini +1 -0
@@ -7,5 +7,6 @@ Link status = P Linux = Y Multiprocess aware = Y +Removal event = Y Usage doc = Y x86-64 = Y
drivers/net/mana/mana.c +97 -0
121 lines not on this page · raw message
drivers/net/mana/mana.h +1 -0
@@ -72,6 +72,7 @@ struct mana_priv {uint8_t ind_table_key[40 ];struct ibv_qp *rwq_qp;void *db_page; +struct rte_intr_handle *intr_handle;int max_rx_queues;int max_tx_queues;int max_rx_desc;
Signature · 1 line
2.17.1
PATCH v4 6/17 net/mana: add device info
In reply to [email protected]From: Long Li <[email protected]>
Add the function to get device info.
--- doc/guides/nics/features/mana.ini | 1 + drivers/net/mana/mana.c | 82 +++++++++++++++++++++++++++++++ 2 files changed, 83 insertions(+)
doc/guides/nics/features/mana.ini +1 -0
@@ -8,5 +8,6 @@ Link status = P Linux = Y Multiprocess aware = Y Removal event = Y +Speed capabilities = P Usage doc = Y x86-64 = Y
drivers/net/mana/mana.c +82 -0
99 lines not on this page · raw message
Signature · 1 line
2.17.1
PATCH v4 7/17 net/mana: add function to configure RSS
In reply to [email protected]From: Long Li <[email protected]>
Currently this PMD supports RSS configuration when the device is stopped. Configuring RSS in running state will be supported in the future.
--- doc/guides/nics/features/mana.ini | 1 + drivers/net/mana/mana.c | 61 +++++++++++++++++++++++++++++++ drivers/net/mana/mana.h | 1 + 3 files changed, 63 insertions(+)
doc/guides/nics/features/mana.ini +1 -0
@@ -8,6 +8,7 @@ Link status = P Linux = Y Multiprocess aware = Y Removal event = Y +RSS hash = Y Speed capabilities = P Usage doc = Y x86-64 = Y
drivers/net/mana/mana.c +61 -0
73 lines not on this page · raw message
drivers/net/mana/mana.h +1 -0
@@ -72,6 +72,7 @@ struct mana_priv {uint8_t ind_table_key[40 ];struct ibv_qp *rwq_qp;void *db_page; +struct rte_eth_rss_conf rss_conf;struct rte_intr_handle *intr_handle;int max_rx_queues;int max_tx_queues;
Signature · 1 line
2.17.1
PATCH v4 8/17 net/mana: add function to configure RX queues
In reply to [email protected]From: Long Li <[email protected]>
RX hardware queue is allocated when starting the queue. This function is for queue configuration pre starting.
--- drivers/net/mana/mana.c | 68 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 68 insertions(+)
drivers/net/mana/mana.c +68 -0
@@ -196,6 +196,16 @@ static int mana_dev_info_get(struct rte_eth_dev *dev,return 0 ; } +static void mana_dev_rx_queue_info (struct rte_eth_dev *dev,uint16_t queue_id, +struct rte_eth_rxq_info *qinfo) +{ +struct mana_rxq *rxq = dev->data->rx_queues[queue_id]; + + qinfo->mp = rxq->mp; + qinfo->nb_desc = rxq->num_desc; + qinfo->conf.offloads = dev->data->dev_conf.rxmode.offloads; +} + static const uint32_t *mana_supported_ptypes(struct rte_eth_dev *dev __rte_unused) {static const uint32_t ptypes[] = {
@@ -270,6 +280,61 @@ static int mana_rss_hash_conf_get(struct rte_eth_dev *dev,return 0 ; } +static int mana_dev_rx_queue_setup (struct rte_eth_dev *dev, +uint16_t queue_idx,uint16_t nb_desc, +unsigned int socket_id, + const struct rte_eth_rxconf *rx_conf __rte_unused, +struct rte_mempool *mp) +{ +struct mana_priv *priv = dev->data->dev_private; +struct mana_rxq *rxq; +int ret; + + rxq =rte_zmalloc_socket ("mana_rxq" ,sizeof (*rxq),0 , socket_id); +if (!rxq) { +DRV_LOG (ERR ,"failed to allocate rxq" ); +return -ENOMEM ; + } + +DRV_LOG (DEBUG ,"idx %u nb_desc %u socket %u" , + queue_idx, nb_desc, socket_id); + + rxq->socket = socket_id; + + rxq->desc_ring =rte_zmalloc_socket ("mana_rx_mbuf_ring" , +sizeof (struct mana_rxq_desc ) * + nb_desc, +RTE_CACHE_LINE_SIZE , socket_id); + +if (!rxq->desc_ring) { +DRV_LOG (ERR ,"failed to allocate rxq desc_ring" ); + ret = -ENOMEM ; + goto fail; + } + + rxq->num_desc = nb_desc; + + rxq->priv = priv; + rxq->num_desc = nb_desc; + rxq->mp = mp; + dev->data->rx_queues[queue_idx] = rxq; + +return 0 ; + +fail: +rte_free (rxq->desc_ring); +rte_free (rxq); +return ret; +} + +static void mana_dev_rx_queue_release (struct rte_eth_dev *dev,uint16_t qid) +{ +struct mana_rxq *rxq = dev->data->rx_queues[qid]; + +rte_free (rxq->desc_ring); +rte_free (rxq); +} +static int mana_dev_link_update (struct rte_eth_dev *dev, int wait_to_complete __rte_unused) {
@@ -290,9 +355,12 @@ const struct eth_dev_ops mana_dev_ops = { .dev_configure = mana_dev_configure, .dev_close = mana_dev_close, .dev_infos_get = mana_dev_info_get, + .rxq_info_get = mana_dev_rx_queue_info, .dev_supported_ptypes_get = mana_supported_ptypes, .rss_hash_update = mana_rss_hash_update, .rss_hash_conf_get = mana_rss_hash_conf_get, + .rx_queue_setup = mana_dev_rx_queue_setup, + .rx_queue_release = mana_dev_rx_queue_release, .link_update = mana_dev_link_update, };
Signature · 1 line
2.17.1
PATCH v4 9/17 net/mana: add function to configure TX queues
In reply to [email protected]From: Long Li <[email protected]>
TX hardware queue is allocated when starting the queue, this is for pre configuration.
--- drivers/net/mana/mana.c | 65 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 65 insertions(+)
drivers/net/mana/mana.c +65 -0
@@ -196,6 +196,15 @@ static int mana_dev_info_get(struct rte_eth_dev *dev,return 0 ; } +static void mana_dev_tx_queue_info (struct rte_eth_dev *dev,uint16_t queue_id, +struct rte_eth_txq_info *qinfo) +{ +struct mana_txq *txq = dev->data->tx_queues[queue_id]; + + qinfo->conf.offloads = dev->data->dev_conf.txmode.offloads; + qinfo->nb_desc = txq->num_desc; +} +static void mana_dev_rx_queue_info (struct rte_eth_dev *dev,uint16_t queue_id,struct rte_eth_rxq_info *qinfo) {
@@ -280,6 +289,59 @@ static int mana_rss_hash_conf_get(struct rte_eth_dev *dev,return 0 ; } +static int mana_dev_tx_queue_setup (struct rte_eth_dev *dev, +uint16_t queue_idx,uint16_t nb_desc, +unsigned int socket_id, + const struct rte_eth_txconf *tx_conf __rte_unused) + +{ +struct mana_priv *priv = dev->data->dev_private; +struct mana_txq *txq; +int ret; + + txq =rte_zmalloc_socket ("mana_txq" ,sizeof (*txq),0 , socket_id); +if (!txq) { +DRV_LOG (ERR ,"failed to allocate txq" ); +return -ENOMEM ; + } + + txq->socket = socket_id; + + txq->desc_ring =rte_malloc_socket ("mana_tx_desc_ring" , +sizeof (struct mana_txq_desc ) * + nb_desc, +RTE_CACHE_LINE_SIZE , socket_id); +if (!txq->desc_ring) { +DRV_LOG (ERR ,"failed to allocate txq desc_ring" ); + ret = -ENOMEM ; + goto fail; + } + +DRV_LOG (DEBUG ,"idx %u nb_desc %u socket %u txq->desc_ring %p" , + queue_idx, nb_desc, socket_id, txq->desc_ring); + + txq->desc_ring_head =0 ; + txq->desc_ring_tail =0 ; + txq->priv = priv; + txq->num_desc = nb_desc; + dev->data->tx_queues[queue_idx] = txq; + +return 0 ; + +fail: +rte_free (txq->desc_ring); +rte_free (txq); +return ret; +} + +static void mana_dev_tx_queue_release (struct rte_eth_dev *dev,uint16_t qid) +{ +struct mana_txq *txq = dev->data->tx_queues[qid]; + +rte_free (txq->desc_ring); +rte_free (txq); +} + static int mana_dev_rx_queue_setup(struct rte_eth_dev *dev, uint16_t queue_idx, uint16_t nb_desc, unsigned int socket_id,
@@ -355,10 +417,13 @@ const struct eth_dev_ops mana_dev_ops = { .dev_configure = mana_dev_configure, .dev_close = mana_dev_close, .dev_infos_get = mana_dev_info_get, + .txq_info_get = mana_dev_tx_queue_info, .rxq_info_get = mana_dev_rx_queue_info, .dev_supported_ptypes_get = mana_supported_ptypes, .rss_hash_update = mana_rss_hash_update, .rss_hash_conf_get = mana_rss_hash_conf_get, + .tx_queue_setup = mana_dev_tx_queue_setup, + .tx_queue_release = mana_dev_tx_queue_release, .rx_queue_setup = mana_dev_rx_queue_setup, .rx_queue_release = mana_dev_rx_queue_release, .link_update = mana_dev_link_update,
Signature · 1 line
2.17.1
PATCH v4 10/17 net/mana: implement memory registration
In reply to [email protected]From: Long Li <[email protected]>
MANA hardware has iommu built-in, that provides hardware safe access to user memory through memory registration. Since memory registration is an expensive operation, this patch implements a two level memory registration cache mechanisum for each queue and for each port.
---
Change log:
v2:
Change all header file functions to start with mana_. Use spinlock in place of rwlock to memory cache access. Remove unused header files.
v4:
Remove extra "\n" in logging function.
drivers/net/mana/mana.c | 20 +++ drivers/net/mana/mana.h | 39 +++++ drivers/net/mana/meson.build | 1 + drivers/net/mana/mp.c | 85 +++++++++ drivers/net/mana/mr.c | 324 +++++++++++++++++++++++++++++++++++ 5 files changed, 469 insertions(+) create mode 100644 drivers/net/mana/mr.c
drivers/net/mana/mana.c +20 -0
@@ -103,6 +103,8 @@ mana_dev_close(struct rte_eth_dev *dev)struct mana_priv *priv = dev->data->dev_private;int ret; +mana_remove_all_mr (priv); + ret =mana_intr_uninstall (priv);if (ret)return ret;
@@ -317,6 +319,13 @@ static int mana_dev_tx_queue_setup(struct rte_eth_dev *dev, goto fail; } + ret =mana_mr_btree_init (&txq->mr_btree, +MANA_MR_BTREE_PER_QUEUE_N , socket_id); +if (ret) { +DRV_LOG (ERR ,"Failed to init TXQ MR btree" ); + goto fail; + } +DRV_LOG (DEBUG ,"idx %u nb_desc %u socket %u txq->desc_ring %p" , queue_idx, nb_desc, socket_id, txq->desc_ring);
@@ -338,6 +347,8 @@ static void mana_dev_tx_queue_release(struct rte_eth_dev *dev, uint16_t qid) {struct mana_txq *txq = dev->data->tx_queues[qid]; +mana_mr_btree_free (&txq->mr_btree); +rte_free (txq->desc_ring);rte_free (txq); }
@@ -374,6 +385,13 @@ static int mana_dev_rx_queue_setup(struct rte_eth_dev *dev, goto fail; } + ret =mana_mr_btree_init (&rxq->mr_btree, +MANA_MR_BTREE_PER_QUEUE_N , socket_id); +if (ret) { +DRV_LOG (ERR ,"Failed to init RXQ MR btree" ); + goto fail; + } + rxq->num_desc = nb_desc; rxq->priv = priv;
@@ -393,6 +411,8 @@ static void mana_dev_rx_queue_release(struct rte_eth_dev *dev, uint16_t qid) {struct mana_rxq *rxq = dev->data->rx_queues[qid]; +mana_mr_btree_free (&rxq->mr_btree); +rte_free (rxq->desc_ring);rte_free (rxq); }
drivers/net/mana/mana.h +39 -0
@@ -50,6 +50,22 @@ struct mana_shared_data {#define MAX_RECEIVE_BUFFERS_PER_QUEUE 256#define MAX_SEND_BUFFERS_PER_QUEUE 256 +struct mana_mr_cache { +uint32_t lkey; +uintptr_t addr; +size_t len; +void *verb_obj; +}; + +#define MANA_MR_BTREE_CACHE_N 512 +struct mana_mr_btree { +uint16_t len;/* Used entries */ +uint16_t size;/* Total entries */ +int overflow; +int socket; +struct mana_mr_cache *table; +}; +struct mana_process_priv {void *db_page; };
@@ -82,6 +98,8 @@ struct mana_priv {int max_recv_sge;int max_mr;uint64_t max_mr_size; +struct mana_mr_btree mr_btree; +rte_spinlock_t mr_btree_lock; };struct mana_txq_desc {
@@ -131,6 +149,7 @@ struct mana_txq {uint32_t desc_ring_head, desc_ring_tail;struct mana_stats stats; +struct mana_mr_btree mr_btree;unsigned int socket; };
@@ -153,6 +172,7 @@ struct mana_rxq {struct mana_gdma_queue gdma_cq;struct mana_stats stats; +struct mana_mr_btree mr_btree;unsigned int socket; };
@@ -176,6 +196,24 @@ uint16_t mana_rx_burst_removed(void *dpdk_rxq, struct rte_mbuf **pkts,uint16_t mana_tx_burst_removed (void *dpdk_rxq,struct rte_mbuf **pkts,uint16_t pkts_n); +struct mana_mr_cache *mana_find_pmd_mr (struct mana_mr_btree *local_tree, +struct mana_priv *priv, +struct rte_mbuf *mbuf); +int mana_new_pmd_mr (struct mana_mr_btree *local_tree,struct mana_priv *priv, +struct rte_mempool *pool); +void mana_remove_all_mr (struct mana_priv *priv); +void mana_del_pmd_mr (struct mana_mr_cache *mr); + +void mana_mempool_chunk_cb (struct rte_mempool *mp,void *opaque, +struct rte_mempool_memhdr *memhdr,unsigned int idx); + +struct mana_mr_cache *mana_mr_btree_lookup (struct mana_mr_btree *bt, +uint16_t *idx, +uintptr_t addr,size_t len); +int mana_mr_btree_insert (struct mana_mr_btree *bt,struct mana_mr_cache *entry); +int mana_mr_btree_init (struct mana_mr_btree *bt,int n,int socket); +void mana_mr_btree_free (struct mana_mr_btree *bt); +/** Request timeout for IPC. */ #define MANA_MP_REQ_TIMEOUT_SEC 5
@@ -204,6 +242,7 @@ int mana_mp_init_secondary(void);void mana_mp_uninit_primary (void );void mana_mp_uninit_secondary (void );int mana_mp_req_verbs_cmd_fd (struct rte_eth_dev *dev); +int mana_mp_req_mr_create (struct mana_priv *priv,uintptr_t addr,uint32_t len);void mana_mp_req_on_rxtx (struct rte_eth_dev *dev,enum mana_mp_req_type type);
drivers/net/mana/meson.build +1 -0
@@ -11,6 +11,7 @@ deps += ['pci', 'bus_pci', 'net', 'eal', 'kvargs'] sources += files( 'mana.c', + 'mr.c', 'mp.c', )
drivers/net/mana/mp.c +85 -0
103 lines not on this page · raw message
drivers/net/mana/mr.c new file +324 -0
324 lines not on this page · raw message
Signature · 1 line
2.17.1
PATCH v4 11/17 net/mana: implement the hardware layer operations
In reply to [email protected]From: Long Li <[email protected]>
The hardware layer of MANA understands the device queue and doorbell formats. Those functions are implemented for use by packet RX/TX code.
---
Change log:
v2:
Remove unused header files.
Rename a camel case.
drivers/net/mana/gdma.c | 284 +++++++++++++++++++++++++++++++++++ drivers/net/mana/mana.h | 183 ++++++++++++++++++++++ drivers/net/mana/meson.build | 1 + 3 files changed, 468 insertions(+) create mode 100644 drivers/net/mana/gdma.c
drivers/net/mana/gdma.c new file +284 -0
@@ -0,0 +1,284 @@ +/* SPDX-License-Identifier: BSD-3-Clause +* Copyright 2022 Microsoft Corporation +*/ + +#include <ethdev_driver.h> +#include <rte_io.h> + +#include "mana.h" + +uint8_t *gdma_get_wqe_pointer (struct mana_gdma_queue *queue) +{ +uint32_t offset_in_bytes = + (queue->head *GDMA_WQE_ALIGNMENT_UNIT_SIZE ) & + (queue->size -1 ); + +DRV_LOG (DEBUG ,"txq sq_head %u sq_size %u offset_in_bytes %u" , + queue->head, queue->size, offset_in_bytes); + +if (offset_in_bytes +GDMA_WQE_ALIGNMENT_UNIT_SIZE > queue->size) +DRV_LOG (ERR ,"fatal error: offset_in_bytes %u too big" , + offset_in_bytes); + +return ((uint8_t *)queue->buffer) + offset_in_bytes; +} + +static uint32_t +write_dma_client_oob (uint8_t *work_queue_buffer_pointer, +const struct gdma_work_request *work_request, +uint32_t client_oob_size) +{ +uint8_t *p = work_queue_buffer_pointer; + +struct gdma_wqe_dma_oob *header = (struct gdma_wqe_dma_oob *)p; + +memset (header,0 ,sizeof (struct gdma_wqe_dma_oob )); + header->num_sgl_entries = work_request->num_sgl_elements; + header->inline_client_oob_size_in_dwords = + client_oob_size /sizeof (uint32_t ); + header->client_data_unit = work_request->client_data_unit; + +DRV_LOG (DEBUG ,"queue buf %p sgl %u oob_h %u du %u oob_buf %p oob_b %u" , + work_queue_buffer_pointer, header->num_sgl_entries, + header->inline_client_oob_size_in_dwords, + header->client_data_unit, work_request->inline_oob_data, + work_request->inline_oob_size_in_bytes); + + p +=sizeof (struct gdma_wqe_dma_oob ); +if (work_request->inline_oob_data && + work_request->inline_oob_size_in_bytes >0 ) { +memcpy (p, work_request->inline_oob_data, + work_request->inline_oob_size_in_bytes); +if (client_oob_size > work_request->inline_oob_size_in_bytes) +memset (p + work_request->inline_oob_size_in_bytes,0 , + client_oob_size - + work_request->inline_oob_size_in_bytes); + } + +return sizeof (struct gdma_wqe_dma_oob ) + client_oob_size; +} + +static uint32_t +write_scatter_gather_list (uint8_t *work_queue_head_pointer, +uint8_t *work_queue_end_pointer, +uint8_t *work_queue_cur_pointer, +struct gdma_work_request *work_request) +{ +struct gdma_sgl_element *sge_list; +struct gdma_sgl_element dummy_sgl[1 ]; +uint8_t *address; +uint32_t size; +uint32_t num_sge; +uint32_t size_to_queue_end; +uint32_t sge_list_size; + +DRV_LOG (DEBUG ,"work_queue_cur_pointer %p work_request->flags %x" , + work_queue_cur_pointer, work_request->flags); + + num_sge = work_request->num_sgl_elements; + sge_list = work_request->sgl; + size_to_queue_end = (uint32_t )(work_queue_end_pointer - + work_queue_cur_pointer); + +if (num_sge ==0 ) { +/* Per spec, the case of an empty SGL should be handled as +* follows to avoid corrupted WQE errors: +* Write one dummy SGL entry +* Set the address to 1, leave the rest as 0 +*/ + dummy_sgl[num_sge].address =1 ; + dummy_sgl[num_sge].size =0 ; + dummy_sgl[num_sge].memory_key =0 ; + num_sge++; + sge_list = dummy_sgl; + } + + sge_list_size =0 ; + { + address = (uint8_t *)sge_list; + size =sizeof (struct gdma_sgl_element ) * num_sge; +if (size_to_queue_end < size) { +memcpy (work_queue_cur_pointer, address, + size_to_queue_end); + work_queue_cur_pointer = work_queue_head_pointer; + address += size_to_queue_end; + size -= size_to_queue_end; + } + +memcpy (work_queue_cur_pointer, address, size); + sge_list_size = size; + } + +DRV_LOG (DEBUG ,"sge %u address 0x%" PRIx64" size %u key %u list_s %u" , + num_sge, sge_list->address, sge_list->size, + sge_list->memory_key, sge_list_size); + +return sge_list_size; +} + +int gdma_post_work_request (struct mana_gdma_queue *queue, +struct gdma_work_request *work_req, +struct gdma_posted_wqe_info *wqe_info) +{ +uint32_t client_oob_size = + work_req->inline_oob_size_in_bytes > +INLINE_OOB_SMALL_SIZE_IN_BYTES ? +INLINE_OOB_LARGE_SIZE_IN_BYTES : +INLINE_OOB_SMALL_SIZE_IN_BYTES ; + +uint32_t sgl_data_size =sizeof (struct gdma_sgl_element ) * +RTE_MAX ((uint32_t )1 , work_req->num_sgl_elements); +uint32_t wqe_size = +RTE_ALIGN (sizeof (struct gdma_wqe_dma_oob ) + + client_oob_size + sgl_data_size, +GDMA_WQE_ALIGNMENT_UNIT_SIZE ); +uint8_t *wq_buffer_pointer; +uint32_t queue_free_units = queue->count - (queue->head - queue->tail); + +if (wqe_size /GDMA_WQE_ALIGNMENT_UNIT_SIZE > queue_free_units) { +DRV_LOG (DEBUG ,"WQE size %u queue count %u head %u tail %u" , + wqe_size, queue->count, queue->head, queue->tail); +return -EBUSY ; + } + +DRV_LOG (DEBUG ,"client_oob_size %u sgl_data_size %u wqe_size %u" , + client_oob_size, sgl_data_size, wqe_size); + +if (wqe_info) { + wqe_info->wqe_index = + ((queue->head *GDMA_WQE_ALIGNMENT_UNIT_SIZE ) & + (queue->size -1 )) /GDMA_WQE_ALIGNMENT_UNIT_SIZE ; + wqe_info->unmasked_queue_offset = queue->head; + wqe_info->wqe_size_in_bu = + wqe_size /GDMA_WQE_ALIGNMENT_UNIT_SIZE ; + } + + wq_buffer_pointer =gdma_get_wqe_pointer (queue); + wq_buffer_pointer +=write_dma_client_oob (wq_buffer_pointer, work_req, + client_oob_size); +if (wq_buffer_pointer >= ((uint8_t *)queue->buffer) + queue->size) + wq_buffer_pointer -= queue->size; + +write_scatter_gather_list ((uint8_t *)queue->buffer, + (uint8_t *)queue->buffer + queue->size, + wq_buffer_pointer, work_req); + + queue->head += wqe_size /GDMA_WQE_ALIGNMENT_UNIT_SIZE ; + +return 0 ; +} + +union gdma_doorbell_entry { +uint64_t as_uint64; + +struct { +uint64_t id :24 ; +uint64_t reserved :8 ; +uint64_t tail_ptr :31 ; +uint64_t arm :1 ; + } cq; + +struct { +uint64_t id :24 ; +uint64_t wqe_cnt :8 ; +uint64_t tail_ptr :32 ; + } rq; + +struct { +uint64_t id :24 ; +uint64_t reserved :8 ; +uint64_t tail_ptr :32 ; + } sq; + +struct { +uint64_t id :16 ; +uint64_t reserved :16 ; +uint64_t tail_ptr :31 ; +uint64_t arm :1 ; + } eq; +};/* HW DATA */ + +#define DOORBELL_OFFSET_SQ 0x0 +#define DOORBELL_OFFSET_RQ 0x400 +#define DOORBELL_OFFSET_CQ 0x800 +#define DOORBELL_OFFSET_EQ 0xFF8 + +int mana_ring_doorbell (void *db_page,enum gdma_queue_types queue_type, +uint32_t queue_id,uint32_t tail) +{ +uint8_t *addr = db_page; +union gdma_doorbell_entry e = {}; + +switch (queue_type) { +case gdma_queue_send: + e.sq.id = queue_id; + e.sq.tail_ptr = tail; + addr +=DOORBELL_OFFSET_SQ ; +break ; + +case gdma_queue_receive: + e.rq.id = queue_id; + e.rq.tail_ptr = tail; + e.rq.wqe_cnt =1 ; + addr +=DOORBELL_OFFSET_RQ ; +break ; + +case gdma_queue_completion: + e.cq.id = queue_id; + e.cq.tail_ptr = tail; + e.cq.arm =1 ; + addr +=DOORBELL_OFFSET_CQ ; +break ; + +default : +DRV_LOG (ERR ,"Unsupported queue type %d" , queue_type); +return -1 ; + } + +rte_wmb (); +DRV_LOG (DEBUG ,"db_page %p addr %p queue_id %u type %u tail %u" , + db_page, addr, queue_id, queue_type, tail); + +rte_write64 (e.as_uint64, addr); +return 0 ; +} + +int gdma_poll_completion_queue (struct mana_gdma_queue *cq, +struct gdma_comp *comp) +{ +struct gdma_hardware_completion_entry *cqe; +uint32_t head = cq->head % cq->count; +uint32_t new_owner_bits, old_owner_bits; +uint32_t cqe_owner_bits; +struct gdma_hardware_completion_entry *buffer = cq->buffer; + + cqe = &buffer[head]; + new_owner_bits = (cq->head / cq->count) &COMPLETION_QUEUE_OWNER_MASK ; + old_owner_bits = (cq->head / cq->count -1 ) & +COMPLETION_QUEUE_OWNER_MASK ; + cqe_owner_bits = cqe->owner_bits; + +DRV_LOG (DEBUG ,"comp cqe bits 0x%x owner bits 0x%x" , + cqe_owner_bits, old_owner_bits); + +if (cqe_owner_bits == old_owner_bits) +return 0 ;/* No new entry */ + +if (cqe_owner_bits != new_owner_bits) { +DRV_LOG (ERR ,"CQ overflowed, ID %u cqe 0x%x new 0x%x" , + cq->id, cqe_owner_bits, new_owner_bits); +return -1 ; + } + + comp->work_queue_number = cqe->wq_num; + comp->send_work_queue = cqe->is_sq; + +memcpy (comp->completion_data, cqe->dma_client_data,GDMA_COMP_DATA_SIZE ); + + cq->head++; + +DRV_LOG (DEBUG ,"comp new 0x%x old 0x%x cqe 0x%x wq %u sq %u head %u" , + new_owner_bits, old_owner_bits, cqe_owner_bits, + comp->work_queue_number, comp->send_work_queue, cq->head); +return 1 ; +}
drivers/net/mana/mana.h +183 -0
201 lines not on this page · raw message
drivers/net/mana/meson.build +1 -0
@@ -12,6 +12,7 @@ deps += ['pci', 'bus_pci', 'net', 'eal', 'kvargs'] sources += files( 'mana.c', 'mr.c', + 'gdma.c', 'mp.c', )
Signature · 1 line
2.17.1
Re: [Patch v4 11/17] net/mana: implement the hardware layer operations
Quoted 13 lines · On 7/9/2022 12:49 AM, [email protected] wrote:
From: Long Li <[email protected]>
The hardware layer of MANA understands the device queue and doorbell formats. Those functions are implemented for use by packet RX/TX code.
Signed-off-by Long Li <[email protected]>---
Change log:
v2:
Remove unused header files.
Rename a camel case.
<...>
drivers/net/mana/mana.h struct mana_shared_data { · line 199
Quoted 11 lines
drivers/net/mana/mana.h +11
-0+/* NDIS HASH Types */ +#define BIT (nr) (1 << (nr)) +#define NDIS_HASH_IPV4 BIT(0) +#define NDIS_HASH_TCP_IPV4 BIT(1) +#define NDIS_HASH_UDP_IPV4 BIT(2) +#define NDIS_HASH_IPV6 BIT(3) +#define NDIS_HASH_TCP_IPV6 BIT(4) +#define NDIS_HASH_UDP_IPV6 BIT(5) +#define NDIS_HASH_IPV6_EX BIT(6) +#define NDIS_HASH_TCP_IPV6_EX BIT(7) +#define NDIS_HASH_UDP_IPV6_EX BIT(8)
Can use RTE_BIT32/64 instead of defining new macro
RE: [Patch v4 11/17] net/mana: implement the hardware layer operations
Quoted 21 lines
Subject: Re: [Patch v4 11/17] net/mana: implement the hardware layer operations
Quoted 13 lines · On 7/9/2022 12:49 AM, [email protected] wrote:
From: Long Li <[email protected]>
The hardware layer of MANA understands the device queue and doorbell formats. Those functions are implemented for use by packet RX/TX code.
Signed-off-by Long Li <[email protected]>---
Change log:
v2:
Remove unused header files.
Rename a camel case.<...>
Quoted 13 lines
drivers/net/mana/mana.h struct mana_shared_data { · line 199
Quoted 11 lines
drivers/net/mana/mana.h +11
-0+/* NDIS HASH Types */ +#define BIT (nr) (1 << (nr)) +#define NDIS_HASH_IPV4 BIT(0) +#define NDIS_HASH_TCP_IPV4 BIT(1) +#define NDIS_HASH_UDP_IPV4 BIT(2) +#define NDIS_HASH_IPV6 BIT(3) +#define NDIS_HASH_TCP_IPV6 BIT(4) +#define NDIS_HASH_UDP_IPV6 BIT(5) +#define NDIS_HASH_IPV6_EX BIT(6) +#define NDIS_HASH_TCP_IPV6_EX BIT(7) +#define NDIS_HASH_UDP_IPV6_EX BIT(8)Can use RTE_BIT32/64 instead of defining new macro
Will fix this.
PATCH v4 12/17 net/mana: add function to start/stop TX queues
In reply to [email protected]From: Long Li <[email protected]>
MANA allocate device queues through the IB layer when starting TX queues. When device is stopped all the queues are unmapped and freed.
---
Change log:
v2:
Add prefix mana_ to all function names.
Remove unused header files.
doc/guides/nics/features/mana.ini | 1 + drivers/net/mana/mana.h | 4 + drivers/net/mana/meson.build | 1 + drivers/net/mana/tx.c | 157 ++++++++++++++++++++++++++++++ 4 files changed, 163 insertions(+) create mode 100644 drivers/net/mana/tx.c
doc/guides/nics/features/mana.ini +1 -0
@@ -7,6 +7,7 @@ Link status = P Linux = Y Multiprocess aware = Y +Queue start/stop = Y Removal event = Y RSS hash = Y Speed capabilities = P
drivers/net/mana/mana.h +4 -0
@@ -379,6 +379,10 @@ uint16_t mana_tx_burst_removed(void *dpdk_rxq, struct rte_mbuf **pkts,int gdma_poll_completion_queue (struct mana_gdma_queue *cq,struct gdma_comp *comp); +int mana_start_tx_queues (struct rte_eth_dev *dev); + +int mana_stop_tx_queues (struct rte_eth_dev *dev); +struct mana_mr_cache *mana_find_pmd_mr (struct mana_mr_btree *local_tree,struct mana_priv *priv,struct rte_mbuf *mbuf);
drivers/net/mana/meson.build +1 -0
@@ -11,6 +11,7 @@ deps += ['pci', 'bus_pci', 'net', 'eal', 'kvargs'] sources += files( 'mana.c', + 'tx.c', 'mr.c', 'gdma.c', 'mp.c',
drivers/net/mana/tx.c new file +157 -0
157 lines not on this page · raw message
Signature · 1 line
2.17.1
PATCH v4 13/17 net/mana: add function to start/stop RX queues
In reply to [email protected]From: Long Li <[email protected]>
MANA allocates device queues through the IB layer when starting RX queues. When device is stopped all the queues are unmapped and freed.
---
Change log:
v2:
Add prefix mana_ to all function names.
Remove unused header files.
v4:
Move defition "uint32_t i" from inside "for ()" to outside
drivers/net/mana/mana.h | 3 + drivers/net/mana/meson.build | 1 + drivers/net/mana/rx.c | 346 +++++++++++++++++++++++++++++++++++ 3 files changed, 350 insertions(+) create mode 100644 drivers/net/mana/rx.c
drivers/net/mana/mana.h +3 -0
@@ -364,6 +364,7 @@ extern int mana_logtype_init;int mana_ring_doorbell (void *db_page,enum gdma_queue_types queue_type,uint32_t queue_id,uint32_t tail); +int mana_rq_ring_doorbell (struct mana_rxq *rxq); int gdma_post_work_request(struct mana_gdma_queue *queue, struct gdma_work_request *work_req,
@@ -379,8 +380,10 @@ uint16_t mana_tx_burst_removed(void *dpdk_rxq, struct rte_mbuf **pkts,int gdma_poll_completion_queue (struct mana_gdma_queue *cq,struct gdma_comp *comp); +int mana_start_rx_queues (struct rte_eth_dev *dev);int mana_start_tx_queues (struct rte_eth_dev *dev); +int mana_stop_rx_queues (struct rte_eth_dev *dev);int mana_stop_tx_queues (struct rte_eth_dev *dev); struct mana_mr_cache *mana_find_pmd_mr(struct mana_mr_btree *local_tree,
drivers/net/mana/meson.build +1 -0
@@ -11,6 +11,7 @@ deps += ['pci', 'bus_pci', 'net', 'eal', 'kvargs'] sources += files( 'mana.c', + 'rx.c', 'tx.c', 'mr.c', 'gdma.c',
drivers/net/mana/rx.c new file +346 -0
346 lines not on this page · raw message
Signature · 1 line
2.17.1
PATCH v4 14/17 net/mana: add function to receive packets
In reply to [email protected]From: Long Li <[email protected]>
With all the RX queues created, MANA can use those queues to receive packets.
---
Change log:
v2:
Add mana_ to all function names.
Rename a camel case.
doc/guides/nics/features/mana.ini | 2 + drivers/net/mana/mana.c | 2 + drivers/net/mana/mana.h | 37 +++++++++++ drivers/net/mana/mp.c | 2 + drivers/net/mana/rx.c | 104 ++++++++++++++++++++++++++++++ 5 files changed, 147 insertions(+)
doc/guides/nics/features/mana.ini +2 -0
@@ -6,6 +6,8 @@ [Features] Link status = P Linux = Y +L3 checksum offload = Y +L4 checksum offload = Y Multiprocess aware = Y Queue start/stop = Y Removal event = Y
drivers/net/mana/mana.c +2 -0
@@ -950,6 +950,8 @@ static int mana_pci_probe_mac(struct rte_pci_driver *pci_drv __rte_unused,/* fd is no not used after mapping doorbell */ close (fd); + eth_dev->rx_pkt_burst = mana_rx_burst; +rte_spinlock_lock (&mana_shared_data->lock); mana_shared_data->secondary_cnt++; mana_local_data.secondary_cnt++;
drivers/net/mana/mana.h +37 -0
@@ -178,6 +178,11 @@ struct gdma_work_request {enum mana_cqe_type {CQE_INVALID =0 , + +CQE_RX_OKAY =1 , +CQE_RX_COALESCED_4 =2 , +CQE_RX_OBJECT_FENCE =3 , +CQE_RX_TRUNCATED =4 , };struct mana_cqe_header {
@@ -203,6 +208,35 @@ struct mana_cqe_header { (NDIS_HASH_TCP_IPV4 |NDIS_HASH_UDP_IPV4 |NDIS_HASH_TCP_IPV6 | \ NDIS_HASH_UDP_IPV6 | NDIS_HASH_TCP_IPV6_EX | NDIS_HASH_UDP_IPV6_EX) +struct mana_rx_comp_per_packet_info { +uint32_t packet_length :16 ; +uint32_t reserved0 :16 ; +uint32_t reserved1; +uint32_t packet_hash; +};/* HW DATA */ +#define RX_COM_OOB_NUM_PACKETINFO_SEGMENTS 4 + +struct mana_rx_comp_oob { +struct mana_cqe_header cqe_hdr; + +uint32_t rx_vlan_id :12 ; +uint32_t rx_vlan_tag_present :1 ; +uint32_t rx_outer_ip_header_checksum_succeeded :1 ; +uint32_t rx_outer_ip_header_checksum_failed :1 ; +uint32_t reserved :1 ; +uint32_t rx_hash_type :9 ; +uint32_t rx_ip_header_checksum_succeeded :1 ; +uint32_t rx_ip_header_checksum_failed :1 ; +uint32_t rx_tcp_checksum_succeeded :1 ; +uint32_t rx_tcp_checksum_failed :1 ; +uint32_t rx_udp_checksum_succeeded :1 ; +uint32_t rx_udp_checksum_failed :1 ; +uint32_t reserved1 :1 ; +struct mana_rx_comp_per_packet_info + packet_info[RX_COM_OOB_NUM_PACKETINFO_SEGMENTS ]; +uint32_t received_wqe_offset; +};/* HW DATA */ +struct gdma_wqe_dma_oob {uint32_t reserved:24 ;uint32_t last_v_bytes:8 ;
@@ -371,6 +405,9 @@ int gdma_post_work_request(struct mana_gdma_queue *queue, struct gdma_posted_wqe_info *wqe_info);uint8_t *gdma_get_wqe_pointer (struct mana_gdma_queue *queue); +uint16_t mana_rx_burst (void *dpdk_rxq,struct rte_mbuf **rx_pkts, +uint16_t pkts_n); +uint16_t mana_rx_burst_removed (void *dpdk_rxq,struct rte_mbuf **pkts,uint16_t pkts_n);
drivers/net/mana/mp.c +2 -0
@@ -138,6 +138,8 @@ static int mana_mp_secondary_handle(const struct rte_mp_msg *mp_msg,case MANA_MP_REQ_START_RXTX :DRV_LOG (INFO ,"Port %u starting datapath" , dev->data->port_id); + dev->rx_pkt_burst = mana_rx_burst; +rte_mb (); res->result =0 ;
drivers/net/mana/rx.c +104 -0
107 lines not on this page · raw message
Signature · 1 line
2.17.1
PATCH v4 15/17 net/mana: add function to send packets
In reply to [email protected]From: Long Li <[email protected]>
With all the TX queues created, MANA can send packets over those queues.
---
Change log:
v2:
Rename all camel cases.
doc/guides/nics/features/mana.ini | 1 + drivers/net/mana/mana.c | 1 + drivers/net/mana/mana.h | 65 ++++++++ drivers/net/mana/mp.c | 1 + drivers/net/mana/tx.c | 241 ++++++++++++++++++++++++++++++ 5 files changed, 309 insertions(+)
doc/guides/nics/features/mana.ini +1 -0
@@ -4,6 +4,7 @@ ; Refer to default.ini for the full list of available PMD features. ; [Features] +Free Tx mbuf on demand = Y Link status = P Linux = Y L3 checksum offload = Y
drivers/net/mana/mana.c +1 -0
@@ -950,6 +950,7 @@ static int mana_pci_probe_mac(struct rte_pci_driver *pci_drv __rte_unused,/* fd is no not used after mapping doorbell */ close (fd); + eth_dev->tx_pkt_burst = mana_tx_burst; eth_dev->rx_pkt_burst = mana_rx_burst;rte_spinlock_lock (&mana_shared_data->lock);
drivers/net/mana/mana.h +65 -0
89 lines not on this page · raw message
drivers/net/mana/mp.c +1 -0
@@ -138,6 +138,7 @@ static int mana_mp_secondary_handle(const struct rte_mp_msg *mp_msg,case MANA_MP_REQ_START_RXTX :DRV_LOG (INFO ,"Port %u starting datapath" , dev->data->port_id); + dev->tx_pkt_burst = mana_tx_burst; dev->rx_pkt_burst = mana_rx_burst;rte_mb ();
drivers/net/mana/tx.c +241 -0
244 lines not on this page · raw message
Signature · 1 line
2.17.1
Re: [Patch v4 15/17] net/mana: add function to send packets
Quoted 13 lines · On 7/9/2022 12:49 AM, [email protected] wrote:
CAUTION: This message has originated from an External Source. Please use proper judgment and caution when opening attachments, clicking links, or responding to this email.
From: Long Li <[email protected]>
With all the TX queues created, MANA can send packets over those queues.
Signed-off-by Long Li <[email protected]>---
Change log:
v2:
Rename all camel cases.
<...>
drivers/net/mana/tx.c static inline uint16_t get_vsq_frame_num(uint32_t vsq) · line 320
Quoted 7 lines
drivers/net/mana/tx.c +7
-0+ +DRV_LOG (DEBUG ,"pkt[%d]: buf_addr 0x%p, nb_segs %d, pkt_len %d" , + pkt_idx, m_pkt->buf_addr, m_pkt->nb_segs, + m_pkt->pkt_len); + +/* Create SGL for packet data buffers */ +for (uint16_t seg_idx =0 ; seg_idx < m_pkt->nb_segs; seg_idx++) {
This is C99 feature and we tend to not use it BUT,
Thomas, David,
In the past there were c89/c90/ansi code in DPDK, but as far as I can see no more left.
Is there anything that prevents us using C99 features, like variable in the for loop, I think it is usefull that it reduces the scope and makes code more readable, etc...
Re: [Patch v4 15/17] net/mana: add function to send packets
22/08/2022 17:09, Ferruh Yigit:
Quoted 5 lines · On 7/9/2022 12:49 AM, [email protected] wrote:
Quoted 1 line
+ for (
uint16_tseg_idx= 0;seg_idx<m_pkt->nb_segs; seg_idx++) {This is C99 feature and we tend to not use it BUT,
Quoted 8 lines
Thomas, David,
In the past there were c89/c90/ansi code in DPDK, but as far as I can see no more left.
Is there anything that prevents us using C99 features, like variable in the for loop, I think it is usefull that it reduces the scope and makes code more readable, etc...
I agree that variable declaration in the "for" loop is nice. I would be very cautious to test that all compilers used around don't emit a warning. If it passes the tests, I think we can accept and update the coding style documentation to make it officially allowed.
PATCH v4 16/17 net/mana: add function to start/stop device
In reply to [email protected]From: Long Li <[email protected]>
Add support for starting/stopping the device.
---
Change log:
v2:
Use spinlock for memory registration cache.
Add prefix mana_ to all function names.
drivers/net/mana/mana.c | 70 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 70 insertions(+)
drivers/net/mana/mana.c +70 -0
@@ -97,6 +97,74 @@ static int mana_dev_configure(struct rte_eth_dev *dev)static int mana_intr_uninstall (struct mana_priv *priv); +static int +mana_dev_start (struct rte_eth_dev *dev) +{ +int ret; +struct mana_priv *priv = dev->data->dev_private; + +rte_spinlock_init (&priv->mr_btree_lock); + ret =mana_mr_btree_init (&priv->mr_btree,MANA_MR_BTREE_CACHE_N , + dev->device->numa_node); +if (ret) { +DRV_LOG (ERR ,"Failed to init device MR btree %d" , ret); +return ret; + } + + ret =mana_start_tx_queues (dev); +if (ret) { +DRV_LOG (ERR ,"failed to start tx queues %d" , ret); +return ret; + } + + ret =mana_start_rx_queues (dev); +if (ret) { +DRV_LOG (ERR ,"failed to start rx queues %d" , ret); +mana_stop_tx_queues (dev); +return ret; + } + +rte_wmb (); + + dev->tx_pkt_burst = mana_tx_burst; + dev->rx_pkt_burst = mana_rx_burst; + +DRV_LOG (INFO ,"TX/RX queues have started" ); + +/* Enable datapath for secondary processes */ +mana_mp_req_on_rxtx (dev,MANA_MP_REQ_START_RXTX ); + +return 0 ; +} + +static int +mana_dev_stop(struct rte_eth_dev *dev __rte_unused) +{ +int ret; + + dev->tx_pkt_burst = mana_tx_burst_removed; + dev->rx_pkt_burst = mana_rx_burst_removed; + +/* Stop datapath on secondary processes */ +mana_mp_req_on_rxtx (dev,MANA_MP_REQ_STOP_RXTX ); + +rte_wmb (); + + ret =mana_stop_tx_queues (dev); +if (ret) { +DRV_LOG (ERR ,"failed to stop tx queues" ); +return ret; + } + + ret =mana_stop_rx_queues (dev); +if (ret) { +DRV_LOG (ERR ,"failed to stop tx queues" ); +return ret; + } + +return 0 ; +} +static int mana_dev_close (struct rte_eth_dev *dev) {
@@ -435,6 +503,8 @@ static int mana_dev_link_update(struct rte_eth_dev *dev,const struct eth_dev_ops mana_dev_ops = { .dev_configure = mana_dev_configure, + .dev_start = mana_dev_start, + .dev_stop = mana_dev_stop, .dev_close = mana_dev_close, .dev_infos_get = mana_dev_info_get, .txq_info_get = mana_dev_tx_queue_info,
Signature · 1 line
2.17.1
PATCH v4 17/17 net/mana: add function to report queue stats
In reply to [email protected]From: Long Li <[email protected]>
Report packet statistics.
--- doc/guides/nics/features/mana.ini | 2 + drivers/net/mana/mana.c | 77 +++++++++++++++++++++++++++++++ 2 files changed, 79 insertions(+)
doc/guides/nics/features/mana.ini +2 -0
@@ -4,6 +4,7 @@ ; Refer to default.ini for the full list of available PMD features. ; [Features] +Basic stats = Y Free Tx mbuf on demand = Y Link status = P Linux = Y
@@ -14,5 +15,6 @@ Queue start/stop = Y Removal event = Y RSS hash = Y Speed capabilities = P +Stats per queue = Y Usage doc = Y x86-64 = Y
drivers/net/mana/mana.c +77 -0
92 lines not on this page · raw message
Signature · 1 line
2.17.1
Re: [Patch v4 17/17] net/mana: add function to report queue stats
Quoted 8 lines · On 7/9/2022 12:49 AM, [email protected] wrote:
CAUTION: This message has originated from an External Source. Please use proper judgment and caution when opening attachments, clicking links, or responding to this email.
From: Long Li <[email protected]>
Report packet statistics.
Signed-off-by Long Li <[email protected]>
<...>
Quoted 4 lines
drivers/net/mana/mana.c +4
-0+static int mana_dev_stats_get (struct rte_eth_dev *dev, +struct rte_eth_stats *stats) +{ +unsigned int i;
drivers/net/mana/mana.c static int mana_dev_link_update(struct rte_eth_dev *dev, · line 517
Quoted 10 lines
drivers/net/mana/mana.c +10
-0+ +for (i =0 ; i < dev->data->nb_tx_queues; i++) { +struct mana_txq *txq = dev->data->tx_queues[i]; + +if (!txq) +continue ; + + stats->opackets = txq->stats.packets; + stats->obytes = txq->stats.bytes; + stats->oerrors = txq->stats.errors;
Shouldn't these be "+=" ? Same for below Rx block.
RE: [Patch v4 17/17] net/mana: add function to report queue stats
Quoted 16 lines
Subject: Re: [Patch v4 17/17] net/mana: add function to report queue stats
Quoted 1 line · On 7/9/2022 12:49 AM, [email protected] wrote:
CAUTION: This message has originated from an External Source. Please use
proper judgment and caution when opening attachments, clicking links, or responding to this email.
Quoted 7 lines
From: Long Li <[email protected]>
Report packet statistics.
Signed-off-by Long Li <[email protected]><...>
Quoted 16 lines
drivers/net/mana/mana.c static int mana_dev_link_update(struct rte_eth_dev *dev, · line 517
Quoted 13 lines
drivers/net/mana/mana.c +13
-0+static int mana_dev_stats_get (struct rte_eth_dev *dev, +struct rte_eth_stats *stats) { +unsigned int i; + +for (i =0 ; i < dev->data->nb_tx_queues; i++) { +struct mana_txq *txq = dev->data->tx_queues[i]; + +if (!txq) +continue ; + + stats->opackets = txq->stats.packets; + stats->obytes = txq->stats.bytes; + stats->oerrors = txq->stats.errors;Shouldn't these be "+=" ? Same for below Rx block.
Thank you. I will fix those.
Quoted 7 lines · On 7/9/2022 12:49 AM, [email protected] wrote:
From: Long Li <[email protected]>
MANA is a network interface card to be used in the Azure cloud environment. MANA provides safe access to user memory through memory registration. It has IOMMU built into the hardware.
Quoted 9 lines
MANA uses IB verbs and RDMA layer to configure hardware resources. It requires the corresponding RDMA kernel-mode and user-mode drivers.
The MANA RDMA kernel-mode driver is being reviewed at:
https://patchwork.kernel.org/project/netdevbpf/cover/[email protected]/The MANA RDMA user-mode driver is being reviewed at:
https://github.com/linux-rdma/rdma-core/pull/1177
Hi Long,
How are the dependencies are progressing? Is there anything blocker for DPDK upstream?
Quoted 19 lines
Long Li (17):
net/mana: add basic driver, build environment and doc net/mana: add device configuration and stop net/mana: add function to report support ptypes net/mana: add link update
net/mana: add function for device removal interrupts net/mana: add device info
net/mana: add function to configure RSS net/mana: add function to configure RX queues net/mana: add function to configure TX queues net/mana: implement memory registration net/mana: implement the hardware layer operations net/mana: add function to start/stop TX queues net/mana: add function to start/stop RX queues net/mana: add function to receive packets net/mana: add function to send packets net/mana: add function to start/stop device net/mana: add function to report queue stats
<...>
Quoted 54 lines
Subject: Re: [Patch v4 00/17] Introduce Microsoft Azure Network Adatper (MANA) PMD
Quoted 4 lines · On 7/9/2022 12:49 AM, [email protected] wrote:
From: Long Li <[email protected]>
MANA is a network interface card to be used in the Azure cloud
environment.
Quoted 8 lines
MANA provides safe access to user memory through memory registration. It has IOMMU built into the hardware.
MANA uses IB verbs and RDMA layer to configure hardware resources. It requires the corresponding RDMA kernel-mode and user-mode drivers.
The MANA RDMA kernel-mode driver is being reviewed at:
https://nam06.safelinks.protection.outlook.com/?url=https%3A%2F%2Fpatc
Quoted 1 line
hwork.kernel.org%2Fproject%2Fnetdevbpf%2Fcover%2F1655345240-
26411-1-gi
Quoted 1 line
t-send-email-
longli%40linuxonhyperv.com%2F&data=05%7C01%7Clongli%4
Quoted 1 line
0microsoft.com%7C232a4a7af70f490b94f608da844ee782%7C72f988bf86f141a f91
Quoted 1 line
ab2d7cd011db47%7C1%7C0%7C637967771686870922%7CUnknown%7CTWFp bGZsb3d8ey
Quoted 1 line
JWIjoiMC4wLjAwMDAiLCJQIjoiV2luMzIiLCJBTiI6Ik1haWwiLCJXVCI6Mn0%3D% 7C300
Quoted 1 line
0%7C%7C%7C&sdata=bC7l7wxfU5sbahBye8CKVS%2BJvirO%2FvIMU3M oS4%2Fdpc8
Quoted 4 lines
%3D&reserved=0
The MANA RDMA user-mode driver is being reviewed at:
https://nam06.safelinks.protection.outlook.com/?url=https%3A%2F%2Fgith
Quoted 1 line
ub.com%2Flinux-rdma%2Frdma-
core%2Fpull%2F1177&data=05%7C01%7Clongl
Quoted 1 line
i%40microsoft.com%7C232a4a7af70f490b94f608da844ee782%7C72f988bf86f1 41a
Quoted 1 line
f91ab2d7cd011db47%7C1%7C0%7C637967771686870922%7CUnknown%7CT WFpbGZsb3d
Quoted 1 line
8eyJWIjoiMC4wLjAwMDAiLCJQIjoiV2luMzIiLCJBTiI6Ik1haWwiLCJXVCI6Mn0% 3D%7C
Quoted 1 line
3000%7C%7C%7C&sdata=DLGg1q1N3%2FNtr7ii3WI2rqShPNoi2u0MF8J8 Cn1h60s%
Quoted 7 lines
Quoted 2 lines
3D&reserved=0
Hi Long,
How are the dependencies are progressing? Is there anything blocker for DPDK upstream?
Hi Ferruh,
The kernel and rdma-core user-mode patch submissions are in progress. They are currently at v4.
Long
Quoted 23 lines
Quoted 21 lines
Long Li (17):
net/mana: add basic driver, build environment and doc net/mana: add device configuration and stop net/mana: add function to report support ptypes net/mana: add link update
net/mana: add function for device removal interrupts net/mana: add device info
net/mana: add function to configure RSS net/mana: add function to configure RX queues net/mana: add function to configure TX queues net/mana: implement memory registration net/mana: implement the hardware layer operations net/mana: add function to start/stop TX queues net/mana: add function to start/stop RX queues net/mana: add function to receive packets net/mana: add function to send packets net/mana: add function to start/stop device net/mana: add function to report queue stats<...>