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 6A520C3DA63 for ; Wed, 24 Jul 2024 22:23:59 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id F28346B007B; Wed, 24 Jul 2024 18:23:58 -0400 (EDT) Received: by kanga.kvack.org (Postfix, from userid 40) id ED88A6B0085; Wed, 24 Jul 2024 18:23:58 -0400 (EDT) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id DA0386B008A; Wed, 24 Jul 2024 18:23:58 -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 BC2956B007B for ; Wed, 24 Jul 2024 18:23:58 -0400 (EDT) Received: from smtpin18.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay08.hostedemail.com (Postfix) with ESMTP id 6293B140C50 for ; Wed, 24 Jul 2024 22:23:58 +0000 (UTC) X-FDA: 82376074956.18.A464281 Received: from mail-ua1-f44.google.com (mail-ua1-f44.google.com [209.85.222.44]) by imf30.hostedemail.com (Postfix) with ESMTP id A0EF48001F for ; Wed, 24 Jul 2024 22:23:56 +0000 (UTC) Authentication-Results: imf30.hostedemail.com; dkim=pass header.d=gmail.com header.s=20230601 header.b=cAoXWqIP; spf=pass (imf30.hostedemail.com: domain of 21cnbao@gmail.com designates 209.85.222.44 as permitted sender) smtp.mailfrom=21cnbao@gmail.com; dmarc=pass (policy=none) header.from=gmail.com ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=hostedemail.com; s=arc-20220608; t=1721859772; 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=m61mAVKn3AwPDI9CWB/tPJk6iX/A6Vv9n5L4Vxpml84=; b=BjuSVvyTYXthmzF3zDgXTV/Srs/w/GR/CZlLl5Pu/ucjYsaYoUOAHRCcgFKeL2XbhvcnJY 7jH7tX1ACorTxnayx3bw5hTVr58BGZWsu1RHMRgOluyJbaSqn7RfsKal68wTQRoWn+bFtc Jns+8AXYgIOPv/CwZqTGgCpNHhe7fOw= ARC-Authentication-Results: i=1; imf30.hostedemail.com; dkim=pass header.d=gmail.com header.s=20230601 header.b=cAoXWqIP; spf=pass (imf30.hostedemail.com: domain of 21cnbao@gmail.com designates 209.85.222.44 as permitted sender) smtp.mailfrom=21cnbao@gmail.com; dmarc=pass (policy=none) header.from=gmail.com ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1721859772; a=rsa-sha256; cv=none; b=50ZH3NZ6e7IyZsTbueUPiNGguEaoyVU1EzpGMmhxLpjybnz3GEnc16k3Z+Ze34rIxkjmnp MInZ1a/dXv3yJzgrzPjru+LHwM1gaYpWH4b8p1+j8KTcyR/i2ThjYC9kHpLtDHDdioI9jh ZiJ7l9qSXPvp0NM682jcIchGTTlU280= Received: by mail-ua1-f44.google.com with SMTP id a1e0cc1a2514c-81ff6a80cbbso83538241.1 for ; Wed, 24 Jul 2024 15:23:56 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1721859836; x=1722464636; darn=kvack.org; h=content-transfer-encoding:cc:to:subject:message-id:date:from :in-reply-to:references:mime-version:from:to:cc:subject:date :message-id:reply-to; bh=m61mAVKn3AwPDI9CWB/tPJk6iX/A6Vv9n5L4Vxpml84=; b=cAoXWqIPyF4/wjBRfBA4UiHRIbixRcb1E+mYGcB3mh/dlnu6spF5j+p0Uazs2xiKs+ FtnQn4z7ybjwvERe8ha0ftmoXdmLmFI59kVcbra1Wvi1dS0TkK5NMerhTxXan0e5dLgM zked4CRKTu7tV/W4ikAe07y+1Ku5bT5ies6Pyrv1FQs1Nj55w69eCpjpcu+YQ7wUa1C7 X5JHJovQSCpuPEjrTK1zRtv6MKVRmdggXWDwfds2d+2/rT7cEMiDegs71rd7UgNYreIH 2PnH1eYaFaJlA1lmEHAy9ZvdfwwE7bG2szRv/eGjBhWWiAYBeTTrs5DeyqgF40tDDxrG IfEQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1721859836; x=1722464636; h=content-transfer-encoding:cc:to:subject:message-id:date:from :in-reply-to:references:mime-version:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=m61mAVKn3AwPDI9CWB/tPJk6iX/A6Vv9n5L4Vxpml84=; b=AQI7swXd8SB13l5SZwhj2WxnItxGBd2UW6fIvdD+ssXAJslrwwB9eCyohcJPIAHKXA fNB9/M7TLCN53PHcQJBNQPeODpEpQ96s1zZbAER/kI4ZSlhNcpFr1HYZfF05J4lhTnpz qTiy8r5RwzzrF2cWrbjJ00DAD8lwvk5gtcGp1Zk44/Qw63udE/C2PIIGgKLp4oWycF/t 7rXV6hgbQIMwfUP7vQFfXY713t+zcP9UatqAthXxP5jn81VMBW6yYPcs3wMX2z1v8MGW hCxSi8X4LIX9nZ8hqRXTM2ntXD34Rf29UFSfeETsrWBK62wEmlE6UNbt+XlVHQMKFVXB xO+g== X-Forwarded-Encrypted: i=1; AJvYcCVsIlOyxwvCk0zHjHJHX3zHSAs9x4CznqOMGDawl8mUMLZOp9zoi23e/g/oAskcNXFvHCvsDIi/GS60nCQ8IbndhkQ= X-Gm-Message-State: AOJu0Yyc1Xd3apJKJBUugzb80g0OF3Q5cpCIZtof33udLoAJeqJ0YQaY SNTgzH/1evPm/w14gd/xFcY16ypYMxogId4JB6dGk38cUlkTmXIvkmkjafgoT44mMnD8BJGvsHt VnNghV2esMItH5j4nHX6odMD0WEQ= X-Google-Smtp-Source: AGHT+IHPCHTpD67fhU8YeC5g3nuqpNf6O1JJeWUgRPDiBoOEgIIpIiA912pdlAJJQA2+7B4D1/pQuPvbWliiRPjqA7g= X-Received: by 2002:a05:6102:15ab:b0:493:bcc9:b03b with SMTP id ada2fe7eead31-493d6400969mr1817114137.3.1721859835650; Wed, 24 Jul 2024 15:23:55 -0700 (PDT) MIME-Version: 1.0 References: <20240724181916.31776-1-hailong.liu@oppo.com> In-Reply-To: <20240724181916.31776-1-hailong.liu@oppo.com> From: Barry Song <21cnbao@gmail.com> Date: Thu, 25 Jul 2024 10:23:44 +1200 Message-ID: Subject: Re: [RFC PATCH v1] mm/vmalloc: fix incorrect __vmap_pages_range_noflush() if vm_area_alloc_pages() from high order fallback to order0 To: hailong.liu@oppo.com Cc: Andrew Morton , Uladzislau Rezki , Christoph Hellwig , Lorenzo Stoakes , Vlastimil Babka , Michal Hocko , "Tangquan . Zheng" , linux-mm@kvack.org, linux-kernel@vger.kernel.org Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable X-Rspamd-Server: rspam06 X-Rspamd-Queue-Id: A0EF48001F X-Stat-Signature: 46gk4ec1pjxg4pqu63xwgr16szyyzmgk X-Rspam-User: X-HE-Tag: 1721859836-220014 X-HE-Meta: U2FsdGVkX1/dzkJCecC3thz5yyGmSAbcBk+OZbIYbXzV/RfqKhI/gq4y/3SqoC8QrIL/kLabmFb+R2JT2716JgLOaStUM8wNi5EhhP4D/R5/2nYguttky5DROeb3LSadyXwarxkiZzU0xQODVhxK5Y9t7i5Do5IXGh1Nv85tMrDlfPLF/JK3VPcheuVcxS7QHOPy7iqmuuPynYkHqPkBnC+Nrx961ZdY6ECJwEKVOrZm6Un/WTXYpmkY0YPn5Jdvnh/d+Y307yFIIB/DX1DI2od6MoUeJaH5bomjySCbLFHBr8w1y7FMR/1i75pQARvk0Xv7Q80VF20pz9kRPuk24qYL1ewg0b7gKWzGA13VhP+Dd6wzYoB1IKS3AzeORe/UmwAhrEp7UQIaFsg3kv4/anu6PfyNwei/bb1OHuqaqTM2JiiUX5Wqf0S0WW20nt5XyAzYVkScbFR/tTtKqPkQgCyVpmW8xS3MeCjQ/REnZMubtrklrOoP2DsE7X71k/1PE0hy5ouAcOgNh9uhmM503sIrp8efnY6zYm5XWzNYmfVV54iRV1TVboUtva6FqsTkNUY4K80FuD8nTo575ejGQmgkfWz0l0UgTRalxmSF/TIOuvI3QitcB4FyNfZfqNTTW34qMh/R78+GkPwlciSkBq9IDABUYGq0oXXcAO3do03nKHz943IyNEKiKRfrW8kYx2LMtQjx6BRvma1H8BSCEYP4kzhyfYUoZAIRzqLHeIoUfh5Qk8aXGO7GQKxU7rz5Q4tnLC1BTEZNOg1FhIxsiL3rxXQ3oGR859MaaOFCJCVJQNgNStC4lN4JyZBKwNE0LezEqgdKrSVDdBI+KOYrudHJzQNY1TWTf5mqylifCmMpHKKT/kOjTb9PSttbFyBFqg6x/No0adslPoJBE2bGJzOg5MFgomIVRNamezAuOtIvC/KAlHnj0dlF2sn+ALcQrqhRQ0m8Ehn1+JmmIDt TgTJjLog B5nJlRy7ua5MDBcQAVXFs6a3H5Zg7S2y2NZMybjuguQ2tm3uvB9OUzI6ADLitwG3de6EGIgw/bDP8DoaYVLv0sxFMVVrUGeQHTmSC70akrKQ74RQ/UZBIVGtWvJ+8q0k5fh9+6iHFqQ4kgw4MLTTW5FzC8IZW6mnqvSLGYe+6Hl55GDrh8mcBM3nBn/FYhS4v3d7QnO6JkgPb/peOci1efwfyyvWVCbxCgd/+pF8Wl61p+AHLI444nxDrYKigqRpS9ha3NxDrJSn68wEmiA0sq+niwUgll/iGR2qUgA4zbTQ8zG8pxwl/jImVbz8IvYGl6rELM5g5Fxo0LMfhiFmztC9lSTxMZbjoueFailCjFrSj1L1nZ1cOx6Cpr+VKsb7rqcuAonly58tJPkOPn8qW2HwJiyT5j4l23ifrN8rNrOCAx3g= 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: List-Subscribe: List-Unsubscribe: On Thu, Jul 25, 2024 at 6:19=E2=80=AFAM wrote: > > From: "Hailong.Liu" > > The scenario where the issue occurs is as follows: > CONFIG: vmap_allow_huge =3D true && 2M is for PMD_SIZE > kvmalloc(2M) > __vmalloc_node_range(vm_flags=3DVM_ALLOW_HUGE_VMAP) > vm_area_alloc_pages(order=3D9) --->allocs order9 failed and fallb= ack to order0 > and phys_addr is aligned with PMD= _SIZE > vmap_pages_range > vmap_pages_range_noflush > __vmap_pages_range_noflush(page_shift =3D 21) ----> i= ncorrect vmap *huge* here > > Fix it by introducing VM_AREA_ALLOC_PAGES_FALLBACK in page->private if fa= llback to 0. > Fixes: e9c3cda4d86e ("mm, vmalloc: fix high order __GFP_NOFAIL allocation= s") > > CC: Barry Song <21cnbao@gmail.com> > Reported-by: Tangquan.Zheng > Signed-off-by: Hailong.Liu > --- > mm/vmalloc.c | 14 ++++++++++++-- > 1 file changed, 12 insertions(+), 2 deletions(-) > > diff --git a/mm/vmalloc.c b/mm/vmalloc.c > index 03c78fae06f3..b35dfd3eeee3 100644 > --- a/mm/vmalloc.c > +++ b/mm/vmalloc.c > @@ -75,6 +75,8 @@ early_param("nohugevmalloc", set_nohugevmalloc); > static const bool vmap_allow_huge =3D false; > #endif /* CONFIG_HAVE_ARCH_HUGE_VMALLOC */ > > +#define VM_AREA_ALLOC_PAGES_FALLBACK 0x1 > + > bool is_vmalloc_addr(const void *x) > { > unsigned long addr =3D (unsigned long)kasan_reset_tag(x); > @@ -604,8 +606,13 @@ int __vmap_pages_range_noflush(unsigned long addr, u= nsigned long end, > WARN_ON(page_shift < PAGE_SHIFT); > > if (!IS_ENABLED(CONFIG_HAVE_ARCH_HUGE_VMALLOC) || > - page_shift =3D=3D PAGE_SHIFT) > - return vmap_small_pages_range_noflush(addr, end, prot, pa= ges); > + page_shift =3D=3D PAGE_SHIFT || > + page_private(pages[0]) =3D=3D VM_AREA_ALLOC_PAGES= _FALLBACK) { > + int ret =3D vmap_small_pages_range_noflush(addr, end, pro= t, pages); > + > + set_page_private(pages[0], 0); > + return ret; > + } we could have more than one *serious* bug here? do we also need the below if ((end - start) % PMD_SIZE) !=3D 0) ? no ? int __vmap_pages_range_noflush(unsigned long addr, unsigned long end, pgprot_t prot, struct page **pages, unsigned int page_shift= ) { unsigned int i, nr =3D (end - addr) >> PAGE_SHIFT; WARN_ON(page_shift < PAGE_SHIFT); if (!IS_ENABLED(CONFIG_HAVE_ARCH_HUGE_VMALLOC) || page_shift =3D=3D PAGE_SHIFT) return vmap_small_pages_range_noflush(addr, end, prot, page= s); for (i =3D 0; i < nr; i +=3D 1U << (page_shift - PAGE_SHIFT)) { int err; err =3D vmap_range_noflush(addr, addr + (1UL << page_shift)= , page_to_phys(pages[i]), prot, page_shift); if (err) return err; addr +=3D 1UL << page_shift; } + if (addr < end) + return vmap_small_pages_range_noflush(addr, end, prot, pages + i); return 0; } > > for (i =3D 0; i < nr; i +=3D 1U << (page_shift - PAGE_SHIFT)) { > int err; > @@ -3583,6 +3590,7 @@ vm_area_alloc_pages(gfp_t gfp, int nid, > > /* fall back to the zero order allocations */ > alloc_gfp |=3D __GFP_NOFAIL; > + fallback =3D true; > order =3D 0; > continue; > } > @@ -3608,6 +3616,8 @@ vm_area_alloc_pages(gfp_t gfp, int nid, > cond_resched(); > nr_allocated +=3D 1U << order; > } > + if (nr_allocated && fallback) > + set_page_private(pages[0], VM_AREA_ALLOC_PAGES_FALLBACK); > > return nr_allocated; > } > -- > 2.34.1 >