From mboxrd@z Thu Jan 1 00:00:00 1970 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=-10.3 required=3.0 tests=BAYES_00, HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_PATCH,MAILING_LIST_MULTI,NICE_REPLY_A, SPF_HELO_NONE,SPF_PASS,USER_AGENT_SANE_1 autolearn=unavailable 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 D55EEC04FF3 for ; Mon, 24 May 2021 12:34:26 +0000 (UTC) Received: from kanga.kvack.org (kanga.kvack.org [205.233.56.17]) by mail.kernel.org (Postfix) with ESMTP id 3924161370 for ; Mon, 24 May 2021 12:34:26 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 3924161370 Authentication-Results: mail.kernel.org; dmarc=fail (p=none dis=none) header.from=huawei.com Authentication-Results: mail.kernel.org; spf=pass smtp.mailfrom=owner-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix) id 6DCB26B0177; Mon, 24 May 2021 08:34:25 -0400 (EDT) Received: by kanga.kvack.org (Postfix, from userid 40) id 68AE8940055; Mon, 24 May 2021 08:34:25 -0400 (EDT) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 1AF406B0179; Mon, 24 May 2021 08:34:25 -0400 (EDT) X-Delivered-To: linux-mm@kvack.org Received: from forelay.hostedemail.com (smtprelay0058.hostedemail.com [216.40.44.58]) by kanga.kvack.org (Postfix) with ESMTP id C6F966B0177 for ; Mon, 24 May 2021 08:34:24 -0400 (EDT) Received: from smtpin30.hostedemail.com (10.5.19.251.rfc1918.com [10.5.19.251]) by forelay04.hostedemail.com (Postfix) with ESMTP id 5764563FA for ; Mon, 24 May 2021 12:34:24 +0000 (UTC) X-FDA: 78176067648.30.5E040B4 Received: from szxga04-in.huawei.com (szxga04-in.huawei.com [45.249.212.190]) by imf01.hostedemail.com (Postfix) with ESMTP id E21B95001655 for ; Mon, 24 May 2021 12:34:17 +0000 (UTC) Received: from dggems705-chm.china.huawei.com (unknown [172.30.72.58]) by szxga04-in.huawei.com (SkyGuard) with ESMTP id 4Fpc5X6jDwz1BR7C; Mon, 24 May 2021 20:31:28 +0800 (CST) Received: from dggeme703-chm.china.huawei.com (10.1.199.99) by dggems705-chm.china.huawei.com (10.3.19.182) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256) id 15.1.2176.2; Mon, 24 May 2021 20:34:19 +0800 Received: from [10.174.178.68] (10.174.178.68) by dggeme703-chm.china.huawei.com (10.1.199.99) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256_P256) id 15.1.2176.2; Mon, 24 May 2021 20:34:18 +0800 Subject: Re: [PATCH] mm/swapfile: move scan_swap_map() under CONFIG_HIBERNATION To: Christoph Hellwig CC: , , References: <20210521070855.2015094-1-linmiaohe@huawei.com> From: Miaohe Lin Message-ID: <83041232-d5a7-1dc1-3137-d497ee7405bd@huawei.com> Date: Mon, 24 May 2021 20:34:18 +0800 User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:78.0) Gecko/20100101 Thunderbird/78.6.0 MIME-Version: 1.0 In-Reply-To: Content-Type: text/plain; charset="utf-8" Content-Language: en-US Content-Transfer-Encoding: 7bit X-Originating-IP: [10.174.178.68] X-ClientProxiedBy: dggems702-chm.china.huawei.com (10.3.19.179) To dggeme703-chm.china.huawei.com (10.1.199.99) X-CFilter-Loop: Reflected X-Rspamd-Queue-Id: E21B95001655 Authentication-Results: imf01.hostedemail.com; dkim=none; dmarc=pass (policy=none) header.from=huawei.com; spf=pass (imf01.hostedemail.com: domain of linmiaohe@huawei.com designates 45.249.212.190 as permitted sender) smtp.mailfrom=linmiaohe@huawei.com X-Rspamd-Server: rspam04 X-Stat-Signature: hqeftp31ewzf9biowo9j4if8u4uk6y65 X-HE-Tag: 1621859657-101866 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: On 2021/5/24 20:06, Christoph Hellwig wrote: > Please just fold it into the only caller and update the comments > referring to it. Something like: Sounds reasonable. Many thanks for your suggestion! Will do it in next version. > > diff --git a/mm/swapfile.c b/mm/swapfile.c > index 149e77454e3c..0e575b45bb87 100644 > --- a/mm/swapfile.c > +++ b/mm/swapfile.c > @@ -452,10 +452,10 @@ static void swap_cluster_schedule_discard(struct swap_info_struct *si, > unsigned int idx) > { > /* > - * If scan_swap_map() can't find a free cluster, it will check > + * If scan_swap_map_slots() can't find a free cluster, it will check > * si->swap_map directly. To make sure the discarding cluster isn't > - * taken by scan_swap_map(), mark the swap entries bad (occupied). It > - * will be cleared after discard > + * taken by scan_swap_map_slots(), mark the swap entries bad (occupied). > + * It will be cleared after discard > */ > memset(si->swap_map + idx * SWAPFILE_CLUSTER, > SWAP_MAP_BAD, SWAPFILE_CLUSTER); > @@ -580,7 +580,7 @@ static void dec_cluster_info_page(struct swap_info_struct *p, > } > > /* > - * It's possible scan_swap_map() uses a free cluster in the middle of free > + * It's possible scan_swap_map_slots() uses a free cluster in the middle of free > * cluster list. Avoiding such abuse to avoid list corruption. > */ > static bool > @@ -1028,21 +1028,6 @@ static void swap_free_cluster(struct swap_info_struct *si, unsigned long idx) > swap_range_free(si, offset, SWAPFILE_CLUSTER); > } > > -static unsigned long scan_swap_map(struct swap_info_struct *si, > - unsigned char usage) > -{ > - swp_entry_t entry; > - int n_ret; > - > - n_ret = scan_swap_map_slots(si, usage, 1, &entry); > - > - if (n_ret) > - return swp_offset(entry); > - else > - return 0; > - > -} > - > int get_swap_pages(int n_goal, swp_entry_t swp_entries[], int entry_size) > { > unsigned long size = swap_entry_size(entry_size); > @@ -1105,14 +1090,14 @@ int get_swap_pages(int n_goal, swp_entry_t swp_entries[], int entry_size) > nextsi: > /* > * if we got here, it's likely that si was almost full before, > - * and since scan_swap_map() can drop the si->lock, multiple > - * callers probably all tried to get a page from the same si > - * and it filled up before we could get one; or, the si filled > - * up between us dropping swap_avail_lock and taking si->lock. > - * Since we dropped the swap_avail_lock, the swap_avail_head > - * list may have been modified; so if next is still in the > - * swap_avail_head list then try it, otherwise start over > - * if we have not gotten any slots. > + * and since scan_swap_map_slots() can drop the si->lock, > + * multiple callers probably all tried to get a page from the > + * same si and it filled up before we could get one; or, the si > + * filled up between us dropping swap_avail_lock and taking > + * si->lock. Since we dropped the swap_avail_lock, the > + * swap_avail_head list may have been modified; so if next is > + * still in the swap_avail_head list then try it, otherwise > + * start over if we have not gotten any slots. > */ > if (plist_node_empty(&next->avail_lists[node])) > goto start_over; > @@ -1132,24 +1117,18 @@ int get_swap_pages(int n_goal, swp_entry_t swp_entries[], int entry_size) > swp_entry_t get_swap_page_of_type(int type) > { > struct swap_info_struct *si = swap_type_to_swap_info(type); > - pgoff_t offset; > + swp_entry_t entry = { }; > > if (!si) > goto fail; > > + /* This is called for allocating swap entry, not cache */ > spin_lock(&si->lock); > - if (si->flags & SWP_WRITEOK) { > - /* This is called for allocating swap entry, not cache */ > - offset = scan_swap_map(si, 1); > - if (offset) { > - atomic_long_dec(&nr_swap_pages); > - spin_unlock(&si->lock); > - return swp_entry(type, offset); > - } > - } > + if ((si->flags & SWP_WRITEOK) && scan_swap_map_slots(si, 1, 1, &entry)) > + atomic_long_dec(&nr_swap_pages); > spin_unlock(&si->lock); > fail: > - return (swp_entry_t) {0}; > + return entry; > } > > static struct swap_info_struct *__swap_info_get(swp_entry_t entry) > . >