Received: by 2002:ac0:a581:0:0:0:0:0 with SMTP id m1-v6csp3302289imm; Sun, 1 Jul 2018 18:02:01 -0700 (PDT) X-Google-Smtp-Source: ADUXVKKPmA263ZOv9dG/fqYOSRcdUqLkkWIdwDLBNCdU4COJUqROMzuGQcJsTSD/fBbYzRVkwo42 X-Received: by 2002:a17:902:b907:: with SMTP id bf7-v6mr24089499plb.331.1530493321912; Sun, 01 Jul 2018 18:02:01 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1530493321; cv=none; d=google.com; s=arc-20160816; b=QJWgKhUyJlSNK5p+CMNmNTojjPY7xSin5FpsKGpwlWX+cYmtfDLRcyKPGmRxv4f8zO ZVd3bxMEnZIdmQbiac5JltR5fWAm9PgBeuL2Z7M6Kyel0FRqtsNQ9THFCU0QKKLNeQQT doyglY5JliQVGDIiJmd+N29lcbvwXaaeTTDgIUJkGkHNgstTU7gMqEZVKr90SdOrW5Sy Gw3Tn7vDZqyTTDGLGrC7PjTJXA/NcdWFdbthyUbAl4Ip/hiKaooTfXqVYF72j0vkJbPJ Gehcd7NU+a0ZUZnjq3Kj2X+LYFiB91F2T19HTPtqipgCB2PGRt3G6RSZ5MNZgcGxfPQP o0dA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:references:in-reply-to:message-id:date :subject:cc:to:from:dkim-signature:arc-authentication-results; bh=HhAI7TUKIO2hMbI+QxZbnwxaMd8iJDubr9ysaPy3gts=; b=Z0lmn42KiVKycjSty2ugIB7L/U38h5mYz0ILysp5BJTt1ZbrE0pYAM/NOhtP2Pn6yw fZ9d0DIbZr3rfbtHeXdAzPwIl03V9LIcW6WrjEL+z6/TJo+dw/IdH7Y/sA0pZQQFz0Yk u8YkrUTOL25u9cKddGfm8H8v5r8Pf0tmkdfeB2epDQEvhfZxT8zDseCOLOnuhAnO+NDt Z5Dxf6Rm4bR/csT6Evcdr1yKsrnZOv7P9Gleh9kBqosW37bhPMDqOldoCjhS+qvVPhtz o2riT5jjSsAuVgPmEU5crG2jKsDXT//kIVYYE3KklPUWJBvqqKTiTv3GuVLKT/Wqupzy +eFw== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@gmail.com header.s=20161025 header.b=FSdPzP3b; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id y186-v6si13424834pgb.395.2018.07.01.18.01.47; Sun, 01 Jul 2018 18:02:01 -0700 (PDT) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; dkim=pass header.i=@gmail.com header.s=20161025 header.b=FSdPzP3b; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S932641AbeGBA7X (ORCPT + 99 others); Sun, 1 Jul 2018 20:59:23 -0400 Received: from mail-oi0-f67.google.com ([209.85.218.67]:34917 "EHLO mail-oi0-f67.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S932221AbeGBA5j (ORCPT ); Sun, 1 Jul 2018 20:57:39 -0400 Received: by mail-oi0-f67.google.com with SMTP id i12-v6so8934847oik.2; Sun, 01 Jul 2018 17:57:38 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=HhAI7TUKIO2hMbI+QxZbnwxaMd8iJDubr9ysaPy3gts=; b=FSdPzP3b4zyl0MoJzhrKQDe0Uyo3SWPEII5s4mx81SFxdpwfjw9FN3lF3+GKY63ZKK ru0St8YCkjsuPOA40xebBZfVNW13yjNzOG9hPIFZHEqxPDOTOL4hhZNkHAYPDeA5bxma xhiJaZkKleVA9owbIm1sIta+2S8eUajOd/lBF6YwmuvcpbNL9m9Urbps9I5utsM20dKh Ar/4yybqZR+1n33By6VmJkDVtuX+MKDEsbsxqNhulgoZ1H9fCDy/SP+cG6yZKk2ZX0Sj MeBvLS6F0mNqHAjPvz1LC2Dk6Rvu5pHzOXcO/m9jWU4CvjlAGy1gt2qC/g+bqtisKUb5 l0oQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=HhAI7TUKIO2hMbI+QxZbnwxaMd8iJDubr9ysaPy3gts=; b=BnwS+uFwydcH0EbNp+BC/w/UEIBJaA8UtI0rmHij+qIW7pFrLlfAsuDTsI14u+XJOJ 0/HjOdTAqfK9z3etgwvk33+icr+AYgEha4Kq2dNQCF9o+YI+MMsWpCmPylT4RF6NfZsG IRMIdKFtZTAokErN5X0gNRFQmPRA/oL1+9o7cRyRScUOBZJD6XURJgTUnVHRiD55mjxD GAfCcuufmXrZl1jKv/3UG4UueIQOYny/qbuXB7fpIK28G2jQHMVsu5VKmWpMAK/nBwC7 TipMwk/+ihHUCdFgt1ZQd3MkkoGTWz/+QpPpHO31NAwtc5EMrkyyh/3WuVvYkoBv5M6x Oa/A== X-Gm-Message-State: APt69E0QWvIshNQWiBva66k+G1axL37S8qDN3EFIzwhPiUDCPDWfkukh WWo6suXVy/5zaLWJG/fAsmU= X-Received: by 2002:aca:5d86:: with SMTP id r128-v6mr140774oib.243.1530493058580; Sun, 01 Jul 2018 17:57:38 -0700 (PDT) Received: from sandstorm.nvidia.com ([2600:1700:43b0:3120:feaa:14ff:fe9e:34cb]) by smtp.gmail.com with ESMTPSA id v6-v6sm4111672oix.30.2018.07.01.17.57.36 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Sun, 01 Jul 2018 17:57:37 -0700 (PDT) From: john.hubbard@gmail.com X-Google-Original-From: jhubbard@nvidia.com To: Matthew Wilcox , Michal Hocko , Christopher Lameter , Jason Gunthorpe , Dan Williams , Jan Kara Cc: linux-mm@kvack.org, LKML , linux-rdma , linux-fsdevel@vger.kernel.org, John Hubbard Subject: [PATCH v2 2/6] mm: introduce page->dma_pinned_flags, _count Date: Sun, 1 Jul 2018 17:56:50 -0700 Message-Id: <20180702005654.20369-3-jhubbard@nvidia.com> X-Mailer: git-send-email 2.18.0 In-Reply-To: <20180702005654.20369-1-jhubbard@nvidia.com> References: <20180702005654.20369-1-jhubbard@nvidia.com> X-NVConfidentiality: public Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: John Hubbard Add two struct page fields that, combined, are unioned with struct page->lru. There is no change in the size of struct page. These new fields are for type safety and clarity. Also add page flag accessors to test, set and clear the new page->dma_pinned_flags field. The page->dma_pinned_count field will be used in upcoming patches Signed-off-by: John Hubbard --- include/linux/mm_types.h | 22 ++++++++++++----- include/linux/page-flags.h | 50 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 66 insertions(+), 6 deletions(-) diff --git a/include/linux/mm_types.h b/include/linux/mm_types.h index 99ce070e7dcb..0ecd29dcd642 100644 --- a/include/linux/mm_types.h +++ b/include/linux/mm_types.h @@ -78,12 +78,22 @@ struct page { */ union { struct { /* Page cache and anonymous pages */ - /** - * @lru: Pageout list, eg. active_list protected by - * zone_lru_lock. Sometimes used as a generic list - * by the page owner. - */ - struct list_head lru; + union { + /** + * @lru: Pageout list, eg. active_list protected + * by zone_lru_lock. Sometimes used as a + * generic list by the page owner. + */ + struct list_head lru; + /* Used by get_user_pages*(). Pages may not be + * on an LRU while these dma_pinned_* fields + * are in use. + */ + struct { + unsigned long dma_pinned_flags; + atomic_t dma_pinned_count; + }; + }; /* See page-flags.h for PAGE_MAPPING_FLAGS */ struct address_space *mapping; pgoff_t index; /* Our offset within mapping. */ diff --git a/include/linux/page-flags.h b/include/linux/page-flags.h index 901943e4754b..b694a1a3bdf3 100644 --- a/include/linux/page-flags.h +++ b/include/linux/page-flags.h @@ -420,6 +420,56 @@ static __always_inline int __PageMovable(struct page *page) PAGE_MAPPING_MOVABLE; } +/* + * page->dma_pinned_flags is protected by the zone_gup_lock, plus the + * page->dma_pinned_count field as well. + * + * Because page->dma_pinned_flags is unioned with page->lru, any page that + * uses these flags must NOT be on an LRU. That's partly enforced by + * ClearPageDmaPinned, which gives the page back to LRU. + * + * Because PageDmaPinned also corresponds to PageTail (the lowest bit in + * the first union of struct page), and this flag is checked without knowing + * whether it is a tail page or a PageDmaPinned page, start the flags at + * bit 1 (0x2), rather than bit 0. + */ +#define PAGE_DMA_PINNED 0x2 +#define PAGE_DMA_PINNED_FLAGS (PAGE_DMA_PINNED) + +/* + * Because these flags are read outside of a lock, ensure visibility between + * different threads, by using READ|WRITE_ONCE. + */ +static __always_inline int PageDmaPinnedFlags(struct page *page) +{ + VM_BUG_ON(page != compound_head(page)); + return (READ_ONCE(page->dma_pinned_flags) & PAGE_DMA_PINNED_FLAGS) != 0; +} + +static __always_inline int PageDmaPinned(struct page *page) +{ + VM_BUG_ON(page != compound_head(page)); + return (READ_ONCE(page->dma_pinned_flags) & PAGE_DMA_PINNED) != 0; +} + +static __always_inline void SetPageDmaPinned(struct page *page) +{ + VM_BUG_ON(page != compound_head(page)); + WRITE_ONCE(page->dma_pinned_flags, PAGE_DMA_PINNED); +} + +static __always_inline void ClearPageDmaPinned(struct page *page) +{ + VM_BUG_ON(page != compound_head(page)); + VM_BUG_ON_PAGE(!PageDmaPinnedFlags(page), page); + + /* This does a WRITE_ONCE to the lru.next, which is also the + * page->dma_pinned_flags field. So in addition to restoring page->lru, + * this provides visibility to other threads. + */ + INIT_LIST_HEAD(&page->lru); +} + #ifdef CONFIG_KSM /* * A KSM page is one of those write-protected "shared pages" or "merged pages" -- 2.18.0