Received: by 2002:a25:824b:0:0:0:0:0 with SMTP id d11csp2004185ybn; Thu, 26 Sep 2019 05:40:29 -0700 (PDT) X-Google-Smtp-Source: APXvYqyO0bBzFMi0kFmOgMyJdq1YeBUw5GBkB5aGh7e7JU2diCfQySzBHCJkXmNPYGBLEFA/Z+D+ X-Received: by 2002:a17:906:6c98:: with SMTP id s24mr2842229ejr.28.1569501628929; Thu, 26 Sep 2019 05:40:28 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1569501628; cv=none; d=google.com; s=arc-20160816; b=Wn9RYU0VuiaNizfIeWM04GxQk1b1DfNUgfwcOkv8o79CKhujt2f6aCy7tCznIOZ/tp WgmgNbtjNatn2uqZUUNa5G8S+/QJzaUS/atCT9sWOd0EETyI2dURA8GS90fa+n3n35WJ Cv6940fBXPpoUntF6Mp2juRaHVMJGBt9bn7tuVS5+6DNa3jGA76O3CyfMHAr9wo4eD4u DqLhG+xd2Mv1SQBjYoe2UamJUd8gXqdG0ONuGi6zWtUQkcUwNcYxFUANFgzlzjp9SeAi 5E5vE1eZS88h4NoWv5QiOgXTAKoANVE4YM9QpyOPN7MX9WBESWcIvtT5SMVug5+OtCLv lKXg== 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=3aBRbKuLbhmDeQPCcDvwoN68E9I/Kyig96SP3Ymj1qw=; b=ttqCPtBPRXda6lVNWHE1z5bkjx86GonCTUUPiQLORBhCC2cPXX+EPhJde9te8IZ2iO s4tikPAO0Os9LHTerN8Mofq0RWP3AKfCvzfAG4xpOvGkfBLA9FFlLpgGNX8DZjQqRccf fHLaaAZmnK/y8Ost4qbEAZ7UppWSesyxTTRnnLqbLiHy1BkrRkgBuVLddZRSdOiyWrJz 6XT9gFx7BnnK7Etwh/lllpRShumcuN0lI+LMGmJVLdKgos6nNHvLmWceDp4lQQeTjl3k C8bn9MC+/TLrY1G3zTU1YOzGEJs2yneAalGdOiS0lX7rVKLpCIR+0ZfsGQWtyGSe0Wv+ 5LqA== 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 k2si1233024ede.311.2019.09.26.05.40.04; Thu, 26 Sep 2019 05:40:28 -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 S2408185AbfIXRwW (ORCPT + 99 others); Tue, 24 Sep 2019 13:52:22 -0400 Received: from mx2.suse.de ([195.135.220.15]:36948 "EHLO mx1.suse.de" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S2393440AbfIXRwW (ORCPT ); Tue, 24 Sep 2019 13:52:22 -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 AE925AC37; Tue, 24 Sep 2019 17:52:19 +0000 (UTC) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 8bit Date: Tue, 24 Sep 2019 19:52:18 +0200 From: Roman Penyaev To: Jason Baron Cc: akpm@linux-foundation.org, linux-kernel@vger.kernel.org, Davidlohr Bueso , Al Viro , Eric Wong Subject: Re: [PATCH] epoll: simplify ep_poll_safewake() for CONFIG_DEBUG_LOCK_ALLOC In-Reply-To: <04b08b78-6348-d592-ca2e-f718955bcc68@akamai.com> References: <1567628549-11501-1-git-send-email-jbaron@akamai.com> <1b26e25fcc0e6c54cbdb9e66dade17db@suse.de> <04b08b78-6348-d592-ca2e-f718955bcc68@akamai.com> Message-ID: <76f656dc7ac92f92682641e22e1c44c4@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-09-24 19:34, Jason Baron wrote: > On 9/23/19 3:23 PM, Roman Penyaev wrote: >> On 2019-09-23 17:43, Jason Baron wrote: >>> On 9/4/19 4:22 PM, Jason Baron wrote: >>>> Currently, ep_poll_safewake() in the CONFIG_DEBUG_LOCK_ALLOC case >>>> uses >>>> ep_call_nested() in order to pass the correct subclass argument to >>>> spin_lock_irqsave_nested(). However, ep_call_nested() adds >>>> unnecessary >>>> checks for epoll depth and loops that are already verified when >>>> doing >>>> EPOLL_CTL_ADD. This mirrors a conversion that was done for >>>> !CONFIG_DEBUG_LOCK_ALLOC in: commit 37b5e5212a44 ("epoll: remove >>>> ep_call_nested() from ep_eventpoll_poll()") >>>> >>>> Signed-off-by: Jason Baron >>>> Cc: Davidlohr Bueso >>>> Cc: Roman Penyaev >>>> Cc: Al Viro >>>> Cc: Eric Wong >>>> Cc: Andrew Morton >>>> --- >>>>  fs/eventpoll.c | 36 +++++++++++++----------------------- >>>>  1 file changed, 13 insertions(+), 23 deletions(-) >>>> >>>> diff --git a/fs/eventpoll.c b/fs/eventpoll.c >>>> index d7f1f50..a9b2737 100644 >>>> --- a/fs/eventpoll.c >>>> +++ b/fs/eventpoll.c >>>> @@ -551,28 +551,23 @@ static int ep_call_nested(struct nested_calls >>>> *ncalls, >>>>   */ >>>>  #ifdef CONFIG_DEBUG_LOCK_ALLOC >>>> >>>> -static struct nested_calls poll_safewake_ncalls; >>>> - >>>> -static int ep_poll_wakeup_proc(void *priv, void *cookie, int >>>> call_nests) >>>> -{ >>>> -    unsigned long flags; >>>> -    wait_queue_head_t *wqueue = (wait_queue_head_t *)cookie; >>>> - >>>> -    spin_lock_irqsave_nested(&wqueue->lock, flags, call_nests + 1); >>>> -    wake_up_locked_poll(wqueue, EPOLLIN); >>>> -    spin_unlock_irqrestore(&wqueue->lock, flags); >>>> - >>>> -    return 0; >>>> -} >>>> +static DEFINE_PER_CPU(int, wakeup_nest); >>>> >>>>  static void ep_poll_safewake(wait_queue_head_t *wq) >>>>  { >>>> -    int this_cpu = get_cpu(); >>>> - >>>> -    ep_call_nested(&poll_safewake_ncalls, >>>> -               ep_poll_wakeup_proc, NULL, wq, (void *) (long) >>>> this_cpu); >>>> +    unsigned long flags; >>>> +    int subclass; >>>> >>>> -    put_cpu(); >>>> +    local_irq_save(flags); >>>> +    preempt_disable(); >>>> +    subclass = __this_cpu_read(wakeup_nest); >>>> +    spin_lock_nested(&wq->lock, subclass + 1); >>>> +    __this_cpu_inc(wakeup_nest); >>>> +    wake_up_locked_poll(wq, POLLIN); >>>> +    __this_cpu_dec(wakeup_nest); >>>> +    spin_unlock(&wq->lock); >>>> +    local_irq_restore(flags); >>>> +    preempt_enable(); >>>>  } >> >> What if reduce number of lines with something as the following: >> >>    int this_cpu = get_cpu(); >>    subclass = __this_cpu_inc_return(wakeup_nest); >>    spin_lock_irqsave_nested(&wq->lock, flags, subclass); >>    wake_up_locked_poll(wq, POLLIN); >>    spin_unlock_irqrestore(&wq->lock, flags); >>    __this_cpu_dec(wakeup_nest); >>    put_cpu(); >> >> Other than that looks good to me. >> >> Reviewed-by: Roman Penyaev >> >> -- >> Roman > > > Hi, > > I put the local_irq_save(flags), call there first so that there > wouldn't > be any nesting. For example, in your sequence, there could be an irq > after the __this_cpu_inc_return(), that could end up back here. That is correct, but seems this is the original behavior of ep_call_nested(), where irq can happen just after spin_unlock_irqrestore(): spin_unlock_irqrestore(&ncalls->lock, flags); >>>> irq here <<<<< /* Call the nested function */ error = (*nproc)(priv, cookie, call_nests); so eventually you end up with spin_lock_irqsave_nested() call where call_nests is not monotonically increased (not sequential) but has a gap (depends on nesting). So if shorter, I thought that your "local_irq_save + increment" sequence is excessive. -- Roman