From patchwork Fri May 24 02:49:45 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: JaeJoon Jung X-Patchwork-Id: 13672620 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 44092C25B75 for ; Fri, 24 May 2024 02:50:14 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id A64486B008C; Thu, 23 May 2024 22:50:13 -0400 (EDT) Received: by kanga.kvack.org (Postfix, from userid 40) id A13316B0092; Thu, 23 May 2024 22:50:13 -0400 (EDT) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 8B3716B0093; Thu, 23 May 2024 22:50:13 -0400 (EDT) X-Delivered-To: linux-mm@kvack.org Received: from relay.hostedemail.com (smtprelay0013.hostedemail.com [216.40.44.13]) by kanga.kvack.org (Postfix) with ESMTP id 66E616B008C for ; Thu, 23 May 2024 22:50:13 -0400 (EDT) Received: from smtpin10.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay04.hostedemail.com (Postfix) with ESMTP id DA1721A07E9 for ; Fri, 24 May 2024 02:50:12 +0000 (UTC) X-FDA: 82151760264.10.CF73BC2 Received: from mail-oa1-f44.google.com (mail-oa1-f44.google.com [209.85.160.44]) by imf22.hostedemail.com (Postfix) with ESMTP id 29262C0008 for ; Fri, 24 May 2024 02:50:10 +0000 (UTC) Authentication-Results: imf22.hostedemail.com; dkim=pass header.d=gmail.com header.s=20230601 header.b=Uxoxz7vg; dmarc=pass (policy=none) header.from=gmail.com; spf=pass (imf22.hostedemail.com: domain of rgbi3307@gmail.com designates 209.85.160.44 as permitted sender) smtp.mailfrom=rgbi3307@gmail.com ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=hostedemail.com; s=arc-20220608; t=1716519011; h=from:from:sender:reply-to:subject:subject:date:date: message-id:message-id:to:to:cc:cc:mime-version:content-type: content-transfer-encoding:in-reply-to:references:dkim-signature; bh=SASRSpkrtcKtFFyiMHRs0i11BtPvoBcdeEVAkFViJVg=; b=D0fhBZsvkBYmaS955TmZMTzmTivQwI7+2dW3M+Je43Gyo3mDcXtmj3ZjMfouLnGU+gLWwf O0nqqXjm3J91rjb94Cpvp9JlX2YKrSJg6sQ+C6Xu6UjrCnQXXdZlpTT+P4coViYN2gUfq1 KuOD2XQUqdNuDf0KwlYuf7vEHcvdPYg= ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1716519011; a=rsa-sha256; cv=none; b=TPQbTDEprqZsj+aIOX9GnRr5J9wlzCXnGYOehoKZ0zxF+FKWVji/wFlzO4fMflECpSa7jG SgXlhCjGgYbEHwK4wedYQCP7B2JBAKLXMwOayZmvQwv+dkW2jQktwtXecSWZ7ZpGeF10z1 tLhcGVHybzCZs+0o1u43rEAr3a8hD3k= ARC-Authentication-Results: i=1; imf22.hostedemail.com; dkim=pass header.d=gmail.com header.s=20230601 header.b=Uxoxz7vg; dmarc=pass (policy=none) header.from=gmail.com; spf=pass (imf22.hostedemail.com: domain of rgbi3307@gmail.com designates 209.85.160.44 as permitted sender) smtp.mailfrom=rgbi3307@gmail.com Received: by mail-oa1-f44.google.com with SMTP id 586e51a60fabf-2454154e53aso3737749fac.3 for ; Thu, 23 May 2024 19:50:10 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1716519010; x=1717123810; darn=kvack.org; h=message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=SASRSpkrtcKtFFyiMHRs0i11BtPvoBcdeEVAkFViJVg=; b=Uxoxz7vgkNprRScgFEsH19kDLRUREsgocuPkFwA3pTZfVOhVWzwb88JfbnVC4Z5X1n XqStlHyZOvGP4hy/RqdWhWXe/mygAoGDKK1HVt75thfmZ3VSXId/biprJ4froBvQYMQN XGAshIcjsF4d7+aiucLfGxCjy6kpLxOaPvnaDHJPw9KwfWgP8Ls3qHEjlW2Y/2+cRz82 BUHhXnFsB0LjcJlE3O7mpd/aXcelauqA8fnIJTpiDp+GMIzx861ndb16X+U0cbdKEJfK UaaqggdqBWOTguXTuJKVOU1c+pLIq+7Hq5RNmjElMS1lAdtyWwTvZgQz/6n5xH00B0sn 86EA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1716519010; x=1717123810; h=message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=SASRSpkrtcKtFFyiMHRs0i11BtPvoBcdeEVAkFViJVg=; b=Ozb4Wy6LzT2glKjDTokWIJiy06M9eKaWZr6WuLTYFayOO5XVilae49KaNiz5dogkKT YUYi6kb1SLxVQ1sIIBDFZn/EDBdYZkVAzLiwOno8Jcse1yG9cjul0c05cHUlpgrgan8a 5WHDvBt2azqyOYxLlkmQSY8Rnplhpuujj6VB65rInxDZGIN0/yRM3EALF3OMW0wbTMp+ nSAnXuY97ZHPGB+EQv5Szk/R9pXBqpBUDwlHol5BtfjH1slAa0cYrz4YV5PsOt3JxW0K IvMdD12fkEM8ICeaOq9Mn7PEw8ZpoZPIo+rn1O17WYsXKbXrF9hHWh1WgbKo83m4N91k QZ4A== X-Forwarded-Encrypted: i=1; AJvYcCV9XPxmm3Ez9zX6DLQCboJfsCaWjHyGUwoiPw/ngfhgmarrDYMp4cNAcVepGPFasuT3dJKhcsAJ1zZfzdQQuItkK2Q= X-Gm-Message-State: AOJu0Yzi2P7TJgAJZ3DadrMsH+Gmop8ZUr60kbn2GYz0xAthNBIkdmqz wNGVhzk4ysWwkqfEYUUBvdWZiabesvrCobyqZ58XbixpZtTPiOBg X-Google-Smtp-Source: AGHT+IHjIaQY5M4+FeKKHj21CXeWPLfDUdZEOx3f9Iqn0FFDfQycAqmJHbytyZu+YhfBpAIMmy4WrQ== X-Received: by 2002:a05:6870:2320:b0:23d:79c3:5629 with SMTP id 586e51a60fabf-24ca12f4b25mr1126716fac.28.1716519009762; Thu, 23 May 2024 19:50:09 -0700 (PDT) Received: from localhost.localdomain ([180.69.210.41]) by smtp.googlemail.com with ESMTPSA id d2e1a72fcca58-6f8fc36c608sm287453b3a.92.2024.05.23.19.50.06 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 23 May 2024 19:50:09 -0700 (PDT) From: Jung-JaeJoon X-Google-Original-From: Jung-JaeJoon To: "Liam R. Howlett" , Matthew Wilcox , Andrew Morton , Peng Zhang Cc: Jung-JaeJoon , maple-tree@lists.infradead.org, linux-mm@kvack.org, linux-fsdevel@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [PATCH] Modified XArray entry bit flags as macro constants Date: Fri, 24 May 2024 11:49:45 +0900 Message-Id: <20240524024945.9309-1-rgbi3307@naver.com> X-Mailer: git-send-email 2.17.1 X-Stat-Signature: aokhj6nsxckky8oh1ngexxjr49t7cccd X-Rspamd-Queue-Id: 29262C0008 X-Rspam-User: X-Rspamd-Server: rspam01 X-HE-Tag: 1716519010-387369 X-HE-Meta: U2FsdGVkX1+P8l7W6BBmnYUMZX7eNzlZYcXTzUbw8stY4xdimJnWOHaUpSKK5PsZO7QzbeVNioY1YNYBJ9VhbsdpuX2JctsLG282I0SyJMOBiCwbhsWfRV6D5JG7ho9LEjUCYg5HD4BxGjS65dAW7O2chlBk4zldri1OblLasyNPhkazhARUuh86Ja9dWPqQEmhkSGEL6BMmofDoGYORCLrkWn2kJbAeWTCXqEiAzS2If14nWz3JGFuMDukw1AVMM+deeU7YaTO0sXVcKDg+Zp0Nky7f/N09jcJLm6Nv/VbfR0PVMcxRwgpQQ8HRl9CJ5EtdtDe2rSVC+Kb2Fm9x2q5vGZJtW1nyRN+v8UzMlBAD3n2TWgSsZXDh9ht2PB3a3zZMbxztpjux+3cl5tZyfr5fPruYvrAyvDkABjvPXyxI+2OrvCmjB7a1/7OJfCzr/pk30yOJ+l7ULPmrsjvLQ0xBAnhagFwLYACOwcyncJzY7EGIR1ZvTLKZgcutm0aMKwmIvzofG8afFNjLuQsjuHagI4aqw9LzQt/Q8lMTzKK4NKL+76KtcfSPRHbzu83vP1Hep5VDFQrQKGSzxYLa7pp9B8tdyq8r7mNW7MacNMqvgJlo4ijEv6sl4HxZwKpH8nrychK0DdCCKJGi6lqhMD2rTTkUA31Qe4zn+buJCK/36Wa7pMaoAFbZz70jnC2rgi5Cd9eMSESIa7AnaX9MlL9OFXjfp8qI+nXZKp+HsZP3Efx+yIkXApl3TMgzIbGqJyZC7X47zPuWhuqcLftF/22nZ+TSGAm0dhLm48Eddd8JuSdS7HZcPHFrd/LzhbdupJ8IVcRpXNQFa76oOXXY0OoF1OizhHWe39Xfv+xQHd7vF5t97HgfFJtT+aXld/Hs1DnPlGStTU7LRWe9dfHdZ9fei3y7krFrVEMBk7y8D+uf5huMW+eq077wgGgO2GHOqMbeRuWeVIh3bZYgoUM 1kk9BifS oIE3VFKqLeqB+D9NfqSpdgN2VC4fKDgCf/FftcJ5zngJh1cm5YhK5CXTQ1tDMam+5Vv46/5P0qRxU71xXiTtfRLpz6sXdGGSDv2WeSXsUySO7MTIQ59PQHY2iOMvgHiuQgPIUF/FqtppZ9HVL9hmAyWQbfr9Jy9MdefbBP1ZzcZxjeINW1ZS5l6/NAWDpeU+zoH7JTwPTfrFQZvycsSqPW6fWniYm8uC69F+zu/frGSvV7wcbatxbnt9U++AgcnulljX9ZdAj4JXHuh338tyVnNblCrGCQGgmF7XxWeyQBsPTyGPlmtIlY1dJZATBkSttIASlTMqEoFJPupWv+2NzXf3WWyGpdTznddcXLXiNrmECzQI= X-Bogosity: Ham, tests=bogofilter, spamicity=0.000045, version=1.2.4 Sender: owner-linux-mm@kvack.org Precedence: bulk X-Loop: owner-majordomo@kvack.org List-ID: List-Subscribe: List-Unsubscribe: From: Jung-JaeJoon It would be better to modify the operation on the last two bits of the entry with a macro constant name rather than using a numeric constant. #define XA_VALUE_ENTRY 1UL #define XA_INTERNAL_ENTRY 2UL #define XA_POINTER_ENTRY 3UL In particular, in the xa_to_node() function, it is more consistent and efficient to perform a logical AND operation as shown below than a subtraction operation. - return (struct xa_node *)((unsigned long)entry - 2); + return (struct xa_node *)((unsigned long)entry & ~XA_INTERNAL_ENTRY); Additionally, it is better to modify the if condition below in the mas_store_root() function of lib/maple_tree.c to the xa_is_internal() inline function. - else if (((unsigned long) (entry) & 3) == 2) + else if (xa_is_internal(entry)) And there is no reason to declare XA_CHECK_SCHED as an enum data type. -enum { - XA_CHECK_SCHED = 4096, -}; +#define XA_CHECK_SCHED 4096 Signed-off-by: JaeJoon Jung --- include/linux/xarray.h | 55 ++++++++++++++++++++++-------------------- lib/maple_tree.c | 2 +- 2 files changed, 30 insertions(+), 27 deletions(-) diff --git a/include/linux/xarray.h b/include/linux/xarray.h index cb571dfcf4b1..d73dfe35a005 100644 --- a/include/linux/xarray.h +++ b/include/linux/xarray.h @@ -42,6 +42,16 @@ * returned by the normal API. */ +#define XA_VALUE_ENTRY 1UL +#define XA_INTERNAL_ENTRY 2UL +#define XA_POINTER_ENTRY 3UL + +/* + * If iterating while holding a lock, drop the lock and reschedule + * every %XA_CHECK_SCHED loops. + */ +#define XA_CHECK_SCHED 4096 + #define BITS_PER_XA_VALUE (BITS_PER_LONG - 1) /** @@ -54,7 +64,7 @@ static inline void *xa_mk_value(unsigned long v) { WARN_ON((long)v < 0); - return (void *)((v << 1) | 1); + return (void *)((v << XA_VALUE_ENTRY) | XA_VALUE_ENTRY); } /** @@ -66,7 +76,7 @@ static inline void *xa_mk_value(unsigned long v) */ static inline unsigned long xa_to_value(const void *entry) { - return (unsigned long)entry >> 1; + return (unsigned long)entry >> XA_VALUE_ENTRY; } /** @@ -78,7 +88,7 @@ static inline unsigned long xa_to_value(const void *entry) */ static inline bool xa_is_value(const void *entry) { - return (unsigned long)entry & 1; + return (unsigned long)entry & XA_VALUE_ENTRY; } /** @@ -111,7 +121,7 @@ static inline void *xa_tag_pointer(void *p, unsigned long tag) */ static inline void *xa_untag_pointer(void *entry) { - return (void *)((unsigned long)entry & ~3UL); + return (void *)((unsigned long)entry & ~XA_POINTER_ENTRY); } /** @@ -126,7 +136,7 @@ static inline void *xa_untag_pointer(void *entry) */ static inline unsigned int xa_pointer_tag(void *entry) { - return (unsigned long)entry & 3UL; + return (unsigned long)entry & XA_POINTER_ENTRY; } /* @@ -144,7 +154,7 @@ static inline unsigned int xa_pointer_tag(void *entry) */ static inline void *xa_mk_internal(unsigned long v) { - return (void *)((v << 2) | 2); + return (void *)((v << XA_INTERNAL_ENTRY) | XA_INTERNAL_ENTRY); } /* @@ -156,7 +166,7 @@ static inline void *xa_mk_internal(unsigned long v) */ static inline unsigned long xa_to_internal(const void *entry) { - return (unsigned long)entry >> 2; + return (unsigned long)entry >> XA_INTERNAL_ENTRY; } /* @@ -168,7 +178,7 @@ static inline unsigned long xa_to_internal(const void *entry) */ static inline bool xa_is_internal(const void *entry) { - return ((unsigned long)entry & 3) == 2; + return ((unsigned long)entry & XA_POINTER_ENTRY) == XA_INTERNAL_ENTRY; } #define XA_ZERO_ENTRY xa_mk_internal(257) @@ -220,7 +230,7 @@ static inline int xa_err(void *entry) { /* xa_to_internal() would not do sign extension. */ if (xa_is_err(entry)) - return (long)entry >> 2; + return (long)entry >> XA_INTERNAL_ENTRY; return 0; } @@ -1245,19 +1255,19 @@ static inline struct xa_node *xa_parent_locked(const struct xarray *xa, /* Private */ static inline void *xa_mk_node(const struct xa_node *node) { - return (void *)((unsigned long)node | 2); + return (void *)((unsigned long)node | XA_INTERNAL_ENTRY); } /* Private */ static inline struct xa_node *xa_to_node(const void *entry) { - return (struct xa_node *)((unsigned long)entry - 2); + return (struct xa_node *)((unsigned long)entry & ~XA_INTERNAL_ENTRY); } /* Private */ static inline bool xa_is_node(const void *entry) { - return xa_is_internal(entry) && (unsigned long)entry > 4096; + return xa_is_internal(entry) && (unsigned long)entry > XA_CHECK_SCHED; } /* Private */ @@ -1358,9 +1368,10 @@ struct xa_state { * We encode errnos in the xas->xa_node. If an error has happened, we need to * drop the lock to fix it, and once we've done so the xa_state is invalid. */ -#define XA_ERROR(errno) ((struct xa_node *)(((unsigned long)errno << 2) | 2UL)) -#define XAS_BOUNDS ((struct xa_node *)1UL) -#define XAS_RESTART ((struct xa_node *)3UL) +#define XA_ERROR(errno) ((struct xa_node *) \ + (((unsigned long)errno << XA_INTERNAL_ENTRY) | XA_INTERNAL_ENTRY)) +#define XAS_BOUNDS ((struct xa_node *)XA_VALUE_ENTRY) +#define XAS_RESTART ((struct xa_node *)XA_POINTER_ENTRY) #define __XA_STATE(array, index, shift, sibs) { \ .xa = array, \ @@ -1449,7 +1460,7 @@ static inline void xas_set_err(struct xa_state *xas, long err) */ static inline bool xas_invalid(const struct xa_state *xas) { - return (unsigned long)xas->xa_node & 3; + return (unsigned long)xas->xa_node & XA_POINTER_ENTRY; } /** @@ -1477,13 +1488,13 @@ static inline bool xas_is_node(const struct xa_state *xas) /* True if the pointer is something other than a node */ static inline bool xas_not_node(struct xa_node *node) { - return ((unsigned long)node & 3) || !node; + return ((unsigned long)node & XA_POINTER_ENTRY) || !node; } /* True if the node represents RESTART or an error */ static inline bool xas_frozen(struct xa_node *node) { - return (unsigned long)node & 2; + return (unsigned long)node & XA_INTERNAL_ENTRY; } /* True if the node represents head-of-tree, RESTART or BOUNDS */ @@ -1764,14 +1775,6 @@ static inline void *xas_next_marked(struct xa_state *xas, unsigned long max, return entry; } -/* - * If iterating while holding a lock, drop the lock and reschedule - * every %XA_CHECK_SCHED loops. - */ -enum { - XA_CHECK_SCHED = 4096, -}; - /** * xas_for_each() - Iterate over a range of an XArray. * @xas: XArray operation state. diff --git a/lib/maple_tree.c b/lib/maple_tree.c index 2d7d27e6ae3c..c08545f8b09b 100644 --- a/lib/maple_tree.c +++ b/lib/maple_tree.c @@ -3515,7 +3515,7 @@ static inline void mas_store_root(struct ma_state *mas, void *entry) { if (likely((mas->last != 0) || (mas->index != 0))) mas_root_expand(mas, entry); - else if (((unsigned long) (entry) & 3) == 2) + else if (xa_is_internal(entry)) mas_root_expand(mas, entry); else { rcu_assign_pointer(mas->tree->ma_root, entry);