From: Yury Norov <yury.norov@gmail.com>
To: Dawei Li <dawei.li@shingroup.cn>
Cc: tglx@linutronix.de, rafael@kernel.org, akpm@linux-foundation.org,
maz@kernel.org, florian.fainelli@broadcom.com,
chenhuacai@kernel.org, jiaxun.yang@flygoat.com,
anup@brainfault.org, palmer@dabbelt.com,
samuel.holland@sifive.com, linux@rasmusvillemoes.dk,
daniel.lezcano@linaro.org, linux-kernel@vger.kernel.org
Subject: Re: [PATCH v2 1/7] cpumask: introduce cpumask_first_and_and()
Date: Tue, 16 Apr 2024 10:49:46 -0700 [thread overview]
Message-ID: <Zh66OpVlYL2p0Jbn@yury-ThinkPad> (raw)
In-Reply-To: <Zh65Uf3oWPS1/kyC@yury-ThinkPad>
On Tue, Apr 16, 2024 at 10:45:54AM -0700, Yury Norov wrote:
> On Tue, Apr 16, 2024 at 04:54:48PM +0800, Dawei Li wrote:
> > Introduce cpumask_first_and_and() to get intersection between 3 cpumasks,
> > free of any intermediate cpumask variable. Instead, cpumask_first_and_and()
> > works in-place with all inputs and produce desired output directly.
Still there: s/produce/produces
But whatever. Also, I think this patch would better go with the rest
of the series, right?
> >
> > Signed-off-by: Dawei Li <dawei.li@shingroup.cn>
>
> Acked-by: Yury Norov <yury.norov@gmail.com>
>
> > ---
> > include/linux/cpumask.h | 17 +++++++++++++++++
> > include/linux/find.h | 27 +++++++++++++++++++++++++++
> > lib/find_bit.c | 12 ++++++++++++
> > 3 files changed, 56 insertions(+)
> >
> > diff --git a/include/linux/cpumask.h b/include/linux/cpumask.h
> > index 1c29947db848..c46f9e9e1d66 100644
> > --- a/include/linux/cpumask.h
> > +++ b/include/linux/cpumask.h
> > @@ -187,6 +187,23 @@ unsigned int cpumask_first_and(const struct cpumask *srcp1, const struct cpumask
> > return find_first_and_bit(cpumask_bits(srcp1), cpumask_bits(srcp2), small_cpumask_bits);
> > }
> >
> > +/**
> > + * cpumask_first_and_and - return the first cpu from *srcp1 & *srcp2 & *srcp3
> > + * @srcp1: the first input
> > + * @srcp2: the second input
> > + * @srcp3: the third input
> > + *
> > + * Return: >= nr_cpu_ids if no cpus set in all.
> > + */
> > +static inline
> > +unsigned int cpumask_first_and_and(const struct cpumask *srcp1,
> > + const struct cpumask *srcp2,
> > + const struct cpumask *srcp3)
> > +{
> > + return find_first_and_and_bit(cpumask_bits(srcp1), cpumask_bits(srcp2),
> > + cpumask_bits(srcp3), small_cpumask_bits);
> > +}
> > +
> > /**
> > * cpumask_last - get the last CPU in a cpumask
> > * @srcp: - the cpumask pointer
> > diff --git a/include/linux/find.h b/include/linux/find.h
> > index c69598e383c1..28ec5a03393a 100644
> > --- a/include/linux/find.h
> > +++ b/include/linux/find.h
> > @@ -29,6 +29,8 @@ unsigned long __find_nth_and_andnot_bit(const unsigned long *addr1, const unsign
> > unsigned long n);
> > extern unsigned long _find_first_and_bit(const unsigned long *addr1,
> > const unsigned long *addr2, unsigned long size);
> > +unsigned long _find_first_and_and_bit(const unsigned long *addr1, const unsigned long *addr2,
> > + const unsigned long *addr3, unsigned long size);
> > extern unsigned long _find_first_zero_bit(const unsigned long *addr, unsigned long size);
> > extern unsigned long _find_last_bit(const unsigned long *addr, unsigned long size);
> >
> > @@ -345,6 +347,31 @@ unsigned long find_first_and_bit(const unsigned long *addr1,
> > }
> > #endif
> >
> > +/**
> > + * find_first_and_and_bit - find the first set bit in 3 memory regions
> > + * @addr1: The first address to base the search on
> > + * @addr2: The second address to base the search on
> > + * @addr3: The third address to base the search on
> > + * @size: The bitmap size in bits
> > + *
> > + * Returns the bit number for the first set bit
> > + * If no bits are set, returns @size.
> > + */
> > +static inline
> > +unsigned long find_first_and_and_bit(const unsigned long *addr1,
> > + const unsigned long *addr2,
> > + const unsigned long *addr3,
> > + unsigned long size)
> > +{
> > + if (small_const_nbits(size)) {
> > + unsigned long val = *addr1 & *addr2 & *addr3 & GENMASK(size - 1, 0);
> > +
> > + return val ? __ffs(val) : size;
> > + }
> > +
> > + return _find_first_and_and_bit(addr1, addr2, addr3, size);
> > +}
> > +
> > #ifndef find_first_zero_bit
> > /**
> > * find_first_zero_bit - find the first cleared bit in a memory region
> > diff --git a/lib/find_bit.c b/lib/find_bit.c
> > index 32f99e9a670e..dacadd904250 100644
> > --- a/lib/find_bit.c
> > +++ b/lib/find_bit.c
> > @@ -116,6 +116,18 @@ unsigned long _find_first_and_bit(const unsigned long *addr1,
> > EXPORT_SYMBOL(_find_first_and_bit);
> > #endif
> >
> > +/*
> > + * Find the first set bit in three memory regions.
> > + */
> > +unsigned long _find_first_and_and_bit(const unsigned long *addr1,
> > + const unsigned long *addr2,
> > + const unsigned long *addr3,
> > + unsigned long size)
> > +{
> > + return FIND_FIRST_BIT(addr1[idx] & addr2[idx] & addr3[idx], /* nop */, size);
> > +}
> > +EXPORT_SYMBOL(_find_first_and_and_bit);
> > +
> > #ifndef find_first_zero_bit
> > /*
> > * Find the first cleared bit in a memory region.
> > --
> > 2.27.0
next prev parent reply other threads:[~2024-04-16 17:49 UTC|newest]
Thread overview: 22+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-04-16 8:54 [PATCH v2 0/7] Remove on-stack cpumask var for irq subsystem Dawei Li
2024-04-16 8:54 ` [PATCH v2 1/7] cpumask: introduce cpumask_first_and_and() Dawei Li
2024-04-16 17:45 ` Yury Norov
2024-04-16 17:49 ` Yury Norov [this message]
2024-04-17 1:35 ` Dawei Li
2024-04-24 20:04 ` [tip: irq/core] cpumask: Introduce cpumask_first_and_and() tip-bot2 for Dawei Li
2024-04-16 8:54 ` [PATCH v2 2/7] irqchip/irq-bcm6345-l1: Avoid explicit cpumask allocation on stack Dawei Li
2024-04-24 20:04 ` [tip: irq/core] " tip-bot2 for Dawei Li
2024-04-16 8:54 ` [PATCH v2 3/7] irqchip/gic-v3-its: " Dawei Li
2024-04-17 10:56 ` Marc Zyngier
2024-04-24 20:04 ` [tip: irq/core] " tip-bot2 for Dawei Li
2024-04-16 8:54 ` [PATCH v2 4/7] irqchip/loongson-eiointc: " Dawei Li
2024-04-16 18:01 ` Yury Norov
2024-04-24 20:04 ` [tip: irq/core] " tip-bot2 for Dawei Li
2024-04-16 8:54 ` [PATCH v2 5/7] irqchip/riscv-aplic-direct: " Dawei Li
2024-04-17 11:22 ` Anup Patel
2024-04-24 20:04 ` [tip: irq/core] " tip-bot2 for Dawei Li
2024-04-16 8:54 ` [PATCH v2 6/7] irqchip/sifive-plic: " Dawei Li
2024-04-17 11:21 ` Anup Patel
2024-04-24 20:04 ` [tip: irq/core] " tip-bot2 for Dawei Li
2024-04-16 8:54 ` [PATCH v2 7/7] cpuidle: " Dawei Li
2024-04-24 20:04 ` [tip: irq/core] " tip-bot2 for Dawei Li
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=Zh66OpVlYL2p0Jbn@yury-ThinkPad \
--to=yury.norov@gmail.com \
--cc=akpm@linux-foundation.org \
--cc=anup@brainfault.org \
--cc=chenhuacai@kernel.org \
--cc=daniel.lezcano@linaro.org \
--cc=dawei.li@shingroup.cn \
--cc=florian.fainelli@broadcom.com \
--cc=jiaxun.yang@flygoat.com \
--cc=linux-kernel@vger.kernel.org \
--cc=linux@rasmusvillemoes.dk \
--cc=maz@kernel.org \
--cc=palmer@dabbelt.com \
--cc=rafael@kernel.org \
--cc=samuel.holland@sifive.com \
--cc=tglx@linutronix.de \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.