lkml.org 
[lkml]   [2022]   [Nov]   [22]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 23/30] cpumask: Implement cpumask_{first,next}_{not,}andnot
    Date
    Allow finding the first or next bit within two input cpumasks which is
    either:

    - both zero and zero,
    - respectively one and zero.

    Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
    ---
    include/linux/cpumask.h | 60 +++++++++++++++++++++++++++++++++++++++++
    1 file changed, 60 insertions(+)

    diff --git a/include/linux/cpumask.h b/include/linux/cpumask.h
    index c2aa0aa26b45..271bccc0a6d7 100644
    --- a/include/linux/cpumask.h
    +++ b/include/linux/cpumask.h
    @@ -153,6 +153,32 @@ unsigned int cpumask_first_and(const struct cpumask *srcp1, const struct cpumask
    return find_first_and_bit(cpumask_bits(srcp1), cpumask_bits(srcp2), nr_cpumask_bits);
    }

    +/**
    + * cpumask_first_andnot - return the first cpu from *srcp1 & ~*srcp2
    + * @src1p: the first input
    + * @src2p: the second input
    + *
    + * Returns >= nr_cpu_ids if no cpus match in both.
    + */
    +static inline
    +unsigned int cpumask_first_andnot(const struct cpumask *srcp1, const struct cpumask *srcp2)
    +{
    + return find_first_andnot_bit(cpumask_bits(srcp1), cpumask_bits(srcp2), nr_cpumask_bits);
    +}
    +
    +/**
    + * cpumask_first_notandnot - return the first cpu from ~*srcp1 & ~*srcp2
    + * @src1p: the first input
    + * @src2p: the second input
    + *
    + * Returns >= nr_cpu_ids if no cpus match in both.
    + */
    +static inline
    +unsigned int cpumask_first_notandnot(const struct cpumask *srcp1, const struct cpumask *srcp2)
    +{
    + return find_first_notandnot_bit(cpumask_bits(srcp1), cpumask_bits(srcp2), nr_cpumask_bits);
    +}
    +
    /**
    * cpumask_last - get the last CPU in a cpumask
    * @srcp: - the cpumask pointer
    @@ -195,6 +221,40 @@ static inline unsigned int cpumask_next_zero(int n, const struct cpumask *srcp)
    return find_next_zero_bit(cpumask_bits(srcp), nr_cpumask_bits, n+1);
    }

    +/**
    + * cpumask_next_andnot - return the next cpu from *srcp1 & ~*srcp2
    + * @n: the cpu prior to the place to search (ie. return will be > @n)
    + * @src1p: the first input
    + * @src2p: the second input
    + *
    + * Returns >= nr_cpu_ids if no cpus match in both.
    + */
    +static inline
    +unsigned int cpumask_next_andnot(int n, const struct cpumask *srcp1, const struct cpumask *srcp2)
    +{
    + /* -1 is a legal arg here. */
    + if (n != -1)
    + cpumask_check(n);
    + return find_next_andnot_bit(cpumask_bits(srcp1), cpumask_bits(srcp2), nr_cpumask_bits, n+1);
    +}
    +
    +/**
    + * cpumask_next_notandnot - return the next cpu from ~*srcp1 & ~*srcp2
    + * @n: the cpu prior to the place to search (ie. return will be > @n)
    + * @src1p: the first input
    + * @src2p: the second input
    + *
    + * Returns >= nr_cpu_ids if no cpus match in both.
    + */
    +static inline
    +unsigned int cpumask_next_notandnot(int n, const struct cpumask *srcp1, const struct cpumask *srcp2)
    +{
    + /* -1 is a legal arg here. */
    + if (n != -1)
    + cpumask_check(n);
    + return find_next_notandnot_bit(cpumask_bits(srcp1), cpumask_bits(srcp2), nr_cpumask_bits, n+1);
    +}
    +
    #if NR_CPUS == 1
    /* Uniprocessor: there is only one valid CPU */
    static inline unsigned int cpumask_local_spread(unsigned int i, int node)
    --
    2.25.1
    \
     
     \ /
      Last update: 2022-11-22 21:44    [W:4.770 / U:0.016 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site