On Wed, May 29, 2024 at 05:52:00PM +0800, Zhang Yi wrote: > From: Zhang Yi <yi.zhang@xxxxxxxxxx> > > Add a new helper rem_u64() to only get the remainder of unsigned 64bit > divide with 32bit divisor. > > Signed-off-by: Zhang Yi <yi.zhang@xxxxxxxxxx> Modulo hch's comments, Reviewed-by: Darrick J. Wong <djwong@xxxxxxxxxx> --D > --- > include/linux/math64.h | 24 ++++++++++++++++++++++++ > 1 file changed, 24 insertions(+) > > diff --git a/include/linux/math64.h b/include/linux/math64.h > index d34def7f9a8c..618df4862091 100644 > --- a/include/linux/math64.h > +++ b/include/linux/math64.h > @@ -3,6 +3,7 @@ > #define _LINUX_MATH64_H > > #include <linux/types.h> > +#include <linux/log2.h> > #include <linux/math.h> > #include <asm/div64.h> > #include <vdso/math64.h> > @@ -12,6 +13,20 @@ > #define div64_long(x, y) div64_s64((x), (y)) > #define div64_ul(x, y) div64_u64((x), (y)) > > +/** > + * rem_u64 - remainder of unsigned 64bit divide with 32bit divisor > + * @dividend: unsigned 64bit dividend > + * @divisor: unsigned 32bit divisor > + * > + * Return: dividend % divisor > + */ > +static inline u32 rem_u64(u64 dividend, u32 divisor) > +{ > + if (is_power_of_2(divisor)) > + return dividend & (divisor - 1); > + return dividend % divisor; > +} > + > /** > * div_u64_rem - unsigned 64bit divide with 32bit divisor with remainder > * @dividend: unsigned 64bit dividend > @@ -86,6 +101,15 @@ static inline s64 div64_s64(s64 dividend, s64 divisor) > #define div64_long(x, y) div_s64((x), (y)) > #define div64_ul(x, y) div_u64((x), (y)) > > +#ifndef rem_u64 > +static inline u32 rem_u64(u64 dividend, u32 divisor) > +{ > + if (is_power_of_2(divisor)) > + return dividend & (divisor - 1); > + return do_div(dividend, divisor); > +} > +#endif > + > #ifndef div_u64_rem > static inline u64 div_u64_rem(u64 dividend, u32 divisor, u32 *remainder) > { > -- > 2.39.2 > >