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 217FACF34CF for ; Thu, 3 Oct 2024 22:41:16 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id 882DA8D0006; Thu, 3 Oct 2024 18:41:15 -0400 (EDT) Received: by kanga.kvack.org (Postfix, from userid 40) id 832718D0003; Thu, 3 Oct 2024 18:41:15 -0400 (EDT) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 6AC228D0006; Thu, 3 Oct 2024 18:41:15 -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 4BC178D0003 for ; Thu, 3 Oct 2024 18:41:15 -0400 (EDT) Received: from smtpin20.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay05.hostedemail.com (Postfix) with ESMTP id C648740DAC for ; Thu, 3 Oct 2024 22:41:14 +0000 (UTC) X-FDA: 82633763268.20.33026E1 Received: from mail-wr1-f48.google.com (mail-wr1-f48.google.com [209.85.221.48]) by imf10.hostedemail.com (Postfix) with ESMTP id EACFAC0010 for ; Thu, 3 Oct 2024 22:41:12 +0000 (UTC) Authentication-Results: imf10.hostedemail.com; dkim=pass header.d=gmail.com header.s=20230601 header.b=i4tJTO8Y; spf=pass (imf10.hostedemail.com: domain of alexander.duyck@gmail.com designates 209.85.221.48 as permitted sender) smtp.mailfrom=alexander.duyck@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=1727995142; 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=/c3hGmLuHS4pscUC6pHa6uh6N08NC8gTb0JYFZQBbgo=; b=NdAGogt8uJqtdFrB0aYOjvB8Nm8Y8SpUwB5L9l8dMKJ/0l7q0dbYRtWptIIdAgXnwHsgyn iUe5/Uz8ig8pGDsm0O+IahNUc6AmRIJKh3E3VXaKDnAz1jay97+vVQjboTi3S4O2osLF4E ifTRIqbswEY3XZpPxF2WKPEsZeIRDH4= ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1727995142; a=rsa-sha256; cv=none; b=sdgRSmqbrRHEmpDPCGprJWlK5aB9pNKMkvGoDkX+YkI+QCBcrkNtRKF9H76TckKsdJN8aa W37ojKHC0yYhNeP54OVXlE6ngNxwj46pJ9dFaGrbRQLlVmX3kjKVKx4D6lpcCCMHv6H5qP AQLW9dhKcakxe9L68XrJ+cINU69TIY8= ARC-Authentication-Results: i=1; imf10.hostedemail.com; dkim=pass header.d=gmail.com header.s=20230601 header.b=i4tJTO8Y; spf=pass (imf10.hostedemail.com: domain of alexander.duyck@gmail.com designates 209.85.221.48 as permitted sender) smtp.mailfrom=alexander.duyck@gmail.com; dmarc=pass (policy=none) header.from=gmail.com Received: by mail-wr1-f48.google.com with SMTP id ffacd0b85a97d-37cc84c12c2so859588f8f.3 for ; Thu, 03 Oct 2024 15:41:12 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1727995271; x=1728600071; 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=/c3hGmLuHS4pscUC6pHa6uh6N08NC8gTb0JYFZQBbgo=; b=i4tJTO8YxEqh6zr+bPxTSxPOWT47ZN5zX+iDOnoxjA0mLQ9I2LqZW8x+wRRI2rfSmt j9PEc0t/pN3bbkKpxloCn7ppUeA/gci7g5CP9Q2Z0QjUPOisRmtWSQfaKU1ayBL4u5/D tYM0BPrlmyQecylVozyKvSXcBzvj0P8bTkNEu7DnsBtRJLZy6Id+TyWCzrPzhv2aWtBk /D9KBV9DDLYT5TuCAj1vyKBG/5nvu9N6ftzvkTqQAKW5y/LmUDY0CvgzfcbINXDAVz6u GHLC+q86cUHQodQ6CRt2a+0YpJNVgwnPKxjsEQL5auyTmGOx1gTWROpHA2PjFeJIVApY OpLA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1727995271; x=1728600071; 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=/c3hGmLuHS4pscUC6pHa6uh6N08NC8gTb0JYFZQBbgo=; b=kuelLzPaGqRn8mwe6XjlLnR96gG/w1wzTNEy5UzAanrHXJNeCt0kYnXNRsjw7kj5IW W2pWF3GIIep4Rq5anO1vEPChG56oEL8jjSWmVAasCc/Q1aezKAdatfS0cQp3U8DdKvYv fGnOsemb/6jU8WVubOOrEewMb2AG0WfNK7omPT2sWaJ5KYEwhiF4ycP9yrqoO/v+3fq5 vRs3+54GkVZrwJ3bMGcS9eG+LAfjl97OadQnv/Z/91ANdiA+1q+8RXDFSCSgobBu3Leu hq9Zt7QC0x1xIodvsHb7f62mzadaPrVRFLgXdKI64Ke4guf8Wrrhw+b3FLpoZBmN20Ou XvRw== X-Forwarded-Encrypted: i=1; AJvYcCW0ARHXMPQWF58BD5gxhCQsGd2jrkzQWqBiljKV5liL/vnWaM/+Dl6QcHmrzzbmOSRjCVxl1K0/ww==@kvack.org X-Gm-Message-State: AOJu0YybbmAFZHgz7pjpJLMBzIXEyQ345YRux785Vdkd2fOsD+q99/rN kht7igVN/AYoacJN8DIielJQNAVOd0AgkZ43bSwJgbuOtEbjrYQhBykUj0FWa2lEE0GqSuyQg85 GxsSfn82th9csgTFbVL6iVoUwiaU= X-Google-Smtp-Source: AGHT+IHfK6TyAzGjZEYhjfDzLgVDZmSbnKje6qw23KJ1XRBBiloYnMzwxbGx/BEfh+aDH9km1ubNbONqWOSSS0A14pc= X-Received: by 2002:adf:ce8f:0:b0:371:8a3a:680a with SMTP id ffacd0b85a97d-37d0e782737mr444823f8f.32.1727995271184; Thu, 03 Oct 2024 15:41:11 -0700 (PDT) MIME-Version: 1.0 References: <20241001075858.48936-1-linyunsheng@huawei.com> <20241001075858.48936-7-linyunsheng@huawei.com> In-Reply-To: <20241001075858.48936-7-linyunsheng@huawei.com> From: Alexander Duyck Date: Thu, 3 Oct 2024 15:40:34 -0700 Message-ID: Subject: Re: [PATCH net-next v19 06/14] mm: page_frag: reuse existing space for 'size' and 'pfmemalloc' To: Yunsheng Lin Cc: davem@davemloft.net, kuba@kernel.org, pabeni@redhat.com, netdev@vger.kernel.org, linux-kernel@vger.kernel.org, Yunsheng Lin , Andrew Morton , linux-mm@kvack.org Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable X-Stat-Signature: 1tcysnohdbiziwabkscgzfr8cmepx6dz X-Rspamd-Queue-Id: EACFAC0010 X-Rspam-User: X-Rspamd-Server: rspam08 X-HE-Tag: 1727995272-669106 X-HE-Meta: U2FsdGVkX1+sAdDyywt7LWe59F7o4vesGB6ygKKqS+B0piyglXUEknqGO2IKpNo9Akjuga2/XALOJoZC7WNsKgqtmFG8bLwJafUCpr6p/JUfOy72i6gBaSGTIIIsgYRW8/GneGU6gmehUfMcMCC5sXH+MYhE6PeALOhIkim8bRxOsJUmY4KBjk2MwyLROZeMepxr7SwiX6FFJYzOPgeWXGfABNoiwsquZn6oCJVDG4BjJdR/xedYx6spyuQmKlES9zVtAUvQxPqF80YAtpzsrWHrYUbnIUe0i4AmExuS4IXtmvg8Ud2d41KMG1xSEK7jrKgXiNklCN0pTKjF5/yf7Ppe40GmzR3ESiLGcnSZG955zEp+vUSeQpzQWS23mB/NZzhbV+HdR953KWuo7e2Gmw1QPtpNokdcGisOj+Qa844o7we0ptC+WZ4RJShrm1txBhAPSdGXAe4XdsbvqkDWRA4tD8VQKLGV1CSAgJ9G1DQG4wWuuUbxCx9VN8hzb7/dT3XStMawL1VlgLN7HTiBKiQVkpIjb2cMZJTjMHyNc+K0+bX0uKmrXDaEC7RYzcpdcP+HAvUkmfhWWZRj+zahTTX82Hr9SP28zpMMsSUoXcfttcWBjXRIFmg8MZtX5DTd/KgfzBLIxafZ4TiD5qpDLjd1YfGDq0iOfv839gtgCldTml5oWval0XkG/+OJTKCbcDk0Ec9gekKqWEoLVLZCYMBvxrB4j9lKG+suHKwyOyt1q5sfPKZLNaYyFcgvl+74Oj9WYQsdFb+kueGcHb6dy5bgoKIrC0z+jb9jUnpi6IL6p4v9yD7mHOAd+4AT9J7wwa4RzVMmbUO11mlGhkuOmxiO/UqMS46cTXlaw41j4kiBCqzd9G8Mr5+FGHJNyBxMkzbq96Z2V1p2YuC1DREp70xad69dAJi0PRRNP8nTVUclonXk6EXOJhwJDuB9ehEpeVDGuAIkvU5mDMN5Cnc oWRGs5KN thE3eapBvGqh6WuaYa66MysOumvxlG6f3jIimrCRNWiKT9o5ayn7hXsqbP9N2tSF/oeI1LZKDR9H0zxooEsBfsOHDf9GIY6tPPbIkXkZEbT0y15q9F24AbL57nIG+A1CYnykCYDDQM/md3HBaOgb3Vkr3/BPTruJiYtrJm3wt8ML4w+ta66TH7pxKyu4tjR+hczdUIS1KbhRRTETrybqTAZTGvX4nQRY5BsA+z+ADw2PIXTdkw9e/VHuKymu9W3v4nxg1KGBNvPNqFvg2VC06s8LiqwR71AV95gHZvEBYZ+J14qpXmoUgqx/VEkZ6YkF8lem2NOGwUxHO2uIzexyqVmlg9gMLFtu/TuF65udsNb6D1yiyZwe/cIQieqP9Gj78iXv+Jle4R7oE/TMTPBB83NJY9+DsQsxitbC89undmw+Tyg4E3abHGZpwBbt5Plyrkp4M 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 Tue, Oct 1, 2024 at 12:59=E2=80=AFAM Yunsheng Lin wrote: > > Currently there is one 'struct page_frag' for every 'struct > sock' and 'struct task_struct', we are about to replace the > 'struct page_frag' with 'struct page_frag_cache' for them. > Before begin the replacing, we need to ensure the size of > 'struct page_frag_cache' is not bigger than the size of > 'struct page_frag', as there may be tens of thousands of > 'struct sock' and 'struct task_struct' instances in the > system. > > By or'ing the page order & pfmemalloc with lower bits of > 'va' instead of using 'u16' or 'u32' for page size and 'u8' > for pfmemalloc, we are able to avoid 3 or 5 bytes space waste. > And page address & pfmemalloc & order is unchanged for the > same page in the same 'page_frag_cache' instance, it makes > sense to fit them together. > > After this patch, the size of 'struct page_frag_cache' should be > the same as the size of 'struct page_frag'. > > CC: Alexander Duyck > Signed-off-by: Yunsheng Lin > --- > include/linux/mm_types_task.h | 19 +++++---- > include/linux/page_frag_cache.h | 26 +++++++++++- > mm/page_frag_cache.c | 75 +++++++++++++++++++++++---------- > 3 files changed, 88 insertions(+), 32 deletions(-) > > diff --git a/include/linux/mm_types_task.h b/include/linux/mm_types_task.= h > index 0ac6daebdd5c..a82aa80c0ba4 100644 > --- a/include/linux/mm_types_task.h > +++ b/include/linux/mm_types_task.h > @@ -47,18 +47,21 @@ struct page_frag { > #define PAGE_FRAG_CACHE_MAX_SIZE __ALIGN_MASK(32768, ~PAGE_MASK) > #define PAGE_FRAG_CACHE_MAX_ORDER get_order(PAGE_FRAG_CACHE_MAX_SIZ= E) > struct page_frag_cache { > - void *va; > -#if (PAGE_SIZE < PAGE_FRAG_CACHE_MAX_SIZE) > + /* encoded_page consists of the virtual address, pfmemalloc bit a= nd > + * order of a page. > + */ > + unsigned long encoded_page; > + > + /* we maintain a pagecount bias, so that we dont dirty cache line > + * containing page->_refcount every time we allocate a fragment. > + */ > +#if (PAGE_SIZE < PAGE_FRAG_CACHE_MAX_SIZE) && (BITS_PER_LONG <=3D 32) > __u16 offset; > - __u16 size; > + __u16 pagecnt_bias; > #else > __u32 offset; > + __u32 pagecnt_bias; > #endif > - /* we maintain a pagecount bias, so that we dont dirty cache line > - * containing page->_refcount every time we allocate a fragment. > - */ > - unsigned int pagecnt_bias; > - bool pfmemalloc; > }; > > /* Track pages that require TLB flushes */ > diff --git a/include/linux/page_frag_cache.h b/include/linux/page_frag_ca= che.h > index 0a52f7a179c8..75aaad6eaea2 100644 > --- a/include/linux/page_frag_cache.h > +++ b/include/linux/page_frag_cache.h > @@ -3,18 +3,40 @@ > #ifndef _LINUX_PAGE_FRAG_CACHE_H > #define _LINUX_PAGE_FRAG_CACHE_H > > +#include > #include > #include > #include > > +#if (PAGE_SIZE < PAGE_FRAG_CACHE_MAX_SIZE) > +/* Use a full byte here to enable assembler optimization as the shift > + * operation is usually expecting a byte. > + */ > +#define PAGE_FRAG_CACHE_ORDER_MASK GENMASK(7, 0) > +#define PAGE_FRAG_CACHE_PFMEMALLOC_SHIFT 8 > +#define PAGE_FRAG_CACHE_PFMEMALLOC_BIT BIT(PAGE_FRAG_CACHE_PFMEM= ALLOC_SHIFT) > +#else > +/* Compiler should be able to figure out we don't read things as any val= ue > + * ANDed with 0 is 0. > + */ > +#define PAGE_FRAG_CACHE_ORDER_MASK 0 > +#define PAGE_FRAG_CACHE_PFMEMALLOC_SHIFT 0 > +#define PAGE_FRAG_CACHE_PFMEMALLOC_BIT BIT(PAGE_FRAG_CACHE_PFMEM= ALLOC_SHIFT) > +#endif > + Minor nit on this. You probably only need to have PAGE_FRAG_CACHE_ORDER_SHIFT defined in the ifdef. The PFMEMALLOC bit code is the same in both so you could pull it out. Also depending on how you defined it you could just define the PFMEMALLOC_BIT as the ORDER_MASK + 1.