Received: by 2002:a25:ab43:0:0:0:0:0 with SMTP id u61csp858787ybi; Fri, 31 May 2019 09:53:48 -0700 (PDT) X-Google-Smtp-Source: APXvYqyYZxFv9Wlmf9zLAmn2o1sr1KFOs1/8R8xgUTTy28wyEN5hTZda3dtAkbobGavWQ4wN+FIF X-Received: by 2002:a17:902:e00a:: with SMTP id ca10mr11078505plb.18.1559321628515; Fri, 31 May 2019 09:53:48 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1559321628; cv=none; d=google.com; s=arc-20160816; b=Z5f84jr5wZdMx2nPcjYzM7ujQjDzthTvfzZwqS2ob+kLPVudbYrI8XiBNX3LUG3Qwf 8tMJjzNMvcSWW9VhotM4Cbn69Svcm0vfpAiCd9WZSaPabW4xsCVNLfzd34ifrrUJdSR2 iW2O5h40pnvlyo3WFVjZfZ3HzQIO9c5PpfKsYr3E90zkhJl5Sa57UFo37Uq8BO4OBjDv 4jDa8/6O3rrlfzZziZy8DxLaNO+tLPrynFlNaV6J2qZ3UdPjOYwUUkDSeFy2Tf9S7vro d93OUG7qQ5InGR8//G4s+0mKl+ORoPqZnLoVYcaBKPhj2UWm3zMtd8L9uAhSeGEH/pPF IEhA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:user-agent:in-reply-to :content-disposition:mime-version:references:message-id:subject:cc :to:from:date:dkim-signature; bh=/T9xgnaJCE7s+nUrgg1lTxdX7p0OidUTw5gqxDihpwY=; b=kAwJoapoBGf7tV7D6sGVqDDzlsgkxTCOjGgopsxxewcGF7gF0e9QjJSj1s+EJ8IX7x VZypYL8kLVRxOBlRMiGGxo3FVLW1h5NMw2Cga4emSYlUEFukPpbv7eTbQBYIAnVOxSFD s4zbNxEqAAR5wf4UC020LLCWswB24qHU906W8INFDMzMTd6SBNfXXNWLihHG2K6Za3uK YfOXIkFUayY/MCgxeJRHVltJrhUrDt2e9bvVPptp8R5Symbe60CcB1iwkdvOccFuh3pF OiTkHROHbdiETYXKoPD0ooaS5mAIvM2JIvfdKi9AoJxJBfUcBEz+WywSemsQQ2hmvFKn IQ+A== ARC-Authentication-Results: i=1; mx.google.com; dkim=fail header.i=@infradead.org header.s=bombadil.20170209 header.b=XtKyKozm; 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 d21si6460467pjv.72.2019.05.31.09.53.31; Fri, 31 May 2019 09:53:48 -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; dkim=fail header.i=@infradead.org header.s=bombadil.20170209 header.b=XtKyKozm; 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 S1726990AbfEaQvs (ORCPT + 99 others); Fri, 31 May 2019 12:51:48 -0400 Received: from bombadil.infradead.org ([198.137.202.133]:48316 "EHLO bombadil.infradead.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726518AbfEaQvs (ORCPT ); Fri, 31 May 2019 12:51:48 -0400 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=infradead.org; s=bombadil.20170209; h=In-Reply-To:Content-Type:MIME-Version :References:Message-ID:Subject:Cc:To:From:Date:Sender:Reply-To: Content-Transfer-Encoding:Content-ID:Content-Description:Resent-Date: Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID:List-Id: List-Help:List-Unsubscribe:List-Subscribe:List-Post:List-Owner:List-Archive; bh=/T9xgnaJCE7s+nUrgg1lTxdX7p0OidUTw5gqxDihpwY=; b=XtKyKozmG1M0+2PGSw6+aVLBF BiKnzafQF+sRmuWNWi7SXf8PmEyIPFheh9YcfrXTjWWxL1QtbeI3he9WWAdg/EPVPHhXXDZdrm13w w6kAan4hib8Jmh+9OmDjGU7qmjnwis61FmWsQSw8pZXguq/XpcHxAUPHRonM/uKPK4IAu/N8V2H2a Ce1IddQ1b1kYbtQIcFNPFKi5Ups2EJyUrop653NlN38b8zdG7ZqBskuY5EGN61kRD5ZVIc+YQG0rk L47xb8AkXTHNu+SjmBfolO+i6hsy/nIpOw8J/DaKk9xRC+TbY/3yLm1Q/zcrBiqC5XZY0k67H/Rks 5W3A3xYXQ==; Received: from j217100.upc-j.chello.nl ([24.132.217.100] helo=hirez.programming.kicks-ass.net) by bombadil.infradead.org with esmtpsa (Exim 4.90_1 #2 (Red Hat Linux)) id 1hWkkr-0003Y0-Kj; Fri, 31 May 2019 16:51:45 +0000 Received: by hirez.programming.kicks-ass.net (Postfix, from userid 1000) id 26575201CF1CB; Fri, 31 May 2019 18:51:44 +0200 (CEST) Date: Fri, 31 May 2019 18:51:44 +0200 From: Peter Zijlstra To: Roman Penyaev 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 06/13] epoll: introduce helpers for adding/removing events to uring Message-ID: <20190531165144.GE2606@hirez.programming.kicks-ass.net> References: <20190516085810.31077-1-rpenyaev@suse.de> <20190516085810.31077-7-rpenyaev@suse.de> <20190531095607.GC17637@hirez.programming.kicks-ass.net> <274e29d102133f3be1f309c66cb0af36@suse.de> <20190531125636.GZ2606@hirez.programming.kicks-ass.net> <98e74ceeefdffc9b50fb33e597d270f7@suse.de> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <98e74ceeefdffc9b50fb33e597d270f7@suse.de> User-Agent: Mutt/1.10.1 (2018-07-13) Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On Fri, May 31, 2019 at 04:21:30PM +0200, Roman Penyaev wrote: > The ep_add_event_to_uring() is lockless, thus I can't increase tail after, > I need to reserve the index slot, where to write to. I can use shadow tail, > which is not seen by userspace, but I have to guarantee that tail is updated > with shadow tail *after* all callers of ep_add_event_to_uring() are left. > That is possible, please see the code below, but it adds more complexity: > > (code was tested on user side, thus has c11 atomics) > > static inline void add_event__kernel(struct ring *ring, unsigned bit) > { > unsigned i, cntr, commit_cntr, *item_idx, tail, old; > > i = __atomic_fetch_add(&ring->cntr, 1, __ATOMIC_ACQUIRE); > item_idx = &ring->user_itemsindex[i % ring->nr]; > > /* Update data */ > *item_idx = bit; > > commit_cntr = __atomic_add_fetch(&ring->commit_cntr, 1, > __ATOMIC_RELEASE); > > tail = ring->user_header->tail; > rmb(); > do { > cntr = ring->cntr; > if (cntr != commit_cntr) > /* Someone else will advance tail */ > break; > > old = tail; > > } while ((tail = > __sync_val_compare_and_swap(&ring->user_header->tail, old, cntr)) != old); > } Yes, I'm well aware of that particular problem (see kernel/events/ring_buffer.c:perf_output_put_handle for instance). But like you show, it can be done. It also makes the thing wait-free, as opposed to merely lockless.