From: Peter Zijlstra <peterz@infradead.org>
To: Roman Penyaev <rpenyaev@suse.de>
Cc: azat@libevent.org, akpm@linux-foundation.org,
viro@zeniv.linux.org.uk, torvalds@linux-foundation.org,
linux-fsdevel@vger.kernel.org, linux-kernel@vger.kernel.org
Subject: Re: [PATCH v3 07/13] epoll: call ep_add_event_to_uring() from ep_poll_callback()
Date: Fri, 31 May 2019 15:05:16 +0200 [thread overview]
Message-ID: <20190531130516.GA2606@hirez.programming.kicks-ass.net> (raw)
In-Reply-To: <98971429dc36e8a2e3417af1744de2b2@suse.de>
On Fri, May 31, 2019 at 01:22:54PM +0200, Roman Penyaev wrote:
> On 2019-05-31 11:56, Peter Zijlstra wrote:
> > On Thu, May 16, 2019 at 10:58:04AM +0200, Roman Penyaev wrote:
> > > +static inline bool ep_clear_public_event_bits(struct epitem *epi)
> > > +{
> > > + __poll_t old, flags;
> > > +
> > > + /*
> > > + * Here we race with ourselves and with ep_modify(), which can
> > > + * change the event bits. In order not to override events updated
> > > + * by ep_modify() we have to do cmpxchg.
> > > + */
> > > +
> > > + old = epi->event.events;
> > > + do {
> > > + flags = old;
> > > + } while ((old = cmpxchg(&epi->event.events, flags,
> > > + flags & EP_PRIVATE_BITS)) != flags);
> > > +
> > > + return flags & ~EP_PRIVATE_BITS;
> > > +}
> >
> > AFAICT epi->event.events also has normal writes to it, eg. in
> > ep_modify(). A number of architectures cannot handle concurrent normal
> > writes and cmpxchg() to the same variable.
>
> Yes, we race with the current function and with ep_modify(). Then,
> ep_modify()
> should do something as the following:
>
> - epi->event.events = event->events
> + xchg(&epi->event.events, event->events);
>
> Is that ok?
That should be correct, but at that point I think we should also always
read the thing with READ_ONCE() to avoid load-tearing. And I suspect it
then becomes sensible to change the type to atomic_t.
atomic_set() vs atomic_cmpxchg() only carries the extra overhead on
those 'dodgy' platforms.
> Just curious: what are these archs?
Oh, lovely stuff like parisc, sparc32 and arc-eznps. See
arch/parisc/lib/bitops.c:__cmpxchg_*() for example :/ Those systems only
have a single truly atomic op (something from the xchg / test-and-set
family) and the rest is fudged on top of that.
next prev parent reply other threads:[~2019-05-31 13:05 UTC|newest]
Thread overview: 50+ messages / expand[flat|nested] mbox.gz Atom feed top
2019-05-16 8:57 [PATCH v3 00/13] epoll: support pollable epoll from userspace Roman Penyaev
2019-05-16 8:57 ` [PATCH v3 01/13] epoll: move private helpers from a header to the source Roman Penyaev
2019-05-16 8:57 ` [PATCH v3 02/13] epoll: introduce user structures for polling from userspace Roman Penyaev
2019-05-16 8:58 ` [PATCH v3 03/13] epoll: allocate user header and user events ring " Roman Penyaev
2019-05-16 8:58 ` [PATCH v3 04/13] epoll: some sanity flags checks for epoll syscalls " Roman Penyaev
2019-05-16 8:58 ` [PATCH v3 05/13] epoll: offload polling to a work in case of epfd polled " Roman Penyaev
2019-05-21 7:51 ` Eric Wong
2019-05-22 12:54 ` Roman Penyaev
2019-05-16 8:58 ` [PATCH v3 06/13] epoll: introduce helpers for adding/removing events to uring Roman Penyaev
2019-05-31 9:55 ` Peter Zijlstra
2019-05-31 11:24 ` Roman Penyaev
2019-05-31 13:11 ` Peter Zijlstra
2019-05-31 9:56 ` Peter Zijlstra
2019-05-31 11:15 ` Roman Penyaev
2019-05-31 12:53 ` Peter Zijlstra
2019-05-31 14:28 ` Roman Penyaev
2019-05-31 16:53 ` Peter Zijlstra
2019-05-31 12:56 ` Peter Zijlstra
2019-05-31 14:21 ` Roman Penyaev
2019-05-31 16:51 ` Peter Zijlstra
2019-05-31 18:58 ` Roman Penyaev
2019-06-03 9:09 ` Peter Zijlstra
2019-06-03 10:02 ` Roman Penyaev
2019-05-16 8:58 ` [PATCH v3 07/13] epoll: call ep_add_event_to_uring() from ep_poll_callback() Roman Penyaev
2019-05-31 9:56 ` Peter Zijlstra
2019-05-31 11:22 ` Roman Penyaev
2019-05-31 13:05 ` Peter Zijlstra [this message]
2019-05-31 15:05 ` Roman Penyaev
2019-05-16 8:58 ` [PATCH v3 08/13] epoll: support polling from userspace for ep_insert() Roman Penyaev
2019-05-16 8:58 ` [PATCH v3 09/13] epoll: support polling from userspace for ep_remove() Roman Penyaev
2019-05-16 8:58 ` [PATCH v3 10/13] epoll: support polling from userspace for ep_modify() Roman Penyaev
2019-05-16 8:58 ` [PATCH v3 11/13] epoll: support polling from userspace for ep_poll() Roman Penyaev
2019-05-16 8:58 ` [PATCH v3 12/13] epoll: support mapping for epfd when polled from userspace Roman Penyaev
2019-05-16 8:58 ` [PATCH v3 13/13] epoll: implement epoll_create2() syscall Roman Penyaev
2019-05-16 10:03 ` Arnd Bergmann
2019-05-16 10:20 ` Roman Penyaev
2019-05-16 10:57 ` Arnd Bergmann
2019-05-22 2:33 ` Andrew Morton
2019-05-22 9:11 ` Roman Penyaev
2019-05-22 11:14 ` Arnd Bergmann
2019-05-22 18:36 ` Andrew Morton
2019-05-31 9:55 ` [PATCH v3 00/13] epoll: support pollable epoll from userspace Peter Zijlstra
2019-05-31 14:48 ` Jens Axboe
2019-05-31 16:02 ` Roman Penyaev
2019-05-31 16:54 ` Jens Axboe
2019-05-31 19:45 ` Roman Penyaev
2019-05-31 21:09 ` Jens Axboe
2019-06-05 6:17 ` Roman Penyaev
2019-05-31 16:33 ` Peter Zijlstra
2019-05-31 18:50 ` Roman Penyaev
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=20190531130516.GA2606@hirez.programming.kicks-ass.net \
--to=peterz@infradead.org \
--cc=akpm@linux-foundation.org \
--cc=azat@libevent.org \
--cc=linux-fsdevel@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=rpenyaev@suse.de \
--cc=torvalds@linux-foundation.org \
--cc=viro@zeniv.linux.org.uk \
/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.