All of lore.kernel.org
 help / color / mirror / Atom feed
From: Zhu Yanjun <yanjun.zhu@linux.dev>
To: Konstantin Taranov <kotaranov@linux.microsoft.com>,
	kotaranov@microsoft.com, pabeni@redhat.com,
	haiyangz@microsoft.com, kys@microsoft.com, edumazet@google.com,
	kuba@kernel.org, davem@davemloft.net, decui@microsoft.com,
	wei.liu@kernel.org, sharmaajay@microsoft.com,
	longli@microsoft.com, jgg@ziepe.ca, leon@kernel.org
Cc: linux-rdma@vger.kernel.org, linux-kernel@vger.kernel.org,
	netdev@vger.kernel.org
Subject: Re: [PATCH rdma-next v3 1/1] RDMA/mana_ib: Set correct device into ib
Date: Sat, 13 Jul 2024 06:41:35 +0200	[thread overview]
Message-ID: <5818dd90-edf5-4480-be94-15aea66c2359@linux.dev> (raw)
In-Reply-To: <1720705077-322-1-git-send-email-kotaranov@linux.microsoft.com>

在 2024/7/11 15:37, Konstantin Taranov 写道:
> From: Konstantin Taranov <kotaranov@microsoft.com>
> 
> Add mana_get_primary_netdev_rcu helper to get a primary
> netdevice for a given port. When mana is used with
> netvsc, the VF netdev is controlled by an upper netvsc
> device. In a baremetal case, the VF netdev is the
> primary device.
> 
> Use the mana_get_primary_netdev_rcu() helper in the mana_ib
> to get the correct device for querying network states.
> 
> Fixes: 8b184e4f1c32 ("RDMA/mana_ib: Enable RoCE on port 1")
> Signed-off-by: Konstantin Taranov <kotaranov@microsoft.com>
> ---
> I would appreciate if I could get Acks on it from:
> * netvsc maintainers (e.g., Haiyang)
> * net maintainers (e.g., Jakub, David, Eric, Paolo)
> 
> v1->v2:
> Leon Romanovsky asked to make a helper in the net/mana and get
> acks from net maintainers.
> v2->v3:
> Added warn on rcu lock not held.
> Use the word "primary" instead of "master"
> Merged two commits into one and submitted to rdma-next
> 
>   drivers/infiniband/hw/mana/device.c           | 16 ++++++++--------
>   drivers/net/ethernet/microsoft/mana/mana_en.c | 19 +++++++++++++++++++
>   include/net/mana/mana.h                       |  2 ++
>   3 files changed, 29 insertions(+), 8 deletions(-)
> 
> diff --git a/drivers/infiniband/hw/mana/device.c b/drivers/infiniband/hw/mana/device.c
> index b07a8e2e838f..7ac01918ef7c 100644
> --- a/drivers/infiniband/hw/mana/device.c
> +++ b/drivers/infiniband/hw/mana/device.c
> @@ -56,7 +56,7 @@ static int mana_ib_probe(struct auxiliary_device *adev,
>   {
>   	struct mana_adev *madev = container_of(adev, struct mana_adev, adev);
>   	struct gdma_dev *mdev = madev->mdev;
> -	struct net_device *upper_ndev;
> +	struct net_device *ndev;
>   	struct mana_context *mc;
>   	struct mana_ib_dev *dev;
>   	u8 mac_addr[ETH_ALEN];
> @@ -84,17 +84,17 @@ static int mana_ib_probe(struct auxiliary_device *adev,
>   	dev->ib_dev.num_comp_vectors = mdev->gdma_context->max_num_queues;
>   	dev->ib_dev.dev.parent = mdev->gdma_context->dev;
>   
> -	rcu_read_lock(); /* required to get upper dev */
> -	upper_ndev = netdev_master_upper_dev_get_rcu(mc->ports[0]);
> -	if (!upper_ndev) {
> +	rcu_read_lock(); /* required to get primary netdev */
> +	ndev = mana_get_primary_netdev_rcu(mc, 0);
> +	if (!ndev) {
>   		rcu_read_unlock();
>   		ret = -ENODEV;
> -		ibdev_err(&dev->ib_dev, "Failed to get master netdev");
> +		ibdev_err(&dev->ib_dev, "Failed to get netdev for IB port 1");
>   		goto free_ib_device;
>   	}
> -	ether_addr_copy(mac_addr, upper_ndev->dev_addr);
> -	addrconf_addr_eui48((u8 *)&dev->ib_dev.node_guid, upper_ndev->dev_addr);
> -	ret = ib_device_set_netdev(&dev->ib_dev, upper_ndev, 1);
> +	ether_addr_copy(mac_addr, ndev->dev_addr);
> +	addrconf_addr_eui48((u8 *)&dev->ib_dev.node_guid, ndev->dev_addr);
> +	ret = ib_device_set_netdev(&dev->ib_dev, ndev, 1);
>   	rcu_read_unlock();
>   	if (ret) {
>   		ibdev_err(&dev->ib_dev, "Failed to set ib netdev, ret %d", ret);
> diff --git a/drivers/net/ethernet/microsoft/mana/mana_en.c b/drivers/net/ethernet/microsoft/mana/mana_en.c
> index b89ad4afd66e..68c2bea2c022 100644
> --- a/drivers/net/ethernet/microsoft/mana/mana_en.c
> +++ b/drivers/net/ethernet/microsoft/mana/mana_en.c
> @@ -3007,3 +3007,22 @@ void mana_remove(struct gdma_dev *gd, bool suspending)
>   	gd->gdma_context = NULL;
>   	kfree(ac);
>   }
> +
> +struct net_device *mana_get_primary_netdev_rcu(struct mana_context *ac, u32 port_index)
> +{
> +	struct net_device *ndev;
> +
> +	RCU_LOCKDEP_WARN(!rcu_read_lock_held(),
> +			 "Taking primary netdev without holding the RCU read lock");

Thanks a lot.
Reviewed-by: Zhu Yanjun <yanjun.zhu@linux.dev>

Zhu Yanjun

> +	if (port_index >= ac->num_ports)
> +		return NULL;
> +
> +	/* When mana is used in netvsc, the upper netdevice should be returned. */
> +	if (ac->ports[port_index]->flags & IFF_SLAVE)
> +		ndev = netdev_master_upper_dev_get_rcu(ac->ports[port_index]);
> +	else
> +		ndev = ac->ports[port_index];
> +
> +	return ndev;
> +}
> +EXPORT_SYMBOL_NS(mana_get_primary_netdev_rcu, NET_MANA);
> diff --git a/include/net/mana/mana.h b/include/net/mana/mana.h
> index 59823901b74f..f9b4b0dcb69f 100644
> --- a/include/net/mana/mana.h
> +++ b/include/net/mana/mana.h
> @@ -797,4 +797,6 @@ void mana_destroy_wq_obj(struct mana_port_context *apc, u32 wq_type,
>   int mana_cfg_vport(struct mana_port_context *apc, u32 protection_dom_id,
>   		   u32 doorbell_pg_id);
>   void mana_uncfg_vport(struct mana_port_context *apc);
> +
> +struct net_device *mana_get_primary_netdev_rcu(struct mana_context *ac, u32 port_index);
>   #endif /* _MANA_H */


  parent reply	other threads:[~2024-07-13  4:41 UTC|newest]

Thread overview: 4+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2024-07-11 13:37 [PATCH rdma-next v3 1/1] RDMA/mana_ib: Set correct device into ib Konstantin Taranov
2024-07-12 23:18 ` Long Li
2024-07-13  4:41 ` Zhu Yanjun [this message]
2024-07-14  7:50 ` Leon Romanovsky

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=5818dd90-edf5-4480-be94-15aea66c2359@linux.dev \
    --to=yanjun.zhu@linux.dev \
    --cc=davem@davemloft.net \
    --cc=decui@microsoft.com \
    --cc=edumazet@google.com \
    --cc=haiyangz@microsoft.com \
    --cc=jgg@ziepe.ca \
    --cc=kotaranov@linux.microsoft.com \
    --cc=kotaranov@microsoft.com \
    --cc=kuba@kernel.org \
    --cc=kys@microsoft.com \
    --cc=leon@kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-rdma@vger.kernel.org \
    --cc=longli@microsoft.com \
    --cc=netdev@vger.kernel.org \
    --cc=pabeni@redhat.com \
    --cc=sharmaajay@microsoft.com \
    --cc=wei.liu@kernel.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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.