All of lore.kernel.org
 help / color / mirror / Atom feed
From: Yury Norov <yury.norov@gmail.com>
To: Shrikanth Hegde <sshegde@linux.ibm.com>
Cc: linux-kernel@vger.kernel.org, mingo@kernel.org,
	peterz@infradead.org, juri.lelli@redhat.com,
	vincent.guittot@linaro.org, yury.norov@gmail.com,
	kprateek.nayak@amd.com, iii@linux.ibm.com, corbet@lwn.net,
	meted@linux.ibm.com, tglx@kernel.org, gregkh@linuxfoundation.org,
	pbonzini@redhat.com, seanjc@google.com, vschneid@redhat.com,
	huschle@linux.ibm.com, rostedt@goodmis.org,
	dietmar.eggemann@arm.com, maddy@linux.ibm.com,
	srikar@linux.ibm.com, hdanton@sina.com, chleroy@kernel.org,
	vineeth@bitbyteword.org, frederic@kernel.org, arighi@nvidia.com,
	pauld@redhat.com, christian.loehle@arm.com, tj@kernel.org,
	tommaso.cucinotta@gmail.com, maz@kernel.org, rafael@kernel.org,
	rdunlap@infradead.org, kernellwp@gmail.com,
	linux-doc@vger.kernel.org, jgross@suse.com,
	virtualization@lists.linux.dev, sunlightlinux@gmail.com
Subject: Re: [PATCH v13 02/13] cpumask: Introduce cpumask_intersects_and
Date: Wed, 9 Sep 2026 12:03:21 -0400	[thread overview]
Message-ID: <aqGDSeGGIfJvn8uc@yury> (raw)
In-Reply-To: <20260909135617.871006-3-sshegde@linux.ibm.com>

On Wed, Sep 09, 2026 at 07:26:06PM +0530, Shrikanth Hegde wrote:
> Introduce bitmap_intersects_and() to determine whether the intersection
> of three bitmaps is non-empty. Unlike cpumask_first_and_and(), this
> returns immediately when an intersecting word is found and does not
> calculate the first matching bit.
> 
> Add cpumask_intersects_and() as the corresponding cpumask wrapper.
> 
> A subsequent patch uses the helper to determine whether a task
> has a CPU that is present in its affinity mask, the preferred CPU mask,
> and task possible CPU mask.
> 
> Suggested-by: Yury Norov <yury.norov@gmail.com>
> Signed-off-by: Shrikanth Hegde <sshegde@linux.ibm.com>


Reviwed-by: Yury Norov <yury.norov@gmail.com>

> ---
>  include/linux/bitmap.h  | 14 ++++++++++++++
>  include/linux/cpumask.h | 18 ++++++++++++++++++
>  lib/bitmap.c            | 17 +++++++++++++++++
>  3 files changed, 49 insertions(+)
> 
> diff --git a/include/linux/bitmap.h b/include/linux/bitmap.h
> index 7df1573a409c..adafbcf2016b 100644
> --- a/include/linux/bitmap.h
> +++ b/include/linux/bitmap.h
> @@ -52,6 +52,7 @@ struct device;
>   *  bitmap_complement(dst, src, nbits)          *dst = ~(*src)
>   *  bitmap_equal(src1, src2, nbits)             Are *src1 and *src2 equal?
>   *  bitmap_intersects(src1, src2, nbits)        Do *src1 and *src2 overlap?
> + *  bitmap_intersects_and(src1, src2, src3, nbits) Do *src1, *src2 and *src3 overlap?
>   *  bitmap_subset(src1, src2, nbits)            Is *src1 a subset of *src2?
>   *  bitmap_empty(src, nbits)                    Are all bits zero in *src?
>   *  bitmap_full(src, nbits)                     Are all bits set in *src?
> @@ -181,6 +182,9 @@ void __bitmap_replace(unsigned long *dst,
>  		      const unsigned long *mask, unsigned int nbits);
>  bool __bitmap_intersects(const unsigned long *bitmap1,
>  			 const unsigned long *bitmap2, unsigned int nbits);
> +bool __bitmap_intersects_and(const unsigned long *bitmap1,
> +			     const unsigned long *bitmap2,
> +			     const unsigned long *bitmap3, unsigned int nbits);
>  bool __bitmap_subset(const unsigned long *bitmap1,
>  		     const unsigned long *bitmap2, unsigned int nbits);
>  unsigned int __bitmap_weight(const unsigned long *bitmap, unsigned int nbits);
> @@ -445,6 +449,16 @@ bool bitmap_intersects(const unsigned long *src1, const unsigned long *src2, uns
>  		return __bitmap_intersects(src1, src2, nbits);
>  }
>  
> +static __always_inline
> +bool bitmap_intersects_and(const unsigned long *src1, const unsigned long *src2,
> +			   const unsigned long *src3, unsigned int nbits)
> +{
> +	if (small_const_nbits(nbits))
> +		return ((*src1 & *src2 & *src3) & BITMAP_LAST_WORD_MASK(nbits)) != 0;
> +	else
> +		return __bitmap_intersects_and(src1, src2, src3, nbits);
> +}
> +
>  static __always_inline
>  bool bitmap_subset(const unsigned long *src1, const unsigned long *src2, unsigned int nbits)
>  {
> diff --git a/include/linux/cpumask.h b/include/linux/cpumask.h
> index 4c8bb6953107..7c8f16797f94 100644
> --- a/include/linux/cpumask.h
> +++ b/include/linux/cpumask.h
> @@ -824,6 +824,24 @@ bool cpumask_intersects(const struct cpumask *src1p, const struct cpumask *src2p
>  						      small_cpumask_bits);
>  }
>  
> +/**
> + * cpumask_intersects_and - (*src1p & *src2p & *src3p) != 0
> + * @src1p: the first input
> + * @src2p: the second input
> + * @src3p: the third input
> + *
> + * Return: true if AND of the three cpumasks is non-empty,
> + *	   otherwise false
> + */
> +static __always_inline
> +bool cpumask_intersects_and(const struct cpumask *src1p,
> +			    const struct cpumask *src2p,
> +			    const struct cpumask *src3p)
> +{
> +	return bitmap_intersects_and(cpumask_bits(src1p), cpumask_bits(src2p),
> +				 cpumask_bits(src3p), small_cpumask_bits);
> +}
> +
>  /**
>   * cpumask_subset - (*src1p & ~*src2p) == 0
>   * @src1p: the first input
> diff --git a/lib/bitmap.c b/lib/bitmap.c
> index ed685127a107..d1cb8a507c60 100644
> --- a/lib/bitmap.c
> +++ b/lib/bitmap.c
> @@ -308,6 +308,23 @@ bool __bitmap_intersects(const unsigned long *bitmap1,
>  }
>  EXPORT_SYMBOL(__bitmap_intersects);
>  
> +bool __bitmap_intersects_and(const unsigned long *bitmap1,
> +			     const unsigned long *bitmap2,
> +			     const unsigned long *bitmap3, unsigned int bits)
> +{
> +	unsigned int k, lim = bits / BITS_PER_LONG;
> +
> +	for (k = 0; k < lim; ++k)
> +		if (bitmap1[k] & bitmap2[k] & bitmap3[k])
> +			return true;
> +
> +	if (bits % BITS_PER_LONG)
> +		if ((bitmap1[k] & bitmap2[k] & bitmap3[k]) & BITMAP_LAST_WORD_MASK(bits))
> +			return true;
> +	return false;
> +}
> +EXPORT_SYMBOL(__bitmap_intersects_and);
> +
>  bool __bitmap_subset(const unsigned long *bitmap1,
>  		     const unsigned long *bitmap2, unsigned int bits)
>  {
> -- 
> 2.52.0

  parent reply	other threads:[~2026-09-09 16:03 UTC|newest]

Thread overview: 33+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-09-09 13:56 [PATCH v13 00/13] sched, steal_governor: Introduce preferred CPUs and steal-driven vCPU backoff Shrikanth Hegde
2026-09-09 13:56 ` [PATCH v13 01/13] sched/cputime: Add kcpustat_field_total helper Shrikanth Hegde
2026-09-09 14:16   ` sashiko-bot
2026-09-09 13:56 ` [PATCH v13 02/13] cpumask: Introduce cpumask_intersects_and Shrikanth Hegde
2026-09-09 14:02   ` sashiko-bot
2026-09-09 16:03   ` Yury Norov [this message]
2026-09-09 13:56 ` [PATCH v13 03/13] sched/docs: Document cpu_preferred_mask and Preferred CPU concept Shrikanth Hegde
2026-09-09 14:01   ` sashiko-bot
2026-09-09 13:56 ` [PATCH v13 04/13] cpumask: Introduce cpu_preferred_mask Shrikanth Hegde
2026-09-09 14:06   ` sashiko-bot
2026-09-09 13:56 ` [PATCH v13 05/13] sysfs: Add preferred CPU file Shrikanth Hegde
2026-09-09 14:04   ` sashiko-bot
2026-09-09 13:56 ` [PATCH v13 06/13] sched/core: Try to use a preferred CPU in is_cpu_allowed Shrikanth Hegde
2026-09-09 14:18   ` sashiko-bot
2026-09-09 16:49     ` Shrikanth Hegde
2026-09-09 13:56 ` [PATCH v13 07/13] sched/fair: Load balance only among preferred CPUs Shrikanth Hegde
2026-09-09 14:33   ` sashiko-bot
2026-09-09 17:09     ` Shrikanth Hegde
2026-09-09 17:19   ` Yury Norov
2026-09-09 13:56 ` [PATCH v13 08/13] sched/core: Push current task from non preferred CPU Shrikanth Hegde
2026-09-09 14:18   ` sashiko-bot
2026-09-09 13:56 ` [PATCH v13 09/13] sched/debug: Add migration stats due to non preferred CPUs Shrikanth Hegde
2026-09-09 14:07   ` sashiko-bot
2026-09-09 13:56 ` [PATCH v13 10/13] virt: Introduce steal governor driver Shrikanth Hegde
2026-09-09 14:09   ` sashiko-bot
2026-09-09 13:56 ` [PATCH v13 11/13] virt/steal_governor: Add control knobs for handling steal values Shrikanth Hegde
2026-09-09 14:06   ` sashiko-bot
2026-09-09 13:56 ` [PATCH v13 12/13] virt/steal_governor: Implement steal_governor policy loop Shrikanth Hegde
2026-09-09 14:16   ` sashiko-bot
2026-09-09 16:52     ` Shrikanth Hegde
2026-09-09 13:56 ` [PATCH v13 13/13] virt/steal_governor: Enable the driver Shrikanth Hegde
2026-09-09 14:17   ` sashiko-bot
2026-09-09 16:58     ` Shrikanth Hegde

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=aqGDSeGGIfJvn8uc@yury \
    --to=yury.norov@gmail.com \
    --cc=arighi@nvidia.com \
    --cc=chleroy@kernel.org \
    --cc=christian.loehle@arm.com \
    --cc=corbet@lwn.net \
    --cc=dietmar.eggemann@arm.com \
    --cc=frederic@kernel.org \
    --cc=gregkh@linuxfoundation.org \
    --cc=hdanton@sina.com \
    --cc=huschle@linux.ibm.com \
    --cc=iii@linux.ibm.com \
    --cc=jgross@suse.com \
    --cc=juri.lelli@redhat.com \
    --cc=kernellwp@gmail.com \
    --cc=kprateek.nayak@amd.com \
    --cc=linux-doc@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=maddy@linux.ibm.com \
    --cc=maz@kernel.org \
    --cc=meted@linux.ibm.com \
    --cc=mingo@kernel.org \
    --cc=pauld@redhat.com \
    --cc=pbonzini@redhat.com \
    --cc=peterz@infradead.org \
    --cc=rafael@kernel.org \
    --cc=rdunlap@infradead.org \
    --cc=rostedt@goodmis.org \
    --cc=seanjc@google.com \
    --cc=srikar@linux.ibm.com \
    --cc=sshegde@linux.ibm.com \
    --cc=sunlightlinux@gmail.com \
    --cc=tglx@kernel.org \
    --cc=tj@kernel.org \
    --cc=tommaso.cucinotta@gmail.com \
    --cc=vincent.guittot@linaro.org \
    --cc=vineeth@bitbyteword.org \
    --cc=virtualization@lists.linux.dev \
    --cc=vschneid@redhat.com \
    /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.