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 Received: from kanga.kvack.org (kanga.kvack.org [205.233.56.17]) by smtp.lore.kernel.org (Postfix) with ESMTP id 18C1DC77B73 for ; Wed, 19 Apr 2023 14:39:57 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id 75697900002; Wed, 19 Apr 2023 10:39:56 -0400 (EDT) Received: by kanga.kvack.org (Postfix, from userid 40) id 6DF866B0072; Wed, 19 Apr 2023 10:39:56 -0400 (EDT) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 55A3B900002; Wed, 19 Apr 2023 10:39:56 -0400 (EDT) X-Delivered-To: linux-mm@kvack.org Received: from relay.hostedemail.com (smtprelay0015.hostedemail.com [216.40.44.15]) by kanga.kvack.org (Postfix) with ESMTP id 46FDD6B0071 for ; Wed, 19 Apr 2023 10:39:56 -0400 (EDT) Received: from smtpin10.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay10.hostedemail.com (Postfix) with ESMTP id 0B71CC0297 for ; Wed, 19 Apr 2023 14:39:56 +0000 (UTC) X-FDA: 80698399992.10.D377110 Received: from mx0a-0031df01.pphosted.com (mx0a-0031df01.pphosted.com [205.220.168.131]) by imf20.hostedemail.com (Postfix) with ESMTP id 9CA9F1C001B for ; Wed, 19 Apr 2023 14:39:52 +0000 (UTC) Authentication-Results: imf20.hostedemail.com; dkim=pass header.d=quicinc.com header.s=qcppdkim1 header.b=KVnsnAAX; spf=pass (imf20.hostedemail.com: domain of quic_charante@quicinc.com designates 205.220.168.131 as permitted sender) smtp.mailfrom=quic_charante@quicinc.com; dmarc=pass (policy=none) header.from=quicinc.com ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=hostedemail.com; s=arc-20220608; t=1681915192; h=from:from:sender:reply-to:subject:subject:date:date: message-id:message-id:to:to:cc:cc:mime-version:mime-version: content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references:dkim-signature; bh=IDS4NhxpsXmOUdhfRsulzkM+yFUNM1lIT/3pIkLJrds=; b=URnw0ZXQHSsAhBm0vphLpSQILd1OWImzwoDZ/l5BFNGSyU6cdnwSVTR0uECqyFXCN6TeKL GUOeFqK3G4Tu9HtZLaE/picK+j64wZ4KWWu2DwFZnmrG1f6k3g9XCB0sL3rnaNvFlQVG8M gJgIBfAijb8d8W6RUTF+vnvkLMP3hT4= ARC-Authentication-Results: i=1; imf20.hostedemail.com; dkim=pass header.d=quicinc.com header.s=qcppdkim1 header.b=KVnsnAAX; spf=pass (imf20.hostedemail.com: domain of quic_charante@quicinc.com designates 205.220.168.131 as permitted sender) smtp.mailfrom=quic_charante@quicinc.com; dmarc=pass (policy=none) header.from=quicinc.com ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1681915192; a=rsa-sha256; cv=none; b=Jfe1xdWtPFmxuNG9bGVuPk0t7aI3tkhCBdrQXwIGf7ImzxsIh63ZhLq9BAXfmqSyzOyFOr QoTzMOynsSSzRXJlSAT4URLp8qYdng7mynngn/YnH25Q7lfcBJ/tQ1muslbKVXw7dfPokT 9SQLajjPpiF26hc0WQoCKb1Ttpv49vg= Received: from pps.filterd (m0279866.ppops.net [127.0.0.1]) by mx0a-0031df01.pphosted.com (8.17.1.19/8.17.1.19) with ESMTP id 33J9YDi5014875; Wed, 19 Apr 2023 14:39:44 GMT DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=quicinc.com; h=message-id : date : mime-version : subject : to : cc : references : from : in-reply-to : content-type : content-transfer-encoding; s=qcppdkim1; bh=IDS4NhxpsXmOUdhfRsulzkM+yFUNM1lIT/3pIkLJrds=; b=KVnsnAAXJt+BXe0xBQHNFIf2CHFfpvmfusdY6dFSrT0Q8sF7qUD4cu8rfgftnmHDgxZV YKllN78TrTl5vh/qD68S2OZtiDnnUCS+pN+Hb2b/tAbM/WbnGZzonDDA8k1YUo6IAdGF 3vKXJN9ufwkl5d83t6iXwOZ1bh+wAhN82kay4+oRKGbNDLVcyz5aDLKyn0qtT0JW0smd P81uOzajrw0+6qqQWMl1RoSMF08Y8GL/mNdf0JYgwLMBYGFmLzND/WXh5iFNyXYungWS U/lvxF+z7Co54mVMMKRcNN9pURfk4KZqHhbGV8lec6iln9iX9f2Grd/EPsr5PNQ4Sc+I Jg== Received: from nalasppmta03.qualcomm.com (Global_NAT1.qualcomm.com [129.46.96.20]) by mx0a-0031df01.pphosted.com (PPS) with ESMTPS id 3q25kwspr1-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Wed, 19 Apr 2023 14:39:43 +0000 Received: from nalasex01b.na.qualcomm.com (nalasex01b.na.qualcomm.com [10.47.209.197]) by NALASPPMTA03.qualcomm.com (8.17.1.5/8.17.1.5) with ESMTPS id 33JEdh9P027031 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Wed, 19 Apr 2023 14:39:43 GMT Received: from [10.216.63.99] (10.80.80.8) by nalasex01b.na.qualcomm.com (10.47.209.197) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.986.42; Wed, 19 Apr 2023 07:39:39 -0700 Message-ID: <4b8b370b-fc8e-0c5f-910d-552ccebf0e08@quicinc.com> Date: Wed, 19 Apr 2023 20:09:36 +0530 MIME-Version: 1.0 User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:91.0) Gecko/20100101 Thunderbird/91.9.1 Subject: Re: [PATCH V7 0/2] mm: shmem: support POSIX_FADV_[WILL|DONT]NEED for shmem files Content-Language: en-US To: Frank van der Linden CC: , , , , , , , , , References: <20230418172942.740769-1-fvdl@google.com> From: Charan Teja Kalla In-Reply-To: <20230418172942.740769-1-fvdl@google.com> Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: 7bit X-Originating-IP: [10.80.80.8] X-ClientProxiedBy: nasanex01a.na.qualcomm.com (10.52.223.231) To nalasex01b.na.qualcomm.com (10.47.209.197) X-QCInternal: smtphost X-Proofpoint-Virus-Version: vendor=nai engine=6200 definitions=5800 signatures=585085 X-Proofpoint-ORIG-GUID: _rwnYlIBTElQ3tbATMM4cn5oIzc6r08s X-Proofpoint-GUID: _rwnYlIBTElQ3tbATMM4cn5oIzc6r08s X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.254,Aquarius:18.0.942,Hydra:6.0.573,FMLib:17.11.170.22 definitions=2023-04-19_09,2023-04-18_01,2023-02-09_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 suspectscore=0 bulkscore=0 malwarescore=0 impostorscore=0 phishscore=0 priorityscore=1501 lowpriorityscore=0 mlxlogscore=954 mlxscore=0 spamscore=0 adultscore=0 clxscore=1015 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.12.0-2303200000 definitions=main-2304190131 X-Rspamd-Server: rspam07 X-Rspamd-Queue-Id: 9CA9F1C001B X-Rspam-User: X-Stat-Signature: kgty5rd6abmyw7e8kt5rmixc6s7xfj86 X-HE-Tag: 1681915192-252875 X-HE-Meta: U2FsdGVkX1/gUcWaKIQSndYhNrqbbOh4pN/F+nVFA7gykxeaL0eVKk4eXvQsOyE7kP7cl6Gkeu6aek6MLpSIyDQpGkgCQPCjCJof3iK3aYMsBuMxqCEUhIriqP6oMyfNXCF+QRGxij0lzPm1kCpLu32BiFUSv2jC+meT6to2+mkiKoqifzDB+pxHR360Y048mv6BhXbMyrMGgqGCz7tW8nf7Y7n1i/uqzYZNzz/bR5nATRRNPbmdcFUCi96WKOb6F48YT7iXd1L/GGkYqpHLaF2f7BjcmZYILKXUTH8+GSf5mHCQoOs+42n1FXWWn6qPtBDpYZut6hOMzZWkz1edAjaYn2eyMTMRaO72uj1dT8L+JwBmmVH1fRTilhuA4DtKFGFyCEpz/da1d07/ZENYUDFD7lMQPdDvPt+CDDgB9Axa5lipmPwANxJKOa9n1az6Q5MJXlYUIp/mzaD6tZwPqIc/jfCkm7095BBmwtBsZjDgqYMP7UVWOumEGAhoaldzetK+cKUk/nK6r0QcxFcur58cP+jjVhTHi8LBvGb6ZiSE+W59hmBi8tAQbbLBxGUKbh651A5Hgkzjz1KUY1U2Fw94oKhO0oCyN4pUTcEG2lalYaMjNIKIBKtEAd8vmXpgW4LnceaDUOXghZJau1Q0ySD4txYhVHt9sJR9lQrHYjUqhvETNZpchfHVtx3Aob9T5OU1mhX7mA6HhrSYCvERDh0VjKJ7lZA4SNzkxc6jL12/tLj2UC3hWFQjqXtI4FLq6yKtAw+5LEb8+6JdZ8VfV+qhv+DQuI+d4qntJPEJbumSBxxdYglO+LwGsBJVmFEs5onT+VpQ0AlJccvLrIILXd/PLaK5TyzzvyA2aN5CfMqnJHOSNEhFfE1Jp/rWHZQgghXYiAqypMNkoQ3yoXBhvPA6f6fZzg7Dsr4iOaTpcNU21M/pIxu5RghwxzRdhE1k4gYWq+6MrQqOqfDaBlQ +EIU6dJT k6C4v7In7upXu7sPYM/A02zkx1MAyftZOAsJCz+i0xMUtcQFERHN/g3UOAdXyuJCKTu0Y9PY8009sgJjaEek9f+oRlH24E7jGAlgB/qLIElDmJoUynkCpThj0pFfgVavFZN1UUIL0lLzIUk/hovrmh1DdG8gawhQ1aEjMNy37/gDfXTEsTnsXaouIyWwT5ucLju0d4JE/Rxi3nJWcBgWXy4hqsQ2KuOkNScgLdSwboSciAwiM4z3Wju8dnBqtfbTZtokvMLhNt2LU0/inwEIWT6M8Wg== 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: Hi Frank, Lets start a separate thread to add the support for mapped pages. I think one question that can come while review is: "what is the overhead an application has in collecting the memory regions and issuing the MADV_PAGEOUT, that made to add this support?". Let me try to get details for this from my side too. BTW, thanks for this POC code!! Thanks, Charan On 4/18/2023 10:59 PM, Frank van der Linden wrote: > Below is a quick patch to allow FADVISE_DONTNEED for shmem to reclaim > mapped pages too. This would fit our usecase, and matches MADV_PAGEOUT > more closely. > > The patch series as posted skips mapped pages even if you remove > the folio_mapped() check, because page_referenced() in > shrink_page_list() will find page tables with the page mapped, > and ignore_references is not set when called from reclaim_pages(). > > You can make this work in a similar fashion to MADV_PAGEOUT by > first unmapping a page, but only if the mapping belongs to > the caller. You just have to change the check for "is there > only one mapping and am I the owner". To do that, change a few > lines in try_to_unmap to allow for checking the mm the mapping > belongs to, and pass in current->mm (NULL still unmaps all mappings). > > I lightly tested this in a somewhat older codebase, so the diff > below isn't fully tested. But if there are no objections to > this approach, we could add it on top of your patchset after > better testing. > > - Frank > > diff --git a/include/linux/rmap.h b/include/linux/rmap.h > index b87d01660412..4403cc2ccc4c 100644 > --- a/include/linux/rmap.h > +++ b/include/linux/rmap.h > @@ -368,6 +368,8 @@ int folio_referenced(struct folio *, int is_locked, > > void try_to_migrate(struct folio *folio, enum ttu_flags flags); > void try_to_unmap(struct folio *, enum ttu_flags flags); > +void try_to_unmap_mm(struct mm_struct *mm, struct folio *folio, > + enum ttu_flags flags); > > int make_device_exclusive_range(struct mm_struct *mm, unsigned long start, > unsigned long end, struct page **pages, > diff --git a/mm/rmap.c b/mm/rmap.c > index 8632e02661ac..4d30e8f5afe2 100644 > --- a/mm/rmap.c > +++ b/mm/rmap.c > @@ -1443,6 +1443,11 @@ void page_remove_rmap(struct page *page, struct vm_area_struct *vma, > munlock_vma_folio(folio, vma, compound); > } > > +struct unmap_arg { > + enum ttu_flags flags; > + struct mm_struct *mm; > +}; > + > /* > * @arg: enum ttu_flags will be passed to this argument > */ > @@ -1455,7 +1460,11 @@ static bool try_to_unmap_one(struct folio *folio, struct vm_area_struct *vma, > struct page *subpage; > bool anon_exclusive, ret = true; > struct mmu_notifier_range range; > - enum ttu_flags flags = (enum ttu_flags)(long)arg; > + struct unmap_arg *uap = (struct unmap_arg *)arg; > + enum ttu_flags flags = uap->flags; > + > + if (uap->mm && uap->mm != mm) > + return true; > > /* > * When racing against e.g. zap_pte_range() on another cpu, > @@ -1776,6 +1785,7 @@ static int folio_not_mapped(struct folio *folio) > > /** > * try_to_unmap - Try to remove all page table mappings to a folio. > + * @mm: mm to unmap from (NULL to unmap from all) > * @folio: The folio to unmap. > * @flags: action and flags > * > @@ -1785,11 +1795,16 @@ static int folio_not_mapped(struct folio *folio) > * > * Context: Caller must hold the folio lock. > */ > -void try_to_unmap(struct folio *folio, enum ttu_flags flags) > +void try_to_unmap_mm(struct mm_struct *mm, struct folio *folio, > + enum ttu_flags flags) > { > + struct unmap_arg ua = { > + .flags = flags, > + .mm = mm, > + }; > struct rmap_walk_control rwc = { > .rmap_one = try_to_unmap_one, > - .arg = (void *)flags, > + .arg = (void *)&ua, > .done = folio_not_mapped, > .anon_lock = folio_lock_anon_vma_read, > }; > @@ -1800,6 +1815,11 @@ void try_to_unmap(struct folio *folio, enum ttu_flags flags) > rmap_walk(folio, &rwc); > } > > +void try_to_unmap(struct folio *folio, enum ttu_flags flags) > +{ > + try_to_unmap_mm(NULL, folio, flags); > +} > + > /* > * @arg: enum ttu_flags will be passed to this argument. > * > diff --git a/mm/shmem.c b/mm/shmem.c > index 1af85259b6fc..b24af2fb3378 100644 > --- a/mm/shmem.c > +++ b/mm/shmem.c > @@ -2362,8 +2362,24 @@ static void shmem_isolate_pages_range(struct address_space *mapping, loff_t star > > if (!folio_try_get(folio)) > continue; > - if (folio_test_unevictable(folio) || folio_mapped(folio) || > - folio_isolate_lru(folio)) { > + > + if (folio_test_unevictable(folio)) { > + folio_put(folio); > + continue; > + } > + > + /* > + * If the folio is mapped once, try to unmap it from the > + * caller's page table. If it's still mapped afterwards, > + * it belongs to someone else, and we're not going to > + * change someone else's mapping. > + */ > + if (folio_mapcount(folio) == 1 && folio_trylock(folio)) { > + try_to_unmap_mm(current->mm, folio, TTU_BATCH_FLUSH); > + folio_unlock(folio); > + } > + > + if (folio_mapped(folio) || folio_isolate_lru(folio)) { > folio_put(folio); > continue; > } > @@ -2383,6 +2399,8 @@ static void shmem_isolate_pages_range(struct address_space *mapping, loff_t star > } > } > rcu_read_unlock(); > + > + try_to_unmap_flush(); > } > > static int shmem_fadvise_dontneed(struct address_space *mapping, loff_t start,