All of lore.kernel.org
 help / color / mirror / Atom feed
From: Jakub Kicinski <kuba@kernel.org>
To: David Wei <dw@davidwei.uk>
Cc: Jiri Pirko <jiri@resnulli.us>,
	Sabrina Dubroca <sd@queasysnail.net>,
	netdev@vger.kernel.org, "David S. Miller" <davem@davemloft.net>,
	Eric Dumazet <edumazet@google.com>,
	Paolo Abeni <pabeni@redhat.com>
Subject: Re: [PATCH net-next v6 1/4] netdevsim: allow two netdevsim ports to be connected
Date: Thu, 25 Jan 2024 18:24:03 -0800	[thread overview]
Message-ID: <20240125182403.13c4475b@kernel.org> (raw)
In-Reply-To: <20240126012357.535494-2-dw@davidwei.uk>

On Thu, 25 Jan 2024 17:23:54 -0800 David Wei wrote:
> diff --git a/drivers/net/netdevsim/bus.c b/drivers/net/netdevsim/bus.c
> index bcbc1e19edde..be8ac2e60c69 100644
> --- a/drivers/net/netdevsim/bus.c
> +++ b/drivers/net/netdevsim/bus.c
> @@ -232,9 +232,81 @@ del_device_store(const struct bus_type *bus, const char *buf, size_t count)
>  }
>  static BUS_ATTR_WO(del_device);
>  
> +static ssize_t link_device_store(const struct bus_type *bus, const char *buf, size_t count)
> +{
> +	unsigned int netnsid_a, netnsid_b, ifidx_a, ifidx_b;
> +	struct netdevsim *nsim_a, *nsim_b;
> +	struct net_device *dev_a, *dev_b;
> +	struct net *ns_a, *ns_b;
> +	int err;
> +
> +	err = sscanf(buf, "%u %u %u %u", &netnsid_a, &ifidx_a, &netnsid_b, &ifidx_b);

I'd go for "%u:%u %u:%u" to make the 'grouping' of netns and ifindex
more obvious. But no strong feelings.

> +	if (err != 4) {
> +		pr_err("Format for linking two devices is \"netnsid_a ifidx_a netnsid_b ifidx_b\" (uint uint unit uint).\n");
> +		return -EINVAL;
> +	}
> +
> +	err = -EINVAL;
> +	rtnl_lock();
> +	ns_a = get_net_ns_by_id(current->nsproxy->net_ns, netnsid_a);
> +	if (!ns_a) {
> +		pr_err("Could not find netns with id: %d\n", netnsid_a);
> +		goto out_unlock_rtnl;
> +	}
> +
> +	dev_a = dev_get_by_index(ns_a, ifidx_a);

since you're under rtnl_lock you can use __get_device_by_index(),
it doesn't increase the refcount so you won't have to worry about
releasing it.

> +	if (!dev_a) {
> +		pr_err("Could not find device with ifindex %d in netnsid %d\n", ifidx_a, netnsid_a);
> +		goto out_put_netns_a;
> +	}
> +
> +	if (!netdev_is_nsim(dev_a)) {
> +		pr_err("Device with ifindex %d in netnsid %d is not a netdevsim\n", ifidx_a, netnsid_a);
> +		goto out_put_dev_a;
> +	}
> +
> +	ns_b = get_net_ns_by_id(current->nsproxy->net_ns, netnsid_b);
> +	if (!ns_b) {
> +		pr_err("Could not find netns with id: %d\n", netnsid_b);
> +		goto out_put_dev_a;
> +	}
> +
> +	dev_b = dev_get_by_index(ns_b, ifidx_b);
> +	if (!dev_b) {
> +		pr_err("Could not find device with ifindex %d in netnsid %d\n", ifidx_b, netnsid_b);
> +		goto out_put_netns_b;
> +	}
> +
> +	if (!netdev_is_nsim(dev_b)) {
> +		pr_err("Device with ifindex %d in netnsid %d is not a netdevsim\n", ifidx_b, netnsid_b);
> +		goto out_put_dev_b;
> +	}
> +
> +	err = 0;
> +	nsim_a = netdev_priv(dev_a);
> +	nsim_b = netdev_priv(dev_b);
> +	rcu_assign_pointer(nsim_a->peer, nsim_b);
> +	rcu_assign_pointer(nsim_b->peer, nsim_a);

Shouldn't we check if peer is NULL? Otherwise we can get into weird
situations where we link A<>B then B<>C and then the pointers look like
this A->B<>C. When B gets freed A's pointer won't get cleared.

> +out_put_dev_b:
> +	dev_put(dev_b);
> +out_put_netns_b:
> +	put_net(ns_b);
> +out_put_dev_a:
> +	dev_put(dev_a);
> +out_put_netns_a:
> +	put_net(ns_a);
> +out_unlock_rtnl:
> +	rtnl_unlock();
> +
> +	return !err ? count : err;
> +}
> +static BUS_ATTR_WO(link_device);

  reply	other threads:[~2024-01-26  2:24 UTC|newest]

Thread overview: 10+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2024-01-26  1:23 [PATCH net-next v6 0/4] netdevsim: link and forward skbs between ports David Wei
2024-01-26  1:23 ` [PATCH net-next v6 1/4] netdevsim: allow two netdevsim ports to be connected David Wei
2024-01-26  2:24   ` Jakub Kicinski [this message]
2024-01-26 18:54     ` David Wei
2024-01-26 19:17       ` Jakub Kicinski
2024-01-26  1:23 ` [PATCH net-next v6 2/4] netdevsim: forward skbs from one connected port to another David Wei
2024-01-26  2:26   ` Jakub Kicinski
2024-01-26 18:55     ` David Wei
2024-01-26  1:23 ` [PATCH net-next v6 3/4] netdevsim: add selftest for forwarding skb between connected ports David Wei
2024-01-26  1:23 ` [PATCH net-next v6 4/4] netdevsim: add Makefile for selftests David Wei

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=20240125182403.13c4475b@kernel.org \
    --to=kuba@kernel.org \
    --cc=davem@davemloft.net \
    --cc=dw@davidwei.uk \
    --cc=edumazet@google.com \
    --cc=jiri@resnulli.us \
    --cc=netdev@vger.kernel.org \
    --cc=pabeni@redhat.com \
    --cc=sd@queasysnail.net \
    /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.