patches for DPDK stable branches
 help / color / mirror / Atom feed
From: Aaron Conole <aconole@redhat.com>
To: John Daley <johndale@cisco.com>
Cc: ferruh.yigit@intel.com,  dev@dpdk.org,  stable@dpdk.org
Subject: Re: [dpdk-stable] [dpdk-dev] [PATCH] net/enic: fix multi-process operation
Date: Tue, 12 Sep 2017 09:53:11 -0400	[thread overview]
Message-ID: <f7tshfsyqew.fsf@dhcp-25-97.bos.redhat.com> (raw)
In-Reply-To: <20170911185833.11458-1-johndale@cisco.com> (John Daley's message of "Mon, 11 Sep 2017 11:58:33 -0700")

John Daley <johndale@cisco.com> writes:

> - Use rte_malloc() instead of malloc() for the per device 'vdev' structure
>   so that it can be shared across processes.
> - Only initialize the device if the process type is RTE_PROC_PRIMARY
> - Only allow the primary process to do queue setup, start/stop, promisc
>   allmulticast, mac add/del, mtu.
>
> Fixes: fefed3d1e62c ("enic: new driver")
> Cc: stable@dpdk.org
>
> Signed-off-by: John Daley <johndale@cisco.com>
> ---

I was first considering that this should be multiple patches, but then I
realized that it wouldn't actually make sense (there's no way to do it
and keep the driver from being broken w.r.t. primary/secondary).

Reviewed-by: Aaron Conole <aconole@redhat.com>

>  doc/guides/nics/features/enic.ini |  1 +
>  drivers/net/enic/base/vnic_dev.c  | 10 +++++++--
>  drivers/net/enic/enic_ethdev.c    | 43 +++++++++++++++++++++++++++++++++++++++
>  drivers/net/enic/enic_main.c      |  7 +++++++
>  4 files changed, 59 insertions(+), 2 deletions(-)
>
> diff --git a/doc/guides/nics/features/enic.ini b/doc/guides/nics/features/enic.ini
> index 0de3ef53c..498341f07 100644
> --- a/doc/guides/nics/features/enic.ini
> +++ b/doc/guides/nics/features/enic.ini
> @@ -25,6 +25,7 @@ L3 checksum offload  = Y
>  L4 checksum offload  = Y
>  Packet type parsing  = Y
>  Basic stats          = Y
> +Multiprocess aware   = Y
>  BSD nic_uio          = Y
>  Linux UIO            = Y
>  Linux VFIO           = Y
> diff --git a/drivers/net/enic/base/vnic_dev.c b/drivers/net/enic/base/vnic_dev.c
> index 49b36555b..162e9c2f2 100644
> --- a/drivers/net/enic/base/vnic_dev.c
> +++ b/drivers/net/enic/base/vnic_dev.c
> @@ -1063,7 +1063,7 @@ void vnic_dev_unregister(struct vnic_dev *vdev)
>  			vdev->free_consistent(vdev->priv,
>  				sizeof(struct vnic_devcmd_fw_info),
>  				vdev->fw_info, vdev->fw_info_pa);
> -		kfree(vdev);
> +		rte_free(vdev);
>  	}
>  }
>  
> @@ -1072,7 +1072,13 @@ struct vnic_dev *vnic_dev_register(struct vnic_dev *vdev,
>  	unsigned int num_bars)
>  {
>  	if (!vdev) {
> -		vdev = kzalloc(sizeof(struct vnic_dev), GFP_ATOMIC);
> +		char name[NAME_MAX];
> +		snprintf((char *)name, sizeof(name), "%s-vnic",
> +			  pdev->device.name);
> +		vdev = (struct vnic_dev *)rte_zmalloc_socket(name,
> +					sizeof(struct vnic_dev),
> +					RTE_CACHE_LINE_SIZE,
> +					pdev->device.numa_node);
>  		if (!vdev)
>  			return NULL;
>  	}
> diff --git a/drivers/net/enic/enic_ethdev.c b/drivers/net/enic/enic_ethdev.c
> index da8fec2d0..33a3f87e2 100644
> --- a/drivers/net/enic/enic_ethdev.c
> +++ b/drivers/net/enic/enic_ethdev.c
> @@ -142,6 +142,10 @@ enicpmd_dev_filter_ctrl(struct rte_eth_dev *dev,
>  static void enicpmd_dev_tx_queue_release(void *txq)
>  {
>  	ENICPMD_FUNC_TRACE();
> +
> +	if (rte_eal_process_type() != RTE_PROC_PRIMARY)
> +		return;
> +
>  	enic_free_wq(txq);
>  }
>  
> @@ -196,6 +200,9 @@ static int enicpmd_dev_tx_queue_setup(struct rte_eth_dev *eth_dev,
>  	int ret;
>  	struct enic *enic = pmd_priv(eth_dev);
>  
> +	if (rte_eal_process_type() != RTE_PROC_PRIMARY)
> +		return -E_RTE_SECONDARY;
> +
>  	ENICPMD_FUNC_TRACE();
>  	if (queue_idx >= ENIC_WQ_MAX) {
>  		dev_err(enic,
> @@ -272,6 +279,10 @@ static int enicpmd_dev_rx_queue_stop(struct rte_eth_dev *eth_dev,
>  static void enicpmd_dev_rx_queue_release(void *rxq)
>  {
>  	ENICPMD_FUNC_TRACE();
> +
> +	if (rte_eal_process_type() != RTE_PROC_PRIMARY)
> +		return;
> +
>  	enic_free_rq(rxq);
>  }
>  
> @@ -310,6 +321,10 @@ static int enicpmd_dev_rx_queue_setup(struct rte_eth_dev *eth_dev,
>  	struct enic *enic = pmd_priv(eth_dev);
>  
>  	ENICPMD_FUNC_TRACE();
> +
> +	if (rte_eal_process_type() != RTE_PROC_PRIMARY)
> +		return -E_RTE_SECONDARY;
> +
>  	/* With Rx scatter support, two RQs are now used on VIC per RQ used
>  	 * by the application.
>  	 */
> @@ -378,6 +393,9 @@ static int enicpmd_dev_configure(struct rte_eth_dev *eth_dev)
>  	int ret;
>  	struct enic *enic = pmd_priv(eth_dev);
>  
> +	if (rte_eal_process_type() != RTE_PROC_PRIMARY)
> +		return -E_RTE_SECONDARY;
> +
>  	ENICPMD_FUNC_TRACE();
>  	ret = enic_set_vnic_res(enic);
>  	if (ret) {
> @@ -404,6 +422,9 @@ static int enicpmd_dev_start(struct rte_eth_dev *eth_dev)
>  {
>  	struct enic *enic = pmd_priv(eth_dev);
>  
> +	if (rte_eal_process_type() != RTE_PROC_PRIMARY)
> +		return -E_RTE_SECONDARY;
> +
>  	ENICPMD_FUNC_TRACE();
>  	return enic_enable(enic);
>  }
> @@ -416,6 +437,9 @@ static void enicpmd_dev_stop(struct rte_eth_dev *eth_dev)
>  	struct rte_eth_link link;
>  	struct enic *enic = pmd_priv(eth_dev);
>  
> +	if (rte_eal_process_type() != RTE_PROC_PRIMARY)
> +		return;
> +
>  	ENICPMD_FUNC_TRACE();
>  	enic_disable(enic);
>  	memset(&link, 0, sizeof(link));
> @@ -513,7 +537,11 @@ static void enicpmd_dev_promiscuous_enable(struct rte_eth_dev *eth_dev)
>  {
>  	struct enic *enic = pmd_priv(eth_dev);
>  
> +	if (rte_eal_process_type() != RTE_PROC_PRIMARY)
> +		return;
> +
>  	ENICPMD_FUNC_TRACE();
> +
>  	enic->promisc = 1;
>  	enic_add_packet_filter(enic);
>  }
> @@ -522,6 +550,9 @@ static void enicpmd_dev_promiscuous_disable(struct rte_eth_dev *eth_dev)
>  {
>  	struct enic *enic = pmd_priv(eth_dev);
>  
> +	if (rte_eal_process_type() != RTE_PROC_PRIMARY)
> +		return;
> +
>  	ENICPMD_FUNC_TRACE();
>  	enic->promisc = 0;
>  	enic_add_packet_filter(enic);
> @@ -531,6 +562,9 @@ static void enicpmd_dev_allmulticast_enable(struct rte_eth_dev *eth_dev)
>  {
>  	struct enic *enic = pmd_priv(eth_dev);
>  
> +	if (rte_eal_process_type() != RTE_PROC_PRIMARY)
> +		return;
> +
>  	ENICPMD_FUNC_TRACE();
>  	enic->allmulti = 1;
>  	enic_add_packet_filter(enic);
> @@ -540,6 +574,9 @@ static void enicpmd_dev_allmulticast_disable(struct rte_eth_dev *eth_dev)
>  {
>  	struct enic *enic = pmd_priv(eth_dev);
>  
> +	if (rte_eal_process_type() != RTE_PROC_PRIMARY)
> +		return;
> +
>  	ENICPMD_FUNC_TRACE();
>  	enic->allmulti = 0;
>  	enic_add_packet_filter(enic);
> @@ -551,6 +588,9 @@ static int enicpmd_add_mac_addr(struct rte_eth_dev *eth_dev,
>  {
>  	struct enic *enic = pmd_priv(eth_dev);
>  
> +	if (rte_eal_process_type() != RTE_PROC_PRIMARY)
> +		return -E_RTE_SECONDARY;
> +
>  	ENICPMD_FUNC_TRACE();
>  	return enic_set_mac_address(enic, mac_addr->addr_bytes);
>  }
> @@ -559,6 +599,9 @@ static void enicpmd_remove_mac_addr(struct rte_eth_dev *eth_dev, uint32_t index)
>  {
>  	struct enic *enic = pmd_priv(eth_dev);
>  
> +	if (rte_eal_process_type() != RTE_PROC_PRIMARY)
> +		return;
> +
>  	ENICPMD_FUNC_TRACE();
>  	enic_del_mac_address(enic, index);
>  }
> diff --git a/drivers/net/enic/enic_main.c b/drivers/net/enic/enic_main.c
> index 1d956cd94..9b0439b96 100644
> --- a/drivers/net/enic/enic_main.c
> +++ b/drivers/net/enic/enic_main.c
> @@ -1181,6 +1181,9 @@ int enic_set_mtu(struct enic *enic, uint16_t new_mtu)
>  	old_mtu = eth_dev->data->mtu;
>  	config_mtu = enic->config.mtu;
>  
> +	if (rte_eal_process_type() != RTE_PROC_PRIMARY)
> +		return -E_RTE_SECONDARY;
> +
>  	if (new_mtu > enic->max_mtu) {
>  		dev_err(enic,
>  			"MTU not updated: requested (%u) greater than max (%u)\n",
> @@ -1332,6 +1335,10 @@ int enic_probe(struct enic *enic)
>  
>  	dev_debug(enic, " Initializing ENIC PMD\n");
>  
> +	/* if this is a secondary process the hardware is already initialized */
> +	if (rte_eal_process_type() != RTE_PROC_PRIMARY)
> +		return 0;
> +
>  	enic->bar0.vaddr = (void *)pdev->mem_resource[0].addr;
>  	enic->bar0.len = pdev->mem_resource[0].len;

  reply	other threads:[~2017-09-12 13:53 UTC|newest]

Thread overview: 4+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2017-09-11 18:58 [dpdk-stable] " John Daley
2017-09-12 13:53 ` Aaron Conole [this message]
2017-09-18 21:27 ` Ferruh Yigit
2017-09-22 16:50 ` Ferruh Yigit

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=f7tshfsyqew.fsf@dhcp-25-97.bos.redhat.com \
    --to=aconole@redhat.com \
    --cc=dev@dpdk.org \
    --cc=ferruh.yigit@intel.com \
    --cc=johndale@cisco.com \
    --cc=stable@dpdk.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).