From patchwork Thu Feb 11 16:24:13 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Pasha Tatashin X-Patchwork-Id: 12083653 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-11.6 required=3.0 tests=BAYES_00,DKIM_INVALID, DKIM_SIGNED,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_PATCH,MAILING_LIST_MULTI, SPF_HELO_NONE,SPF_PASS,USER_AGENT_GIT autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 1B31CC433DB for ; Thu, 11 Feb 2021 16:24:33 +0000 (UTC) Received: from kanga.kvack.org (kanga.kvack.org [205.233.56.17]) by mail.kernel.org (Postfix) with ESMTP id 7FA7864E8B for ; Thu, 11 Feb 2021 16:24:32 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 7FA7864E8B Authentication-Results: mail.kernel.org; dmarc=none (p=none dis=none) header.from=soleen.com Authentication-Results: mail.kernel.org; spf=pass smtp.mailfrom=owner-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix) id CA3F06B0109; Thu, 11 Feb 2021 11:24:31 -0500 (EST) Received: by kanga.kvack.org (Postfix, from userid 40) id C536D6B010A; Thu, 11 Feb 2021 11:24:31 -0500 (EST) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id AF3E96B010B; Thu, 11 Feb 2021 11:24:31 -0500 (EST) X-Delivered-To: linux-mm@kvack.org Received: from forelay.hostedemail.com (smtprelay0087.hostedemail.com [216.40.44.87]) by kanga.kvack.org (Postfix) with ESMTP id 91B8B6B0109 for ; Thu, 11 Feb 2021 11:24:31 -0500 (EST) Received: from smtpin23.hostedemail.com (10.5.19.251.rfc1918.com [10.5.19.251]) by forelay01.hostedemail.com (Postfix) with ESMTP id 4E2A2180AD817 for ; Thu, 11 Feb 2021 16:24:31 +0000 (UTC) X-FDA: 77806509942.23.hole54_0c00f1e2761a Received: from filter.hostedemail.com (10.5.16.251.rfc1918.com [10.5.16.251]) by smtpin23.hostedemail.com (Postfix) with ESMTP id 2DFF437606 for ; Thu, 11 Feb 2021 16:24:31 +0000 (UTC) X-HE-Tag: hole54_0c00f1e2761a X-Filterd-Recvd-Size: 9394 Received: from mail-qt1-f171.google.com (mail-qt1-f171.google.com [209.85.160.171]) by imf13.hostedemail.com (Postfix) with ESMTP for ; Thu, 11 Feb 2021 16:24:30 +0000 (UTC) Received: by mail-qt1-f171.google.com with SMTP id d3so4530114qtr.10 for ; Thu, 11 Feb 2021 08:24:30 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=soleen.com; s=google; h=from:to:subject:date:message-id:mime-version :content-transfer-encoding; bh=Yy8l9ObkeV/ymXOaTl4aRZL4ekIQwJK2VWwZLNWsZ8M=; b=diSaDExX5LrPCKbGY/gbzqk7cPOuQ4UYWZRKHMK4kG6PBiBsGfBhF8M0i9dLRamnOx 4qBlOT/gCE6i7K5nHit/vcV9QxJIU6kZz/pvphRFMxf5IwNZeiw45IHH7Deso3V7v1q8 66W04fm4k0vT281ppzJIjDIzLh8kfgPdPkOiXe9bl+y+VBtW9rEjRVtEtSmMNOwtBepg UFfCPhqHMBGHFqaZX0skODncFT9QhRYzNJJ/QsTQK+X+9xRIihbLBzaIwCScODLmwFRW IdjMbFqSwMeJqeDIK5qIMiba9WXt1BrR+tTKESYdXE2UvVumOc6zz5LwtuCYhm/Qfq3R X9XQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:subject:date:message-id:mime-version :content-transfer-encoding; bh=Yy8l9ObkeV/ymXOaTl4aRZL4ekIQwJK2VWwZLNWsZ8M=; b=Wk55SfQYyrkDHglubI2tXcK2Pp4jjiyqziNIUEQoFPIAFsx7s9/0aBmKr/z6K9gYl8 LgmdQEuH9ZA0Tp9M21LECs6P4qNBHL85GFxrxz9j7A7hy8xgY8/dU2pHnqfn/qz1GjxH Iifyqjk+mn3RCbWNulAdD+BT2gg4vvlW5QDqnu7uk1wkUVdMBKW1tFINEWwzsS/3QblO sEVNB8PaCPeskOhRXVQgfNmuHroWylMjDpQ3GiSTxiNTKeZ5N60ICbKDC/JxWXxq24xj V5VDeD1xLpc3Ar4MBO42hbo3txJzQZ6hdjpq0QN2quRx1eX9/kOv7EGlc9Tql8/HDDqY cd5w== X-Gm-Message-State: AOAM533Wz2UW3qI8WBrj179FaOAVtMYAXY4OQyWMyx6REoR6peUaetv2 gmVe2VvgBNMdC8GQ8jLgMFxnPQ== X-Google-Smtp-Source: ABdhPJyrUUKa4paqMq1JLAbdCli1GAhNhy7dThCCn+KHVt5BL8+sc4CYs8ePGHiLMKby6DEZ0Ut5vg== X-Received: by 2002:aed:3165:: with SMTP id 92mr8315722qtg.233.1613060669628; Thu, 11 Feb 2021 08:24:29 -0800 (PST) Received: from localhost.localdomain (c-73-69-118-222.hsd1.nh.comcast.net. [73.69.118.222]) by smtp.gmail.com with ESMTPSA id i23sm3831778qtq.42.2021.02.11.08.24.27 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 11 Feb 2021 08:24:29 -0800 (PST) From: Pavel Tatashin To: pasha.tatashin@soleen.com, linux-kernel@vger.kernel.org, linux-mm@kvack.org, akpm@linux-foundation.org, vbabka@suse.cz, mhocko@suse.com, david@redhat.com, osalvador@suse.de, dan.j.williams@intel.com, sashal@kernel.org, tyhicks@linux.microsoft.com, iamjoonsoo.kim@lge.com, mike.kravetz@oracle.com, rostedt@goodmis.org, mingo@redhat.com, jgg@ziepe.ca, peterz@infradead.org, mgorman@suse.de, willy@infradead.org, rientjes@google.com, jhubbard@nvidia.com, linux-doc@vger.kernel.org, ira.weiny@intel.com, linux-kselftest@vger.kernel.org, jmorris@namei.org Subject: [PATCH v10 00/14] prohibit pinning pages in ZONE_MOVABLE Date: Thu, 11 Feb 2021 11:24:13 -0500 Message-Id: <20210211162427.618913-1-pasha.tatashin@soleen.com> X-Mailer: git-send-email 2.25.1 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: Changelog --------- v10 - Fixed !CONFIG_MMU compiler issues by adding is_zero_pfn() stub. v9 - Renamed gpf_to_alloc_flags() to gfp_to_alloc_flags_cma(); thanks Lecopzer Chen for noticing. - Fixed warning reported scripts/checkpatch.pl: "Logical continuations should be on the previous line" v8 - Added reviewed by's from John Hubbard - Fixed subjects for selftests patches - Moved zero page check inside is_pinnable_page() as requested by Jason Gunthorpe. v7 - Added reviewed-by's - Fixed a compile bug on non-mmu builds reported by robot v6 Small update, but I wanted to send it out quicker, as it removes a controversial patch and replaces it with something sane. - Removed forcing FOLL_WRITE for longterm gup, instead added a patch to skip zero pages during migration. - Added reviewed-by's and minor log changes. v5 - Added the following patches to the beginning of series, which are fixes to the other existing problems with CMA migration code: mm/gup: check every subpage of a compound page during isolation mm/gup: return an error on migration failure mm/gup: check for isolation errors also at the beginning of series mm/gup: do not allow zero page for pinned pages - remove .gfp_mask/.reclaim_idx changes from mm/vmscan.c - update movable zone header comment in patch 8 instead of patch 3, fix the comment - Added acked, sign-offs - Updated commit logs based on feedback - Addressed issues reported by Michal and Jason. - Remove: #define PINNABLE_MIGRATE_MAX 10 #define PINNABLE_ISOLATE_MAX 100 Instead: fail on the first migration failure, and retry isolation forever as their failures are transient. - In self-set addressed some of the comments from John Hubbard, updated commit logs, and added comments. Renamed gup->flags with gup->test_flags. v4 - Address page migration comments. New patch: mm/gup: limit number of gup migration failures, honor failures Implements the limiting number of retries for migration failures, and also check for isolation failures. Added a test case into gup_test to verify that pages never long-term pinned in a movable zone, and also added tests to fault both in kernel and in userland. v3 - Merged with linux-next, which contains clean-up patch from Jason, therefore this series is reduced by two patches which did the same thing. v2 - Addressed all review comments - Added Reviewed-by's. - Renamed PF_MEMALLOC_NOMOVABLE to PF_MEMALLOC_PIN - Added is_pinnable_page() to check if page can be longterm pinned - Fixed gup fast path by checking is_in_pinnable_zone() - rename cma_page_list to movable_page_list - add a admin-guide note about handling pinned pages in ZONE_MOVABLE, updated caveat about pinned pages from linux/mmzone.h - Move current_gfp_context() to fast-path --------- When page is pinned it cannot be moved and its physical address stays the same until pages is unpinned. This is useful functionality to allows userland to implementation DMA access. For example, it is used by vfio in vfio_pin_pages(). However, this functionality breaks memory hotplug/hotremove assumptions that pages in ZONE_MOVABLE can always be migrated. This patch series fixes this issue by forcing new allocations during page pinning to omit ZONE_MOVABLE, and also to migrate any existing pages from ZONE_MOVABLE during pinning. It uses the same scheme logic that is currently used by CMA, and extends the functionality for all allocations. For more information read the discussion [1] about this problem. [1] https://lore.kernel.org/lkml/CA+CK2bBffHBxjmb9jmSKacm0fJMinyt3Nhk8Nx6iudcQSj80_w@mail.gmail.com Previous versions: v1 https://lore.kernel.org/lkml/20201202052330.474592-1-pasha.tatashin@soleen.com v2 https://lore.kernel.org/lkml/20201210004335.64634-1-pasha.tatashin@soleen.com v3 https://lore.kernel.org/lkml/20201211202140.396852-1-pasha.tatashin@soleen.com v4 https://lore.kernel.org/lkml/20201217185243.3288048-1-pasha.tatashin@soleen.com v5 https://lore.kernel.org/lkml/20210119043920.155044-1-pasha.tatashin@soleen.com v6 https://lore.kernel.org/lkml/20210120014333.222547-1-pasha.tatashin@soleen.com v7 https://lore.kernel.org/lkml/20210122033748.924330-1-pasha.tatashin@soleen.com v8 https://lore.kernel.org/lkml/20210125194751.1275316-1-pasha.tatashin@soleen.com v9 https://lore.kernel.org/lkml/20210201153827.444374-1-pasha.tatashin@soleen.com Pavel Tatashin (14): mm/gup: don't pin migrated cma pages in movable zone mm/gup: check every subpage of a compound page during isolation mm/gup: return an error on migration failure mm/gup: check for isolation errors mm cma: rename PF_MEMALLOC_NOCMA to PF_MEMALLOC_PIN mm: apply per-task gfp constraints in fast path mm: honor PF_MEMALLOC_PIN for all movable pages mm/gup: do not migrate zero page mm/gup: migrate pinned pages out of movable zone memory-hotplug.rst: add a note about ZONE_MOVABLE and page pinning mm/gup: change index type to long as it counts pages mm/gup: longterm pin migration cleanup selftests/vm: gup_test: fix test flag selftests/vm: gup_test: test faulting in kernel, and verify pinnable pages .../admin-guide/mm/memory-hotplug.rst | 9 + include/linux/migrate.h | 1 + include/linux/mm.h | 19 ++ include/linux/mmzone.h | 13 +- include/linux/pgtable.h | 12 ++ include/linux/sched.h | 2 +- include/linux/sched/mm.h | 27 +-- include/trace/events/migrate.h | 3 +- mm/gup.c | 174 ++++++++---------- mm/gup_test.c | 29 +-- mm/gup_test.h | 3 +- mm/hugetlb.c | 4 +- mm/page_alloc.c | 33 ++-- tools/testing/selftests/vm/gup_test.c | 36 +++- 14 files changed, 208 insertions(+), 157 deletions(-)