Received: by 2002:a25:ab43:0:0:0:0:0 with SMTP id u61csp465656ybi; Fri, 31 May 2019 04:24:24 -0700 (PDT) X-Google-Smtp-Source: APXvYqyiOqpMqnZuz9XUAAyedyVm0WhLdjWJp+igBWZxL1SR0/E0UH+vse1Sxon2KoaHshgctt6T X-Received: by 2002:a65:62c6:: with SMTP id m6mr8590156pgv.306.1559301864499; Fri, 31 May 2019 04:24:24 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1559301864; cv=none; d=google.com; s=arc-20160816; b=c0YXJ60dF48kUB/+VvG4nfNb71dIshT9MUMzXwevwzeapAMxcpVVJeUujxGkkhiQZb WwLW3JOV7wc2LL9FficoP6t7Ijfw1pgxS77+4kz0I3B7dx5ZEooOJDJGp/CFuoS4ztnL W6pU4Re/MPWk9bSsuRA239XsH8C82zvRs5kJBn/dGXRMU3ByBeqHtwA58Z0QWpKcy/kV kqdwvZZ3F+rj13m1V8vF0RxVDrJLS4WLdZN6VeV/YVi2zVlkZY6tBmP9honNLuUJVVBr Sqw3HAPRXba2Fi1S3iTEtj9iktVxPqmDVo2gOjj2BsAQlBhoHoE6UrK1HuipOJHW0Ike 1YGw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:user-agent:message-id:references :in-reply-to:subject:cc:to:from:date:content-transfer-encoding :mime-version; bh=Sp4UCyt+5sROB/uGJtshN2ZOD0vpIjLcUKam0XMbMEg=; b=dHPIWkwKH0OVFLagMIlzclFudhrrqoAUD62sGWc2aufM+0/Tan7YY0zVYXODnCWCSq 6FcdfaTYEbDFtBQyqq6eJatip6GcdWtGOD3euRq3WIfI/uABdBSvvmwlXWUVSFSckslK nAz2OZ/WnIAzKWWw/h/wN6MVDCqgWRCv5pjcJs8b6tVhL0opu9eqDTZUR7ry1ly8UF9S u/7rWxbsGiVf8SR05xq+MwfA8PVHhqV/HdP5dTECJ45lmXCQ3pdKW3kKuLYmSSoriru/ VhQBQ8IR7OqiqVSaC5ioDrIBx4UQtDv5hp+1xw1E4MFiBRy5WDvAh/v+v638tTRRxEoX VcLQ== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id h3si5343577pgq.33.2019.05.31.04.24.07; Fri, 31 May 2019 04:24:24 -0700 (PDT) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726518AbfEaLW4 (ORCPT + 99 others); Fri, 31 May 2019 07:22:56 -0400 Received: from mx2.suse.de ([195.135.220.15]:51444 "EHLO mx1.suse.de" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1726002AbfEaLW4 (ORCPT ); Fri, 31 May 2019 07:22:56 -0400 X-Virus-Scanned: by amavisd-new at test-mx.suse.de Received: from relay2.suse.de (unknown [195.135.220.254]) by mx1.suse.de (Postfix) with ESMTP id 09B2EAD05; Fri, 31 May 2019 11:22:55 +0000 (UTC) MIME-Version: 1.0 Content-Type: text/plain; charset=US-ASCII; format=flowed Content-Transfer-Encoding: 7bit Date: Fri, 31 May 2019 13:22:54 +0200 From: Roman Penyaev To: Peter Zijlstra 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() In-Reply-To: <20190531095616.GD17637@hirez.programming.kicks-ass.net> References: <20190516085810.31077-1-rpenyaev@suse.de> <20190516085810.31077-8-rpenyaev@suse.de> <20190531095616.GD17637@hirez.programming.kicks-ass.net> Message-ID: <98971429dc36e8a2e3417af1744de2b2@suse.de> X-Sender: rpenyaev@suse.de User-Agent: Roundcube Webmail Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On 2019-05-31 11:56, Peter Zijlstra wrote: > On Thu, May 16, 2019 at 10:58:04AM +0200, Roman Penyaev wrote: >> Each ep_poll_callback() is called when fd calls wakeup() on epfd. >> So account new event in user ring. >> >> The tricky part here is EPOLLONESHOT. Since we are lockless we >> have to be deal with ep_poll_callbacks() called in paralle, thus >> use cmpxchg to clear public event bits and filter out concurrent >> call from another cpu. >> >> Signed-off-by: Roman Penyaev >> Cc: Andrew Morton >> Cc: Al Viro >> Cc: Linus Torvalds >> Cc: linux-fsdevel@vger.kernel.org >> Cc: linux-kernel@vger.kernel.org >> >> diff --git a/fs/eventpoll.c b/fs/eventpoll.c >> index 2f551c005640..55612da9651e 100644 >> --- a/fs/eventpoll.c >> +++ b/fs/eventpoll.c >> @@ -1407,6 +1407,29 @@ struct file *get_epoll_tfile_raw_ptr(struct >> file *file, int tfd, >> } >> #endif /* CONFIG_CHECKPOINT_RESTORE */ >> >> +/** >> + * Atomically clear public event bits and return %true if the old >> value has >> + * public event bits set. >> + */ >> +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? Just curious: what are these archs? Thanks. -- Roman