From patchwork Fri Jul 20 07:18:43 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Huang, Ying" X-Patchwork-Id: 10536051 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork.web.codeaurora.org (Postfix) with ESMTP id 97CC2602CA for ; Fri, 20 Jul 2018 07:20:27 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 821DC28610 for ; Fri, 20 Jul 2018 07:20:27 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 76AC729869; Fri, 20 Jul 2018 07:20:27 +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 D964829868 for ; Fri, 20 Jul 2018 07:20:26 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id 93BD66B0269; Fri, 20 Jul 2018 03:20:05 -0400 (EDT) Delivered-To: linux-mm-outgoing@kvack.org Received: by kanga.kvack.org (Postfix, from userid 40) id 8BD706B026A; Fri, 20 Jul 2018 03:20:05 -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 73A6F6B026B; Fri, 20 Jul 2018 03:20:05 -0400 (EDT) X-Original-To: linux-mm@kvack.org X-Delivered-To: linux-mm@kvack.org Received: from mail-pg1-f197.google.com (mail-pg1-f197.google.com [209.85.215.197]) by kanga.kvack.org (Postfix) with ESMTP id 280E16B0269 for ; Fri, 20 Jul 2018 03:20:05 -0400 (EDT) Received: by mail-pg1-f197.google.com with SMTP id q12-v6so5379161pgp.6 for ; Fri, 20 Jul 2018 00:20:05 -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; bh=yVc/Id39O+yOS6rb4xvxCavASon/RBPt3ms4JL2mffU=; b=WLwYYXqKyonjO2QUdksitNXEuEigug6lMpaWhkkgIN3Dy3dQDJBVJYyB4QUaxlViZy i0l4qxPvmfdr1EEcSQefnM+e3gmMvGB0HqQzVAJceMg5n/LHwMAzyjbVXBUvSapZmUMm ErM63WfhA88GiPRsKsz0aCE9agSW6aXrDodZ1xUGLZydCXYdzpzuqnC5wxZX0Jt2sGGT LO7J9l3E+5hNYwE3tGx9VjIEHcM75LN8h3VbO+0DwJ94oRMKg0jkk8dLGpB+Le9tPTNj 0iMNv7ZGRox2zLctX7QJEb1breySSzQSQWr13daOOE+FZ+dpKJ9BYWFNbXs8pBy0hn4S Y1kg== X-Original-Authentication-Results: mx.google.com; spf=pass (google.com: domain of ying.huang@intel.com designates 192.55.52.115 as permitted sender) smtp.mailfrom=ying.huang@intel.com; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=intel.com X-Gm-Message-State: AOUpUlFymfnCl3xXGCUMh7b7PDBQaNMJOpqQ1yFlH1b8nrKH6emypcAM UVeMjk0BBWGBaqRRBwlUmTJ5s2ImxNof1l1L3yCNHnubByHkESZzIjrbXqWd6k3p9/9uO+8GWIr 0vWCPglND5fN2RAr97IUecuqMstio8g/r6LVXBvmXbndA2D148+A5VjsStKEWv7Qb7Q== X-Received: by 2002:a63:8dca:: with SMTP id z193-v6mr975212pgd.228.1532071204838; Fri, 20 Jul 2018 00:20:04 -0700 (PDT) X-Google-Smtp-Source: AAOMgpcja6y6AsSD08zP/aZsvJ/f13nRYn3/5fX9WPLFUNhNtUFwYDilMFKWH3rxgK+PbJc9uI/W X-Received: by 2002:a63:8dca:: with SMTP id z193-v6mr974896pgd.228.1532071197487; Fri, 20 Jul 2018 00:19:57 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1532071197; cv=none; d=google.com; s=arc-20160816; b=qyz++Zwa7FiMk5Xs592Cz/AB+Ta02wdASwCXc05m5hWTO2RUrwkjmPHmta8dLlZjOT k8f2yb0y9I3xeCTjHg2mZTVB5LhsSmJRPI6ndzr4Ksoz+hXLJTicagcj0z+sCt7dtUtX wGy5PHpjy5ECXJfZdE9LSesBRpDFHn4EthttSQVaIKOdqUlboQEtA2Lcj1KzJBEaisOi 8ufPLdCJuFPGQRVrfNFpZSVDYSj49ywi7ci599yQ/yIq+zSAsxcXvPePymDPkHh4B1CP 4q/oVsKO2lvXGwV32k6KVGP6MeFAhRRSwHzmfaUfMQC1tXaoa6VbqqbSOcGp7NLXFVf+ 9xSQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=references:in-reply-to:message-id:date:subject:cc:to:from :arc-authentication-results; bh=yVc/Id39O+yOS6rb4xvxCavASon/RBPt3ms4JL2mffU=; b=dBUhJD7Ssj7+7blV1tuSFWZ34uUPqAv70Nuv84JZ+ey1IvnejEVKgeIwvor+Auqm5n bnUDuGbOojIIZSIpWZoyIMR01G6jhbz3N7d2bFe2yJuDV1Qy24QRLr3lDZq4aITrWEjX 6371+99tzba3XM63XsXrKmZa315hyJxTxuBCsOrg0goYyzfS0kJoj3jdai2s0We0w7nG lxhHMzh5GE0InfxNT0ifR5+UW+6coB1Fry+hcjuYIo8QU7uY12MJu9u+BL4cZ88AO9hM wdmIU0Sp10msFuto35J5hd07ZLLlhGrCJlQfksHeHp7Y8Bj4VzlLzGaL4SBf3WWRRTRC 567A== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: domain of ying.huang@intel.com designates 192.55.52.115 as permitted sender) smtp.mailfrom=ying.huang@intel.com; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=intel.com Received: from mga14.intel.com (mga14.intel.com. [192.55.52.115]) by mx.google.com with ESMTPS id a24-v6si1272473pgh.357.2018.07.20.00.19.57 for (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Fri, 20 Jul 2018 00:19:57 -0700 (PDT) Received-SPF: pass (google.com: domain of ying.huang@intel.com designates 192.55.52.115 as permitted sender) client-ip=192.55.52.115; Authentication-Results: mx.google.com; spf=pass (google.com: domain of ying.huang@intel.com designates 192.55.52.115 as permitted sender) smtp.mailfrom=ying.huang@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 fmsmga002.fm.intel.com ([10.253.24.26]) by fmsmga103.fm.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 20 Jul 2018 00:19:56 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.51,377,1526367600"; d="scan'208";a="68652054" Received: from yhuang6-ux31a.sh.intel.com ([10.239.198.6]) by fmsmga002.fm.intel.com with ESMTP; 20 Jul 2018 00:19:05 -0700 From: Huang Ying To: Andrew Morton Cc: linux-mm@kvack.org, linux-kernel@vger.kernel.org, Huang Ying , Daniel Jordan , Michal Hocko , Johannes Weiner , Shaohua Li , Hugh Dickins , Minchan Kim , Rik van Riel , Dan Williams , Dave Hansen Subject: [PATCH v4 6/8] swap, get_swap_pages: Use entry_size instead of cluster in parameter Date: Fri, 20 Jul 2018 15:18:43 +0800 Message-Id: <20180720071845.17920-7-ying.huang@intel.com> X-Mailer: git-send-email 2.16.4 In-Reply-To: <20180720071845.17920-1-ying.huang@intel.com> References: <20180720071845.17920-1-ying.huang@intel.com> 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 As suggested by Matthew Wilcox, it is better to use "int entry_size" instead of "bool cluster" as parameter to specify whether to operate for huge or normal swap entries. Because this improve the flexibility to support other swap entry size. And Dave Hansen thinks that this improves code readability too. So in this patch, the "bool cluster" parameter of get_swap_pages() is replaced by "int entry_size". And nr_swap_entries() trick is used to reduce the binary size when !CONFIG_TRANSPARENT_HUGE_PAGE. text data bss dec hex filename base 24215 2028 340 26583 67d7 mm/swapfile.o head 24123 2004 340 26467 6763 mm/swapfile.o Signed-off-by: "Huang, Ying" Acked-by: Dave Hansen Cc: Daniel Jordan Cc: Michal Hocko Cc: Johannes Weiner Cc: Shaohua Li Cc: Hugh Dickins Cc: Minchan Kim Cc: Rik van Riel Cc: Dan Williams --- include/linux/swap.h | 2 +- mm/swap_slots.c | 8 ++++---- mm/swapfile.c | 16 ++++++++-------- 3 files changed, 13 insertions(+), 13 deletions(-) diff --git a/include/linux/swap.h b/include/linux/swap.h index e20c240d6c65..34de0d8bf4fa 100644 --- a/include/linux/swap.h +++ b/include/linux/swap.h @@ -443,7 +443,7 @@ extern void si_swapinfo(struct sysinfo *); extern swp_entry_t get_swap_page(struct page *page); extern void put_swap_page(struct page *page, swp_entry_t entry); extern swp_entry_t get_swap_page_of_type(int); -extern int get_swap_pages(int n, bool cluster, swp_entry_t swp_entries[]); +extern int get_swap_pages(int n, swp_entry_t swp_entries[], int entry_size); extern int add_swap_count_continuation(swp_entry_t, gfp_t); extern void swap_shmem_alloc(swp_entry_t); extern int swap_duplicate(swp_entry_t); diff --git a/mm/swap_slots.c b/mm/swap_slots.c index 008ccb22fee6..63a7b4563a57 100644 --- a/mm/swap_slots.c +++ b/mm/swap_slots.c @@ -269,8 +269,8 @@ static int refill_swap_slots_cache(struct swap_slots_cache *cache) cache->cur = 0; if (swap_slot_cache_active) - cache->nr = get_swap_pages(SWAP_SLOTS_CACHE_SIZE, false, - cache->slots); + cache->nr = get_swap_pages(SWAP_SLOTS_CACHE_SIZE, + cache->slots, 1); return cache->nr; } @@ -316,7 +316,7 @@ swp_entry_t get_swap_page(struct page *page) if (PageTransHuge(page)) { if (IS_ENABLED(CONFIG_THP_SWAP)) - get_swap_pages(1, true, &entry); + get_swap_pages(1, &entry, HPAGE_PMD_NR); goto out; } @@ -350,7 +350,7 @@ swp_entry_t get_swap_page(struct page *page) goto out; } - get_swap_pages(1, false, &entry); + get_swap_pages(1, &entry, 1); out: if (mem_cgroup_try_charge_swap(page, entry)) { put_swap_page(page, entry); diff --git a/mm/swapfile.c b/mm/swapfile.c index ad247c3da494..d80567dd60db 100644 --- a/mm/swapfile.c +++ b/mm/swapfile.c @@ -941,18 +941,18 @@ static unsigned long scan_swap_map(struct swap_info_struct *si, } -int get_swap_pages(int n_goal, bool cluster, swp_entry_t swp_entries[]) +int get_swap_pages(int n_goal, swp_entry_t swp_entries[], int entry_size) { - unsigned long nr_pages = cluster ? SWAPFILE_CLUSTER : 1; + unsigned long size = swap_entry_size(entry_size); struct swap_info_struct *si, *next; long avail_pgs; int n_ret = 0; int node; /* Only single cluster request supported */ - WARN_ON_ONCE(n_goal > 1 && cluster); + WARN_ON_ONCE(n_goal > 1 && size == SWAPFILE_CLUSTER); - avail_pgs = atomic_long_read(&nr_swap_pages) / nr_pages; + avail_pgs = atomic_long_read(&nr_swap_pages) / size; if (avail_pgs <= 0) goto noswap; @@ -962,7 +962,7 @@ int get_swap_pages(int n_goal, bool cluster, swp_entry_t swp_entries[]) if (n_goal > avail_pgs) n_goal = avail_pgs; - atomic_long_sub(n_goal * nr_pages, &nr_swap_pages); + atomic_long_sub(n_goal * size, &nr_swap_pages); spin_lock(&swap_avail_lock); @@ -989,14 +989,14 @@ int get_swap_pages(int n_goal, bool cluster, swp_entry_t swp_entries[]) spin_unlock(&si->lock); goto nextsi; } - if (cluster) { + if (size == SWAPFILE_CLUSTER) { if (!(si->flags & SWP_FILE)) n_ret = swap_alloc_cluster(si, swp_entries); } else n_ret = scan_swap_map_slots(si, SWAP_HAS_CACHE, n_goal, swp_entries); spin_unlock(&si->lock); - if (n_ret || cluster) + if (n_ret || size == SWAPFILE_CLUSTER) goto check_out; pr_debug("scan_swap_map of si %d failed to find offset\n", si->type); @@ -1022,7 +1022,7 @@ int get_swap_pages(int n_goal, bool cluster, swp_entry_t swp_entries[]) check_out: if (n_ret < n_goal) - atomic_long_add((long)(n_goal - n_ret) * nr_pages, + atomic_long_add((long)(n_goal - n_ret) * size, &nr_swap_pages); noswap: return n_ret;