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 70D79C02188 for ; Mon, 27 Jan 2025 20:24:00 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id DC464280178; Mon, 27 Jan 2025 15:23:59 -0500 (EST) Received: by kanga.kvack.org (Postfix, from userid 40) id D74C9280163; Mon, 27 Jan 2025 15:23:59 -0500 (EST) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id C3BF7280178; Mon, 27 Jan 2025 15:23:59 -0500 (EST) 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 A5C2B280163 for ; Mon, 27 Jan 2025 15:23:59 -0500 (EST) Received: from smtpin07.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay02.hostedemail.com (Postfix) with ESMTP id 1F05E12062D for ; Mon, 27 Jan 2025 20:23:59 +0000 (UTC) X-FDA: 83054358198.07.AD34DC9 Received: from mail-ed1-f54.google.com (mail-ed1-f54.google.com [209.85.208.54]) by imf05.hostedemail.com (Postfix) with ESMTP id 1E000100013 for ; Mon, 27 Jan 2025 20:23:56 +0000 (UTC) Authentication-Results: imf05.hostedemail.com; dkim=pass header.d=gmail.com header.s=20230601 header.b=b+vuAfKy; spf=pass (imf05.hostedemail.com: domain of ubizjak@gmail.com designates 209.85.208.54 as permitted sender) smtp.mailfrom=ubizjak@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=1738009437; 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=7e+2wHGN3Pp6q7dFqDtLcOtOJoQxDMmhsrb9ED/JLVY=; b=6qcYIUzFeCrG3jISlSrF1DErTuiGqtWCsOa8nuEACmAtlcDKtSHJodHkgKgVVE9+ZB8cPd fb8iugy4GM95Nfrpimp98IjLdMGbyAxMEIggRH51OpfZt0xUZtGFql+OCHhxhA1Pb/wKie lXlYQ1AxWpLwV78gqmjLVA3L7u7b0wE= ARC-Authentication-Results: i=1; imf05.hostedemail.com; dkim=pass header.d=gmail.com header.s=20230601 header.b=b+vuAfKy; spf=pass (imf05.hostedemail.com: domain of ubizjak@gmail.com designates 209.85.208.54 as permitted sender) smtp.mailfrom=ubizjak@gmail.com; dmarc=pass (policy=none) header.from=gmail.com ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1738009437; a=rsa-sha256; cv=none; b=glpd68kjXxhZz0Fm4gLsMOQNvYZ2/78uTcqENsqaMc4ft2whAu6QGrjFQxfUEVdv6BN1gf KTU9t2T2/5wXVyMO/lCzdMHrt3ShumOdfqD/4v1trtwBovBP2mTkLLfszdcsrKTxSMO0L+ FqnZo0MYy6WUhjx0HmcfCPX/Vf1p4IU= Received: by mail-ed1-f54.google.com with SMTP id 4fb4d7f45d1cf-5d3f28881d6so7134508a12.1 for ; Mon, 27 Jan 2025 12:23:56 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1738009435; x=1738614235; darn=kvack.org; h=content-transfer-encoding:in-reply-to:from:content-language :references:cc:to:subject:user-agent:mime-version:date:message-id :from:to:cc:subject:date:message-id:reply-to; bh=7e+2wHGN3Pp6q7dFqDtLcOtOJoQxDMmhsrb9ED/JLVY=; b=b+vuAfKycfeqQDidibuOv7dsxlGP1vS+HHRLEQQ3O+kfiX6i0lNstB+DJCLxEp9RJh fjr0+8/z2Kri1BXxxk7VemK4nJ+03Z8o8wmtqCCGJK9tUW2cK2CYm79uZid6+dAOPv8E 7KRTMs6Y8APK//y74IMldWMQWZHB51ckqHmmlVdxR/j40q0Zk1xYeNGcu8kOqDCNgqbg 6JeAiEVJ+S65zNLXehG9WlPbFqaJOMwpwNP55iNYpstXJ9NLqOC51vVtzvH2PXog9kdE +5U/wMJX7mOhsGFv0ntDtRmG0mo8Q0b+DGsFRi7mYjMYekEH80sIzTg0O6JzinqVhCIi pzWg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1738009435; x=1738614235; h=content-transfer-encoding:in-reply-to:from:content-language :references:cc:to:subject:user-agent:mime-version:date:message-id :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=7e+2wHGN3Pp6q7dFqDtLcOtOJoQxDMmhsrb9ED/JLVY=; b=lFEGeEgLKCQ0iqUe8jytyQq/MSkCNIcHO1jEBTtb/aKKrcSaqIgZDzxQi/4hpIVdDe Agr7+iXwOv+35Ygs5uaxMYOiOxAFwClWjqRvBLmxxeMDTAyB2dF3ceQc9M5U6Msk6+WD WXM2N184NIzPMbpw0kEno3riXFVvU/x0WfbftZrbmITKlfoV4suJ2VJWcwOqY/aS6Y9j NLthXjSYTTvG4QyxqpcljKLSQixznfLg8z+uh3YKTe1j0Ral20LB+Xg2D4dxbXO/wGTQ xPWLjt+7WlK17RHJr/4KXb6Q4UlDIM+l1xymB5Rr9yL3DxO+YmZR5iBKLckXc2+ZSf2m j89w== X-Gm-Message-State: AOJu0Yw/WSLWlKGi94++XBrqOWLFhQuEF5+kDyIEPUrzJ9IXV/g9oana Xj9tIzUZXvBx+VkLZDMHk1qqGytP+4lywZEQWp1BMT8quUg2iNBL X-Gm-Gg: ASbGncsM4id+QP/vVEBxG4c2RhWx0YxeLxHg+yaMjMbL6dp/eWiim3kCpgWT+GKKck5 DaNlSlu8jkabKE7Rb+A5CNTwRLPOfIUgCfL2Sm46TDCzv/4pjDmNUTcvKd1tMz3/Fp1OUI+2/Kj YptWVO9W8ZLcGfhVl2IlzEoXEyygPefrdiJv/ZvbwDg5JtN6/xJlfRPi5IEHuAlJaQkX1/uAME2 3T/UR++KlukbxeuCWyNwk94Eyic6vVmzx25Ocx6HP99qcnmXy/Ks1a7PDSN0qemkK8Arxg2BDXY ikzXIA== X-Google-Smtp-Source: AGHT+IHY/VGwKOWXuQ+QiJq5REmrQV8M3DnBCVAY2eoQ40JKqvkDx09Zti93fML0J4ZJ5D2nMVaVCg== X-Received: by 2002:a05:6402:518a:b0:5d3:ba42:e9e3 with SMTP id 4fb4d7f45d1cf-5db7d2f5ec0mr103782166a12.13.1738009435161; Mon, 27 Jan 2025 12:23:55 -0800 (PST) Received: from [192.168.1.100] ([46.248.82.114]) by smtp.gmail.com with ESMTPSA id 4fb4d7f45d1cf-5dc18638ed2sm5915926a12.36.2025.01.27.12.23.53 (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128); Mon, 27 Jan 2025 12:23:54 -0800 (PST) Message-ID: Date: Mon, 27 Jan 2025 21:23:53 +0100 MIME-Version: 1.0 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:102.0) Gecko/20100101 Thunderbird/102.15.1 Subject: Re: [RFC PATCH 2/6] zsmalloc: make zspage lock preemptible To: Sergey Senozhatsky , Andrew Morton , Minchan Kim , Johannes Weiner , Yosry Ahmed , Nhat Pham Cc: linux-mm@kvack.org, linux-kernel@vger.kernel.org References: <20250127080254.1302026-1-senozhatsky@chromium.org> <20250127080254.1302026-3-senozhatsky@chromium.org> Content-Language: en-US From: Uros Bizjak In-Reply-To: <20250127080254.1302026-3-senozhatsky@chromium.org> Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 7bit X-Rspamd-Server: rspam02 X-Rspamd-Queue-Id: 1E000100013 X-Stat-Signature: iay5nmwn9i3jh7k4791185azoftr3x83 X-Rspam-User: X-HE-Tag: 1738009436-71772 X-HE-Meta: U2FsdGVkX18FY/BflvYkrKN7/uUKIcA1qnysYhPDf1w1lTgSnvnahOtjjvFr84EFfdB/ZOlH4tPIrDTrekzlUV9gzv3Mfa1hNUywuMAxuMJYNowkaa+2PhaaxK8uFMmVo2PGr/pNecc8kMpNYPE+ncwLdaY7+FbgQ42lMmf+FeyOnFQaqGIWryoigjVX2sW7fV8SY6PjQ2WxaVftGXkwG6hG+OICzStMTQiTXe0Iy4UTxpoJSB3APNkjmiZB9ybFwgemTxkvQFHsNX7AJN9DthvC2/G3XHYeMmpwUqKV89Nqc4N0mFOty5+delRKsnPBMnSbNn2RGsC060sNlHRJTRkm/el3hsuDL+1h93l+pYt7f7F1IJLqLccJ/2owwF63kztGYUfxrZlleUXRePBnjM4z4RHl+VoP83I6Cpybd/5Oj5DyEviXv7uH+UYehDJLpapNu2pFFBOG4r0J1MQwg5BCKWyziuP81sGo0pHwg4PYCCkKm3PWPphAoKGzufEmfNMi21khahruKcc8UbcMPi+uy7Z1B2quoPYa5j/mFnXKWIQ2Dr+UQ4cxDuxwgcZ/FwoNG20Sfr+4aDItTlWqfzyfNZRgGiYzQM66rY1AaYTjUz22LRpfIHTMk3HTzuC4vw6hPIgFABs2M1R9Kqn17yamRKO9dAKAHlhgbfZ2MRONZpb24TODYmr2AV32phHch1x7pxHJPnkcWCiYMhLLzgk3NDl1Tanio5bwN/KRsdk0gl0qYcBS26iU8mMc34a82g0t9pci67ez0oPqbz1+JGbfKgRP5SmEftfKldy80Rx7vQKdUX+q8gVhISIWsXF7ItgxcAr/jeBg97ze/fwtePI95Ov5+RQTmAuQP3i4VFhGJ4UbExUEhxge8oRVOnVjZyLEa8eGQQyVBUIH9JMe6FyYajPcZxPYYWP+aJuHI/9NR8FeGuhbRsXeVxAU1BZOjaJ8M33WDpq5eGcJuj+ LSJsrRwc q1tcd9gprGJe6lCylWkwl4dpoKEYVN7ULsHILuvRpL5+ao9QTBsHe602M2ORJgSg8FIn+5liXRSY6TUIrNO4S4dqeTOZGHuFgsXXWXgXtZ1+cm9dBB5S+41N6igwVqqcfqtwMmAP80c4HoR7PlQ+YpvljkUOqEPEgOCZWBgZzfO4RBzxsTXGgV+U1kx8Q8gyQPHQl75MwixWuVdxWYJUyIefTArB+YdpHqepFSR/GdXai4eGJk7Z1SPA0vGf6n3dE839NgvGtjg8DhP05mkpS3EALgBtMsZjMMmdhpF9LzWfM8xQURt46gCWjWd9KynIAFbMF9rKUzF6d7uCGYFiNIHzQegLhMwrs42P6FOAQh8LhSdwJMYvBvLFBRlyWHuItii2T 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 27. 01. 25 08:59, Sergey Senozhatsky wrote: > Switch over from rwlock_t to a atomic_t variable that takes > negative value when the page is under migration, or positive > values when the page is used by zsmalloc users (object map, > etc.) Using a rwsem per-zspage is a little too memory heavy, > a simple atomic_t should suffice, after all we only need to > mark zspage as either used-for-write or used-for-read. This > is needed to make zsmalloc preemtible in the future. > > Signed-off-by: Sergey Senozhatsky > --- > mm/zsmalloc.c | 112 +++++++++++++++++++++++++++++--------------------- > 1 file changed, 66 insertions(+), 46 deletions(-) > > diff --git a/mm/zsmalloc.c b/mm/zsmalloc.c > index 817626a351f8..28a75bfbeaa6 100644 > --- a/mm/zsmalloc.c > +++ b/mm/zsmalloc.c > @@ -257,6 +257,9 @@ static inline void free_zpdesc(struct zpdesc *zpdesc) > __free_page(page); > } > > +#define ZS_PAGE_UNLOCKED 0 > +#define ZS_PAGE_WRLOCKED -1 > + > struct zspage { > struct { > unsigned int huge:HUGE_BITS; > @@ -269,7 +272,7 @@ struct zspage { > struct zpdesc *first_zpdesc; > struct list_head list; /* fullness list */ > struct zs_pool *pool; > - rwlock_t lock; > + atomic_t lock; > }; > > struct mapping_area { > @@ -290,11 +293,53 @@ static bool ZsHugePage(struct zspage *zspage) > return zspage->huge; > } > > -static void migrate_lock_init(struct zspage *zspage); > -static void migrate_read_lock(struct zspage *zspage); > -static void migrate_read_unlock(struct zspage *zspage); > -static void migrate_write_lock(struct zspage *zspage); > -static void migrate_write_unlock(struct zspage *zspage); > +static void zspage_lock_init(struct zspage *zspage) > +{ > + atomic_set(&zspage->lock, ZS_PAGE_UNLOCKED); > +} > + > +static void zspage_read_lock(struct zspage *zspage) > +{ > + atomic_t *lock = &zspage->lock; > + int old; > + > + while (1) { > + old = atomic_read(lock); > + if (old == ZS_PAGE_WRLOCKED) { > + cpu_relax(); > + continue; > + } > + > + if (atomic_cmpxchg(lock, old, old + 1) == old) > + return; You can use atomic_try_cmpxchg() here: if (atomic_try_cmpxchg(lock, &old, old + 1)) return; > + > + cpu_relax(); > + } > +} > + > +static void zspage_read_unlock(struct zspage *zspage) > +{ > + atomic_dec(&zspage->lock); > +} > + > +static void zspage_write_lock(struct zspage *zspage) > +{ > + atomic_t *lock = &zspage->lock; > + int old; > + > + while (1) { > + old = atomic_cmpxchg(lock, ZS_PAGE_UNLOCKED, ZS_PAGE_WRLOCKED); > + if (old == ZS_PAGE_UNLOCKED) > + return; Also, the above code can be rewritten as: while (1) { old = ZS_PAGE_UNLOCKED; if (atomic_try_cmpxchg (lock, &old, ZS_PAGE_WRLOCKED)) return; > + > + cpu_relax(); > + } > +} The above change will result in a slightly better generated asm. Uros.