From patchwork Thu Jun 6 01:45:34 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Ira Weiny X-Patchwork-Id: 10978205 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id 7639114E5 for ; Thu, 6 Jun 2019 01:45:16 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 6600B2878E for ; Thu, 6 Jun 2019 01:45:16 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 5A2CC2879D; Thu, 6 Jun 2019 01:45:16 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-2.9 required=2.0 tests=BAYES_00,MAILING_LIST_MULTI, RCVD_IN_DNSWL_NONE autolearn=unavailable version=3.3.1 Received: from kanga.kvack.org (kanga.kvack.org [205.233.56.17]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id D62F72878E for ; Thu, 6 Jun 2019 01:45:15 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id 0DCE76B026F; Wed, 5 Jun 2019 21:45:12 -0400 (EDT) Delivered-To: linux-mm-outgoing@kvack.org Received: by kanga.kvack.org (Postfix, from userid 40) id 0677C6B0270; Wed, 5 Jun 2019 21:45:12 -0400 (EDT) X-Original-To: int-list-linux-mm@kvack.org X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id D858B6B0271; Wed, 5 Jun 2019 21:45:11 -0400 (EDT) X-Original-To: linux-mm@kvack.org X-Delivered-To: linux-mm@kvack.org Received: from mail-pg1-f198.google.com (mail-pg1-f198.google.com [209.85.215.198]) by kanga.kvack.org (Postfix) with ESMTP id A1C086B026F for ; Wed, 5 Jun 2019 21:45:11 -0400 (EDT) Received: by mail-pg1-f198.google.com with SMTP id a21so465183pgh.11 for ; Wed, 05 Jun 2019 18:45:11 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-original-authentication-results:x-gm-message-state:from:to:cc :subject:date:message-id:in-reply-to:references:mime-version :content-transfer-encoding; bh=5uQsAX2pIUaH2J6K4wUHjO28qHMkSyLajY2GJr92kcE=; b=hJO+bKk489Ie6PA8VvMh0fidsKb90ZrkBFnzzJYH70/9Phu339csh6HbieBN7kC67n gVsJZQwaP9W5rFQnryQPkMM/uKOvXM+Srx+pC38qKU5u0dAlWTIIwYbeIa+2X2VUe9VW vXFJBM2A4Pp2HQFrxEFPzpaW+33CI3yaID7dv6DVa8lt689YAN6KhmBliLuFShRJT72y ycZl7ZN7U1Pk/ISeotvOizLNEt0BMchvS7fpH1iJlEZNY5El5sTOZDPPHKgCaHqAST/S eUsXvy96T3icxyYUb9TlZ8VCLc3DNOCv6I8fHAsNq1XSBfzhzf0/cXuz5g8t6f3Oi7aS xy/A== X-Original-Authentication-Results: mx.google.com; spf=pass (google.com: domain of ira.weiny@intel.com designates 134.134.136.100 as permitted sender) smtp.mailfrom=ira.weiny@intel.com; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=intel.com X-Gm-Message-State: APjAAAXmKz6Rwzqj7Vzv16vSxx+8s8kj1Bys+Zwx3VDG+ausT5Bc9TQ4 o9adN1vYOr2lg2MdUDEeOhYCawAz+CQQjS37TaEl8Dr1tLWCVhXWwr4v9qMPi+SEBdeAWK4FsCQ xEgnUU49JjOqUbwAEbs14ZNouWkjVHVyi1j1OuuPqA3Gc0H64bMhqaF4FgPnLk2wwzQ== X-Received: by 2002:a17:90a:ad41:: with SMTP id w1mr12656210pjv.52.1559785511186; Wed, 05 Jun 2019 18:45:11 -0700 (PDT) X-Google-Smtp-Source: APXvYqzMy+FOcJMiHW2Nlo9PlRammUUA3X/fOYRmZbKrBxt4GVNMENJuXO3HhqsmNBvPzn+YObWe X-Received: by 2002:a17:90a:ad41:: with SMTP id w1mr12656142pjv.52.1559785509979; Wed, 05 Jun 2019 18:45:09 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1559785509; cv=none; d=google.com; s=arc-20160816; b=DxMoyz60EgIwlJcOl4roFE5Nw79dJxAy3vWMf1gXGR0cl8OYKB7/GXiNpeDyY3P+p3 4UhXs5Pkz38waYWTHPtHFecj6nsjsVYcZCafwepwyRLCwf9oZQjD/IGx4kXrPkWx7dF3 IY1KCsbEI8v2hhvpsnjbfnQOZaMd0YvCA5X5TU3+kBsswSrHNDnJNeXZYBexLFy5JGV5 mtaMFKOQzciYbV/ySSVbF/HvpkICPYllT8FRzPyY2OfkatupO6YaDRIkbBCaQATooykE kgydNmsWPiAubHJfLsa+AU6tiUlSu8a5AsaqqzeqH0cHBP7j4ZCEzr4+B05cl0u5W7cO gsjQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from; bh=5uQsAX2pIUaH2J6K4wUHjO28qHMkSyLajY2GJr92kcE=; b=TCrLwesNlyYr3qJI2mA1WjEJI/wUdorGng4vamjNwG2bf4RXPXRvNH5HkQBuyNe70M 6mnrtEUbldPxdcK7wpAelyx5tnYyHfEtjlceJFmU68gNTBZiDnbjhe1Qt55N8MzEcSNa GYMfDu1rKUCgopZ83tgPuDLlnXbHTV3BRPhy8P1aPIjz7HWNcr4sx9P84AcbRBft5hBP NFDk2CalRxN5RwRn+n/xWfLOy0CrSBwWuDMJLiLDVt9AykVTPXE8TDmNWBRalPRG7Qfn QzL9iTsgp9UwNsrS4jR1xIj0I7JnzBH3L3u/RVrJNqpDO/tP3zR5b8n6kbbVjiYnx27C 5YAw== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: domain of ira.weiny@intel.com designates 134.134.136.100 as permitted sender) smtp.mailfrom=ira.weiny@intel.com; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=intel.com Received: from mga07.intel.com (mga07.intel.com. [134.134.136.100]) by mx.google.com with ESMTPS id k18si276921pfk.103.2019.06.05.18.45.09 for (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Wed, 05 Jun 2019 18:45:09 -0700 (PDT) Received-SPF: pass (google.com: domain of ira.weiny@intel.com designates 134.134.136.100 as permitted sender) client-ip=134.134.136.100; Authentication-Results: mx.google.com; spf=pass (google.com: domain of ira.weiny@intel.com designates 134.134.136.100 as permitted sender) smtp.mailfrom=ira.weiny@intel.com; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=intel.com X-Amp-Result: SKIPPED(no attachment in message) X-Amp-File-Uploaded: False Received: from orsmga002.jf.intel.com ([10.7.209.21]) by orsmga105.jf.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 05 Jun 2019 18:45:09 -0700 X-ExtLoop1: 1 Received: from iweiny-desk2.sc.intel.com ([10.3.52.157]) by orsmga002.jf.intel.com with ESMTP; 05 Jun 2019 18:45:09 -0700 From: ira.weiny@intel.com To: Dan Williams , Jan Kara , "Theodore Ts'o" , Jeff Layton , Dave Chinner Cc: Ira Weiny , Matthew Wilcox , linux-xfs@vger.kernel.org, Andrew Morton , John Hubbard , =?utf-8?b?SsOpcsO0bWUgR2xpc3Nl?= , linux-fsdevel@vger.kernel.org, linux-kernel@vger.kernel.org, linux-nvdimm@lists.01.org, linux-ext4@vger.kernel.org, linux-mm@kvack.org Subject: [PATCH RFC 01/10] fs/locks: Add trace_leases_conflict Date: Wed, 5 Jun 2019 18:45:34 -0700 Message-Id: <20190606014544.8339-2-ira.weiny@intel.com> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20190606014544.8339-1-ira.weiny@intel.com> References: <20190606014544.8339-1-ira.weiny@intel.com> MIME-Version: 1.0 X-Bogosity: Ham, tests=bogofilter, spamicity=0.000000, version=1.2.4 Sender: owner-linux-mm@kvack.org Precedence: bulk X-Loop: owner-majordomo@kvack.org List-ID: X-Virus-Scanned: ClamAV using ClamSMTP From: Ira Weiny Signed-off-by: Ira Weiny Reviewed-by: Jeff Layton --- fs/locks.c | 20 ++++++++++++++----- include/trace/events/filelock.h | 35 +++++++++++++++++++++++++++++++++ 2 files changed, 50 insertions(+), 5 deletions(-) diff --git a/fs/locks.c b/fs/locks.c index ec1e4a5df629..0cc2b9f30e22 100644 --- a/fs/locks.c +++ b/fs/locks.c @@ -1534,11 +1534,21 @@ static void time_out_leases(struct inode *inode, struct list_head *dispose) static bool leases_conflict(struct file_lock *lease, struct file_lock *breaker) { - if ((breaker->fl_flags & FL_LAYOUT) != (lease->fl_flags & FL_LAYOUT)) - return false; - if ((breaker->fl_flags & FL_DELEG) && (lease->fl_flags & FL_LEASE)) - return false; - return locks_conflict(breaker, lease); + bool rc; + + if ((breaker->fl_flags & FL_LAYOUT) != (lease->fl_flags & FL_LAYOUT)) { + rc = false; + goto trace; + } + if ((breaker->fl_flags & FL_DELEG) && (lease->fl_flags & FL_LEASE)) { + rc = false; + goto trace; + } + + rc = locks_conflict(breaker, lease); +trace: + trace_leases_conflict(rc, lease, breaker); + return rc; } static bool diff --git a/include/trace/events/filelock.h b/include/trace/events/filelock.h index fad7befa612d..4b735923f2ff 100644 --- a/include/trace/events/filelock.h +++ b/include/trace/events/filelock.h @@ -203,6 +203,41 @@ TRACE_EVENT(generic_add_lease, show_fl_type(__entry->fl_type)) ); +TRACE_EVENT(leases_conflict, + TP_PROTO(bool conflict, struct file_lock *lease, struct file_lock *breaker), + + TP_ARGS(conflict, lease, breaker), + + TP_STRUCT__entry( + __field(void *, lease) + __field(void *, breaker) + __field(unsigned int, l_fl_flags) + __field(unsigned int, b_fl_flags) + __field(unsigned char, l_fl_type) + __field(unsigned char, b_fl_type) + __field(bool, conflict) + ), + + TP_fast_assign( + __entry->lease = lease; + __entry->l_fl_flags = lease->fl_flags; + __entry->l_fl_type = lease->fl_type; + __entry->breaker = breaker; + __entry->b_fl_flags = breaker->fl_flags; + __entry->b_fl_type = breaker->fl_type; + __entry->conflict = conflict; + ), + + TP_printk("conflict %d: lease=0x%p fl_flags=%s fl_type=%s; breaker=0x%p fl_flags=%s fl_type=%s", + __entry->conflict, + __entry->lease, + show_fl_flags(__entry->l_fl_flags), + show_fl_type(__entry->l_fl_type), + __entry->breaker, + show_fl_flags(__entry->b_fl_flags), + show_fl_type(__entry->b_fl_type)) +); + #endif /* _TRACE_FILELOCK_H */ /* This part must be outside protection */ From patchwork Thu Jun 6 01:45:35 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Ira Weiny X-Patchwork-Id: 10978215 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id B242B15E6 for ; Thu, 6 Jun 2019 01:45:21 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id A1EDE28783 for ; Thu, 6 Jun 2019 01:45:21 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 9F98728787; Thu, 6 Jun 2019 01:45:21 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-2.9 required=2.0 tests=BAYES_00,MAILING_LIST_MULTI, RCVD_IN_DNSWL_NONE autolearn=unavailable version=3.3.1 Received: from kanga.kvack.org (kanga.kvack.org [205.233.56.17]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 8FE9F28783 for ; Thu, 6 Jun 2019 01:45:18 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id 23C466B0270; Wed, 5 Jun 2019 21:45:14 -0400 (EDT) Delivered-To: linux-mm-outgoing@kvack.org Received: by kanga.kvack.org (Postfix, from userid 40) id 1A0EC6B0271; Wed, 5 Jun 2019 21:45:14 -0400 (EDT) X-Original-To: int-list-linux-mm@kvack.org X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id EBE496B0272; Wed, 5 Jun 2019 21:45:13 -0400 (EDT) X-Original-To: linux-mm@kvack.org X-Delivered-To: linux-mm@kvack.org Received: from mail-pl1-f197.google.com (mail-pl1-f197.google.com [209.85.214.197]) by kanga.kvack.org (Postfix) with ESMTP id AEBED6B0270 for ; Wed, 5 Jun 2019 21:45:13 -0400 (EDT) Received: by mail-pl1-f197.google.com with SMTP id g11so483599plt.23 for ; Wed, 05 Jun 2019 18:45:13 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-original-authentication-results:x-gm-message-state:from:to:cc :subject:date:message-id:in-reply-to:references:mime-version :content-transfer-encoding; bh=RwseoB0hw/rDqmwrfSdhujbgyOh6rWSvNFjMF8DwG0o=; b=ET/tJmMUyDl7HvGvQbq1XiQL2EIWAb++FXVoR287VJ17Ir17MGw0EpPELzaJ9Gzwcc K+WjI3EpadxyB4WSk75b/P2lcjKwjMDbI1geXF0BVd3DjcWo482Csa3UaPnc6SukF2wL UaWQ5Cy+6Ln0Ygbj395mvWcIRraA8PGzJmfzIDJqJo0pW6pC1GT3QjJf3vvZEpvtc2Ms AEKBMgMqwPQQnzkHH9psXr/U3RDtCfznOiUy4xITZIhPEphP1rEVjuOs+hTJ9AMbkKQc XiqlXora9VpmyLvdUc1TU2uKKhrK2QhB+oMFh0FlRdjq3jXWjD7dJ4wkKi3t8/wPPU5/ alrw== X-Original-Authentication-Results: mx.google.com; spf=pass (google.com: domain of ira.weiny@intel.com designates 134.134.136.100 as permitted sender) smtp.mailfrom=ira.weiny@intel.com; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=intel.com X-Gm-Message-State: APjAAAVNxpWKcTrpKl3PB7aEOrc6WRNZhNIxbwQjxNwa7JIJxN3tigw5 /bQC4InHH3U1fbtK/SgNXW+P6fCRafwFFwmSJE3XdehCwr3RqY8GOmSSw+/3/0NnvMwXzdPCkTj gdtK4MBomsQ4VTffAGfHeHSbY+TKRytkN5HWuZg53HBt32UO/JRRru4h314So2YzY2A== X-Received: by 2002:aa7:9a8c:: with SMTP id w12mr49714468pfi.187.1559785513319; Wed, 05 Jun 2019 18:45:13 -0700 (PDT) X-Google-Smtp-Source: APXvYqyE2TTVpf+b2d4I1TM/JpVT7/sveV8qOZ4DxhMTYiWBy+lgoB9RqET6qsnXc5B6E+UgyMEN X-Received: by 2002:aa7:9a8c:: with SMTP id w12mr49714388pfi.187.1559785512099; Wed, 05 Jun 2019 18:45:12 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1559785512; cv=none; d=google.com; s=arc-20160816; b=fyRTPluJXtQg6sC/mUQdC2+fGwc8x536CCObfzZ89XQbKH58OgBEpIQqB3ZxOqpGPX 2cvglbLkDXq2UlA/AH6F5/sJ1OG12CxJRFdL0hHYWrQC+Vf2Qqeb+xT8DI7K1m/wcZhP 5zYSTjkHAiyseDSsbDhydlA2YNeDDaej8z+x/TzWBEbH9DYaTcN8OYitge1fU+IMTcr0 dqIW7k9eNEI34/xqdlcdpb0vgp+Oq8pRYvkW2fqr1WfXFCdjL7Pmw0MdrBeMZKoG/tGx jgMSe9vr9/IOWlvO23+HmWdVNOVaDv0xiHMgFtgXVJJRw5wnJxMYYJutwsh2iH388baG /7Bw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from; bh=RwseoB0hw/rDqmwrfSdhujbgyOh6rWSvNFjMF8DwG0o=; b=TH2xLDxWbpNOC2azgZgjCUSNzyOxCm7BcVJMOUc6lduiGUezmU3q1szKhyAKwxlRYQ wUgPV/Becx1BZwXNiWSllHd47oZrRKwynhyG968sf5jDY+sL1tdNt1KcdL+yUx8+gqi7 73TbCeGgTOUZuhoJQO+kdW+mWVorLAiwtfAn53MalJ1tSzYYaropJy406EV5w2IoVwPF Wk7ubAywu6p1pDI8oHaxdfeCmqF5cKL6YP3h7LsoLp8SCASM4/+2Rgm14ZLuDDVnXQm1 9W2XZbtkf32IUOopE+OD/YJlXzil6yTcy563xL/FqxHYL5GkRjh29grrRqRBf4vScLSE 4r7A== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: domain of ira.weiny@intel.com designates 134.134.136.100 as permitted sender) smtp.mailfrom=ira.weiny@intel.com; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=intel.com Received: from mga07.intel.com (mga07.intel.com. [134.134.136.100]) by mx.google.com with ESMTPS id k18si276921pfk.103.2019.06.05.18.45.11 for (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Wed, 05 Jun 2019 18:45:12 -0700 (PDT) Received-SPF: pass (google.com: domain of ira.weiny@intel.com designates 134.134.136.100 as permitted sender) client-ip=134.134.136.100; Authentication-Results: mx.google.com; spf=pass (google.com: domain of ira.weiny@intel.com designates 134.134.136.100 as permitted sender) smtp.mailfrom=ira.weiny@intel.com; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=intel.com X-Amp-Result: SKIPPED(no attachment in message) X-Amp-File-Uploaded: False Received: from orsmga002.jf.intel.com ([10.7.209.21]) by orsmga105.jf.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 05 Jun 2019 18:45:11 -0700 X-ExtLoop1: 1 Received: from iweiny-desk2.sc.intel.com ([10.3.52.157]) by orsmga002.jf.intel.com with ESMTP; 05 Jun 2019 18:45:11 -0700 From: ira.weiny@intel.com To: Dan Williams , Jan Kara , "Theodore Ts'o" , Jeff Layton , Dave Chinner Cc: Ira Weiny , Matthew Wilcox , linux-xfs@vger.kernel.org, Andrew Morton , John Hubbard , =?utf-8?b?SsOpcsO0bWUgR2xpc3Nl?= , linux-fsdevel@vger.kernel.org, linux-kernel@vger.kernel.org, linux-nvdimm@lists.01.org, linux-ext4@vger.kernel.org, linux-mm@kvack.org Subject: [PATCH RFC 02/10] fs/locks: Export F_LAYOUT lease to user space Date: Wed, 5 Jun 2019 18:45:35 -0700 Message-Id: <20190606014544.8339-3-ira.weiny@intel.com> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20190606014544.8339-1-ira.weiny@intel.com> References: <20190606014544.8339-1-ira.weiny@intel.com> MIME-Version: 1.0 X-Bogosity: Ham, tests=bogofilter, spamicity=0.000000, version=1.2.4 Sender: owner-linux-mm@kvack.org Precedence: bulk X-Loop: owner-majordomo@kvack.org List-ID: X-Virus-Scanned: ClamAV using ClamSMTP From: Ira Weiny GUP longterm pins of non-pagecache file system pages (eg FS DAX) are currently disallowed because they are unsafe. The danger for pinning these pages comes from the fact that hole punch and/or truncate of those files results in the pages being mapped and pinned by a user space process while DAX has potentially allocated those pages to other processes. Most (All) users who are mapping FS DAX pages for long term pin purposes (such as RDMA) are not going to want to deallocate these pages while those pages are in use. To do so would mean the application would lose data. So the use case for allowing truncate operations of such pages is limited. However, the kernel must protect itself and users from potential mistakes and/or malicious user space code. Rather than disabling long term pins as is done now. Allow for users who know they are going to be pinning this memory to alert the file system of this intention. Furthermore, allow users to be alerted such that they can react if a truncate operation occurs for some reason. Example user space pseudocode for a user using RDMA and wanting to allow a truncate would look like this: lease_break_sigio_handler() { ... if (sigio.fd == rdma_fd) { complete_rdma_operations(...); ibv_dereg_mr(mr); close(rdma_fd); fcntl(rdma_fd, F_SETLEASE, F_UNLCK); } } setup_rdma_to_dax_file() { ... rdma_fd = open(...) fcntl(rdma_fd, F_SETLEASE, F_LAYOUT); sigaction(SIGIO, ... lease_break ...); ptr = mmap(rdma_fd, ...); mr = ibv_reg_mr(ptr, ...); do_rdma_stuff(...); } Follow on patches implement the notification of the lease holder on truncate as well as failing the truncate if the GUP pin is not released. This first patch exports the F_LAYOUT lease type and allows the user to set and get it. After the complete series: 1) Failure to obtain a F_LAYOUT lease on an open FS DAX file will result in a failure to GUP pin any pages in that file. An example of a call which results in GUP pin is ibv_reg_mr(). 2) While the GUP pin is in place (eg MR is in use) truncates of the affected pages will fail. 3) If the user registers a sigaction they will be notified of the truncate so they can react. Failure to react will result in the lease being revoked after /lease-break-time seconds. After this time new GUP pins will fail without a new lease being taken. 4) A truncate will work if the pages being truncated are not actively pinned at the time of truncate. Attempts to pin these pages after will result in a failure. Signed-off-by: Ira Weiny --- fs/locks.c | 36 +++++++++++++++++++++++++++----- include/linux/fs.h | 2 +- include/uapi/asm-generic/fcntl.h | 3 +++ 3 files changed, 35 insertions(+), 6 deletions(-) diff --git a/fs/locks.c b/fs/locks.c index 0cc2b9f30e22..de9761c068de 100644 --- a/fs/locks.c +++ b/fs/locks.c @@ -191,6 +191,8 @@ static int target_leasetype(struct file_lock *fl) return F_UNLCK; if (fl->fl_flags & FL_DOWNGRADE_PENDING) return F_RDLCK; + if (fl->fl_flags & FL_LAYOUT) + return F_LAYOUT; return fl->fl_type; } @@ -611,7 +613,8 @@ static const struct lock_manager_operations lease_manager_ops = { /* * Initialize a lease, use the default lock manager operations */ -static int lease_init(struct file *filp, long type, struct file_lock *fl) +static int lease_init(struct file *filp, long type, unsigned int flags, + struct file_lock *fl) { if (assign_type(fl, type) != 0) return -EINVAL; @@ -621,6 +624,8 @@ static int lease_init(struct file *filp, long type, struct file_lock *fl) fl->fl_file = filp; fl->fl_flags = FL_LEASE; + if (flags & FL_LAYOUT) + fl->fl_flags |= FL_LAYOUT; fl->fl_start = 0; fl->fl_end = OFFSET_MAX; fl->fl_ops = NULL; @@ -629,7 +634,8 @@ static int lease_init(struct file *filp, long type, struct file_lock *fl) } /* Allocate a file_lock initialised to this type of lease */ -static struct file_lock *lease_alloc(struct file *filp, long type) +static struct file_lock *lease_alloc(struct file *filp, long type, + unsigned int flags) { struct file_lock *fl = locks_alloc_lock(); int error = -ENOMEM; @@ -637,7 +643,7 @@ static struct file_lock *lease_alloc(struct file *filp, long type) if (fl == NULL) return ERR_PTR(error); - error = lease_init(filp, type, fl); + error = lease_init(filp, type, flags, fl); if (error) { locks_free_lock(fl); return ERR_PTR(error); @@ -1588,7 +1594,7 @@ int __break_lease(struct inode *inode, unsigned int mode, unsigned int type) int want_write = (mode & O_ACCMODE) != O_RDONLY; LIST_HEAD(dispose); - new_fl = lease_alloc(NULL, want_write ? F_WRLCK : F_RDLCK); + new_fl = lease_alloc(NULL, want_write ? F_WRLCK : F_RDLCK, 0); if (IS_ERR(new_fl)) return PTR_ERR(new_fl); new_fl->fl_flags = type; @@ -1725,6 +1731,8 @@ EXPORT_SYMBOL(lease_get_mtime); * * %F_UNLCK to indicate no lease is held. * + * %F_LAYOUT to indicate a layout lease is held. + * * (if a lease break is pending): * * %F_RDLCK to indicate an exclusive lease needs to be @@ -2015,8 +2023,26 @@ static int do_fcntl_add_lease(unsigned int fd, struct file *filp, long arg) struct file_lock *fl; struct fasync_struct *new; int error; + unsigned int flags = 0; + + /* + * NOTE on F_LAYOUT lease + * + * LAYOUT lease types are taken on files which the user knows that + * they will be pinning in memory for some indeterminate amount of + * time. Such as for use with RDMA. While we don't know what user + * space is going to do with the file we still use a F_RDLOCK level of + * lease. This ensures that there are no conflicts between + * 2 users. The conflict should only come from the File system wanting + * to revoke the lease in break_layout() And this is done by using + * F_WRLCK in the break code. + */ + if (arg == F_LAYOUT) { + arg = F_RDLCK; + flags = FL_LAYOUT; + } - fl = lease_alloc(filp, arg); + fl = lease_alloc(filp, arg, flags); if (IS_ERR(fl)) return PTR_ERR(fl); diff --git a/include/linux/fs.h b/include/linux/fs.h index f7fdfe93e25d..9e9d8d35ee93 100644 --- a/include/linux/fs.h +++ b/include/linux/fs.h @@ -998,7 +998,7 @@ static inline struct file *get_file(struct file *f) #define FL_DOWNGRADE_PENDING 256 /* Lease is being downgraded */ #define FL_UNLOCK_PENDING 512 /* Lease is being broken */ #define FL_OFDLCK 1024 /* lock is "owned" by struct file */ -#define FL_LAYOUT 2048 /* outstanding pNFS layout */ +#define FL_LAYOUT 2048 /* outstanding pNFS layout or user held pin */ #define FL_CLOSE_POSIX (FL_POSIX | FL_CLOSE) diff --git a/include/uapi/asm-generic/fcntl.h b/include/uapi/asm-generic/fcntl.h index 9dc0bf0c5a6e..baddd54f3031 100644 --- a/include/uapi/asm-generic/fcntl.h +++ b/include/uapi/asm-generic/fcntl.h @@ -174,6 +174,9 @@ struct f_owner_ex { #define F_SHLCK 8 /* or 4 */ #endif +#define F_LAYOUT 16 /* layout lease to allow longterm pins such as + RDMA */ + /* operations for bsd flock(), also used by the kernel implementation */ #define LOCK_SH 1 /* shared lock */ #define LOCK_EX 2 /* exclusive lock */ From patchwork Thu Jun 6 01:45:36 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Ira Weiny X-Patchwork-Id: 10978213 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id A1D5614E5 for ; Thu, 6 Jun 2019 01:45:21 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 921A228786 for ; Thu, 6 Jun 2019 01:45:21 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 85FA5287AD; Thu, 6 Jun 2019 01:45:21 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-2.9 required=2.0 tests=BAYES_00,MAILING_LIST_MULTI, RCVD_IN_DNSWL_NONE autolearn=unavailable version=3.3.1 Received: from kanga.kvack.org (kanga.kvack.org [205.233.56.17]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 1716F287A9 for ; Thu, 6 Jun 2019 01:45:21 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id 76FA86B0271; Wed, 5 Jun 2019 21:45:15 -0400 (EDT) Delivered-To: linux-mm-outgoing@kvack.org Received: by kanga.kvack.org (Postfix, from userid 40) id 6AB556B0272; Wed, 5 Jun 2019 21:45:15 -0400 (EDT) X-Original-To: int-list-linux-mm@kvack.org X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 4AE006B0273; Wed, 5 Jun 2019 21:45:15 -0400 (EDT) X-Original-To: linux-mm@kvack.org X-Delivered-To: linux-mm@kvack.org Received: from mail-pl1-f199.google.com (mail-pl1-f199.google.com [209.85.214.199]) by kanga.kvack.org (Postfix) with ESMTP id 0E7196B0271 for ; Wed, 5 Jun 2019 21:45:15 -0400 (EDT) Received: by mail-pl1-f199.google.com with SMTP id 91so515748pla.7 for ; Wed, 05 Jun 2019 18:45:15 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-original-authentication-results:x-gm-message-state:from:to:cc :subject:date:message-id:in-reply-to:references:mime-version :content-transfer-encoding; bh=s7DWfafskOgsiBfZmagZult6DZudLkXSYifUFY2yeVQ=; b=Ujy0EVw/2mNN2DFgMz/atwOSxr8VWPkBUeTKSO3yZaXintHebkKVoaS2rwMzseSSXv 2mAu8gjY/PoiFY09a8M5EHjJQaRiPJwpUKLCjriEd4Gy/ziEkxt8q1p0IJQvo+7OQjup n5p9dFRRo46Qn6aoqO57ZWshyh1Zu0wb9zQpVK39EH6UbRTaB410pL4YSbzWGT6vLxWF xmFOfxHpzOhVEuajsO74P4pVhDnaYvs7XP1xpWIFcqSxBQG80+kGdHWTRMMV1K0N63mC n169bfGsmRzyHXwgvIZFmpzIaakRRagFweItefZJg/MWSqBV69eBgHd3sU2s1L0uVZXU QuDA== X-Original-Authentication-Results: mx.google.com; spf=pass (google.com: domain of ira.weiny@intel.com designates 134.134.136.100 as permitted sender) smtp.mailfrom=ira.weiny@intel.com; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=intel.com X-Gm-Message-State: APjAAAV8oSGuzrddlRb0LWopvgvTALbIM8Z7b+WUOONhu8VgssRkpNd6 lkjjIAYnPL5ctJTiT2v04ijtYGTSQLj6kq0Xz6gFUmqyD58o5SEMXxKWlxqbpRmV/TFG2PVhXCa jpim61DJlHE6pjxyIJYAQU+2rRSMazfZjk2IR1kE47Rb8mzoR2nvIbyKQbjBj8sgUgQ== X-Received: by 2002:a62:ac1a:: with SMTP id v26mr28070745pfe.184.1559785514723; Wed, 05 Jun 2019 18:45:14 -0700 (PDT) X-Google-Smtp-Source: APXvYqy791Qekwah8qsDN999usWnttKWNu08NFoNrveBohg2d2xJpskMelhybVa6krn8PWtoaSjJ X-Received: by 2002:a62:ac1a:: with SMTP id v26mr28070693pfe.184.1559785513982; Wed, 05 Jun 2019 18:45:13 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1559785513; cv=none; d=google.com; s=arc-20160816; b=sIIcOG+IlKgOxQcSUG4yI5sWbKtF/wk18fM2OiBVFx/F6EAmb5fBPnF1LKh5ApEyKA LWHtMK9jDMycKTH96Gk0xEymRDllxoYupqEgQYL5QzOORWmYZoqm7GqJkoImRw+iebXF YRtrqCoMDl+ZWYT6rE2o8xFXJyX4BKWpvPgs8tg3KHmj3nT800L41GaC+3wNouZ7XGpY ck890+9TamZvC9QWEwtEyil9rAwvCHvRNHZUQm5qiAgZ5mg4G/VNMQE8aMNcjba2NFGY GXSh0tcwjbv5tH4BqU6TbWp+QqUWr6CZ9VqW4SwesK73K41+5DesQqkp9Iv6/ANO6Fls tjyw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from; bh=s7DWfafskOgsiBfZmagZult6DZudLkXSYifUFY2yeVQ=; b=fxQB6oIOdV3vXoSwxRz2/0rFpYNyXTotk6gziUB2fFpXD+bj54B4P+V4bHsQoY86WX 4wT8NCwbsrAMZPHWYyqbUTTvYr3ojWNIRrey5p2BY0LeKipgkiefh/Aq1MchXfOXl8dN FvA6aJAnmWulYaTykPAwbygwp582w12hnRfFxUzrA6v4mSQ2BPvSndUj4F9AbKOtoQV/ Le9LS93aCxYl5LCOJyC0uxlRPa7TpRULQOx9fMNo8O/KvybAzndqwgNj9hPLr6kPe9Hi dgHigvky7syx6vQR98XrGEsusINRRdj8U4sLe6thv0qnLZY+jGe70mLEtE+3Dm0sD+u/ IKVg== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: domain of ira.weiny@intel.com designates 134.134.136.100 as permitted sender) smtp.mailfrom=ira.weiny@intel.com; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=intel.com Received: from mga07.intel.com (mga07.intel.com. [134.134.136.100]) by mx.google.com with ESMTPS id k18si276921pfk.103.2019.06.05.18.45.13 for (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Wed, 05 Jun 2019 18:45:13 -0700 (PDT) Received-SPF: pass (google.com: domain of ira.weiny@intel.com designates 134.134.136.100 as permitted sender) client-ip=134.134.136.100; Authentication-Results: mx.google.com; spf=pass (google.com: domain of ira.weiny@intel.com designates 134.134.136.100 as permitted sender) smtp.mailfrom=ira.weiny@intel.com; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=intel.com X-Amp-Result: SKIPPED(no attachment in message) X-Amp-File-Uploaded: False Received: from orsmga002.jf.intel.com ([10.7.209.21]) by orsmga105.jf.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 05 Jun 2019 18:45:13 -0700 X-ExtLoop1: 1 Received: from iweiny-desk2.sc.intel.com ([10.3.52.157]) by orsmga002.jf.intel.com with ESMTP; 05 Jun 2019 18:45:12 -0700 From: ira.weiny@intel.com To: Dan Williams , Jan Kara , "Theodore Ts'o" , Jeff Layton , Dave Chinner Cc: Ira Weiny , Matthew Wilcox , linux-xfs@vger.kernel.org, Andrew Morton , John Hubbard , =?utf-8?b?SsOpcsO0bWUgR2xpc3Nl?= , linux-fsdevel@vger.kernel.org, linux-kernel@vger.kernel.org, linux-nvdimm@lists.01.org, linux-ext4@vger.kernel.org, linux-mm@kvack.org Subject: [PATCH RFC 03/10] mm/gup: Pass flags down to __gup_device_huge* calls Date: Wed, 5 Jun 2019 18:45:36 -0700 Message-Id: <20190606014544.8339-4-ira.weiny@intel.com> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20190606014544.8339-1-ira.weiny@intel.com> References: <20190606014544.8339-1-ira.weiny@intel.com> MIME-Version: 1.0 X-Bogosity: Ham, tests=bogofilter, spamicity=0.000000, version=1.2.4 Sender: owner-linux-mm@kvack.org Precedence: bulk X-Loop: owner-majordomo@kvack.org List-ID: X-Virus-Scanned: ClamAV using ClamSMTP From: Ira Weiny In order to support checking for a layout lease on a FS DAX inode these calls need to know if FOLL_LONGTERM was specified. Prepare for this with this patch. Signed-off-by: Ira Weiny --- mm/gup.c | 26 +++++++++++++++++--------- 1 file changed, 17 insertions(+), 9 deletions(-) diff --git a/mm/gup.c b/mm/gup.c index a3fb48605836..26a7a3a3a657 100644 --- a/mm/gup.c +++ b/mm/gup.c @@ -1939,7 +1939,8 @@ static int gup_pte_range(pmd_t pmd, unsigned long addr, unsigned long end, #if defined(__HAVE_ARCH_PTE_DEVMAP) && defined(CONFIG_TRANSPARENT_HUGEPAGE) static int __gup_device_huge(unsigned long pfn, unsigned long addr, - unsigned long end, struct page **pages, int *nr) + unsigned long end, struct page **pages, int *nr, + unsigned int flags) { int nr_start = *nr; struct dev_pagemap *pgmap = NULL; @@ -1969,30 +1970,33 @@ static int __gup_device_huge(unsigned long pfn, unsigned long addr, } static int __gup_device_huge_pmd(pmd_t orig, pmd_t *pmdp, unsigned long addr, - unsigned long end, struct page **pages, int *nr) + unsigned long end, struct page **pages, int *nr, + unsigned int flags) { unsigned long fault_pfn; int nr_start = *nr; fault_pfn = pmd_pfn(orig) + ((addr & ~PMD_MASK) >> PAGE_SHIFT); - if (!__gup_device_huge(fault_pfn, addr, end, pages, nr)) + if (!__gup_device_huge(fault_pfn, addr, end, pages, nr, flags)) return 0; if (unlikely(pmd_val(orig) != pmd_val(*pmdp))) { undo_dev_pagemap(nr, nr_start, pages); return 0; } + return 1; } static int __gup_device_huge_pud(pud_t orig, pud_t *pudp, unsigned long addr, - unsigned long end, struct page **pages, int *nr) + unsigned long end, struct page **pages, int *nr, + unsigned int flags) { unsigned long fault_pfn; int nr_start = *nr; fault_pfn = pud_pfn(orig) + ((addr & ~PUD_MASK) >> PAGE_SHIFT); - if (!__gup_device_huge(fault_pfn, addr, end, pages, nr)) + if (!__gup_device_huge(fault_pfn, addr, end, pages, nr, flags)) return 0; if (unlikely(pud_val(orig) != pud_val(*pudp))) { @@ -2003,14 +2007,16 @@ static int __gup_device_huge_pud(pud_t orig, pud_t *pudp, unsigned long addr, } #else static int __gup_device_huge_pmd(pmd_t orig, pmd_t *pmdp, unsigned long addr, - unsigned long end, struct page **pages, int *nr) + unsigned long end, struct page **pages, int *nr, + unsigned int flags) { BUILD_BUG(); return 0; } static int __gup_device_huge_pud(pud_t pud, pud_t *pudp, unsigned long addr, - unsigned long end, struct page **pages, int *nr) + unsigned long end, struct page **pages, int *nr, + unsigned int flags) { BUILD_BUG(); return 0; @@ -2029,7 +2035,8 @@ static int gup_huge_pmd(pmd_t orig, pmd_t *pmdp, unsigned long addr, if (pmd_devmap(orig)) { if (unlikely(flags & FOLL_LONGTERM)) return 0; - return __gup_device_huge_pmd(orig, pmdp, addr, end, pages, nr); + return __gup_device_huge_pmd(orig, pmdp, addr, end, pages, nr, + flags); } refs = 0; @@ -2072,7 +2079,8 @@ static int gup_huge_pud(pud_t orig, pud_t *pudp, unsigned long addr, if (pud_devmap(orig)) { if (unlikely(flags & FOLL_LONGTERM)) return 0; - return __gup_device_huge_pud(orig, pudp, addr, end, pages, nr); + return __gup_device_huge_pud(orig, pudp, addr, end, pages, nr, + flags); } refs = 0; From patchwork Thu Jun 6 01:45:37 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Ira Weiny X-Patchwork-Id: 10978223 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id 3FF8515E6 for ; Thu, 6 Jun 2019 01:45:24 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 3155028783 for ; Thu, 6 Jun 2019 01:45:24 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 2591428796; Thu, 6 Jun 2019 01:45:24 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-2.9 required=2.0 tests=BAYES_00,MAILING_LIST_MULTI, RCVD_IN_DNSWL_NONE autolearn=unavailable version=3.3.1 Received: from kanga.kvack.org (kanga.kvack.org [205.233.56.17]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 90DC3287AD for ; Thu, 6 Jun 2019 01:45:23 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id DB2A76B0272; Wed, 5 Jun 2019 21:45:17 -0400 (EDT) Delivered-To: linux-mm-outgoing@kvack.org Received: by kanga.kvack.org (Postfix, from userid 40) id C76B96B0273; Wed, 5 Jun 2019 21:45:17 -0400 (EDT) X-Original-To: int-list-linux-mm@kvack.org X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id AC7CF6B0274; Wed, 5 Jun 2019 21:45:17 -0400 (EDT) X-Original-To: linux-mm@kvack.org X-Delivered-To: linux-mm@kvack.org Received: from mail-pf1-f200.google.com (mail-pf1-f200.google.com [209.85.210.200]) by kanga.kvack.org (Postfix) with ESMTP id 6E51F6B0272 for ; Wed, 5 Jun 2019 21:45:17 -0400 (EDT) Received: by mail-pf1-f200.google.com with SMTP id f9so665733pfn.6 for ; Wed, 05 Jun 2019 18:45:17 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-original-authentication-results:x-gm-message-state:from:to:cc :subject:date:message-id:in-reply-to:references:mime-version :content-transfer-encoding; bh=cJXDXTe4LEXK71E9x18N/OOUKaBMgZQnZxMV1+LS/IU=; b=RSuV3lr+BaVeq39vFiyIKky8dHcwrS7fGoUWscfxrkN0R5VJF+CcJf5TrmqcUhzlBE u86bqOae6/4b9VmG8k3Leu0W2u0xoFZteAwPr4EpajO0s8EztX7yR+Gmn5uDeK72Exex K9ywE4TbAZE4qWe/WB5sZV6+E2Tmr+QHO450vCN4br3utMSw4ZLziKWQds9O4CYKXRhZ WakloIeLJZKbwlgfPBWWN4FwTIwOjQeffwtssmVjgPgq4e8XKaCkz3pvrMW7zPg1Q8V1 GIXO5ywiqJ7KY+OTWsIvwgshWbGcXmFGPp5Em3wGej92h1+kPwVyyoMwak2hHi4xDBkx x5oQ== X-Original-Authentication-Results: mx.google.com; spf=pass (google.com: domain of ira.weiny@intel.com designates 134.134.136.100 as permitted sender) smtp.mailfrom=ira.weiny@intel.com; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=intel.com X-Gm-Message-State: APjAAAVHFOkUBH4bPiT1WKM0TJ8t0wWXsOs2Cgiyj0y0M31gRe1m7+Cm 1Ii5hHIsdqHYfJExqfSDmw0t0EWSuDYms/7ZAdT4UNbmxuh8yD+5xsc5LesajK2aYxtXTkKSu4V FYNzyIEJ2ROfxr5c0quWVQyUJf8BKnGESxN2quEMdb4PplZq6qwqU9O5xCnf+O3JoRw== X-Received: by 2002:a17:902:8204:: with SMTP id x4mr46743227pln.226.1559785517099; Wed, 05 Jun 2019 18:45:17 -0700 (PDT) X-Google-Smtp-Source: APXvYqwlmJY/+zxKrcOAYHA6KYwkysTMN4s2A+2XhAKCrj857SJWE73cnBoAEUiatwJYa013TDtL X-Received: by 2002:a17:902:8204:: with SMTP id x4mr46743148pln.226.1559785515851; Wed, 05 Jun 2019 18:45:15 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1559785515; cv=none; d=google.com; s=arc-20160816; b=gjuqaXdqY5KguU4yncsjNYOyAJC8a2xpudOMW1j5efplBYCNADpI5j4ztqICsKAwen 9fbw15VMAzq13ZXOs42gdZd2lJx31vznutxH1VTLgOcdx/3BjxwBVbEY873RGvBQ0I/U +GUtuge3Xgv3MbKOcfp1o0gdB6fPj9QgRap+gIE/Uhxyz+f1cFiXLXXOzJuAYcysGvWK 7ewtKTES27r4oyTcqwvYa9XG3cWLIoRLdsTWIEH45emx5g58Mw/cfaoeFyprt26f4/HM +aO1c5pOixbp7xioKFjY5mYf5HvqRm4MnYLVjAO3uMRgQV5GikYgbDHCj6a/vt92Wypj wvSA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from; bh=cJXDXTe4LEXK71E9x18N/OOUKaBMgZQnZxMV1+LS/IU=; b=hXd4Jc31K9ct+gdK8HmrqLjmJxZt2LQ0lycd3ig4L83iWu8oeenrhqwY3OICYMx+35 Hf0LINIUg/UGCVw23fKBYSKhbvWR7MrCMLJHDUm+3HKeef1GqTRewHYd0malioWmqYQv owz6urIJV+OnVhCICWpq7iN6KsV652KCFndWv7AWIgJiLBG61LIe1FqG9o3MjK6E4shv xwa5oSUlsagUiDik+POAQvM6BzLPCjiNsRqidxaRkV7R+cszGrvUwNPMeBqFDYXp7yaq 1FRQj/GvoDkNJqtoQ8OSD3+2vuwZJMNq8wTjmL0X5FYXsDtCoK/Q6uR7a04ls9iD3CMi llFw== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: domain of ira.weiny@intel.com designates 134.134.136.100 as permitted sender) smtp.mailfrom=ira.weiny@intel.com; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=intel.com Received: from mga07.intel.com (mga07.intel.com. [134.134.136.100]) by mx.google.com with ESMTPS id k18si276921pfk.103.2019.06.05.18.45.15 for (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Wed, 05 Jun 2019 18:45:15 -0700 (PDT) Received-SPF: pass (google.com: domain of ira.weiny@intel.com designates 134.134.136.100 as permitted sender) client-ip=134.134.136.100; Authentication-Results: mx.google.com; spf=pass (google.com: domain of ira.weiny@intel.com designates 134.134.136.100 as permitted sender) smtp.mailfrom=ira.weiny@intel.com; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=intel.com X-Amp-Result: SKIPPED(no attachment in message) X-Amp-File-Uploaded: False Received: from orsmga002.jf.intel.com ([10.7.209.21]) by orsmga105.jf.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 05 Jun 2019 18:45:15 -0700 X-ExtLoop1: 1 Received: from iweiny-desk2.sc.intel.com ([10.3.52.157]) by orsmga002.jf.intel.com with ESMTP; 05 Jun 2019 18:45:14 -0700 From: ira.weiny@intel.com To: Dan Williams , Jan Kara , "Theodore Ts'o" , Jeff Layton , Dave Chinner Cc: Ira Weiny , Matthew Wilcox , linux-xfs@vger.kernel.org, Andrew Morton , John Hubbard , =?utf-8?b?SsOpcsO0bWUgR2xpc3Nl?= , linux-fsdevel@vger.kernel.org, linux-kernel@vger.kernel.org, linux-nvdimm@lists.01.org, linux-ext4@vger.kernel.org, linux-mm@kvack.org Subject: [PATCH RFC 04/10] mm/gup: Ensure F_LAYOUT lease is held prior to GUP'ing pages Date: Wed, 5 Jun 2019 18:45:37 -0700 Message-Id: <20190606014544.8339-5-ira.weiny@intel.com> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20190606014544.8339-1-ira.weiny@intel.com> References: <20190606014544.8339-1-ira.weiny@intel.com> MIME-Version: 1.0 X-Bogosity: Ham, tests=bogofilter, spamicity=0.000000, version=1.2.4 Sender: owner-linux-mm@kvack.org Precedence: bulk X-Loop: owner-majordomo@kvack.org List-ID: X-Virus-Scanned: ClamAV using ClamSMTP From: Ira Weiny On FS DAX files users must inform the file system they intend to take long term GUP pins on the file pages. Failure to do so should result in an error. Ensure that a F_LAYOUT lease exists at the time the GUP call is made. If not return EPERM. Signed-off-by: Ira Weiny --- fs/locks.c | 41 +++++++++++++++++++++++++++++++++++++++++ include/linux/mm.h | 2 ++ mm/gup.c | 25 +++++++++++++++++++++++++ mm/huge_memory.c | 12 ++++++++++++ 4 files changed, 80 insertions(+) diff --git a/fs/locks.c b/fs/locks.c index de9761c068de..43f5dc97652c 100644 --- a/fs/locks.c +++ b/fs/locks.c @@ -2945,3 +2945,44 @@ static int __init filelock_init(void) return 0; } core_initcall(filelock_init); + +/** + * mapping_inode_has_layout() + * @page page we are trying to GUP + * + * This should only be called on DAX pages. DAX pages which are mapped through + * FS DAX do not use the page cache. As a result they require the user to take + * a LAYOUT lease on them prior to be able to pin them for longterm use. + * This allows the user to opt-into the fact that truncation operations will + * fail for the duration of the pin. + * + * @Return true if the page has a LAYOUT lease associated with it's file. + */ +bool mapping_inode_has_layout(struct page *page) +{ + bool ret = false; + struct inode *inode; + struct file_lock *fl; + struct file_lock_context *ctx; + + if (WARN_ON(PageAnon(page)) || + WARN_ON(!page) || + WARN_ON(!page->mapping) || + WARN_ON(!page->mapping->host)) + return false; + + inode = page->mapping->host; + + ctx = locks_get_lock_context(inode, F_RDLCK); + spin_lock(&ctx->flc_lock); + list_for_each_entry(fl, &ctx->flc_lease, fl_list) { + if (fl->fl_flags & FL_LAYOUT) { + ret = true; + break; + } + } + spin_unlock(&ctx->flc_lock); + + return ret; +} +EXPORT_SYMBOL_GPL(mapping_inode_has_layout); diff --git a/include/linux/mm.h b/include/linux/mm.h index bc373a9b69fc..432b004b920c 100644 --- a/include/linux/mm.h +++ b/include/linux/mm.h @@ -1630,6 +1630,8 @@ long get_user_pages_unlocked(unsigned long start, unsigned long nr_pages, int get_user_pages_fast(unsigned long start, int nr_pages, unsigned int gup_flags, struct page **pages); +bool mapping_inode_has_layout(struct page *page); + /* Container for pinned pfns / pages */ struct frame_vector { unsigned int nr_allocated; /* Number of frames we have space for */ diff --git a/mm/gup.c b/mm/gup.c index 26a7a3a3a657..d06cc5b14c0b 100644 --- a/mm/gup.c +++ b/mm/gup.c @@ -361,6 +361,13 @@ static struct page *follow_page_pte(struct vm_area_struct *vma, page = pte_page(pte); else goto no_page; + + if (unlikely(flags & FOLL_LONGTERM) && + (*pgmap)->type == MEMORY_DEVICE_FS_DAX && + !mapping_inode_has_layout(page)) { + page = ERR_PTR(-EPERM); + goto out; + } } else if (unlikely(!page)) { if (flags & FOLL_DUMP) { /* Avoid special (like zero) pages in core dumps */ @@ -1905,6 +1912,16 @@ static int gup_pte_range(pmd_t pmd, unsigned long addr, unsigned long end, VM_BUG_ON_PAGE(compound_head(page) != head, page); + if (pte_devmap(pte) && + unlikely(flags & FOLL_LONGTERM) && + pgmap->type == MEMORY_DEVICE_FS_DAX && + !mapping_inode_has_layout(head)) { + mod_node_page_state(page_pgdat(head), + NR_GUP_FAST_PAGE_BACKOFFS, 1); + put_user_page(head); + goto pte_unmap; + } + SetPageReferenced(page); pages[*nr] = page; (*nr)++; @@ -1955,6 +1972,14 @@ static int __gup_device_huge(unsigned long pfn, unsigned long addr, } SetPageReferenced(page); pages[*nr] = page; + + if (unlikely(flags & FOLL_LONGTERM) && + pgmap->type == MEMORY_DEVICE_FS_DAX && + !mapping_inode_has_layout(page)) { + undo_dev_pagemap(nr, nr_start, pages); + return 0; + } + if (try_get_gup_pin_page(page, NR_GUP_FAST_PAGES_REQUESTED)) { undo_dev_pagemap(nr, nr_start, pages); return 0; diff --git a/mm/huge_memory.c b/mm/huge_memory.c index bb7fd7fa6f77..cdc213e50902 100644 --- a/mm/huge_memory.c +++ b/mm/huge_memory.c @@ -950,6 +950,12 @@ struct page *follow_devmap_pmd(struct vm_area_struct *vma, unsigned long addr, if (!*pgmap) return ERR_PTR(-EFAULT); page = pfn_to_page(pfn); + + if (unlikely(flags & FOLL_LONGTERM) && + (*pgmap)->type == MEMORY_DEVICE_FS_DAX && + !mapping_inode_has_layout(page)) + return ERR_PTR(-EPERM); + if (unlikely(!try_get_gup_pin_page(page, NR_GUP_SLOW_PAGES_REQUESTED))) page = ERR_PTR(-ENOMEM); @@ -1092,6 +1098,12 @@ struct page *follow_devmap_pud(struct vm_area_struct *vma, unsigned long addr, if (!*pgmap) return ERR_PTR(-EFAULT); page = pfn_to_page(pfn); + + if (unlikely(flags & FOLL_LONGTERM) && + (*pgmap)->type == MEMORY_DEVICE_FS_DAX && + !mapping_inode_has_layout(page)) + return ERR_PTR(-EPERM); + if (unlikely(!try_get_gup_pin_page(page, NR_GUP_SLOW_PAGES_REQUESTED))) page = ERR_PTR(-ENOMEM); From patchwork Thu Jun 6 01:45:38 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Ira Weiny X-Patchwork-Id: 10978227 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id D448D15E6 for ; Thu, 6 Jun 2019 01:45:26 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id C0E28212BE for ; Thu, 6 Jun 2019 01:45:26 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id B5136212D5; Thu, 6 Jun 2019 01:45:26 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-2.9 required=2.0 tests=BAYES_00,MAILING_LIST_MULTI, RCVD_IN_DNSWL_NONE autolearn=unavailable version=3.3.1 Received: from kanga.kvack.org (kanga.kvack.org [205.233.56.17]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 40ED82878E for ; Thu, 6 Jun 2019 01:45:26 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id 4D9256B0273; Wed, 5 Jun 2019 21:45:19 -0400 (EDT) Delivered-To: linux-mm-outgoing@kvack.org Received: by kanga.kvack.org (Postfix, from userid 40) id 39D696B0274; Wed, 5 Jun 2019 21:45:19 -0400 (EDT) X-Original-To: int-list-linux-mm@kvack.org X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 1A0596B0276; Wed, 5 Jun 2019 21:45:19 -0400 (EDT) X-Original-To: linux-mm@kvack.org X-Delivered-To: linux-mm@kvack.org Received: from mail-pf1-f200.google.com (mail-pf1-f200.google.com [209.85.210.200]) by kanga.kvack.org (Postfix) with ESMTP id D3CC56B0273 for ; Wed, 5 Jun 2019 21:45:18 -0400 (EDT) Received: by mail-pf1-f200.google.com with SMTP id x9so650804pfm.16 for ; Wed, 05 Jun 2019 18:45:18 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-original-authentication-results:x-gm-message-state:from:to:cc :subject:date:message-id:in-reply-to:references:mime-version :content-transfer-encoding; bh=IdcCczW9Vt2bMohG/KgLyShIIfT/XdZU8+3ISgkl6NY=; b=RfFJ11XlLYuN0ntNu3R5jFLVJOGVu2hRYkgvzKbG2XTRZuPL8XyiZQJZoBY5onHD4u vYmlclh6GMLdZdrbWjVZL5iGSWjodzKEePGucOqTDEk4u1NPvE9uCpurCh3SieaSuJx7 1MhObx5CzttOkYUuQqkl1lWLN3cHymcPdIdxxQwC1PIYKDgLv2pz3NhEVgfnREtBRyX0 sRmvLm4sk+OJ9nm+TEjPQxPsddYbHKdpJnggYCnuMtxxz+cz55bNyGPG2UohSdADHYtX Zle9nJH5KMBUsUil95ORzYxLVpe/lXpLOxmjEMViHXts84YRT39PTtPw4ujyz2Q+TxhR P9aA== X-Original-Authentication-Results: mx.google.com; spf=pass (google.com: domain of ira.weiny@intel.com designates 134.134.136.100 as permitted sender) smtp.mailfrom=ira.weiny@intel.com; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=intel.com X-Gm-Message-State: APjAAAUhaUBJ1cfMDvJg+RNXm9hLToq+UnwLfvmgzoMHRm74EBqkHsKP zQ+MZZ4q36Ccm4kLLW/HglPmgOICCKGqoVXgi9IJlq2AhEducF7SdactZnJeH8QBt04VcdPvjlY ZorEelqtOO6ZKd6qiJzKni6F1xdYG3LtsVmNXfXYtL9ce0Q7/lnhc3L0nrB/OIT2j7Q== X-Received: by 2002:a17:902:8f87:: with SMTP id z7mr21748412plo.65.1559785518523; Wed, 05 Jun 2019 18:45:18 -0700 (PDT) X-Google-Smtp-Source: APXvYqxq9OdwaMU2iDqfAgeDYWh/GwEHN1vHeBhUKLPpC0kQj051TE3JrplKTbWQHsQ2AIMN+Njy X-Received: by 2002:a17:902:8f87:: with SMTP id z7mr21748359plo.65.1559785517742; Wed, 05 Jun 2019 18:45:17 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1559785517; cv=none; d=google.com; s=arc-20160816; b=Zu32PpuJ0+Rc7ov5aYK+9szwESVq/+4hlGz9216XWFPfagqXwxqnI9ewteVdsgfCKv 8Qr1HkRfI9Lo2AyVDDo/xphuwgLReeGcSTCHrdJbtU7BjxZMegjWGsvy7kUBvly7vSO+ 3FZuVp8fe58LGAL3TJ7ZH1yRMPtPGmFFYpfREM4mOzs9mindwjy1skf7WevKGUxftwQ2 3p3OUFcGQZMGl7aVqpL9Xvdkig8SoRJqgvENGHNtt1g9HdKfx2dY97aq/SrszZx+Jz7B JKRuqY1qF0vHLrY69LYcdwAPxVgHBzLfGd3nyIekSaYRPUmp3qMrlwtfhGzuTBMMopC/ ryZQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from; bh=IdcCczW9Vt2bMohG/KgLyShIIfT/XdZU8+3ISgkl6NY=; b=ZwDP93zJQZ9ernMfxf4yeaDlXwdfzoZpyrkV/vr3OGJZVaoixYtxx+I4QJdw5mwajr dCiAdnAJF55CBSL6kt8qZ5O+VKFn6hilpleZzkGChPkZ2UY5MfY/pEKV/owzxxP4wc/8 sp/VGEDZLhsXC80XwYpyjqYuV6qy9O/J+bVN3mcrMnQ2WSsaQ+0hDZhqVcvvwWLKV3D3 6rIGUj14gd2OiKde1eCwTm0UrcEqKHGfJbySgNTU2gl//xwQQPSj+rI4yLgbTcCo/jvU 3LQcXH32cI1l3fIJJjHUgQbu5rtgp5841oG958juj6MAQ1YZKn+UrQtVJjQT18Y/owyT 9T7w== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: domain of ira.weiny@intel.com designates 134.134.136.100 as permitted sender) smtp.mailfrom=ira.weiny@intel.com; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=intel.com Received: from mga07.intel.com (mga07.intel.com. [134.134.136.100]) by mx.google.com with ESMTPS id k18si276921pfk.103.2019.06.05.18.45.17 for (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Wed, 05 Jun 2019 18:45:17 -0700 (PDT) Received-SPF: pass (google.com: domain of ira.weiny@intel.com designates 134.134.136.100 as permitted sender) client-ip=134.134.136.100; Authentication-Results: mx.google.com; spf=pass (google.com: domain of ira.weiny@intel.com designates 134.134.136.100 as permitted sender) smtp.mailfrom=ira.weiny@intel.com; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=intel.com X-Amp-Result: SKIPPED(no attachment in message) X-Amp-File-Uploaded: False Received: from orsmga002.jf.intel.com ([10.7.209.21]) by orsmga105.jf.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 05 Jun 2019 18:45:17 -0700 X-ExtLoop1: 1 Received: from iweiny-desk2.sc.intel.com ([10.3.52.157]) by orsmga002.jf.intel.com with ESMTP; 05 Jun 2019 18:45:16 -0700 From: ira.weiny@intel.com To: Dan Williams , Jan Kara , "Theodore Ts'o" , Jeff Layton , Dave Chinner Cc: Ira Weiny , Matthew Wilcox , linux-xfs@vger.kernel.org, Andrew Morton , John Hubbard , =?utf-8?b?SsOpcsO0bWUgR2xpc3Nl?= , linux-fsdevel@vger.kernel.org, linux-kernel@vger.kernel.org, linux-nvdimm@lists.01.org, linux-ext4@vger.kernel.org, linux-mm@kvack.org Subject: [PATCH RFC 05/10] fs/ext4: Teach ext4 to break layout leases Date: Wed, 5 Jun 2019 18:45:38 -0700 Message-Id: <20190606014544.8339-6-ira.weiny@intel.com> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20190606014544.8339-1-ira.weiny@intel.com> References: <20190606014544.8339-1-ira.weiny@intel.com> MIME-Version: 1.0 X-Bogosity: Ham, tests=bogofilter, spamicity=0.000000, version=1.2.4 Sender: owner-linux-mm@kvack.org Precedence: bulk X-Loop: owner-majordomo@kvack.org List-ID: X-Virus-Scanned: ClamAV using ClamSMTP From: Ira Weiny ext4 needs to break a layout lease if it is held to inform a user holding a layout lease that a truncate is about to happen. This allows the user knowledge of, and choice in how to handle, some other thread attempting to modify a file they are actively using. Split out the logic to determine if a mapping is DAX, export it, and then break layout leases if a mapping is DAX. Signed-off-by: Ira Weiny --- fs/dax.c | 23 ++++++++++++++++------- fs/ext4/inode.c | 4 ++++ include/linux/dax.h | 6 ++++++ 3 files changed, 26 insertions(+), 7 deletions(-) diff --git a/fs/dax.c b/fs/dax.c index f74386293632..29ff3b683657 100644 --- a/fs/dax.c +++ b/fs/dax.c @@ -552,6 +552,21 @@ static void *grab_mapping_entry(struct xa_state *xas, return xa_mk_internal(VM_FAULT_FALLBACK); } +bool dax_mapping_is_dax(struct address_space *mapping) +{ + /* + * In the 'limited' case get_user_pages() for dax is disabled. + */ + if (IS_ENABLED(CONFIG_FS_DAX_LIMITED)) + return false; + + if (!dax_mapping(mapping) || !mapping_mapped(mapping)) + return false; + + return true; +} +EXPORT_SYMBOL_GPL(dax_mapping_is_dax); + /** * dax_layout_busy_page - find first pinned page in @mapping * @mapping: address space to scan for a page with ref count > 1 @@ -574,13 +589,7 @@ struct page *dax_layout_busy_page(struct address_space *mapping) unsigned int scanned = 0; struct page *page = NULL; - /* - * In the 'limited' case get_user_pages() for dax is disabled. - */ - if (IS_ENABLED(CONFIG_FS_DAX_LIMITED)) - return NULL; - - if (!dax_mapping(mapping) || !mapping_mapped(mapping)) + if (!dax_mapping_is_dax(mapping)) return NULL; /* diff --git a/fs/ext4/inode.c b/fs/ext4/inode.c index c16071547c9c..c7c99f51961f 100644 --- a/fs/ext4/inode.c +++ b/fs/ext4/inode.c @@ -4241,6 +4241,10 @@ int ext4_break_layouts(struct inode *inode) if (WARN_ON_ONCE(!rwsem_is_locked(&ei->i_mmap_sem))) return -EINVAL; + /* Break layout leases if active */ + if (dax_mapping_is_dax(inode->i_mapping)) + break_layout(inode, true); + do { page = dax_layout_busy_page(inode->i_mapping); if (!page) diff --git a/include/linux/dax.h b/include/linux/dax.h index becaea5f4488..ee6cbd56ddc4 100644 --- a/include/linux/dax.h +++ b/include/linux/dax.h @@ -106,6 +106,7 @@ struct dax_device *fs_dax_get_by_bdev(struct block_device *bdev); int dax_writeback_mapping_range(struct address_space *mapping, struct block_device *bdev, struct writeback_control *wbc); +bool dax_mapping_is_dax(struct address_space *mapping); struct page *dax_layout_busy_page(struct address_space *mapping); dax_entry_t dax_lock_page(struct page *page); void dax_unlock_page(struct page *page, dax_entry_t cookie); @@ -137,6 +138,11 @@ static inline struct dax_device *fs_dax_get_by_bdev(struct block_device *bdev) return NULL; } +bool dax_mapping_is_dax(struct address_space *mapping) +{ + return false; +} + static inline struct page *dax_layout_busy_page(struct address_space *mapping) { return NULL; From patchwork Thu Jun 6 01:45:39 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Ira Weiny X-Patchwork-Id: 10978231 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id B68D26C5 for ; Thu, 6 Jun 2019 01:45:29 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id A707C2878E for ; Thu, 6 Jun 2019 01:45:29 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 9AFDE28787; Thu, 6 Jun 2019 01:45:29 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-2.9 required=2.0 tests=BAYES_00,MAILING_LIST_MULTI, RCVD_IN_DNSWL_NONE autolearn=unavailable version=3.3.1 Received: from kanga.kvack.org (kanga.kvack.org [205.233.56.17]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id E9DCD2850D for ; Thu, 6 Jun 2019 01:45:28 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id 98FAD6B0274; Wed, 5 Jun 2019 21:45:21 -0400 (EDT) Delivered-To: linux-mm-outgoing@kvack.org Received: by kanga.kvack.org (Postfix, from userid 40) id 91B3A6B0276; Wed, 5 Jun 2019 21:45:21 -0400 (EDT) X-Original-To: int-list-linux-mm@kvack.org X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 7BB6A6B0277; Wed, 5 Jun 2019 21:45:21 -0400 (EDT) X-Original-To: linux-mm@kvack.org X-Delivered-To: linux-mm@kvack.org Received: from mail-pg1-f200.google.com (mail-pg1-f200.google.com [209.85.215.200]) by kanga.kvack.org (Postfix) with ESMTP id 3AE2A6B0274 for ; Wed, 5 Jun 2019 21:45:21 -0400 (EDT) Received: by mail-pg1-f200.google.com with SMTP id a21so465550pgh.11 for ; Wed, 05 Jun 2019 18:45:21 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-original-authentication-results:x-gm-message-state:from:to:cc :subject:date:message-id:in-reply-to:references:mime-version :content-transfer-encoding; bh=pNUsURCNz1QfDvcOXQypXCsx50pGuciqm/2DBUfj73A=; b=NXvMV9jGTScbxPbWTXUZ8omgfgwwUwtX9v95f9uCun+IotnCQn2ouwlhgJ1DF8gOO1 Pr4uhN0fTrazP/JECE1MOcal9zuV6hS3hSPf4SfI6zYv48GKRam4+pcd0YP7AQLq13FS D9wdxv4Ogj2edpdftJwF0SVL0WjPRR8rIeuQ5kX8L/M6fQPEmR9XFyqc2eeG+VjDSWRM Or/yTQ55m2kBUVGr8MVnPYy+x3AaHvvk31ior2pfTlcZDoDC0WdtyVylnK+oiA7RgfVR 91pBOcSTlEig0ScGsQV8N5dcvbfQkPZWAdF43RCK1+3sRNWhPymiqxtDMeOysSp9HyBD Hr7Q== X-Original-Authentication-Results: mx.google.com; spf=pass (google.com: domain of ira.weiny@intel.com designates 134.134.136.100 as permitted sender) smtp.mailfrom=ira.weiny@intel.com; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=intel.com X-Gm-Message-State: APjAAAXnrx3K1aruf1CEv4nvJ4n4Bq83u3ADd8Joik1HRzNv1Ri00iVB gOpLSfhPQkX/FHSk1fohrqdLPgdz3DLYfk6pEHdXxu9pqgGbw0McRWjVxVdyJ0iDAEfviWmmzlv L/7AqU7LlLcI8sovK76UBa7Ea0OEX5fWUdyuJTX419s8ohQYWCjRDXCMX6SuH6qkssw== X-Received: by 2002:a63:470e:: with SMTP id u14mr800326pga.135.1559785520899; Wed, 05 Jun 2019 18:45:20 -0700 (PDT) X-Google-Smtp-Source: APXvYqww8NoQaE5yolruIkTwE6sQN4ifzzVSGq4Uj4aewJ0FeVi/Ho5AHyf92PQq+4N+zPspuWRU X-Received: by 2002:a63:470e:: with SMTP id u14mr800277pga.135.1559785519849; Wed, 05 Jun 2019 18:45:19 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1559785519; cv=none; d=google.com; s=arc-20160816; b=WsllICmVFQNfFbH7blB4mHmwtqa+87riHBZf2LK/f5vrn2fSaFWuAFteiHNiyZMQzo U3v13/VTqtuMCkSWIOGD5I5i/XmSmC+smri3N2vdhgKJFdkXWS02KHoaI5syMgkIBnCJ 7P8l35J7nzB7MfRa6VgvwRfAiWuiiYblX3uov99JiYjNa8prxfF8BICnlh9+yWH72i5h fh4Tg6P3sFdJ3aldOg6EgpIxglvl4DryVpOZi+N0KIdjt4MWsMY4O+6Z/rLhyGLcjxXM lG22neUBUW52/tNnwDMnA7A0Y60oEq+Wirsuf0uHu0/5Aho/1f4ROASNv6HVXki7IO52 n4dA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from; bh=pNUsURCNz1QfDvcOXQypXCsx50pGuciqm/2DBUfj73A=; b=IPlEHEOOov+4RWY/0R3NYDR3TS3XM7KFsovb4XIa+FppqHTaTh9J38fUodefK0k4TU +onFKQJX4mJnEZJVO1j8pMLf/hD2prTzocTolRrBqhI3xGACNIrQY+Lx+vsPeo1v2hgx C6Ntl55asJdfgTje/8qBzC47dhYJlT+LGCuhZjLyl5vWoAgqR+AJrGe2+MsmKcorKCsy nymur6ZXLZEUz2T3fyrJIrvJmEJwRfPSMUoQqgYKryi57T+quzzYNsFYj72htvVDwrix g2myd/JmUTgGIMRDB6y4zX5ouuxmT9b0pPnfGKCzDlVOPKSDUmeSrFnKZCVd18gG539w L1tQ== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: domain of ira.weiny@intel.com designates 134.134.136.100 as permitted sender) smtp.mailfrom=ira.weiny@intel.com; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=intel.com Received: from mga07.intel.com (mga07.intel.com. [134.134.136.100]) by mx.google.com with ESMTPS id k18si276921pfk.103.2019.06.05.18.45.19 for (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Wed, 05 Jun 2019 18:45:19 -0700 (PDT) Received-SPF: pass (google.com: domain of ira.weiny@intel.com designates 134.134.136.100 as permitted sender) client-ip=134.134.136.100; Authentication-Results: mx.google.com; spf=pass (google.com: domain of ira.weiny@intel.com designates 134.134.136.100 as permitted sender) smtp.mailfrom=ira.weiny@intel.com; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=intel.com X-Amp-Result: SKIPPED(no attachment in message) X-Amp-File-Uploaded: False Received: from orsmga002.jf.intel.com ([10.7.209.21]) by orsmga105.jf.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 05 Jun 2019 18:45:19 -0700 X-ExtLoop1: 1 Received: from iweiny-desk2.sc.intel.com ([10.3.52.157]) by orsmga002.jf.intel.com with ESMTP; 05 Jun 2019 18:45:18 -0700 From: ira.weiny@intel.com To: Dan Williams , Jan Kara , "Theodore Ts'o" , Jeff Layton , Dave Chinner Cc: Ira Weiny , Matthew Wilcox , linux-xfs@vger.kernel.org, Andrew Morton , John Hubbard , =?utf-8?b?SsOpcsO0bWUgR2xpc3Nl?= , linux-fsdevel@vger.kernel.org, linux-kernel@vger.kernel.org, linux-nvdimm@lists.01.org, linux-ext4@vger.kernel.org, linux-mm@kvack.org Subject: [PATCH RFC 06/10] fs/ext4: Teach dax_layout_busy_page() to operate on a sub-range Date: Wed, 5 Jun 2019 18:45:39 -0700 Message-Id: <20190606014544.8339-7-ira.weiny@intel.com> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20190606014544.8339-1-ira.weiny@intel.com> References: <20190606014544.8339-1-ira.weiny@intel.com> MIME-Version: 1.0 X-Bogosity: Ham, tests=bogofilter, spamicity=0.000000, version=1.2.4 Sender: owner-linux-mm@kvack.org Precedence: bulk X-Loop: owner-majordomo@kvack.org List-ID: X-Virus-Scanned: ClamAV using ClamSMTP From: Ira Weiny Callers of dax_layout_busy_page() are only rarely operating on the entire file of concern. Teach dax_layout_busy_page() to operate on a sub-range of the address_space provided. Specifying 0 - ULONG_MAX however, will continue to operate on the "entire file" and XFS is split out to a separate patch by this method. This could potentially speed up dax_layout_busy_page() as well. Signed-off-by: Ira Weiny --- fs/dax.c | 15 +++++++++++---- fs/ext4/ext4.h | 2 +- fs/ext4/extents.c | 6 +++--- fs/ext4/inode.c | 19 ++++++++++++------- fs/xfs/xfs_file.c | 3 ++- include/linux/dax.h | 3 ++- 6 files changed, 31 insertions(+), 17 deletions(-) diff --git a/fs/dax.c b/fs/dax.c index 29ff3b683657..abd77b184879 100644 --- a/fs/dax.c +++ b/fs/dax.c @@ -568,8 +568,11 @@ bool dax_mapping_is_dax(struct address_space *mapping) EXPORT_SYMBOL_GPL(dax_mapping_is_dax); /** - * dax_layout_busy_page - find first pinned page in @mapping + * dax_layout_busy_page - find first pinned page in @mapping within + * the range @off - @off + @len * @mapping: address space to scan for a page with ref count > 1 + * @off: offset to start at + * @len: length to scan through * * DAX requires ZONE_DEVICE mapped pages. These pages are never * 'onlined' to the page allocator so they are considered idle when @@ -582,9 +585,13 @@ EXPORT_SYMBOL_GPL(dax_mapping_is_dax); * to be able to run unmap_mapping_range() and subsequently not race * mapping_mapped() becoming true. */ -struct page *dax_layout_busy_page(struct address_space *mapping) +struct page *dax_layout_busy_page(struct address_space *mapping, + loff_t off, loff_t len) { - XA_STATE(xas, &mapping->i_pages, 0); + unsigned long start_idx = off >> PAGE_SHIFT; + unsigned long end_idx = (len == ULONG_MAX) ? ULONG_MAX + : start_idx + (len >> PAGE_SHIFT); + XA_STATE(xas, &mapping->i_pages, start_idx); void *entry; unsigned int scanned = 0; struct page *page = NULL; @@ -607,7 +614,7 @@ struct page *dax_layout_busy_page(struct address_space *mapping) unmap_mapping_range(mapping, 0, 0, 1); xas_lock_irq(&xas); - xas_for_each(&xas, entry, ULONG_MAX) { + xas_for_each(&xas, entry, end_idx) { if (WARN_ON_ONCE(!xa_is_value(entry))) continue; if (unlikely(dax_is_locked(entry))) diff --git a/fs/ext4/ext4.h b/fs/ext4/ext4.h index 1cb67859e051..ba5920c21023 100644 --- a/fs/ext4/ext4.h +++ b/fs/ext4/ext4.h @@ -2530,7 +2530,7 @@ extern int ext4_get_inode_loc(struct inode *, struct ext4_iloc *); extern int ext4_inode_attach_jinode(struct inode *inode); extern int ext4_can_truncate(struct inode *inode); extern int ext4_truncate(struct inode *); -extern int ext4_break_layouts(struct inode *); +extern int ext4_break_layouts(struct inode *inode, loff_t offset, loff_t len); extern int ext4_punch_hole(struct inode *inode, loff_t offset, loff_t length); extern int ext4_truncate_restart_trans(handle_t *, struct inode *, int nblocks); extern void ext4_set_inode_flags(struct inode *); diff --git a/fs/ext4/extents.c b/fs/ext4/extents.c index d40ed940001e..9ddb117d8beb 100644 --- a/fs/ext4/extents.c +++ b/fs/ext4/extents.c @@ -4736,7 +4736,7 @@ static long ext4_zero_range(struct file *file, loff_t offset, */ down_write(&EXT4_I(inode)->i_mmap_sem); - ret = ext4_break_layouts(inode); + ret = ext4_break_layouts(inode, offset, len); if (ret) { up_write(&EXT4_I(inode)->i_mmap_sem); goto out_mutex; @@ -5419,7 +5419,7 @@ int ext4_collapse_range(struct inode *inode, loff_t offset, loff_t len) */ down_write(&EXT4_I(inode)->i_mmap_sem); - ret = ext4_break_layouts(inode); + ret = ext4_break_layouts(inode, offset, len); if (ret) goto out_mmap; @@ -5572,7 +5572,7 @@ int ext4_insert_range(struct inode *inode, loff_t offset, loff_t len) */ down_write(&EXT4_I(inode)->i_mmap_sem); - ret = ext4_break_layouts(inode); + ret = ext4_break_layouts(inode, offset, len); if (ret) goto out_mmap; diff --git a/fs/ext4/inode.c b/fs/ext4/inode.c index c7c99f51961f..75f543f384e4 100644 --- a/fs/ext4/inode.c +++ b/fs/ext4/inode.c @@ -4232,7 +4232,7 @@ static void ext4_wait_dax_page(struct ext4_inode_info *ei) down_write(&ei->i_mmap_sem); } -int ext4_break_layouts(struct inode *inode) +int ext4_break_layouts(struct inode *inode, loff_t offset, loff_t len) { struct ext4_inode_info *ei = EXT4_I(inode); struct page *page; @@ -4246,7 +4246,7 @@ int ext4_break_layouts(struct inode *inode) break_layout(inode, true); do { - page = dax_layout_busy_page(inode->i_mapping); + page = dax_layout_busy_page(inode->i_mapping, offset, len); if (!page) return 0; @@ -4333,7 +4333,7 @@ int ext4_punch_hole(struct inode *inode, loff_t offset, loff_t length) */ down_write(&EXT4_I(inode)->i_mmap_sem); - ret = ext4_break_layouts(inode); + ret = ext4_break_layouts(inode, offset, length); if (ret) goto out_dio; @@ -5605,10 +5605,15 @@ int ext4_setattr(struct dentry *dentry, struct iattr *attr) down_write(&EXT4_I(inode)->i_mmap_sem); - rc = ext4_break_layouts(inode); - if (rc) { - up_write(&EXT4_I(inode)->i_mmap_sem); - return rc; + if (shrink) { + loff_t off = attr->ia_size; + loff_t len = inode->i_size - attr->ia_size; + + rc = ext4_break_layouts(inode, off, len); + if (rc) { + up_write(&EXT4_I(inode)->i_mmap_sem); + return rc; + } } if (attr->ia_size != inode->i_size) { diff --git a/fs/xfs/xfs_file.c b/fs/xfs/xfs_file.c index 76748255f843..ebddf911644c 100644 --- a/fs/xfs/xfs_file.c +++ b/fs/xfs/xfs_file.c @@ -746,7 +746,8 @@ xfs_break_dax_layouts( ASSERT(xfs_isilocked(XFS_I(inode), XFS_MMAPLOCK_EXCL)); - page = dax_layout_busy_page(inode->i_mapping); + /* We default to the "whole file" */ + page = dax_layout_busy_page(inode->i_mapping, 0, ULONG_MAX); if (!page) return 0; diff --git a/include/linux/dax.h b/include/linux/dax.h index ee6cbd56ddc4..3c3ab8dd76c6 100644 --- a/include/linux/dax.h +++ b/include/linux/dax.h @@ -107,7 +107,8 @@ int dax_writeback_mapping_range(struct address_space *mapping, struct block_device *bdev, struct writeback_control *wbc); bool dax_mapping_is_dax(struct address_space *mapping); -struct page *dax_layout_busy_page(struct address_space *mapping); +struct page *dax_layout_busy_page(struct address_space *mapping, + loff_t off, loff_t len); dax_entry_t dax_lock_page(struct page *page); void dax_unlock_page(struct page *page, dax_entry_t cookie); #else From patchwork Thu Jun 6 01:45:40 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Ira Weiny X-Patchwork-Id: 10978237 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id 5483714E5 for ; Thu, 6 Jun 2019 01:45:32 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 4536F2878E for ; Thu, 6 Jun 2019 01:45:32 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 398D628787; Thu, 6 Jun 2019 01:45:32 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-2.9 required=2.0 tests=BAYES_00,MAILING_LIST_MULTI, RCVD_IN_DNSWL_NONE autolearn=ham version=3.3.1 Received: from kanga.kvack.org (kanga.kvack.org [205.233.56.17]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id D4EF22850D for ; Thu, 6 Jun 2019 01:45:31 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id 5C1B96B0276; Wed, 5 Jun 2019 21:45:23 -0400 (EDT) Delivered-To: linux-mm-outgoing@kvack.org Received: by kanga.kvack.org (Postfix, from userid 40) id 521336B0277; Wed, 5 Jun 2019 21:45:23 -0400 (EDT) X-Original-To: int-list-linux-mm@kvack.org X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 350606B0278; Wed, 5 Jun 2019 21:45:23 -0400 (EDT) X-Original-To: linux-mm@kvack.org X-Delivered-To: linux-mm@kvack.org Received: from mail-pl1-f200.google.com (mail-pl1-f200.google.com [209.85.214.200]) by kanga.kvack.org (Postfix) with ESMTP id E5E406B0276 for ; Wed, 5 Jun 2019 21:45:22 -0400 (EDT) Received: by mail-pl1-f200.google.com with SMTP id q6so484869pll.22 for ; Wed, 05 Jun 2019 18:45:22 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-original-authentication-results:x-gm-message-state:from:to:cc :subject:date:message-id:in-reply-to:references:mime-version :content-transfer-encoding; bh=uaTRZLRYkOF6zdKGHzjPlcXa4k/4GB2jeuLkq5t3Y0A=; b=Rrc/NLbDW57NON5XbUeHgtGAXAPHC8fMinV3MeWCI25XVikBpIeAchrS3WAGG8NPfu JZ6MNwcwAjP5GZvFBlspCGL7FtPIjAy+vcl7s03c7QoMmOKj4tIsLJtWGon5wkLNRWQS gujJdzuq+TZrHwnbaLtoaq/A4qisgYWf7kItWCIOePgMW+SREiV333Nd1Vm0sUjMn7MD 6K206XL8k9SA07s0sUsxuJJXYrCtX9LiVTei++8Tu0QTd3Yvh1V2oNZpBrBMWNzwe6fo RLzH40EEa7ClTd9z68TG+O8vL9dbijoqzjbOvBNwFgrF/yIHmFAe/gW3HLfcvecUIZhu m8DA== X-Original-Authentication-Results: mx.google.com; spf=pass (google.com: domain of ira.weiny@intel.com designates 134.134.136.100 as permitted sender) smtp.mailfrom=ira.weiny@intel.com; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=intel.com X-Gm-Message-State: APjAAAXQG/kqgU7HGhRRPpgM1rNReB8Tfbd+CD46NeP320o6o2UZ1ydv SgQ//pjY9UweyXPM4y4Z+wz9iUINHnUZXfYyHfFHVaETfTulIKvei9pkAlJUtLM+OHDvDBMBV7q GWPAyZ21k0dchzrpUD3lWs3qf2vh9b3f1AfbrBhjo2eA3KEE4TBe16zHGYLQoit87Vw== X-Received: by 2002:a62:7552:: with SMTP id q79mr30333153pfc.71.1559785522622; Wed, 05 Jun 2019 18:45:22 -0700 (PDT) X-Google-Smtp-Source: APXvYqzaG8gDjffgBBcB9JTxp0dG+iNYwRficX0slqinqCiACxwgONcW1yLFPD/1j7j7c75AUgXF X-Received: by 2002:a62:7552:: with SMTP id q79mr30333115pfc.71.1559785521837; Wed, 05 Jun 2019 18:45:21 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1559785521; cv=none; d=google.com; s=arc-20160816; b=zK0n9+IhN1oiygfPd69BVVmQENfu2TsSKkA6yOZI6fXVLWa0Eq4ApA5iCKKZbZiOkl RtJ72+YNDxyHDgaCedPDdacLgr0pohamhmvZ6U3SMI7Rf2ixQYvSoTo5ob/nV4B6UW+e pIBHa35V3mGgvWFRJhEGm11FtNta9+ZHA9KHabh8zPouqEQ04zh7bQaGp1byGE3/AI22 jY1r/FPw7nvSQZoSYerx7tXLXpdMK6m3ugdNn1ZcJsY1a9ChFemmt8EVDXcSO0eeK7Qa PirS1PqljBrSHau71DZHfKxh+mpgVO3bCQJZWO23txFzPOF1VGLqlcRzMhH21WB5Gzq5 M5Iw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from; bh=uaTRZLRYkOF6zdKGHzjPlcXa4k/4GB2jeuLkq5t3Y0A=; b=cNzFPnYC5Dft6uqZ5OrhiLpfKsdzCRP8ZyzXP/FxLM8SQrK2e8xl4IIeLVuYjTqPW7 nu/Hp/KnoSFeXHEu5nBYmGlb4bVIs3z2vfR80xUPlrv10u9S+fvY2ChOI8tXQ+adSnaD 70tncTDph+6qvyDp3BIKDhcvGLwrFIx9UhKhJeYGxIERpfaS36q6IkI2IeUITZzcsqRO pSTyCGjptjIeAVgoClg9uEF5JDQycwxfEvlCdMW2hUfgARKAyNvUw1tgdlw5v+O51D9P Wedo5JHirn9+MGJ1/3tVduQqybD1Rn5dIBNILWdgCRb6MpfJ0J/S7bzFpp/RgCCV3FxE vA2A== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: domain of ira.weiny@intel.com designates 134.134.136.100 as permitted sender) smtp.mailfrom=ira.weiny@intel.com; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=intel.com Received: from mga07.intel.com (mga07.intel.com. [134.134.136.100]) by mx.google.com with ESMTPS id k18si276921pfk.103.2019.06.05.18.45.21 for (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Wed, 05 Jun 2019 18:45:21 -0700 (PDT) Received-SPF: pass (google.com: domain of ira.weiny@intel.com designates 134.134.136.100 as permitted sender) client-ip=134.134.136.100; Authentication-Results: mx.google.com; spf=pass (google.com: domain of ira.weiny@intel.com designates 134.134.136.100 as permitted sender) smtp.mailfrom=ira.weiny@intel.com; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=intel.com X-Amp-Result: SKIPPED(no attachment in message) X-Amp-File-Uploaded: False Received: from orsmga002.jf.intel.com ([10.7.209.21]) by orsmga105.jf.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 05 Jun 2019 18:45:21 -0700 X-ExtLoop1: 1 Received: from iweiny-desk2.sc.intel.com ([10.3.52.157]) by orsmga002.jf.intel.com with ESMTP; 05 Jun 2019 18:45:20 -0700 From: ira.weiny@intel.com To: Dan Williams , Jan Kara , "Theodore Ts'o" , Jeff Layton , Dave Chinner Cc: Ira Weiny , Matthew Wilcox , linux-xfs@vger.kernel.org, Andrew Morton , John Hubbard , =?utf-8?b?SsOpcsO0bWUgR2xpc3Nl?= , linux-fsdevel@vger.kernel.org, linux-kernel@vger.kernel.org, linux-nvdimm@lists.01.org, linux-ext4@vger.kernel.org, linux-mm@kvack.org Subject: [PATCH RFC 07/10] fs/ext4: Fail truncate if pages are GUP pinned Date: Wed, 5 Jun 2019 18:45:40 -0700 Message-Id: <20190606014544.8339-8-ira.weiny@intel.com> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20190606014544.8339-1-ira.weiny@intel.com> References: <20190606014544.8339-1-ira.weiny@intel.com> MIME-Version: 1.0 X-Bogosity: Ham, tests=bogofilter, spamicity=0.000000, version=1.2.4 Sender: owner-linux-mm@kvack.org Precedence: bulk X-Loop: owner-majordomo@kvack.org List-ID: X-Virus-Scanned: ClamAV using ClamSMTP From: Ira Weiny If pages are actively gup pinned fail the truncate operation. Signed-off-by: Ira Weiny --- fs/ext4/inode.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/fs/ext4/inode.c b/fs/ext4/inode.c index 75f543f384e4..1ded83ec08c0 100644 --- a/fs/ext4/inode.c +++ b/fs/ext4/inode.c @@ -4250,6 +4250,9 @@ int ext4_break_layouts(struct inode *inode, loff_t offset, loff_t len) if (!page) return 0; + if (page_gup_pinned(page)) + return -ETXTBSY; + error = ___wait_var_event(&page->_refcount, atomic_read(&page->_refcount) == 1, TASK_INTERRUPTIBLE, 0, 0, From patchwork Thu Jun 6 01:45:41 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Ira Weiny X-Patchwork-Id: 10978241 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id 365B26C5 for ; Thu, 6 Jun 2019 01:45:35 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 26F3428787 for ; Thu, 6 Jun 2019 01:45:35 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 1B4A428784; Thu, 6 Jun 2019 01:45:35 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-2.9 required=2.0 tests=BAYES_00,MAILING_LIST_MULTI, RCVD_IN_DNSWL_NONE autolearn=unavailable version=3.3.1 Received: from kanga.kvack.org (kanga.kvack.org [205.233.56.17]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 8F10C28783 for ; Thu, 6 Jun 2019 01:45:34 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id 3EA6A6B0277; Wed, 5 Jun 2019 21:45:26 -0400 (EDT) Delivered-To: linux-mm-outgoing@kvack.org Received: by kanga.kvack.org (Postfix, from userid 40) id 34EC96B0278; Wed, 5 Jun 2019 21:45:26 -0400 (EDT) X-Original-To: int-list-linux-mm@kvack.org X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 12D516B0279; Wed, 5 Jun 2019 21:45:26 -0400 (EDT) X-Original-To: linux-mm@kvack.org X-Delivered-To: linux-mm@kvack.org Received: from mail-pl1-f199.google.com (mail-pl1-f199.google.com [209.85.214.199]) by kanga.kvack.org (Postfix) with ESMTP id C09896B0277 for ; Wed, 5 Jun 2019 21:45:25 -0400 (EDT) Received: by mail-pl1-f199.google.com with SMTP id bc12so531221plb.0 for ; Wed, 05 Jun 2019 18:45:25 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-original-authentication-results:x-gm-message-state:from:to:cc :subject:date:message-id:in-reply-to:references:mime-version :content-transfer-encoding; bh=uFdusVjodyy3c8noCcKp53JvnCAvA92nCht7AL33MbQ=; b=EOfmlVCII2cQhr55KY8EBBTTC81F0sZqWcwLrBPQ1ylQt9iOsAc6NeVG5ukmuBE+rS 3hyR2hjXAGddoSbUq0zDLdZbBk/1jo3/AXkC1P0fNXdly2Tc4PmKjjbcFW0Zsy+vRUs5 dF2M3sVeLZQoB9GWm3+g2VdT8+lexUwskXOyOtAdln6NrClTPXmNzVEaifpYH3ASZr1C PcvkdwNOztwD/fjEnonXmZoDtUT0F4qU9ZmLZBHMai4duhq8PiTyzKZEM9vnkeKLSF5e //NQOohyWZaNEFXl0sh7IyKjlt9M6dOPUXpFNp6UFAOKKmmf1IPOxwANMidVenRYRitz YTfw== X-Original-Authentication-Results: mx.google.com; spf=pass (google.com: domain of ira.weiny@intel.com designates 192.55.52.120 as permitted sender) smtp.mailfrom=ira.weiny@intel.com; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=intel.com X-Gm-Message-State: APjAAAWwLLrBCeQMvAHEdS2xFWKJQLwsuqgwQ/3e0kSE1vbWj2G8h1NW CRCmm23TZvfX1CHn9UyiTxXUpFBYmAkWHwor+L2c9D+WYS75G9Edfs7k9LP5GgucM1KJDaTjpT2 aGIWmG87jtFA7eAGCf1sY+hU9SenT5dmdfRJQO+44WI6lVGyEhh4aLIsEY4CJANIBCg== X-Received: by 2002:a63:1b07:: with SMTP id b7mr791320pgb.289.1559785525435; Wed, 05 Jun 2019 18:45:25 -0700 (PDT) X-Google-Smtp-Source: APXvYqyQ8cNK8tcJ9HrLjJ/JPLTou+5E9DovZl9WsXQFko8OJ+nE/Z4Azr/fE1gCQuUzu6h1YHdp X-Received: by 2002:a63:1b07:: with SMTP id b7mr791283pgb.289.1559785524590; Wed, 05 Jun 2019 18:45:24 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1559785524; cv=none; d=google.com; s=arc-20160816; b=W/jsblF+zKTSKLyUqfRO+y3Fr8UYAF4nI/P3buapiJ+lDNBvFBLMMMYPdfP84oGBkv GRaqaKaxUG5WpNiEuJOKTE0FRxDbCkZGDaM4MzqdrobMLc7mO1HMYs+xCoTJVXRUcnSm DRGk0sa7E9IYEW49JvoXwxdnBNJ3krG9QnugrlYLcboIQeIiATBjtQMjkwWhZaiAk4iD Ldzp4/ueEY/2NU076LzwARtRTlQvwxp87ByL5EcCCPXXcIWp7+Gl9kbMp47PXmOKXxy5 6UqzxLnQ+hWofXyDXYSQqvfobJi3BzzvarvnUALUqgA7R/tp9Ivzfv8Z6sNXNU0vtHz7 1rbg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from; bh=uFdusVjodyy3c8noCcKp53JvnCAvA92nCht7AL33MbQ=; b=vrk88l/TqtsOEQCBrHxnCaCN65SnD6evIura5//YiKArnixcf7BBApCKud7+cN1Xft 7lKdm7Rx3cyZmzvby9jdyVP1rM0jGG3u2ApKJHgHNcpocj65ww32hKkz7q40zVyTv9hl fvLjR27wSFRV1+Qatg6pcwOiQk21WU/JLGRLm4YWcaAcyzlGwpAoacDKQxYdcfKOVpEx DNDKEk8RgGQHgZkYmXPA9N/CyzsI657kNUN3Jj+swuKytdnqKnTK7CTXKiZ56o9pSE7c nCBV2fsV+wpEfE/OZb6GFQcEl1/z0qxsyQevO6u8BSw4MABkuckzoHAUu37TZx/kiNYH x0Rg== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: domain of ira.weiny@intel.com designates 192.55.52.120 as permitted sender) smtp.mailfrom=ira.weiny@intel.com; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=intel.com Received: from mga04.intel.com (mga04.intel.com. [192.55.52.120]) by mx.google.com with ESMTPS id 71si254942plf.156.2019.06.05.18.45.24 for (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Wed, 05 Jun 2019 18:45:24 -0700 (PDT) Received-SPF: pass (google.com: domain of ira.weiny@intel.com designates 192.55.52.120 as permitted sender) client-ip=192.55.52.120; Authentication-Results: mx.google.com; spf=pass (google.com: domain of ira.weiny@intel.com designates 192.55.52.120 as permitted sender) smtp.mailfrom=ira.weiny@intel.com; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=intel.com X-Amp-Result: SKIPPED(no attachment in message) X-Amp-File-Uploaded: False Received: from orsmga002.jf.intel.com ([10.7.209.21]) by fmsmga104.fm.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 05 Jun 2019 18:45:23 -0700 X-ExtLoop1: 1 Received: from iweiny-desk2.sc.intel.com ([10.3.52.157]) by orsmga002.jf.intel.com with ESMTP; 05 Jun 2019 18:45:22 -0700 From: ira.weiny@intel.com To: Dan Williams , Jan Kara , "Theodore Ts'o" , Jeff Layton , Dave Chinner Cc: Ira Weiny , Matthew Wilcox , linux-xfs@vger.kernel.org, Andrew Morton , John Hubbard , =?utf-8?b?SsOpcsO0bWUgR2xpc3Nl?= , linux-fsdevel@vger.kernel.org, linux-kernel@vger.kernel.org, linux-nvdimm@lists.01.org, linux-ext4@vger.kernel.org, linux-mm@kvack.org Subject: [PATCH RFC 08/10] fs/xfs: Teach xfs to use new dax_layout_busy_page() Date: Wed, 5 Jun 2019 18:45:41 -0700 Message-Id: <20190606014544.8339-9-ira.weiny@intel.com> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20190606014544.8339-1-ira.weiny@intel.com> References: <20190606014544.8339-1-ira.weiny@intel.com> MIME-Version: 1.0 X-Bogosity: Ham, tests=bogofilter, spamicity=0.000000, version=1.2.4 Sender: owner-linux-mm@kvack.org Precedence: bulk X-Loop: owner-majordomo@kvack.org List-ID: X-Virus-Scanned: ClamAV using ClamSMTP From: Ira Weiny dax_layout_busy_page() can now operate on a sub-range of the address_space provided. Have xfs specify the sub range to dax_layout_busy_page() Signed-off-by: Ira Weiny --- fs/xfs/xfs_file.c | 19 +++++++++++++------ fs/xfs/xfs_inode.h | 5 +++-- fs/xfs/xfs_ioctl.c | 15 ++++++++++++--- fs/xfs/xfs_iops.c | 14 ++++++++++---- 4 files changed, 38 insertions(+), 15 deletions(-) diff --git a/fs/xfs/xfs_file.c b/fs/xfs/xfs_file.c index ebddf911644c..350eb5546d36 100644 --- a/fs/xfs/xfs_file.c +++ b/fs/xfs/xfs_file.c @@ -300,7 +300,11 @@ xfs_file_aio_write_checks( if (error <= 0) return error; - error = xfs_break_layouts(inode, iolock, BREAK_WRITE); + /* + * BREAK_WRITE ignores offset/len tuple just specify the whole file + * (0 - ULONG_MAX to be safe. + */ + error = xfs_break_layouts(inode, iolock, 0, ULONG_MAX, BREAK_WRITE); if (error) return error; @@ -740,14 +744,15 @@ xfs_wait_dax_page( static int xfs_break_dax_layouts( struct inode *inode, - bool *retry) + bool *retry, + loff_t off, + loff_t len) { struct page *page; ASSERT(xfs_isilocked(XFS_I(inode), XFS_MMAPLOCK_EXCL)); - /* We default to the "whole file" */ - page = dax_layout_busy_page(inode->i_mapping, 0, ULONG_MAX); + page = dax_layout_busy_page(inode->i_mapping, off, len); if (!page) return 0; @@ -761,6 +766,8 @@ int xfs_break_layouts( struct inode *inode, uint *iolock, + loff_t off, + loff_t len, enum layout_break_reason reason) { bool retry; @@ -772,7 +779,7 @@ xfs_break_layouts( retry = false; switch (reason) { case BREAK_UNMAP: - error = xfs_break_dax_layouts(inode, &retry); + error = xfs_break_dax_layouts(inode, &retry, off, len); if (error || retry) break; /* fall through */ @@ -814,7 +821,7 @@ xfs_file_fallocate( return -EOPNOTSUPP; xfs_ilock(ip, iolock); - error = xfs_break_layouts(inode, &iolock, BREAK_UNMAP); + error = xfs_break_layouts(inode, &iolock, offset, len, BREAK_UNMAP); if (error) goto out_unlock; diff --git a/fs/xfs/xfs_inode.h b/fs/xfs/xfs_inode.h index 558173f95a03..1b0948f5267c 100644 --- a/fs/xfs/xfs_inode.h +++ b/fs/xfs/xfs_inode.h @@ -475,8 +475,9 @@ enum xfs_prealloc_flags { int xfs_update_prealloc_flags(struct xfs_inode *ip, enum xfs_prealloc_flags flags); -int xfs_break_layouts(struct inode *inode, uint *iolock, - enum layout_break_reason reason); +int xfs_break_layouts(struct inode *inode, uint *iolock, + loff_t off, loff_t len, + enum layout_break_reason reason); /* from xfs_iops.c */ extern void xfs_setup_inode(struct xfs_inode *ip); diff --git a/fs/xfs/xfs_ioctl.c b/fs/xfs/xfs_ioctl.c index d7dfc13f30f5..a702e44a63b8 100644 --- a/fs/xfs/xfs_ioctl.c +++ b/fs/xfs/xfs_ioctl.c @@ -605,6 +605,7 @@ xfs_ioc_space( enum xfs_prealloc_flags flags = 0; uint iolock = XFS_IOLOCK_EXCL | XFS_MMAPLOCK_EXCL; int error; + loff_t break_length; if (inode->i_flags & (S_IMMUTABLE|S_APPEND)) return -EPERM; @@ -625,9 +626,6 @@ xfs_ioc_space( return error; xfs_ilock(ip, iolock); - error = xfs_break_layouts(inode, &iolock, BREAK_UNMAP); - if (error) - goto out_unlock; switch (bf->l_whence) { case 0: /*SEEK_SET*/ @@ -673,6 +671,17 @@ xfs_ioc_space( goto out_unlock; } + /* break layout for the whole file if len ends up 0 */ + if (bf->l_len == 0) + break_length = ULONG_MAX; + else + break_length = bf->l_len; + + error = xfs_break_layouts(inode, &iolock, bf->l_start, break_length, + BREAK_UNMAP); + if (error) + goto out_unlock; + switch (cmd) { case XFS_IOC_ZERO_RANGE: flags |= XFS_PREALLOC_SET; diff --git a/fs/xfs/xfs_iops.c b/fs/xfs/xfs_iops.c index 74047bd0c1ae..5529bc7a516b 100644 --- a/fs/xfs/xfs_iops.c +++ b/fs/xfs/xfs_iops.c @@ -1052,10 +1052,16 @@ xfs_vn_setattr( xfs_ilock(ip, XFS_MMAPLOCK_EXCL); iolock = XFS_IOLOCK_EXCL | XFS_MMAPLOCK_EXCL; - error = xfs_break_layouts(inode, &iolock, BREAK_UNMAP); - if (error) { - xfs_iunlock(ip, XFS_MMAPLOCK_EXCL); - return error; + if (iattr->ia_size < inode->i_size) { + loff_t off = iattr->ia_size; + loff_t len = inode->i_size - iattr->ia_size; + + error = xfs_break_layouts(inode, &iolock, off, len, + BREAK_UNMAP); + if (error) { + xfs_iunlock(ip, XFS_MMAPLOCK_EXCL); + return error; + } } error = xfs_vn_setattr_size(dentry, iattr); From patchwork Thu Jun 6 01:45:42 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Ira Weiny X-Patchwork-Id: 10978245 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id DF7A815E6 for ; Thu, 6 Jun 2019 01:45:37 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id CEBCA28787 for ; Thu, 6 Jun 2019 01:45:37 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id CC5BD287AF; Thu, 6 Jun 2019 01:45:37 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-2.9 required=2.0 tests=BAYES_00,MAILING_LIST_MULTI, RCVD_IN_DNSWL_NONE autolearn=unavailable version=3.3.1 Received: from kanga.kvack.org (kanga.kvack.org [205.233.56.17]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 583D12879D for ; Thu, 6 Jun 2019 01:45:37 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id F39C46B0278; Wed, 5 Jun 2019 21:45:27 -0400 (EDT) Delivered-To: linux-mm-outgoing@kvack.org Received: by kanga.kvack.org (Postfix, from userid 40) id E25566B0279; Wed, 5 Jun 2019 21:45:27 -0400 (EDT) X-Original-To: int-list-linux-mm@kvack.org X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id C4E6E6B027A; Wed, 5 Jun 2019 21:45:27 -0400 (EDT) X-Original-To: linux-mm@kvack.org X-Delivered-To: linux-mm@kvack.org Received: from mail-pl1-f200.google.com (mail-pl1-f200.google.com [209.85.214.200]) by kanga.kvack.org (Postfix) with ESMTP id 89EB26B0278 for ; Wed, 5 Jun 2019 21:45:27 -0400 (EDT) Received: by mail-pl1-f200.google.com with SMTP id i33so497958pld.15 for ; Wed, 05 Jun 2019 18:45:27 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-original-authentication-results:x-gm-message-state:from:to:cc :subject:date:message-id:in-reply-to:references:mime-version :content-transfer-encoding; bh=6od4TDbdqx+LT3047SpEutXdAzWkr/YDgVOMjEtHNxg=; b=ixXURW4TArC65jE9EKP8S1T9RE1ZVCdEkGxa6nhqZsj/U98SK0qpdvKLwwab78NAT0 M59olF47hO0x7VuA5zcZ1Is/17nxVmb/jMYp7bzUzBAmwgel1Oi458fahuCB0Cia8B+U /yGZEG9/dGK0k8beriZF8O4R6TYW9y+mw8zulDOyap5l+PNBQhi/hsD1PDfLk4t7Bhq1 K3/6Jsxpa+FxstoWjp8aCF1fMCbPQKRb31ldReME4SnZB4Y+Wg9DCJ/xB8C63WsG56dW HaAwCdp6z9c7+dkScHOEglnp5Hm8sBPG/rhFBvE+tHQem/SpCEy+hw0NPo0zG9LXDBTl x/jw== X-Original-Authentication-Results: mx.google.com; spf=pass (google.com: domain of ira.weiny@intel.com designates 192.55.52.120 as permitted sender) smtp.mailfrom=ira.weiny@intel.com; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=intel.com X-Gm-Message-State: APjAAAXrqB26+3NmebIYA/dY5d/SCdEQVLLIEGej3GwhCp3i/pmBnWYg ZKKh6sj3cNVxMGaOr/4LJ7qUIDOFB2mxsh8xK6juszlcau2GvzLk2VABF9nknEB9UZfSM7lvxe4 BzAgYOq4aSByYgHl1ylqi2ilfjYCM3byf1u80NOk0B1a2vKtLoYZr25xuM6FPZo7z5A== X-Received: by 2002:a17:90a:d3d2:: with SMTP id d18mr13052088pjw.5.1559785527205; Wed, 05 Jun 2019 18:45:27 -0700 (PDT) X-Google-Smtp-Source: APXvYqwDe7l/rkn8YE6SEHNe2A81U1x3sx8md/P6JgKx8LbN3VgnPpyVijQq4vu7DHTDKtBslxlZ X-Received: by 2002:a17:90a:d3d2:: with SMTP id d18mr13052024pjw.5.1559785526059; Wed, 05 Jun 2019 18:45:26 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1559785526; cv=none; d=google.com; s=arc-20160816; b=iyaPl3CUu+oQZuVdl0VZlbFYFSiA9ub0TrFXIhIpZ58fbxAIAR6syUfbMl3nFk1xJa kHbxKJ+sX67XUvjfCnY3xm42Szjsw9FPPq4XUp+Qa7RrEHIgYUTewzpjhuElifNZhOhu 3ZZA0VfOoKMG2Eka8zvNtaWaTRVA9h3nn3VitUvPYSQZiY7FI5GaIFtHEw2pNG/FCEPW eI6HXxm+uFFmE13UN7OlDbYvnCISdCk/gA3AR1riwCLI5RGrU3EMy0xzjMutDTADY53g z6S7xbErzXvY2cUdj6K3/EPv01tzRhbZMQbE+XZV18fmmtZ1cFzjERSnCcHNayor7qZg dhtQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from; bh=6od4TDbdqx+LT3047SpEutXdAzWkr/YDgVOMjEtHNxg=; b=0+jCpbVbdd/LQ9jJUuTh8TaavRa4TmFVQ3GRZCBTJSPWO/KjnceHIDMIX+3qSFIYW+ GIAOdVkS8flSnIqji0PYxPm5ZYQc9WBLPTF+Gw9qrpMG7bq83ApdKvYJ1xMt4N09zcnv v+HIPCyYCnGzx8CMY89KtpvM/pz5Gj30TXtO7rM7yJiFADoEtL6YupsN22EPRAM50l71 8xiduHslgXHzuXEcxcWHdAaDBisd29+vZ1xx2TGVXAK3Ou+ZAqvfdlSkgmIjKjRKDJjb JRqElE01anRJUGxqnJl3ey9wq8dx88SApFHo8zft8TRNquZSvNSD657z7G9kkpvB438Y IYAA== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: domain of ira.weiny@intel.com designates 192.55.52.120 as permitted sender) smtp.mailfrom=ira.weiny@intel.com; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=intel.com Received: from mga04.intel.com (mga04.intel.com. [192.55.52.120]) by mx.google.com with ESMTPS id 71si254942plf.156.2019.06.05.18.45.25 for (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Wed, 05 Jun 2019 18:45:26 -0700 (PDT) Received-SPF: pass (google.com: domain of ira.weiny@intel.com designates 192.55.52.120 as permitted sender) client-ip=192.55.52.120; Authentication-Results: mx.google.com; spf=pass (google.com: domain of ira.weiny@intel.com designates 192.55.52.120 as permitted sender) smtp.mailfrom=ira.weiny@intel.com; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=intel.com X-Amp-Result: SKIPPED(no attachment in message) X-Amp-File-Uploaded: False Received: from orsmga002.jf.intel.com ([10.7.209.21]) by fmsmga104.fm.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 05 Jun 2019 18:45:25 -0700 X-ExtLoop1: 1 Received: from iweiny-desk2.sc.intel.com ([10.3.52.157]) by orsmga002.jf.intel.com with ESMTP; 05 Jun 2019 18:45:24 -0700 From: ira.weiny@intel.com To: Dan Williams , Jan Kara , "Theodore Ts'o" , Jeff Layton , Dave Chinner Cc: Ira Weiny , Matthew Wilcox , linux-xfs@vger.kernel.org, Andrew Morton , John Hubbard , =?utf-8?b?SsOpcsO0bWUgR2xpc3Nl?= , linux-fsdevel@vger.kernel.org, linux-kernel@vger.kernel.org, linux-nvdimm@lists.01.org, linux-ext4@vger.kernel.org, linux-mm@kvack.org Subject: [PATCH RFC 09/10] fs/xfs: Fail truncate if pages are GUP pinned Date: Wed, 5 Jun 2019 18:45:42 -0700 Message-Id: <20190606014544.8339-10-ira.weiny@intel.com> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20190606014544.8339-1-ira.weiny@intel.com> References: <20190606014544.8339-1-ira.weiny@intel.com> MIME-Version: 1.0 X-Bogosity: Ham, tests=bogofilter, spamicity=0.000000, version=1.2.4 Sender: owner-linux-mm@kvack.org Precedence: bulk X-Loop: owner-majordomo@kvack.org List-ID: X-Virus-Scanned: ClamAV using ClamSMTP From: Ira Weiny If pages are actively gup pinned fail the truncate operation. To support an application who wishes to removing a pin upon SIGIO reception we must change the order of breaking layout leases with respect to DAX layout leases. Check for a GUP pin on the page being truncated and return ETXTBSY if it is GUP pinned. Change the order of XFS break leased layouts and break DAX layouts. Select EXPORT_BLOCK_OPS for FS_DAX to ensure that xfs_break_lease_layouts() is defined for FS_DAX as well as pNFS. Update comment for xfs_break_lease_layouts() Signed-off-by: Ira Weiny --- fs/Kconfig | 1 + fs/xfs/xfs_file.c | 8 ++++++-- fs/xfs/xfs_pnfs.c | 14 +++++++------- 3 files changed, 14 insertions(+), 9 deletions(-) diff --git a/fs/Kconfig b/fs/Kconfig index f1046cf6ad85..c54b0b88abbf 100644 --- a/fs/Kconfig +++ b/fs/Kconfig @@ -49,6 +49,7 @@ config FS_DAX select DEV_PAGEMAP_OPS if (ZONE_DEVICE && !FS_DAX_LIMITED) select FS_IOMAP select DAX + select EXPORTFS_BLOCK_OPS help Direct Access (DAX) can be used on memory-backed block devices. If the block device supports DAX and the filesystem supports DAX, diff --git a/fs/xfs/xfs_file.c b/fs/xfs/xfs_file.c index 350eb5546d36..1dc61c98f7cd 100644 --- a/fs/xfs/xfs_file.c +++ b/fs/xfs/xfs_file.c @@ -756,6 +756,9 @@ xfs_break_dax_layouts( if (!page) return 0; + if (page_gup_pinned(page)) + return -ETXTBSY; + *retry = true; return ___wait_var_event(&page->_refcount, atomic_read(&page->_refcount) == 1, TASK_INTERRUPTIBLE, @@ -779,10 +782,11 @@ xfs_break_layouts( retry = false; switch (reason) { case BREAK_UNMAP: - error = xfs_break_dax_layouts(inode, &retry, off, len); + error = xfs_break_leased_layouts(inode, iolock, &retry); if (error || retry) break; - /* fall through */ + error = xfs_break_dax_layouts(inode, &retry, off, len); + break; case BREAK_WRITE: error = xfs_break_leased_layouts(inode, iolock, &retry); break; diff --git a/fs/xfs/xfs_pnfs.c b/fs/xfs/xfs_pnfs.c index bde2c9f56a46..e70d24d12cbf 100644 --- a/fs/xfs/xfs_pnfs.c +++ b/fs/xfs/xfs_pnfs.c @@ -21,14 +21,14 @@ #include "xfs_pnfs.h" /* - * Ensure that we do not have any outstanding pNFS layouts that can be used by - * clients to directly read from or write to this inode. This must be called - * before every operation that can remove blocks from the extent map. - * Additionally we call it during the write operation, where aren't concerned - * about exposing unallocated blocks but just want to provide basic + * Ensure that we do not have any outstanding pNFS or longterm GUP layouts that + * can be used by clients to directly read from or write to this inode. This + * must be called before every operation that can remove blocks from the extent + * map. Additionally we call it during the write operation, where aren't + * concerned about exposing unallocated blocks but just want to provide basic * synchronization between a local writer and pNFS clients. mmap writes would - * also benefit from this sort of synchronization, but due to the tricky locking - * rules in the page fault path we don't bother. + * also benefit from this sort of synchronization, but due to the tricky + * locking rules in the page fault path we don't bother. */ int xfs_break_leased_layouts( From patchwork Thu Jun 6 01:45:43 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Ira Weiny X-Patchwork-Id: 10978251 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id 1D2BA15E6 for ; Thu, 6 Jun 2019 01:45:41 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 0F57D28784 for ; Thu, 6 Jun 2019 01:45:41 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 03B1D28725; Thu, 6 Jun 2019 01:45:41 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-2.9 required=2.0 tests=BAYES_00,MAILING_LIST_MULTI, RCVD_IN_DNSWL_NONE autolearn=unavailable version=3.3.1 Received: from kanga.kvack.org (kanga.kvack.org [205.233.56.17]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 88E102850D for ; Thu, 6 Jun 2019 01:45:40 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id 942C66B0279; Wed, 5 Jun 2019 21:45:29 -0400 (EDT) Delivered-To: linux-mm-outgoing@kvack.org Received: by kanga.kvack.org (Postfix, from userid 40) id 8A38F6B027A; Wed, 5 Jun 2019 21:45:29 -0400 (EDT) X-Original-To: int-list-linux-mm@kvack.org X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 721C26B027B; Wed, 5 Jun 2019 21:45:29 -0400 (EDT) X-Original-To: linux-mm@kvack.org X-Delivered-To: linux-mm@kvack.org Received: from mail-pl1-f199.google.com (mail-pl1-f199.google.com [209.85.214.199]) by kanga.kvack.org (Postfix) with ESMTP id 33A1D6B0279 for ; Wed, 5 Jun 2019 21:45:29 -0400 (EDT) Received: by mail-pl1-f199.google.com with SMTP id m12so506736pls.10 for ; Wed, 05 Jun 2019 18:45:29 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-original-authentication-results:x-gm-message-state:from:to:cc :subject:date:message-id:in-reply-to:references:mime-version :content-transfer-encoding; bh=PNYBk/3BEslXLtRMKRLhSbGGd0Jj/+WqkjRHb0gPhHk=; b=Q7OrF9vj1d6I/kU5P7AoCnp7pI1oSgyLgS05/7yEyPPcbbNL0mgqu6t9ymXylee+/u rODtpqlSJScOjTF9KajY4sQr22IcKj7QC2syQF3AKRYSGSl0Vbta7Fe9WuyHz0++EDXr 30wBTupZbhMT8MlSFrcS1Dg+LhZTgipnmZZ/2JdlkHZ0y981h2WcYUtPnUlGOiNUzoRQ LyFpAK1POI+sHI9OFmoyENIJufUTesJtM7yPxuoqFqe6RqyDSI6VoVZFo7o7CKa+Mc6e SSe3KtRYQuVxiCiktthjnEJ5t5Rrstpi11/YfottyD68MI4Opp9numXDjLTCFdtwKNjS JqjA== X-Original-Authentication-Results: mx.google.com; spf=pass (google.com: domain of ira.weiny@intel.com designates 192.55.52.120 as permitted sender) smtp.mailfrom=ira.weiny@intel.com; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=intel.com X-Gm-Message-State: APjAAAVwhweuqgU8RukSaPNzzptWUYSEL/BMRTlckMH9m3FknmJjOJeS +GEaKSXiC2OLTt8re/M0TE7LhezWJNQQ5yrB1EveWStZLv+XlsxlRO/+jN+zr46EUIESlagpzw2 RZ18QiIvcPj8bSVKPwaJzlyzTtSrj9whVVfskbe22+KkfWsoffScephrvNSy1sFbITA== X-Received: by 2002:a17:90a:7f93:: with SMTP id m19mr31278285pjl.73.1559785528859; Wed, 05 Jun 2019 18:45:28 -0700 (PDT) X-Google-Smtp-Source: APXvYqzxb+syro6M2WaR4q7Qy8CLb7S98AUF0GVfkxT7fvVNyAIBIAR9dCJHpdRyX+LYBc3lJWwR X-Received: by 2002:a17:90a:7f93:: with SMTP id m19mr31278241pjl.73.1559785528037; Wed, 05 Jun 2019 18:45:28 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1559785528; cv=none; d=google.com; s=arc-20160816; b=XErr++NbsLbDnfjm8rq9n6uB7NI4is9lpmqGSbmaQUipOME1L76kM91rA1NzOg4AlU QseatNqCZCw6nMjlBGmolEF/AwJSSqpRnvkm1z5fCC3EBgeNceDrENwFKP/ozSwg2o5G nY18ldTYU4VvOW4S7twcP8Z/dkKr8opLGTFHdKEnaVWlLJdjofa/baiBsfU49/Fr2wlq lsWHnWXJZBSEImin/NNxlQVRvahF4LNq9oauYwax86ots+hifQIi9iu5t5vYj5lx5MIh 4Qb6V2fDS7jA/YcMvfJU1/FXxj5+oUyH+vkt3/Fuc4uJnMLGN8EiJUcCSNfjRuuMA+6C gqUA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from; bh=PNYBk/3BEslXLtRMKRLhSbGGd0Jj/+WqkjRHb0gPhHk=; b=wUK0SL1JlGAo3Qr4WKETTVd0ibLt2p74xu/TkPS1umywBKuJNARgUSGmi4M0frsTWr rUH2H/HVdiHY03zM4yaSg6dfmcEvOjWRL7IbWGNx3hsB1zl3EHrxZYEme/mbqcam+uiA vuifV2Ta9lL1eYiDVDi5aFFAY8DH70b+JYpG8aQ+KeJRSnv1nCQvdkDGv6SSB0j4YAzx WvavdqVxIiHuWlUs9aHGzds+gAsorVuLqCwEVnFzOxpEx0/KGlzGfhqvT5fO9SvmdUO1 Kj/RSZ7zZQc8/lJVFL4iS/ilL93boIsi8E4+mU712m/wFzCfZzaMtfwKjxNC6uiYnm7W niwA== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: domain of ira.weiny@intel.com designates 192.55.52.120 as permitted sender) smtp.mailfrom=ira.weiny@intel.com; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=intel.com Received: from mga04.intel.com (mga04.intel.com. [192.55.52.120]) by mx.google.com with ESMTPS id 71si254942plf.156.2019.06.05.18.45.27 for (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Wed, 05 Jun 2019 18:45:28 -0700 (PDT) Received-SPF: pass (google.com: domain of ira.weiny@intel.com designates 192.55.52.120 as permitted sender) client-ip=192.55.52.120; Authentication-Results: mx.google.com; spf=pass (google.com: domain of ira.weiny@intel.com designates 192.55.52.120 as permitted sender) smtp.mailfrom=ira.weiny@intel.com; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=intel.com X-Amp-Result: SKIPPED(no attachment in message) X-Amp-File-Uploaded: False Received: from orsmga002.jf.intel.com ([10.7.209.21]) by fmsmga104.fm.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 05 Jun 2019 18:45:27 -0700 X-ExtLoop1: 1 Received: from iweiny-desk2.sc.intel.com ([10.3.52.157]) by orsmga002.jf.intel.com with ESMTP; 05 Jun 2019 18:45:26 -0700 From: ira.weiny@intel.com To: Dan Williams , Jan Kara , "Theodore Ts'o" , Jeff Layton , Dave Chinner Cc: Ira Weiny , Matthew Wilcox , linux-xfs@vger.kernel.org, Andrew Morton , John Hubbard , =?utf-8?b?SsOpcsO0bWUgR2xpc3Nl?= , linux-fsdevel@vger.kernel.org, linux-kernel@vger.kernel.org, linux-nvdimm@lists.01.org, linux-ext4@vger.kernel.org, linux-mm@kvack.org Subject: [PATCH RFC 10/10] mm/gup: Remove FOLL_LONGTERM DAX exclusion Date: Wed, 5 Jun 2019 18:45:43 -0700 Message-Id: <20190606014544.8339-11-ira.weiny@intel.com> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20190606014544.8339-1-ira.weiny@intel.com> References: <20190606014544.8339-1-ira.weiny@intel.com> MIME-Version: 1.0 X-Bogosity: Ham, tests=bogofilter, spamicity=0.000000, version=1.2.4 Sender: owner-linux-mm@kvack.org Precedence: bulk X-Loop: owner-majordomo@kvack.org List-ID: X-Virus-Scanned: ClamAV using ClamSMTP From: Ira Weiny Now that there is a mechanism for users to safely take LONGTERM pins on FS DAX pages, remove the FS DAX exclusion from GUP with FOLL_LONGTERM. Special processing remains in effect for CONFIG_CMA Signed-off-by: Ira Weiny --- mm/gup.c | 78 ++++++-------------------------------------------------- 1 file changed, 8 insertions(+), 70 deletions(-) diff --git a/mm/gup.c b/mm/gup.c index d06cc5b14c0b..4f6e5606b81e 100644 --- a/mm/gup.c +++ b/mm/gup.c @@ -1392,26 +1392,6 @@ long get_user_pages_remote(struct task_struct *tsk, struct mm_struct *mm, } EXPORT_SYMBOL(get_user_pages_remote); -#if defined(CONFIG_FS_DAX) || defined (CONFIG_CMA) -static bool check_dax_vmas(struct vm_area_struct **vmas, long nr_pages) -{ - long i; - struct vm_area_struct *vma_prev = NULL; - - for (i = 0; i < nr_pages; i++) { - struct vm_area_struct *vma = vmas[i]; - - if (vma == vma_prev) - continue; - - vma_prev = vma; - - if (vma_is_fsdax(vma)) - return true; - } - return false; -} - #ifdef CONFIG_CMA static struct page *new_non_cma_page(struct page *page, unsigned long private) { @@ -1542,18 +1522,6 @@ static long check_and_migrate_cma_pages(struct task_struct *tsk, return nr_pages; } -#else -static long check_and_migrate_cma_pages(struct task_struct *tsk, - struct mm_struct *mm, - unsigned long start, - unsigned long nr_pages, - struct page **pages, - struct vm_area_struct **vmas, - unsigned int gup_flags) -{ - return nr_pages; -} -#endif /* * __gup_longterm_locked() is a wrapper for __get_user_pages_locked which @@ -1567,49 +1535,28 @@ static long __gup_longterm_locked(struct task_struct *tsk, struct vm_area_struct **vmas, unsigned int gup_flags) { - struct vm_area_struct **vmas_tmp = vmas; unsigned long flags = 0; - long rc, i; + long rc; - if (gup_flags & FOLL_LONGTERM) { - if (!pages) - return -EINVAL; - - if (!vmas_tmp) { - vmas_tmp = kcalloc(nr_pages, - sizeof(struct vm_area_struct *), - GFP_KERNEL); - if (!vmas_tmp) - return -ENOMEM; - } + if (flags & FOLL_LONGTERM) flags = memalloc_nocma_save(); - } rc = __get_user_pages_locked(tsk, mm, start, nr_pages, pages, - vmas_tmp, NULL, gup_flags); + vmas, NULL, gup_flags); if (gup_flags & FOLL_LONGTERM) { memalloc_nocma_restore(flags); if (rc < 0) goto out; - if (check_dax_vmas(vmas_tmp, rc)) { - for (i = 0; i < rc; i++) - put_page(pages[i]); - rc = -EOPNOTSUPP; - goto out; - } - rc = check_and_migrate_cma_pages(tsk, mm, start, rc, pages, - vmas_tmp, gup_flags); + vmas, gup_flags); } out: - if (vmas_tmp != vmas) - kfree(vmas_tmp); return rc; } -#else /* !CONFIG_FS_DAX && !CONFIG_CMA */ +#else /* !CONFIG_CMA */ static __always_inline long __gup_longterm_locked(struct task_struct *tsk, struct mm_struct *mm, unsigned long start, @@ -1621,7 +1568,7 @@ static __always_inline long __gup_longterm_locked(struct task_struct *tsk, return __get_user_pages_locked(tsk, mm, start, nr_pages, pages, vmas, NULL, flags); } -#endif /* CONFIG_FS_DAX || CONFIG_CMA */ +#endif /* CONFIG_CMA */ /* * This is the same as get_user_pages_remote(), just with a @@ -1882,9 +1829,6 @@ static int gup_pte_range(pmd_t pmd, unsigned long addr, unsigned long end, goto pte_unmap; if (pte_devmap(pte)) { - if (unlikely(flags & FOLL_LONGTERM)) - goto pte_unmap; - pgmap = get_dev_pagemap(pte_pfn(pte), pgmap); if (unlikely(!pgmap)) { undo_dev_pagemap(nr, nr_start, pages); @@ -2057,12 +2001,9 @@ static int gup_huge_pmd(pmd_t orig, pmd_t *pmdp, unsigned long addr, if (!pmd_access_permitted(orig, flags & FOLL_WRITE)) return 0; - if (pmd_devmap(orig)) { - if (unlikely(flags & FOLL_LONGTERM)) - return 0; + if (pmd_devmap(orig)) return __gup_device_huge_pmd(orig, pmdp, addr, end, pages, nr, flags); - } refs = 0; page = pmd_page(orig) + ((addr & ~PMD_MASK) >> PAGE_SHIFT); @@ -2101,12 +2042,9 @@ static int gup_huge_pud(pud_t orig, pud_t *pudp, unsigned long addr, if (!pud_access_permitted(orig, flags & FOLL_WRITE)) return 0; - if (pud_devmap(orig)) { - if (unlikely(flags & FOLL_LONGTERM)) - return 0; + if (pud_devmap(orig)) return __gup_device_huge_pud(orig, pudp, addr, end, pages, nr, flags); - } refs = 0; page = pud_page(orig) + ((addr & ~PUD_MASK) >> PAGE_SHIFT);