Received: by 10.223.185.116 with SMTP id b49csp1991827wrg; Thu, 22 Feb 2018 06:33:48 -0800 (PST) X-Google-Smtp-Source: AH8x227gTob+E9V4WnK/GSbBr8pH7hcXb1JoZK8UQc622NVAkOQ2P2hkb0dVCkDdZsltZ80xFjiw X-Received: by 2002:a17:902:2b84:: with SMTP id l4-v6mr6841230plb.338.1519310028297; Thu, 22 Feb 2018 06:33:48 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1519310028; cv=none; d=google.com; s=arc-20160816; b=domFTYO14RmaqJqe2c3kWGcs89DV7qZWoQ8L/O6zLL6PSG6CnLnRxv2dok5gKZr1A1 pfrlYkGnT1QtyCh7FxEI0rhoVkGk0Uq2cZ3VbfYnEAxpQNLDqzR7ypdei0yMa54n2Ckv 0W1eM/5BvUJbs28SIqaP+7kqHtjuKr9EGaD+R9C0CecXu9EXv5Koff4urNf6VTbidxnq Gsu/qcqmC2a7ebZlw9wh/Ht0EY/b5FYx7Dt18UPFs77J0ygNQAXKrs8uAPVRHFRcvSOX 9Jp0nNnp+i83qBHuLFQvxcZDdfE3FWyviAY8NmiFaB9ixv2cS+jow9OifzjizkwiJhzC +YHQ== 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:arc-authentication-results; bh=d3yFYosTlSxCm6R11/rEXRPZrk4EfLsvKQDM2zUgddE=; b=PENLmcM0r4O9eNhA+CyhXA3anS3SSvfs/xWuSSCWum9oSvKieoTYAf3YzwIo4gWMBG z8168sR+aJQ/kc5vvLhinLJ6ogmBhEiJbAZPOZUKRlazJ5rfyiXBOmkmn2Lg5PINa3HD hkphh50yygXIjWMAu2dIjmo6szSo1ZvZsRmv6ouuLvGfjVzhCrzCyVuJQNbmw7Ryeu4k 1cKU7cgFH8yjL4Ft9b+GlKnbBagvq5AgTDoOPCSAugYvRCGsKNJmTDDW40+fwvxnK6Za Oph5cHFcldxcfLHxzqI0AtRGqzMGwmuKbhyWsojlj5uo0TxlALIiIWaznMc9T2hjzff5 2L1Q== 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 t190si119864pfb.231.2018.02.22.06.33.30; Thu, 22 Feb 2018 06:33:48 -0800 (PST) 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 S932737AbeBVOco (ORCPT + 99 others); Thu, 22 Feb 2018 09:32:44 -0500 Received: from mx2.suse.de ([195.135.220.15]:57194 "EHLO mx2.suse.de" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S932675AbeBVOcn (ORCPT ); Thu, 22 Feb 2018 09:32:43 -0500 X-Virus-Scanned: by amavisd-new at test-mx.suse.de Received: from relay2.suse.de (charybdis-ext.suse.de [195.135.220.254]) by mx2.suse.de (Postfix) with ESMTP id 62FA4AE6C; Thu, 22 Feb 2018 14:32:41 +0000 (UTC) Received: by quack2.suse.cz (Postfix, from userid 1000) id 6488C1E04D6; Thu, 22 Feb 2018 15:32:40 +0100 (CET) Date: Thu, 22 Feb 2018 15:32:40 +0100 From: Jan Kara To: Kunal Shubham Cc: "jack@suse.cz" , VIVEK TRIVEDI , "amir73il@gmail.com" , "linux-fsdevel@vger.kernel.org" , "linux-kernel@vger.kernel.org" , PANKAJ MISHRA Subject: Re: Re: [PATCH] fanotify: allow freeze on suspend when waiting for response from userspace Message-ID: <20180222143240.jc4wcifzzyzeuy6i@quack2.suse.cz> References: <20180216102913.jcgvc5rhjqtzlkb6@quack2.suse.cz> <1518774280-38090-1-git-send-email-t.vivek@samsung.com> <20180222094454epcms5p15e3538bdba8bcbc036dc379583bc3a55@epcms5p1> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20180222094454epcms5p15e3538bdba8bcbc036dc379583bc3a55@epcms5p1> User-Agent: NeoMutt/20170421 (1.8.2) Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On Thu 22-02-18 15:14:54, Kunal Shubham wrote: > >> On Fri 16-02-18 15:14:40, t.vivek@samsung.com wrote: > >> From: Vivek Trivedi > >> > >> If fanotify userspace response server thread is frozen first, > >> it may fail to send response from userspace to kernel space listener. > >> In this scenario, fanotify response listener will never get response > >> from userepace and fail to suspend. > >> > >> Use freeze-friendly wait API to handle this issue. > >> > >> Same problem was reported here: > >> https://bbs.archlinux.org/viewtopic.php?id=232270 > >> > >> Freezing of tasks failed after 20.005 seconds > >> (1 tasks refusing to freeze, wq_busy=0) > >> > >> Backtrace: > >> [] (__schedule) from [] (schedule+0x4c/0xa4) > >> [] (schedule) from [] (fanotify_handle_event+0x1c8/0x218) > >> [] (fanotify_handle_event) from [] (fsnotify+0x17c/0x38c) > >> [] (fsnotify) from [] (security_file_open+0x88/0x8c) > >> [] (security_file_open) from [] (do_dentry_open+0xc0/0x338) > >> [] (do_dentry_open) from [] (vfs_open+0x54/0x58) > >> [] (vfs_open) from [] (do_last.isra.10+0x45c/0xcf8) > >> [] (do_last.isra.10) from [] (path_openat+0x424/0x600) > >> [] (path_openat) from [] (do_filp_open+0x3c/0x98) > >> [] (do_filp_open) from [] (do_sys_open+0x120/0x1e4) > >> [] (do_sys_open) from [] (SyS_open+0x28/0x2c) > >> [] (SyS_open) from [] (__sys_trace_return+0x0/0x20) > > > > Yeah, good catch. > > > >> @@ -63,7 +64,9 @@ static int fanotify_get_response(struct fsnotify_group *group, > >> > >> pr_debug("%s: group=%p event=%p\n", __func__, group, event); > >> > >> - wait_event(group->fanotify_data.access_waitq, event->response); > >> + while (!event->response) > >> + wait_event_freezable(group->fanotify_data.access_waitq, > >> + event->response); > > > > But if the process gets a signal while waiting, we will just livelock the > > kernel in this loop as wait_event_freezable() will keep returning > > ERESTARTSYS. So you need to be a bit more clever here... > > Hi Jack, > Thanks for the quick review. > To avoid livelock issue, is it fine to use below change? > If agree, I will send v2 patch. > > @@ -63,7 +64,11 @@ static int fanotify_get_response(struct fsnotify_group *group, > > pr_debug("%s: group=%p event=%p\n", __func__, group, event); > > - wait_event(group->fanotify_data.access_waitq, event->response); > + while (!event->response) { > + if (wait_event_freezable(group->fanotify_data.access_waitq, > + event->response)) > + flush_signals(current); > + } Hum, I don't think this is correct either as this way if any signal was delivered while waiting for fanotify response, we'd just lose it while previously it has been properly handled. So what I think needs to be done is that we just use wait_event_freezable() and propagate non-zero return value (-ERESTARTSYS) up to the caller to handle the signal and restart the syscall as necessary. Honza -- Jan Kara SUSE Labs, CR