From: Jesper Dangaard Brouer <brouer@redhat.com>
To: Jason Wang <jasowang@redhat.com>
Cc: netdev@vger.kernel.org, linux-kernel@vger.kernel.org,
mst@redhat.com, sergei.shtylyov@cogentembedded.com,
christoffer.dall@linaro.org, brouer@redhat.com
Subject: Re: [PATCH V4 net 2/3] tuntap: disable preemption during XDP processing
Date: Mon, 26 Feb 2018 12:02:09 +0100 [thread overview]
Message-ID: <20180226120209.3c3b172b@redhat.com> (raw)
In-Reply-To: <1519443146-9089-2-git-send-email-jasowang@redhat.com>
On Sat, 24 Feb 2018 11:32:25 +0800
Jason Wang <jasowang@redhat.com> wrote:
> Except for tuntap, all other drivers' XDP was implemented at NAPI
> poll() routine in a bh. This guarantees all XDP operation were done at
> the same CPU which is required by e.g BFP_MAP_TYPE_PERCPU_ARRAY. But
There is a typo in the defined name "BFP_MAP_TYPE_PERCPU_ARRAY".
Besides it is NOT a requirement that comes from the map type
BPF_MAP_TYPE_PERCPU_ARRAY.
The requirement comes from the bpf_redirect_map helper (and only partly
devmap + cpumap types), as the BPF helper/program stores information in
the per-cpu redirect_info struct (see filter.c), that is used by
xdp_do_redirect() and xdp_do_flush_map().
struct redirect_info {
u32 ifindex;
u32 flags;
struct bpf_map *map;
struct bpf_map *map_to_flush;
unsigned long map_owner;
};
static DEFINE_PER_CPU(struct redirect_info, redirect_info);
[...]
void xdp_do_flush_map(void)
{
struct redirect_info *ri = this_cpu_ptr(&redirect_info);
struct bpf_map *map = ri->map_to_flush;
[...]
Notice the same redirect_info is used by the TC clsbpf system...
> for tuntap, we do it in process context and we try to protect XDP
> processing by RCU reader lock. This is insufficient since
> CONFIG_PREEMPT_RCU can preempt the RCU reader critical section which
> breaks the assumption that all XDP were processed in the same CPU.
>
> Fixing this by simply disabling preemption during XDP processing.
I guess, this could pamper over the problem...
But I generally find it problematic that the tuntap is not invoking XDP
from NAPI poll() routine in BH-context, as that context provided us
with some protection that allow certain kind of optimizations (like
this flush API). I hope this will not limit us in the future, that
tuntap driver violate the XDP call context.
> Fixes: 761876c857cb ("tap: XDP support")
$ git describe --contains 761876c857cb
v4.14-rc1~130^2~270^2
--
Best regards,
Jesper Dangaard Brouer
MSc.CS, Principal Kernel Engineer at Red Hat
LinkedIn: http://www.linkedin.com/in/brouer
next prev parent reply other threads:[~2018-02-26 11:02 UTC|newest]
Thread overview: 8+ messages / expand[flat|nested] mbox.gz Atom feed top
2018-02-24 3:32 [PATCH V4 net 1/3] Revert "tuntap: add missing xdp flush" Jason Wang
2018-02-24 3:32 ` [PATCH V4 net 2/3] tuntap: disable preemption during XDP processing Jason Wang
2018-02-26 11:02 ` Jesper Dangaard Brouer [this message]
2018-02-26 13:43 ` Jason Wang
2018-02-26 18:50 ` David Miller
2018-02-24 3:32 ` [PATCH V4 net 3/3] tuntap: correctly add the missing XDP flush Jason Wang
2018-02-26 18:50 ` David Miller
2018-02-26 18:50 ` [PATCH V4 net 1/3] Revert "tuntap: add missing xdp flush" David Miller
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=20180226120209.3c3b172b@redhat.com \
--to=brouer@redhat.com \
--cc=christoffer.dall@linaro.org \
--cc=jasowang@redhat.com \
--cc=linux-kernel@vger.kernel.org \
--cc=mst@redhat.com \
--cc=netdev@vger.kernel.org \
--cc=sergei.shtylyov@cogentembedded.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.