________________________________________ From: Bruce Ashfield <bruce.ashfi...@gmail.com> Sent: Thursday, 1 July 2021 08:25 To: Zhang, Qiang Cc: linux-yocto@lists.yoctoproject.org Subject: Re: [linux-yocto][linux-yocto v5.10][PATCH] eventfd: Enlarge recursion limit to allow vhost to work
[Please note: This e-mail is from an EXTERNAL e-mail address] In message: [linux-yocto][linux-yocto v5.10][PATCH] eventfd: Enlarge recursion limit to allow vhost to work on 28/06/2021 qiang.zh...@windriver.com wrote: > From: Zqiang <qiang.zh...@windriver.com> > > 1/1 [ > Author: He Zhe > Email: zhe...@windriver.com > Subject: eventfd: Enlarge recursion limit to allow vhost to work > Date: Fri, 5 Jun 2020 16:32:18 +0800 > > commit 85f0a97f3aac6bb2c9549af607843644dd2ef5c7 upstream [linux-yocto] > > Upstream link: > https://lore.kernel.org/lkml/20200410114720.24838-1-zhe...@windriver.com/ >I was reading the thread on lore, and it isn't clear to me what is >the latest status. > >Does this problem show more easily under preempt-rt, but is not a >preempt-rt only fix ? I'm just trying to confirm that you are >targeting this at v5.10/standard/base. Hello Bruce Sorry is my mistake this patch not only for v5.10, but also for v5.13 This problem occurs not only in preempt-rt kernel, but also in non preempt-rt kernel. in preempt-rt kernel, due to spinlock is replaced by rt-mutex, the spinlock critical area becomes preemptive, If preemption occurs after increasing the current reference count of CPU, the new task accesses the current CPU again will trigger warning, in non preempt-rt kernel, if the eventfd_signal() is called recursively also trigger warning Thanks Qiang > >You first submitted this a year ago, and it still isn't applied >upstream. And Juri was seeing the same warning. There was a >recent series posted that had a similar change to your v1, but >you've resent this patch (v2?) as part of that effort .. but still >no answer on the change. > >Also note, I just pushed 5.13 as the start of the new release >kernel, since this is in mainline still, I assume I can apply this >to those branches as well. > >Bruce > > commit b5e683d5cab8 ("eventfd: track eventfd_signal() recursion depth") > introduces a percpu counter that tracks the percpu recursion depth and > warn if it greater than zero, to avoid potential deadlock and stack > overflow. > > However sometimes different eventfds may be used in parallel. Specifically, > when heavy network load goes through kvm and vhost, working as below, it > would trigger the following call trace. > > - 100.00% > - 66.51% > ret_from_fork > kthread > - vhost_worker > - 33.47% handle_tx_kick > handle_tx > handle_tx_copy > vhost_tx_batch.isra.0 > vhost_add_used_and_signal_n > eventfd_signal > - 33.05% handle_rx_net > handle_rx > vhost_add_used_and_signal_n > eventfd_signal > - 33.49% > ioctl > entry_SYSCALL_64_after_hwframe > do_syscall_64 > __x64_sys_ioctl > ksys_ioctl > do_vfs_ioctl > kvm_vcpu_ioctl > kvm_arch_vcpu_ioctl_run > vmx_handle_exit > handle_ept_misconfig > kvm_io_bus_write > __kvm_io_bus_write > eventfd_signal > 001: WARNING: CPU: 1 PID: 1503 at fs/eventfd.c:73 eventfd_signal+0x85/0xa0 > ---- snip ---- > 001: Call Trace: > 001: vhost_signal+0x15e/0x1b0 [vhost] > 001: vhost_add_used_and_signal_n+0x2b/0x40 [vhost] > 001: handle_rx+0xb9/0x900 [vhost_net] > 001: handle_rx_net+0x15/0x20 [vhost_net] > 001: vhost_worker+0xbe/0x120 [vhost] > 001: kthread+0x106/0x140 > 001: ? log_used.part.0+0x20/0x20 [vhost] > 001: ? kthread_park+0x90/0x90 > 001: ret_from_fork+0x35/0x40 > 001: ---[ end trace 0000000000000003 ]--- > > This patch enlarges the limit to 1 which is the maximum recursion depth we > have found so far. > > Signed-off-by: He Zhe <zhe...@windriver.com> > Signed-off-by: Bruce Ashfield <bruce.ashfi...@gmail.com> > [CE: backport of 85f0a97f3aac from v5.4 branch of linux-yocto] > Signed-off-by: Catalin Enache <catalin.ena...@windriver.com> > ] > > Signed-off-by: Zqiang <qiang.zh...@windriver.com> > --- > fs/eventfd.c | 2 +- > include/linux/eventfd.h | 2 ++ > 2 files changed, 3 insertions(+), 1 deletion(-) > > diff --git a/fs/eventfd.c b/fs/eventfd.c > index df466ef81ddd..7a5cbec9e843 100644 > --- a/fs/eventfd.c > +++ b/fs/eventfd.c > @@ -71,7 +71,7 @@ __u64 eventfd_signal(struct eventfd_ctx *ctx, __u64 n) > * it returns true, the eventfd_signal() call should be deferred to a > * safe context. > */ > - if (WARN_ON_ONCE(this_cpu_read(eventfd_wake_count))) > + if (WARN_ON_ONCE(this_cpu_read(eventfd_wake_count) > > EFD_WAKE_COUNT_MAX)) > return 0; > > spin_lock_irqsave(&ctx->wqh.lock, flags); > diff --git a/include/linux/eventfd.h b/include/linux/eventfd.h > index dc4fd8a6644d..db050fb99e0b 100644 > --- a/include/linux/eventfd.h > +++ b/include/linux/eventfd.h > @@ -29,6 +29,8 @@ > #define EFD_SHARED_FCNTL_FLAGS (O_CLOEXEC | O_NONBLOCK) > #define EFD_FLAGS_SET (EFD_SHARED_FCNTL_FLAGS | EFD_SEMAPHORE) > > +/* This is the maximum recursion depth we find so far */ > +#define EFD_WAKE_COUNT_MAX 1 > struct eventfd_ctx; > struct file; > > -- > 2.29.2 >
-=-=-=-=-=-=-=-=-=-=-=- Links: You receive all messages sent to this group. View/Reply Online (#10027): https://lists.yoctoproject.org/g/linux-yocto/message/10027 Mute This Topic: https://lists.yoctoproject.org/mt/83840069/21656 Group Owner: linux-yocto+ow...@lists.yoctoproject.org Unsubscribe: https://lists.yoctoproject.org/g/linux-yocto/unsub [arch...@mail-archive.com] -=-=-=-=-=-=-=-=-=-=-=-