From: "Michael S. Tsirkin" <mst@redhat.com>
To: Jason Wang <jasowang@redhat.com>
Cc: netdev@vger.kernel.org, YueHaibing <yuehaibing@huawei.com>,
Cong Wang <xiyou.wangcong@gmail.com>,
"weiyongjun (A)" <weiyongjun1@huawei.com>,
Eric Dumazet <eric.dumazet@gmail.com>
Subject: Re: [PATCH net V2] tuntap: synchronize through tfiles array instead of tun->numqueues
Date: Wed, 8 May 2019 00:16:11 -0400 [thread overview]
Message-ID: <20190508001518-mutt-send-email-mst@kernel.org> (raw)
In-Reply-To: <1557201816-19945-1-git-send-email-jasowang@redhat.com>
On Tue, May 07, 2019 at 12:03:36AM -0400, Jason Wang wrote:
> When a queue(tfile) is detached through __tun_detach(), we move the
> last enabled tfile to the position where detached one sit but don't
> NULL out last position. We expect to synchronize the datapath through
> tun->numqueues. Unfortunately, this won't work since we're lacking
> sufficient mechanism to order or synchronize the access to
> tun->numqueues.
>
> To fix this, NULL out the last position during detaching and check
> RCU protected tfile against NULL instead of checking tun->numqueues in
> datapath.
>
> Cc: YueHaibing <yuehaibing@huawei.com>
> Cc: Cong Wang <xiyou.wangcong@gmail.com>
> Cc: weiyongjun (A) <weiyongjun1@huawei.com>
> Cc: Eric Dumazet <eric.dumazet@gmail.com>
> Fixes: c8d68e6be1c3b ("tuntap: multiqueue support")
> Signed-off-by: Jason Wang <jasowang@redhat.com>
> ---
> Changes from V1:
> - keep the check in tun_xdp_xmit()
> ---
> drivers/net/tun.c | 8 +++++++-
> 1 file changed, 7 insertions(+), 1 deletion(-)
>
> diff --git a/drivers/net/tun.c b/drivers/net/tun.c
> index e9ca1c0..32a0b23 100644
> --- a/drivers/net/tun.c
> +++ b/drivers/net/tun.c
> @@ -700,6 +700,8 @@ static void __tun_detach(struct tun_file *tfile, bool clean)
> tun->tfiles[tun->numqueues - 1]);
> ntfile = rtnl_dereference(tun->tfiles[index]);
> ntfile->queue_index = index;
> + rcu_assign_pointer(tun->tfiles[tun->numqueues - 1],
> + NULL);
>
> --tun->numqueues;
> if (clean) {
> @@ -1082,7 +1084,7 @@ static netdev_tx_t tun_net_xmit(struct sk_buff *skb, struct net_device *dev)
> tfile = rcu_dereference(tun->tfiles[txq]);
>
> /* Drop packet if interface is not attached */
> - if (txq >= tun->numqueues)
> + if (!tfile)
> goto drop;
>
> if (!rcu_dereference(tun->steering_prog))
Hmm don't we need to range check txq?
> @@ -1313,6 +1315,10 @@ static int tun_xdp_xmit(struct net_device *dev, int n,
>
> tfile = rcu_dereference(tun->tfiles[smp_processor_id() %
> numqueues]);
> + if (!tfile) {
> + rcu_read_unlock();
> + return -ENXIO; /* Caller will free/return all frames */
> + }
>
> spin_lock(&tfile->tx_ring.producer_lock);
> for (i = 0; i < n; i++) {
> --
> 1.8.3.1
next prev parent reply other threads:[~2019-05-08 4:16 UTC|newest]
Thread overview: 11+ messages / expand[flat|nested] mbox.gz Atom feed top
2019-05-07 4:03 [PATCH net V2] tuntap: synchronize through tfiles array instead of tun->numqueues Jason Wang
2019-05-07 4:54 ` Cong Wang
2019-05-07 6:19 ` Jason Wang
2019-05-07 14:41 ` Cong Wang
2019-05-08 2:54 ` Jason Wang
2019-05-09 5:34 ` Cong Wang
2019-05-09 12:55 ` Jason Wang
2019-05-08 4:16 ` Michael S. Tsirkin [this message]
2019-05-08 4:30 ` Jason Wang
2019-05-08 17:36 ` David Miller
2019-05-09 3:16 ` Jason Wang
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=20190508001518-mutt-send-email-mst@kernel.org \
--to=mst@redhat.com \
--cc=eric.dumazet@gmail.com \
--cc=jasowang@redhat.com \
--cc=netdev@vger.kernel.org \
--cc=weiyongjun1@huawei.com \
--cc=xiyou.wangcong@gmail.com \
--cc=yuehaibing@huawei.com \
/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.