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 54C1CC5B549 for ; Fri, 6 Jun 2025 07:18:42 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id 9C6B36B007B; Fri, 6 Jun 2025 03:18:41 -0400 (EDT) Received: by kanga.kvack.org (Postfix, from userid 40) id 977726B0088; Fri, 6 Jun 2025 03:18:41 -0400 (EDT) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 8667A6B0089; Fri, 6 Jun 2025 03:18:41 -0400 (EDT) X-Delivered-To: linux-mm@kvack.org Received: from relay.hostedemail.com (smtprelay0011.hostedemail.com [216.40.44.11]) by kanga.kvack.org (Postfix) with ESMTP id 62A576B007B for ; Fri, 6 Jun 2025 03:18:41 -0400 (EDT) Received: from smtpin13.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay08.hostedemail.com (Postfix) with ESMTP id 02944142721 for ; Fri, 6 Jun 2025 07:18:40 +0000 (UTC) X-FDA: 83524123242.13.2373A22 Received: from mail-vs1-f48.google.com (mail-vs1-f48.google.com [209.85.217.48]) by imf10.hostedemail.com (Postfix) with ESMTP id 126A8C000C for ; Fri, 6 Jun 2025 07:18:38 +0000 (UTC) Authentication-Results: imf10.hostedemail.com; dkim=pass header.d=gmail.com header.s=20230601 header.b=VPgOoTV+; spf=pass (imf10.hostedemail.com: domain of 21cnbao@gmail.com designates 209.85.217.48 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=1749194319; 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=81N3G2EiE8jl6/Bl162HCJNaqYLVKxHGkZAdpjf6weQ=; b=nqGKWi87jzZXZhWDe5QhWQEX0A/zUmoN1cb9OF4gVg2Gn8p5L4aWQ51dw2pS1BA2QjNmU+ lYnrec9sqs9U15d04MQvCEPOoDAh/24wCg2MoiOKqjwEaz5s7ZfMobB0kiwSYo3JBwMddQ cUZq5Z+i/M51qlhOtnqi429oH7gj3ns= ARC-Authentication-Results: i=1; imf10.hostedemail.com; dkim=pass header.d=gmail.com header.s=20230601 header.b=VPgOoTV+; spf=pass (imf10.hostedemail.com: domain of 21cnbao@gmail.com designates 209.85.217.48 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=1749194319; a=rsa-sha256; cv=none; b=uuj/+11g2HsPTk1g4vv985dSy++B8MwtSmK1NHYbm2mBAkjfszOCT3UTsppc+z7pTlevvF bjPFz/NXmIEsYZtkGj0cAvYMMUx3O2W8aWmCjFXo/PyT9+gmiUk3hFvYja/R+0XvOj37TS 9DLpwAYx1jiik1dgooEfaQdSvMqgNFU= Received: by mail-vs1-f48.google.com with SMTP id ada2fe7eead31-4e5adc977ecso542110137.3 for ; Fri, 06 Jun 2025 00:18:38 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1749194318; x=1749799118; 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=81N3G2EiE8jl6/Bl162HCJNaqYLVKxHGkZAdpjf6weQ=; b=VPgOoTV+0QQKDZ34xi358HUPNbtZawcfAv/ydICzy0YhYWafAI6JcLKquGaYjLbi7J YdaNuIIGHVmSVkEYXOLQa2Rfv0eFnnrMSULHzVLyjw0R970skbdjPmzjPjEzuzrQ5BWM bCkDp4dTH2fQVwe0m45iifsjluG150ZryZGbzI+vbboZKHloSdpf0UekbIXNQJWVo6zg HI/x+OmmNGiQrxAa1SgFMsnywX3xmo7k4hHToG2VhYiRxwO+HIpk5G+a05DtjhYe8YSU aPCmVCYbSmYgcNySCrtrCiMvO9dpc7blO8HXe2jXveHugQF4sN4rK1Hvj5bVXTaFAcd6 fy4w== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1749194318; x=1749799118; 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=81N3G2EiE8jl6/Bl162HCJNaqYLVKxHGkZAdpjf6weQ=; b=o3Q2tjLS5Nif5m8w+cx9QGXRZKgA8/RtSiXlBI+Mt8ceU8k89/NGXrdgk8xZrImA6B SjeVIvgp550TGgpbERmtrUaWXxnIhgW8tpcJFsL6JFpML/fDLU414eZD0LG/5jnzo7Sy sZVWvTrR4ZV6nKjKaVMs/qjrcTglb6dLmSRxVggIrmZfofN5tJrHzkeIQ39abF4BilyX 5LOZ27eLh3hrcMoJzyFNmNB0DyUZqagEJL2kIQngK6jprnm2CgcryI3RQlZkykmy1rUZ UeWziKC0WALQy4uTN4uZW+cmmMMQdGCOW8XQ7o3/LFL2Yxqi/kJQtzhWztOHCIrcw4g3 TNJg== X-Forwarded-Encrypted: i=1; AJvYcCWfIEBTPLr80MDfe1djIN0jH43TsobI/MNRvlKAXNVc2pwnJwiQkKVubvOHrlxdhL1eeqfPdwfvuQ==@kvack.org X-Gm-Message-State: AOJu0Yw0hjmmOkALoY8ZW0n7uP8fxKB4WtyacAehLsqUFDG/jjSzWyt6 iK4KlCfmt+CMfQVVJEQfoGSN2Lgs6mTr5SdhQwpk595Rap+f0XEBXFC25erhX0PPcK0BJAcgzyi Nky2nDh5OMWiiz9bklWi2uNq2fMbdEE0= X-Gm-Gg: ASbGncvaIE+VrfMJTOnooKVknPIZwoi9QOLCA3jHPv0xk5czvzW5Qg3NtvokOs/JxjI +xlnyE6fONVGJ4PwSLgcpzhxrcrkpSvY4H0T+lrYmgNK1OuZtLEdS2co8z5Z9Aug/VCyKtsqVUA p9B5C0Lv91uW4vnSbxZVFRqyh8ya3CXrBA3w== X-Google-Smtp-Source: AGHT+IEN7o3Nt2k6TzMRne9klFDn8+ml1QuHy4jJPCmZwEseUv24nrR5KnEBRjqA+279qE6imTPlUyJYgqZB93CQjW0= X-Received: by 2002:a05:6102:4b18:b0:4e5:9323:d2b9 with SMTP id ada2fe7eead31-4e772997c59mr2154973137.2.1749194317917; Fri, 06 Jun 2025 00:18:37 -0700 (PDT) MIME-Version: 1.0 References: <20250530104439.64841-1-21cnbao@gmail.com> <0b96ce61-a52c-4036-b5b6-5c50783db51f@lucifer.local> In-Reply-To: From: Barry Song <21cnbao@gmail.com> Date: Fri, 6 Jun 2025 19:18:25 +1200 X-Gm-Features: AX0GCFsXx5o38QJQIsbg8xYd5TcOnQ2AMqO2vTKH-7Yj_ODJOcMVPqzreLsYAgg Message-ID: Subject: Re: [PATCH RFC v2] mm: use per_vma lock for MADV_DONTNEED To: Suren Baghdasaryan Cc: Lorenzo Stoakes , akpm@linux-foundation.org, linux-mm@kvack.org, linux-kernel@vger.kernel.org, Barry Song , "Liam R. Howlett" , David Hildenbrand , Vlastimil Babka , Jann Horn , Lokesh Gidra , Tangquan Zheng Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable X-Rspamd-Server: rspam12 X-Rspamd-Queue-Id: 126A8C000C X-Stat-Signature: gzbw1wxwguj9s1gnzbi4y4jey3sd9sk8 X-Rspam-User: X-HE-Tag: 1749194318-293128 X-HE-Meta: U2FsdGVkX1/dGk2TUZDomjxgh3cvtcSPNgk8SE+O12qehUzn6Sf8Xip8J7IDQRRvGKkf8zj8MGNK1JfmzgfWQKUU18cg+YyDKjMji47yt6qu6nyqx/6TTIyVAuTPQdsafaZCHJHtI2HqpT/c5GJ/EsSIS6e4QXBysyCETWc6/LuO9KLzcQ2Rd5cOdmfjmFn/mSDZ8gO/1wZy2QtUhHeen8L4WM2caaCp4mKtbzquDkAhe6BQTClPqfHhI0p1JRoQmomdMmXlK26Q0K9u1b6pZ9ViB4zYYj3Z82m/RotCg+eBlR4cKi8BHKfFRdulm3SQHmOAcNyf9oxbPgkR57SMe9bI0aPjIj8xeY/nZpjV8+DGuFty08k1i2mnFU2eHTZAWcQyUdfxkBPXEogITrSiTdb7SVj+Sm4dXrLFWcWVEfLpvTWnf7k1o3X4z8apgATjVWfF5+dSDnRB7vdX8q7DyQSSY1CQhrqSFEUyVuH6QIQmMUHlt4rTNRg6cV4REVGM6g8Kk2xHAJJ8YtoQqN3qOHYnjsJ/KWuUqZTGXSmv+dlsz1sJpiTRB0hxQi440kuDZ5Jrh6pQTjMt93ZlenFjDM3xbYZn9AwjofnavSxJN+7KesVpNmvNIvNbmu0TxigkBOuN2qM8Si7TPmOK3p/PqgcML47v8k5sBiW+/ekSwb/8Sq4B+PhAFIMLCpmeBsYguKnOG2baZUQ3QE0Oy0qG1OBzpe5mVkbWtaN7HWnzFJhDLD8bHUE4P2DxPDlhTl7manhX+f9AihcReKXF+Grref+v6w+asA37oojJ6x2A6bgm+yEQ0uSFsvKO6ixUA/lOX/Cd2hnutWLNLRk4pbtgTk4Xx375t/RAw96sVlUCL5KRMjrsz56LEJlEgfoyoMOZOtnIRqFBK6AiTRA457l0kwQei4SXwwaIlYvRYKqR/oppLR+pFuZQCk8yXtYoKKGOCtgHgypNSdXugXzSECA 3vpfRwxh M/whCAv9eVFKGAfp7ayp8Pe3Etd2GxUO8O4ks1NpYOsuO9pjJmXG3onWbKgG64tI+YVeArmCuTWh3oEPpVWT+EQjISqM+GsCwA8arevMkVqgWlmNA7Ro07DY7ijTxEMFI9mK8Z1k+yia4zjV1zOWM6tH/p7cEdcSDczisHVhRQ1Tv72vJcmRvJp8zyt8av8OPMkNLAXKw0d9xr7CdmcfZvFEsqXLLO3xID6qOkjQcDG6tSAWpAPT307dMcc55nBleh2Iiq1GN5BAdpoUQyifjvIFCUeqz+VR5Q4gOpoyUaUDwhi15kJ0IOoQ4OfjK1kjErn9u50qrRBz/DBR/ep0KLYls8XgUem7l0jSLYjsyjNF5IMYnzbW9mq2KjoabmY6iU9FFmvfQJr+E9MZmdAJxlin+5NAEa+7Zli1A 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 Wed, Jun 4, 2025 at 8:17=E2=80=AFAM Suren Baghdasaryan wrote: > > On Tue, Jun 3, 2025 at 11:43=E2=80=AFAM Lorenzo Stoakes > wrote: > > > > Hi Barry, > > > > As promised, I enclose a patch to give a sense of how I think we might > > thread state through this operation. > > > > There's a todo on the untagged stuff so you can figure that out. This i= s > > based on the v1 so it might not encompass everything you addressed in t= he > > v2. > > > > Passing in madv_behavior to madvise_walk_vmas() twice kinda sucks, I > > _despise_ the void *arg function ptr stuff there added just for the ano= n > > vma name stuff (ughhh) so might be the only sensible way of threading > > state. > > > > I don't need any attribution, so please use this patch as you see > > fit/adapt/delete/do whatever with it, just an easier way for me to show= the > > idea! > > > > I did some very basic testing and it seems to work, but nothing deeper. > > > > Cheers, Lorenzo Really appreciate your work on this, Lorenzo. > > > > ----8<---- > > From ff4ba0115cb31a0630b6f8c02c68f11b3fb71f7a Mon Sep 17 00:00:00 2001 > > From: Lorenzo Stoakes > > Date: Tue, 3 Jun 2025 18:22:55 +0100 > > Subject: [PATCH] mm/madvise: support VMA read locks for MADV_DONTNEED[_= LOCKED] > > > > Refactor the madvise() code to retain state about the locking mode util= ised > > for traversing VMAs. > > > > Then use this mechanism to permit VMA locking to be done later in the > > madvise() logic and also to allow altering of the locking mode to permi= t > > falling back to an mmap read lock if required. > > > > Signed-off-by: Lorenzo Stoakes > > --- > > mm/madvise.c | 174 +++++++++++++++++++++++++++++++++++++-------------- > > 1 file changed, 127 insertions(+), 47 deletions(-) > > > > diff --git a/mm/madvise.c b/mm/madvise.c > > index 5f7a66a1617e..a3a6d73d0bd5 100644 > > --- a/mm/madvise.c > > +++ b/mm/madvise.c > > @@ -48,38 +48,19 @@ struct madvise_walk_private { > > bool pageout; > > }; > > > > +enum madvise_lock_mode { > > + MADVISE_NO_LOCK, > > + MADVISE_MMAP_READ_LOCK, > > + MADVISE_MMAP_WRITE_LOCK, > > + MADVISE_VMA_READ_LOCK, > > +}; > > + > > struct madvise_behavior { > > int behavior; > > struct mmu_gather *tlb; > > + enum madvise_lock_mode lock_mode; > > }; > > > > -/* > > - * Any behaviour which results in changes to the vma->vm_flags needs t= o > > - * take mmap_lock for writing. Others, which simply traverse vmas, nee= d > > - * to only take it for reading. > > - */ > > -static int madvise_need_mmap_write(int behavior) > > -{ > > - switch (behavior) { > > - case MADV_REMOVE: > > - case MADV_WILLNEED: > > - case MADV_DONTNEED: > > - case MADV_DONTNEED_LOCKED: > > - case MADV_COLD: > > - case MADV_PAGEOUT: > > - case MADV_FREE: > > - case MADV_POPULATE_READ: > > - case MADV_POPULATE_WRITE: > > - case MADV_COLLAPSE: > > - case MADV_GUARD_INSTALL: > > - case MADV_GUARD_REMOVE: > > - return 0; > > - default: > > - /* be safe, default to 1. list exceptions explicitly */ > > - return 1; > > - } > > -} > > - > > #ifdef CONFIG_ANON_VMA_NAME > > struct anon_vma_name *anon_vma_name_alloc(const char *name) > > { > > @@ -1486,6 +1467,43 @@ static bool process_madvise_remote_valid(int beh= avior) > > } > > } > > > > +/* > > + * Try to acquire a VMA read lock if possible. > > + * > > + * We only support this lock over a single VMA, which the input range = must > > + * span.either partially or fully. > > + * > > + * This function always returns with an appropriate lock held. If a VM= A read > > + * lock could be acquired, we return the locked VMA. > > + * > > + * If a VMA read lock could not be acquired, we return NULL and expect= caller to > > Worth mentioning that the function itself will fall back to taking > mmap_read_lock in such a case. > > > + * fallback to mmap lock behaviour. > > + */ > > +static struct vm_area_struct *try_vma_read_lock(struct mm_struct *mm, > > + struct madvise_behavior *madv_behavior, > > + unsigned long start, unsigned long end) > > +{ > > + struct vm_area_struct *vma; > > + > > + if (!madv_behavior || madv_behavior->lock_mode !=3D MADVISE_VMA= _READ_LOCK) > > nit: I think it would be better to do this check before calling > try_vma_read_lock(). IMHO it does not make sense to call > try_vma_read_lock() when lock_mode !=3D MADVISE_VMA_READ_LOCK. It also > makes reading this function easier. The first time I looked at it and > saw "return NULL" in one place that takes mmap_read_lock() and another > place which returns the same NULL but does not take mmap_lock really > confused me. > > > + return NULL; > > + > > + vma =3D lock_vma_under_rcu(mm, start); > > + if (!vma) > > + goto take_mmap_read_lock; > > + /* We must span only a single VMA, uffd unsupported. */ > > + if (end > vma->vm_end || userfaultfd_armed(vma)) { > > vma->vm_end is not inclusive, so the above condition I think should be > (end >=3D vma->vm_end || ...) I don't quite understand why `end > vma->vm_end` would be a problem. For a VMA with `vm_start =3D X` and `vm_end =3D X + 0x1000`, wouldn't the range `(X, X + 0x1000)`=E2=80=94where `end =3D=3D vm_end`=E2=80=94still be = a valid candidate for using a per-VMA lock? We're checking which cases are not eligible for per-VMA locking, not which ones are. > > > + vma_end_read(vma); > > + goto take_mmap_read_lock; > > + } > > + return vma; > > + > > +take_mmap_read_lock: > > + mmap_read_lock(mm); > > + madv_behavior->lock_mode =3D MADVISE_MMAP_READ_LOCK; > > + return NULL; > > +} > > + > > /* > > * Walk the vmas in range [start,end), and call the visit function on = each one. > > * The visit function will get start and end parameters that cover the= overlap > > @@ -1496,7 +1514,8 @@ static bool process_madvise_remote_valid(int beha= vior) > > */ > > static > > int madvise_walk_vmas(struct mm_struct *mm, unsigned long start, > > - unsigned long end, void *arg, > > + unsigned long end, struct madvise_behavior *madv_= behavior, > > + void *arg, > > int (*visit)(struct vm_area_struct *vma, > > struct vm_area_struct **prev, unsign= ed long start, > > unsigned long end, void *arg)) > > @@ -1505,6 +1524,15 @@ int madvise_walk_vmas(struct mm_struct *mm, unsi= gned long start, > > struct vm_area_struct *prev; > > unsigned long tmp; > > int unmapped_error =3D 0; > > + int error; > > + > > + /* If VMA read lock supported, we apply advice to a single VMA = only. */ > > + vma =3D try_vma_read_lock(mm, madv_behavior, start, end); > > + if (vma) { > > + error =3D visit(vma, &prev, start, end, arg); > > + vma_end_read(vma); > > + return error; > > + } > > > > /* > > * If the interval [start,end) covers some unmapped address > > @@ -1516,8 +1544,6 @@ int madvise_walk_vmas(struct mm_struct *mm, unsig= ned long start, > > prev =3D vma; > > > > for (;;) { > > - int error; > > - > > /* Still start < end. */ > > if (!vma) > > return -ENOMEM; > > @@ -1598,34 +1624,86 @@ int madvise_set_anon_name(struct mm_struct *mm,= unsigned long start, > > if (end =3D=3D start) > > return 0; > > > > - return madvise_walk_vmas(mm, start, end, anon_name, > > + return madvise_walk_vmas(mm, start, end, anon_name, NULL, I think this should be: + return madvise_walk_vmas(mm, start, end, NULL, anon_name, > > madvise_vma_anon_name); > > } > > #endif /* CONFIG_ANON_VMA_NAME */ > > > > -static int madvise_lock(struct mm_struct *mm, int behavior) > > + > > +/* > > + * Any behaviour which results in changes to the vma->vm_flags needs t= o > > + * take mmap_lock for writing. Others, which simply traverse vmas, nee= d > > + * to only take it for reading. > > + */ > > +static enum madvise_lock_mode get_lock_mode(struct madvise_behavior *m= adv_behavior) > > { > > + int behavior =3D madv_behavior->behavior; > > + > > if (is_memory_failure(behavior)) > > - return 0; > > + return MADVISE_NO_LOCK; > > > > - if (madvise_need_mmap_write(behavior)) { > > + switch (behavior) { > > + case MADV_REMOVE: > > + case MADV_WILLNEED: > > + case MADV_COLD: > > + case MADV_PAGEOUT: > > + case MADV_FREE: > > + case MADV_POPULATE_READ: > > + case MADV_POPULATE_WRITE: > > + case MADV_COLLAPSE: > > + case MADV_GUARD_INSTALL: > > + case MADV_GUARD_REMOVE: > > + return MADVISE_MMAP_READ_LOCK; > > + case MADV_DONTNEED: > > + case MADV_DONTNEED_LOCKED: > > + return MADVISE_VMA_READ_LOCK; > > + default: > > + return MADVISE_MMAP_WRITE_LOCK; > > + } > > +} > > + > > +static int madvise_lock(struct mm_struct *mm, > > + struct madvise_behavior *madv_behavior) > > +{ > > + enum madvise_lock_mode lock_mode =3D get_lock_mode(madv_behavio= r); > > + > > + switch (lock_mode) { > > + case MADVISE_NO_LOCK: > > + break; > > + case MADVISE_MMAP_WRITE_LOCK: > > if (mmap_write_lock_killable(mm)) > > return -EINTR; > > - } else { > > + break; > > + case MADVISE_MMAP_READ_LOCK: > > mmap_read_lock(mm); > > + break; > > + case MADVISE_VMA_READ_LOCK: > > + /* We will acquire the lock per-VMA in madvise_walk_vma= s(). */ > > + break; > > } > > + > > + madv_behavior->lock_mode =3D lock_mode; > > return 0; > > } > > > > -static void madvise_unlock(struct mm_struct *mm, int behavior) > > +static void madvise_unlock(struct mm_struct *mm, > > + struct madvise_behavior *madv_behavior) > > { > > - if (is_memory_failure(behavior)) > > + switch (madv_behavior->lock_mode) { > > + case MADVISE_NO_LOCK: > > return; > > - > > - if (madvise_need_mmap_write(behavior)) > > + case MADVISE_MMAP_WRITE_LOCK: > > mmap_write_unlock(mm); > > - else > > + break; > > + case MADVISE_MMAP_READ_LOCK: > > mmap_read_unlock(mm); > > + break; > > + case MADVISE_VMA_READ_LOCK: > > + /* We will drop the lock per-VMA in madvise_walk_vmas()= . */ > > + break; > > + } > > + > > + madv_behavior->lock_mode =3D MADVISE_NO_LOCK; > > } > > > > static bool madvise_batch_tlb_flush(int behavior) > > @@ -1721,6 +1799,8 @@ static int madvise_do_behavior(struct mm_struct *= mm, > > > > if (is_memory_failure(behavior)) > > return madvise_inject_error(behavior, start, start + le= n_in); > > + > > + // TODO: handle untagged stuff here... > > start =3D untagged_addr(start); //untagged_addr_remote(mm, star= t); > > end =3D start + PAGE_ALIGN(len_in); > > > > @@ -1729,7 +1809,7 @@ static int madvise_do_behavior(struct mm_struct *= mm, > > error =3D madvise_populate(mm, start, end, behavior); > > else > > error =3D madvise_walk_vmas(mm, start, end, madv_behavi= or, > > - madvise_vma_behavior); > > + madv_behavior, madvise_vma_be= havior); > > blk_finish_plug(&plug); > > return error; > > } > > @@ -1817,13 +1897,13 @@ int do_madvise(struct mm_struct *mm, unsigned l= ong start, size_t len_in, int beh > > > > if (madvise_should_skip(start, len_in, behavior, &error)) > > return error; > > - error =3D madvise_lock(mm, behavior); > > + error =3D madvise_lock(mm, &madv_behavior); > > if (error) > > return error; > > madvise_init_tlb(&madv_behavior, mm); > > error =3D madvise_do_behavior(mm, start, len_in, &madv_behavior= ); > > madvise_finish_tlb(&madv_behavior); > > - madvise_unlock(mm, behavior); > > + madvise_unlock(mm, &madv_behavior); > > > > return error; > > } > > @@ -1847,7 +1927,7 @@ static ssize_t vector_madvise(struct mm_struct *m= m, struct iov_iter *iter, > > > > total_len =3D iov_iter_count(iter); > > > > - ret =3D madvise_lock(mm, behavior); > > + ret =3D madvise_lock(mm, &madv_behavior); > > if (ret) > > return ret; > > madvise_init_tlb(&madv_behavior, mm); > > @@ -1880,8 +1960,8 @@ static ssize_t vector_madvise(struct mm_struct *m= m, struct iov_iter *iter, > > > > /* Drop and reacquire lock to unwind race. */ > > madvise_finish_tlb(&madv_behavior); > > - madvise_unlock(mm, behavior); > > - ret =3D madvise_lock(mm, behavior); > > + madvise_unlock(mm, &madv_behavior); > > + ret =3D madvise_lock(mm, &madv_behavior); > > if (ret) > > goto out; > > madvise_init_tlb(&madv_behavior, mm); > > @@ -1892,7 +1972,7 @@ static ssize_t vector_madvise(struct mm_struct *m= m, struct iov_iter *iter, > > iov_iter_advance(iter, iter_iov_len(iter)); > > } > > madvise_finish_tlb(&madv_behavior); > > - madvise_unlock(mm, behavior); > > + madvise_unlock(mm, &madv_behavior); > > > > out: > > ret =3D (total_len - iov_iter_count(iter)) ? : ret; > > -- > > 2.49.0 Thanks Barry