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 0D8CDC001DE for ; Fri, 28 Jul 2023 18:34:18 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id 3620A6B0071; Fri, 28 Jul 2023 14:34:18 -0400 (EDT) Received: by kanga.kvack.org (Postfix, from userid 40) id 2EBEE8D0002; Fri, 28 Jul 2023 14:34:18 -0400 (EDT) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 18D018D0001; Fri, 28 Jul 2023 14:34:18 -0400 (EDT) X-Delivered-To: linux-mm@kvack.org Received: from relay.hostedemail.com (smtprelay0016.hostedemail.com [216.40.44.16]) by kanga.kvack.org (Postfix) with ESMTP id 02EFE6B0071 for ; Fri, 28 Jul 2023 14:34:18 -0400 (EDT) Received: from smtpin11.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay03.hostedemail.com (Postfix) with ESMTP id C8C0BA07C6 for ; Fri, 28 Jul 2023 18:34:17 +0000 (UTC) X-FDA: 81061870554.11.C5DAD40 Received: from dfw.source.kernel.org (dfw.source.kernel.org [139.178.84.217]) by imf16.hostedemail.com (Postfix) with ESMTP id E58F7180008 for ; Fri, 28 Jul 2023 18:34:14 +0000 (UTC) Authentication-Results: imf16.hostedemail.com; dkim=pass header.d=linux-foundation.org header.s=korg header.b=YTsH65jz; spf=pass (imf16.hostedemail.com: domain of akpm@linux-foundation.org designates 139.178.84.217 as permitted sender) smtp.mailfrom=akpm@linux-foundation.org; dmarc=none ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=hostedemail.com; s=arc-20220608; t=1690569255; 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=N6JQftCWh8QtpWdLAq9JTCYyeHQhlI5xnqQwvxzOab8=; b=TUHjSWKIsbmjCxAGP23XhN0SyQ+5JXINRKAgTS1I94dRdmtgMYlNs2tNNLA8qT+JhEttFz pt5qcMC8jxG//DrZ8fwq21yruqIlR4TaXsf0W63+dmEofzxe0lnJJg/5UZtsCYT28nekst 5W/WDV/ZBnwm8jX6YR8gGq1jeCoV86A= ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1690569255; a=rsa-sha256; cv=none; b=kW2xyE4NBJk+pGPE47VDOIN4l5cOEi8nWlz7Hra0y7iLoEzvKt0TB06uE8O9dd4Zyxtf+8 r0r46UUIs2h1txLs2bZNHXuRGOO/xX+WHxjTkNW7/XdtrQV6rU4RimEWSHEWyNkoivKIsp Cpez/NdyvxYZ7rQI0fCo97wON/Jaq5Y= ARC-Authentication-Results: i=1; imf16.hostedemail.com; dkim=pass header.d=linux-foundation.org header.s=korg header.b=YTsH65jz; spf=pass (imf16.hostedemail.com: domain of akpm@linux-foundation.org designates 139.178.84.217 as permitted sender) smtp.mailfrom=akpm@linux-foundation.org; dmarc=none Received: from smtp.kernel.org (relay.kernel.org [52.25.139.140]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits)) (No client certificate requested) by dfw.source.kernel.org (Postfix) with ESMTPS id B5F62621B1; Fri, 28 Jul 2023 18:34:13 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id C1DC1C433C8; Fri, 28 Jul 2023 18:34:12 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=linux-foundation.org; s=korg; t=1690569253; bh=/ETXr35GlXt0lU8/LQjsLacBjCHt5zwDBcQ0Op7/lFs=; h=Date:From:To:Cc:Subject:In-Reply-To:References:From; b=YTsH65jzd0Sqntit8sAw82+9M0LlNChQHLbo/BlV9Dry+yXgUbPL84x5DOBlIIWUe 0yybr65hMII/yjAywfknW/QPYesC8SOU6+XqDz7PCeRev3jPEmqpnJx66bSKtNe3Qz FwNrSadjqZD4xnnjrQxT4bRQYjaxVwEJZ3PxUgSs= Date: Fri, 28 Jul 2023 11:34:12 -0700 From: Andrew Morton To: Yin Fengwei Cc: linux-mm@kvack.org, linux-kernel@vger.kernel.org, yuzhao@google.com, willy@infradead.org, david@redhat.com, ryan.roberts@arm.com, shy828301@gmail.com, hughd@google.com Subject: Re: [PATCH 1/3] mm: add functions folio_in_range() and folio_within_vma() Message-Id: <20230728113412.65741d2dd23228d0e2c0cb8d@linux-foundation.org> In-Reply-To: <20230728070929.2487065-2-fengwei.yin@intel.com> References: <20230728070929.2487065-1-fengwei.yin@intel.com> <20230728070929.2487065-2-fengwei.yin@intel.com> X-Mailer: Sylpheed 3.8.0beta1 (GTK+ 2.24.33; x86_64-pc-linux-gnu) Mime-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit X-Stat-Signature: 9nt67ujiz9ajudfmtx1wdefw5ucqskbu X-Rspamd-Server: rspam10 X-Rspamd-Queue-Id: E58F7180008 X-Rspam-User: X-HE-Tag: 1690569254-254023 X-HE-Meta: U2FsdGVkX1+ZPskUIebPHN5apDCMdFljYXBYSRFBeWC6tDNUa+pF6h2F5V/f6QYt8KL38RfDSw9TF3GA+tIcQfpxg0sTWGuWT6nCVWQhq3drkhSZRfx1P/SeTYaNOzHIMVAMwnV78P5pPRdc2Zcg05g7Dk5izv5qYpCLPZ6JHy4HLHZOILtHEwetw3oJDBYXTuOv7b0Iv0OrRackMYBJXWwHe0aBIWKT3rr84mgQLXjE/8ygIoZY28LkaYYRXClM3qNARLjEMapVJ+b3nSGvyGV4+kNmYcBVcQQT8To83n8K64Q4oQ52OVHWW1/giyrM0BET687YPcj3R5OQ0mobtaldYOKyasJkKO5g0VUdhum5LJLGLOPoV37sFj0O1TflQDl6K2oAG2CmXnsz+1SkyptuzFE79gYbhaQUEpJruw0lzPdwZVEIkB14EoNUToyrx+TbECr+hsj/9oXZYwhDviGveKfzDI822zwfukKIzbAwXicZMjRCxggqhanBodCnxJ5e4+tOcjOW7Srt/Yf+wXkQ5XWhc6zZUGTvtbl2M7pDteSvBbT308HZuVKlVlB+uxkzpt5hkIHpW/3/Peq9g3qCjEAqQyBj74KVT/m2H9W5UkXAhZN1qFZKTOjTUj+NzJAtgma5FbcE4X/FKGlUyncwc9aV2WKfSZOhuUOQiSASD/dTyCfZDApFGliIFdaAnnpVP+YKgWOrbrOD9oHqQ5A+bZOb7JF+i0MM6wETQHOHsUipvDzySEGmIfF7nup9cHSSgRda/y/tmUSKWvSCEf/1YWGQAPQYsAqHKi/Sxa42HbvDPNhv5LABVsl/U3uBD7KHHkPmfu29J5ZgT3/IvuED/2zzDraNUUn6kw2JTLVGbFPK1Wgd9EWxFEK0aoRNZBWwvYrWx2+4CqnhKr9RnxtVPGNO6Z3kGOg4zpSjQek26VvncP7gerLZ+p3fLlzzc/P8VbqXFBytvottkMA kxW4r8j4 SycVcfs/xj2Y6QzGOY/UnBpM+uGCWYXDA6fyfgemP4lwF7XOI85GpZrDDPndw9FYBioDgLvqyeXmU48wbEGGIBUmAow/eci+7/DifgfoJ+9VGf9B3Y3beeDAKkZM3QXh7iRh5rZTeztECNLYHuAZSjc/VqqJGGDAaSwZcwbo5Ttni6vJ2r4yhw8YizSphqyqjyN5vIjUHoHmIEMUQOsSBIJUQMFQvn/l5Bwx6jhapZrpnSHFGdNBE/EMOC7gB+wBN2dpc4Umk9BfvBTghCRZ0lyVCnHLptgp/FoOl2WOIfhUPlYR1dw67w7WJOG61DOcy9JSXM22xiURteOr4Jd8oU/QO2soZx+jUwKqAi6Bina7dOkxaIyal1ytI8f+yer4HyPldwheEVIkhpCM= 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 Fri, 28 Jul 2023 15:09:27 +0800 Yin Fengwei wrote: > It will be used to check whether the folio is mapped to specific > VMA and whether the mapping address of folio is in the range. > > Also a helper function folio_within_vma() to check whether folio > is in the range of vma based on folio_in_range(). > > ... > > --- a/mm/internal.h > +++ b/mm/internal.h > @@ -585,6 +585,75 @@ extern long faultin_vma_page_range(struct vm_area_struct *vma, > bool write, int *locked); > extern bool mlock_future_ok(struct mm_struct *mm, unsigned long flags, > unsigned long bytes); > + > +/* > + * Check whether the folio is in specific range > + * > + * First, check whether the folio is in the range of vma. > + * Then, check whether the folio is mapped to the range of [start, end]. > + * In the end, check whether the folio is fully mapped to the range. > + * > + * @pte page table pointer will be checked whether the large folio > + * is fully mapped to. Currently, if mremap in the middle of > + * large folio, the large folio could be mapped to to different > + * VMA and address check can't identify this situation. > + */ > +static inline bool > +folio_in_range(struct folio *folio, struct vm_area_struct *vma, > + unsigned long start, unsigned long end, pte_t *pte) > +{ This looks crazily way too large to be inlined? > + pte_t ptent; > + unsigned long i, nr = folio_nr_pages(folio); > + pgoff_t pgoff, addr; > + unsigned long vma_pglen = (vma->vm_end - vma->vm_start) >> PAGE_SHIFT; > + > + VM_WARN_ON_FOLIO(folio_test_ksm(folio), folio); > + > + if (start < vma->vm_start) > + start = vma->vm_start; > + if (end > vma->vm_end) > + end = vma->vm_end; > + > + pgoff = folio_pgoff(folio); > + /* if folio start address is not in vma range */ > + if (pgoff < vma->vm_pgoff || pgoff > vma->vm_pgoff + vma_pglen) > + return false; > + > + addr = vma->vm_start + ((pgoff - vma->vm_pgoff) << PAGE_SHIFT); > + if (addr < start || end - addr < folio_size(folio)) > + return false; > + > + /* not necessary to check pte for none large folio */ > + if (!folio_test_large(folio)) > + return true; > + > + if (!pte) > + return false; > + > + /* check whether parameter pte is associated with folio */ > + ptent = ptep_get(pte); > + if (pte_none(ptent) || !pte_present(ptent) || > + pte_pfn(ptent) - folio_pfn(folio) >= nr) > + return false; > + > + pte -= pte_pfn(ptent) - folio_pfn(folio); > + for (i = 0; i < nr; i++, pte++) { > + ptent = ptep_get(pte); > + > + if (pte_none(ptent) || !pte_present(ptent) || > + pte_pfn(ptent) - folio_pfn(folio) >= nr) > + return false; > + } > + > + return true; > +} > + > +static inline bool > +folio_within_vma(struct folio *folio, struct vm_area_struct *vma, pte_t *pte) > +{ > + return folio_in_range(folio, vma, vma->vm_start, vma->vm_end, pte); > +} And this doesn't.