mirror of
				https://github.com/torvalds/linux.git
				synced 2025-10-31 16:48:26 +02:00 
			
		
		
		
	bitmap: replace bitmap_{from,to}_u32array
with bitmap_{from,to}_arr32 over the kernel. Additionally to it:
* __check_eq_bitmap() now takes single nbits argument.
* __check_eq_u32_array is not used in new test but may be used in
  future. So I don't remove it here, but annotate as __used.
Tested on arm64 and 32-bit BE mips.
[arnd@arndb.de: perf: arm_dsu_pmu: convert to bitmap_from_arr32]
  Link: http://lkml.kernel.org/r/20180201172508.5739-2-ynorov@caviumnetworks.com
[ynorov@caviumnetworks.com: fix net/core/ethtool.c]
  Link: http://lkml.kernel.org/r/20180205071747.4ekxtsbgxkj5b2fz@yury-thinkpad
Link: http://lkml.kernel.org/r/20171228150019.27953-2-ynorov@caviumnetworks.com
Signed-off-by: Yury Norov <ynorov@caviumnetworks.com>
Signed-off-by: Arnd Bergmann <arnd@arndb.de>
Cc: Ben Hutchings <ben@decadent.org.uk>
Cc: David Decotigny <decot@googlers.com>,
Cc: David S. Miller <davem@davemloft.net>,
Cc: Geert Uytterhoeven <geert@linux-m68k.org>
Cc: Matthew Wilcox <mawilcox@microsoft.com>
Cc: Rasmus Villemoes <linux@rasmusvillemoes.dk>
Cc: Heiner Kallweit <hkallweit1@gmail.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
			
			
This commit is contained in:
		
							parent
							
								
									c724f19361
								
							
						
					
					
						commit
						3aa56885e5
					
				
					 6 changed files with 53 additions and 307 deletions
				
			
		|  | @ -925,9 +925,8 @@ static void __armv8pmu_probe_pmu(void *info) | ||||||
| 	pmceid[0] = read_sysreg(pmceid0_el0); | 	pmceid[0] = read_sysreg(pmceid0_el0); | ||||||
| 	pmceid[1] = read_sysreg(pmceid1_el0); | 	pmceid[1] = read_sysreg(pmceid1_el0); | ||||||
| 
 | 
 | ||||||
| 	bitmap_from_u32array(cpu_pmu->pmceid_bitmap, | 	bitmap_from_arr32(cpu_pmu->pmceid_bitmap, | ||||||
| 			     ARMV8_PMUV3_MAX_COMMON_EVENTS, pmceid, | 			     pmceid, ARMV8_PMUV3_MAX_COMMON_EVENTS); | ||||||
| 			     ARRAY_SIZE(pmceid)); |  | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| static int armv8pmu_probe_pmu(struct arm_pmu *cpu_pmu) | static int armv8pmu_probe_pmu(struct arm_pmu *cpu_pmu) | ||||||
|  |  | ||||||
|  | @ -658,10 +658,8 @@ static void dsu_pmu_probe_pmu(struct dsu_pmu *dsu_pmu) | ||||||
| 		return; | 		return; | ||||||
| 	cpmceid[0] = __dsu_pmu_read_pmceid(0); | 	cpmceid[0] = __dsu_pmu_read_pmceid(0); | ||||||
| 	cpmceid[1] = __dsu_pmu_read_pmceid(1); | 	cpmceid[1] = __dsu_pmu_read_pmceid(1); | ||||||
| 	bitmap_from_u32array(dsu_pmu->cpmceid_bitmap, | 	bitmap_from_arr32(dsu_pmu->cpmceid_bitmap, cpmceid, | ||||||
| 				DSU_PMU_MAX_COMMON_EVENTS, | 			  DSU_PMU_MAX_COMMON_EVENTS); | ||||||
| 				cpmceid, |  | ||||||
| 				ARRAY_SIZE(cpmceid)); |  | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| static void dsu_pmu_set_active_cpu(int cpu, struct dsu_pmu *dsu_pmu) | static void dsu_pmu_set_active_cpu(int cpu, struct dsu_pmu *dsu_pmu) | ||||||
|  |  | ||||||
|  | @ -64,8 +64,6 @@ | ||||||
|  *  bitmap_find_free_region(bitmap, bits, order)  Find and allocate bit region |  *  bitmap_find_free_region(bitmap, bits, order)  Find and allocate bit region | ||||||
|  *  bitmap_release_region(bitmap, pos, order)   Free specified bit region |  *  bitmap_release_region(bitmap, pos, order)   Free specified bit region | ||||||
|  *  bitmap_allocate_region(bitmap, pos, order)  Allocate specified bit region |  *  bitmap_allocate_region(bitmap, pos, order)  Allocate specified bit region | ||||||
|  *  bitmap_from_u32array(dst, nbits, buf, nwords)  *dst = *buf (nwords 32b words) |  | ||||||
|  *  bitmap_to_u32array(buf, nwords, src, nbits) *buf = *dst (nwords 32b words) |  | ||||||
|  *  bitmap_from_arr32(dst, buf, nbits)          Copy nbits from u32[] buf to dst |  *  bitmap_from_arr32(dst, buf, nbits)          Copy nbits from u32[] buf to dst | ||||||
|  *  bitmap_to_arr32(buf, src, nbits)            Copy nbits from buf to u32[] dst |  *  bitmap_to_arr32(buf, src, nbits)            Copy nbits from buf to u32[] dst | ||||||
|  * |  * | ||||||
|  | @ -176,14 +174,7 @@ extern void bitmap_fold(unsigned long *dst, const unsigned long *orig, | ||||||
| extern int bitmap_find_free_region(unsigned long *bitmap, unsigned int bits, int order); | extern int bitmap_find_free_region(unsigned long *bitmap, unsigned int bits, int order); | ||||||
| extern void bitmap_release_region(unsigned long *bitmap, unsigned int pos, int order); | extern void bitmap_release_region(unsigned long *bitmap, unsigned int pos, int order); | ||||||
| extern int bitmap_allocate_region(unsigned long *bitmap, unsigned int pos, int order); | extern int bitmap_allocate_region(unsigned long *bitmap, unsigned int pos, int order); | ||||||
| extern unsigned int bitmap_from_u32array(unsigned long *bitmap, | 
 | ||||||
| 					 unsigned int nbits, |  | ||||||
| 					 const u32 *buf, |  | ||||||
| 					 unsigned int nwords); |  | ||||||
| extern unsigned int bitmap_to_u32array(u32 *buf, |  | ||||||
| 				       unsigned int nwords, |  | ||||||
| 				       const unsigned long *bitmap, |  | ||||||
| 				       unsigned int nbits); |  | ||||||
| #ifdef __BIG_ENDIAN | #ifdef __BIG_ENDIAN | ||||||
| extern void bitmap_copy_le(unsigned long *dst, const unsigned long *src, unsigned int nbits); | extern void bitmap_copy_le(unsigned long *dst, const unsigned long *src, unsigned int nbits); | ||||||
| #else | #else | ||||||
|  |  | ||||||
							
								
								
									
										87
									
								
								lib/bitmap.c
									
									
									
									
									
								
							
							
						
						
									
										87
									
								
								lib/bitmap.c
									
									
									
									
									
								
							|  | @ -1105,93 +1105,6 @@ int bitmap_allocate_region(unsigned long *bitmap, unsigned int pos, int order) | ||||||
| } | } | ||||||
| EXPORT_SYMBOL(bitmap_allocate_region); | EXPORT_SYMBOL(bitmap_allocate_region); | ||||||
| 
 | 
 | ||||||
| /**
 |  | ||||||
|  * bitmap_from_u32array - copy the contents of a u32 array of bits to bitmap |  | ||||||
|  *	@bitmap: array of unsigned longs, the destination bitmap, non NULL |  | ||||||
|  *	@nbits: number of bits in @bitmap |  | ||||||
|  *	@buf: array of u32 (in host byte order), the source bitmap, non NULL |  | ||||||
|  *	@nwords: number of u32 words in @buf |  | ||||||
|  * |  | ||||||
|  * copy min(nbits, 32*nwords) bits from @buf to @bitmap, remaining |  | ||||||
|  * bits between nword and nbits in @bitmap (if any) are cleared. In |  | ||||||
|  * last word of @bitmap, the bits beyond nbits (if any) are kept |  | ||||||
|  * unchanged. |  | ||||||
|  * |  | ||||||
|  * Return the number of bits effectively copied. |  | ||||||
|  */ |  | ||||||
| unsigned int |  | ||||||
| bitmap_from_u32array(unsigned long *bitmap, unsigned int nbits, |  | ||||||
| 		     const u32 *buf, unsigned int nwords) |  | ||||||
| { |  | ||||||
| 	unsigned int dst_idx, src_idx; |  | ||||||
| 
 |  | ||||||
| 	for (src_idx = dst_idx = 0; dst_idx < BITS_TO_LONGS(nbits); ++dst_idx) { |  | ||||||
| 		unsigned long part = 0; |  | ||||||
| 
 |  | ||||||
| 		if (src_idx < nwords) |  | ||||||
| 			part = buf[src_idx++]; |  | ||||||
| 
 |  | ||||||
| #if BITS_PER_LONG == 64 |  | ||||||
| 		if (src_idx < nwords) |  | ||||||
| 			part |= ((unsigned long) buf[src_idx++]) << 32; |  | ||||||
| #endif |  | ||||||
| 
 |  | ||||||
| 		if (dst_idx < nbits/BITS_PER_LONG) |  | ||||||
| 			bitmap[dst_idx] = part; |  | ||||||
| 		else { |  | ||||||
| 			unsigned long mask = BITMAP_LAST_WORD_MASK(nbits); |  | ||||||
| 
 |  | ||||||
| 			bitmap[dst_idx] = (bitmap[dst_idx] & ~mask) |  | ||||||
| 				| (part & mask); |  | ||||||
| 		} |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	return min_t(unsigned int, nbits, 32*nwords); |  | ||||||
| } |  | ||||||
| EXPORT_SYMBOL(bitmap_from_u32array); |  | ||||||
| 
 |  | ||||||
| /**
 |  | ||||||
|  * bitmap_to_u32array - copy the contents of bitmap to a u32 array of bits |  | ||||||
|  *	@buf: array of u32 (in host byte order), the dest bitmap, non NULL |  | ||||||
|  *	@nwords: number of u32 words in @buf |  | ||||||
|  *	@bitmap: array of unsigned longs, the source bitmap, non NULL |  | ||||||
|  *	@nbits: number of bits in @bitmap |  | ||||||
|  * |  | ||||||
|  * copy min(nbits, 32*nwords) bits from @bitmap to @buf. Remaining |  | ||||||
|  * bits after nbits in @buf (if any) are cleared. |  | ||||||
|  * |  | ||||||
|  * Return the number of bits effectively copied. |  | ||||||
|  */ |  | ||||||
| unsigned int |  | ||||||
| bitmap_to_u32array(u32 *buf, unsigned int nwords, |  | ||||||
| 		   const unsigned long *bitmap, unsigned int nbits) |  | ||||||
| { |  | ||||||
| 	unsigned int dst_idx = 0, src_idx = 0; |  | ||||||
| 
 |  | ||||||
| 	while (dst_idx < nwords) { |  | ||||||
| 		unsigned long part = 0; |  | ||||||
| 
 |  | ||||||
| 		if (src_idx < BITS_TO_LONGS(nbits)) { |  | ||||||
| 			part = bitmap[src_idx]; |  | ||||||
| 			if (src_idx >= nbits/BITS_PER_LONG) |  | ||||||
| 				part &= BITMAP_LAST_WORD_MASK(nbits); |  | ||||||
| 			src_idx++; |  | ||||||
| 		} |  | ||||||
| 
 |  | ||||||
| 		buf[dst_idx++] = part & 0xffffffffUL; |  | ||||||
| 
 |  | ||||||
| #if BITS_PER_LONG == 64 |  | ||||||
| 		if (dst_idx < nwords) { |  | ||||||
| 			part >>= 32; |  | ||||||
| 			buf[dst_idx++] = part & 0xffffffffUL; |  | ||||||
| 		} |  | ||||||
| #endif |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	return min_t(unsigned int, nbits, 32*nwords); |  | ||||||
| } |  | ||||||
| EXPORT_SYMBOL(bitmap_to_u32array); |  | ||||||
| 
 |  | ||||||
| /**
 | /**
 | ||||||
|  * bitmap_copy_le - copy a bitmap, putting the bits into little-endian order. |  * bitmap_copy_le - copy a bitmap, putting the bits into little-endian order. | ||||||
|  * @dst:   destination buffer |  * @dst:   destination buffer | ||||||
|  |  | ||||||
|  | @ -23,7 +23,7 @@ __check_eq_uint(const char *srcfile, unsigned int line, | ||||||
| 		const unsigned int exp_uint, unsigned int x) | 		const unsigned int exp_uint, unsigned int x) | ||||||
| { | { | ||||||
| 	if (exp_uint != x) { | 	if (exp_uint != x) { | ||||||
| 		pr_warn("[%s:%u] expected %u, got %u\n", | 		pr_err("[%s:%u] expected %u, got %u\n", | ||||||
| 			srcfile, line, exp_uint, x); | 			srcfile, line, exp_uint, x); | ||||||
| 		return false; | 		return false; | ||||||
| 	} | 	} | ||||||
|  | @ -33,19 +33,13 @@ __check_eq_uint(const char *srcfile, unsigned int line, | ||||||
| 
 | 
 | ||||||
| static bool __init | static bool __init | ||||||
| __check_eq_bitmap(const char *srcfile, unsigned int line, | __check_eq_bitmap(const char *srcfile, unsigned int line, | ||||||
| 		  const unsigned long *exp_bmap, unsigned int exp_nbits, | 		  const unsigned long *exp_bmap, const unsigned long *bmap, | ||||||
| 		  const unsigned long *bmap, unsigned int nbits) | 		  unsigned int nbits) | ||||||
| { | { | ||||||
| 	if (exp_nbits != nbits) { |  | ||||||
| 		pr_warn("[%s:%u] bitmap length mismatch: expected %u, got %u\n", |  | ||||||
| 			srcfile, line, exp_nbits, nbits); |  | ||||||
| 		return false; |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	if (!bitmap_equal(exp_bmap, bmap, nbits)) { | 	if (!bitmap_equal(exp_bmap, bmap, nbits)) { | ||||||
| 		pr_warn("[%s:%u] bitmaps contents differ: expected \"%*pbl\", got \"%*pbl\"\n", | 		pr_warn("[%s:%u] bitmaps contents differ: expected \"%*pbl\", got \"%*pbl\"\n", | ||||||
| 			srcfile, line, | 			srcfile, line, | ||||||
| 			exp_nbits, exp_bmap, nbits, bmap); | 			nbits, exp_bmap, nbits, bmap); | ||||||
| 		return false; | 		return false; | ||||||
| 	} | 	} | ||||||
| 	return true; | 	return true; | ||||||
|  | @ -66,6 +60,10 @@ __check_eq_pbl(const char *srcfile, unsigned int line, | ||||||
| 	return true; | 	return true; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | static bool __init | ||||||
|  | __check_eq_u32_array(const char *srcfile, unsigned int line, | ||||||
|  | 		     const u32 *exp_arr, unsigned int exp_len, | ||||||
|  | 		     const u32 *arr, unsigned int len) __used; | ||||||
| static bool __init | static bool __init | ||||||
| __check_eq_u32_array(const char *srcfile, unsigned int line, | __check_eq_u32_array(const char *srcfile, unsigned int line, | ||||||
| 		     const u32 *exp_arr, unsigned int exp_len, | 		     const u32 *exp_arr, unsigned int exp_len, | ||||||
|  | @ -255,171 +253,29 @@ static void __init test_bitmap_parselist(void) | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| static void __init test_bitmap_u32_array_conversions(void) | static void __init test_bitmap_arr32(void) | ||||||
| { | { | ||||||
| 	DECLARE_BITMAP(bmap1, 1024); | 	unsigned int nbits, next_bit, len = sizeof(exp) * 8; | ||||||
| 	DECLARE_BITMAP(bmap2, 1024); | 	u32 arr[sizeof(exp) / 4]; | ||||||
| 	u32 exp_arr[32], arr[32]; | 	DECLARE_BITMAP(bmap2, len); | ||||||
| 	unsigned nbits; |  | ||||||
| 
 | 
 | ||||||
| 	for (nbits = 0 ; nbits < 257 ; ++nbits) { | 	memset(arr, 0xa5, sizeof(arr)); | ||||||
| 		const unsigned int used_u32s = DIV_ROUND_UP(nbits, 32); |  | ||||||
| 		unsigned int i, rv; |  | ||||||
| 
 | 
 | ||||||
| 		bitmap_zero(bmap1, nbits); | 	for (nbits = 0; nbits < len; ++nbits) { | ||||||
| 		bitmap_set(bmap1, nbits, 1024 - nbits);  /* garbage */ | 		bitmap_to_arr32(arr, exp, nbits); | ||||||
|  | 		bitmap_from_arr32(bmap2, arr, nbits); | ||||||
|  | 		expect_eq_bitmap(bmap2, exp, nbits); | ||||||
| 
 | 
 | ||||||
| 		memset(arr, 0xff, sizeof(arr)); | 		next_bit = find_next_bit(bmap2, | ||||||
| 		rv = bitmap_to_u32array(arr, used_u32s, bmap1, nbits); | 				round_up(nbits, BITS_PER_LONG), nbits); | ||||||
| 		expect_eq_uint(nbits, rv); | 		if (next_bit < round_up(nbits, BITS_PER_LONG)) | ||||||
|  | 			pr_err("bitmap_copy_arr32(nbits == %d:" | ||||||
|  | 				" tail is not safely cleared: %d\n", | ||||||
|  | 				nbits, next_bit); | ||||||
| 
 | 
 | ||||||
| 		memset(exp_arr, 0xff, sizeof(exp_arr)); | 		if (nbits < len - 32) | ||||||
| 		memset(exp_arr, 0, used_u32s*sizeof(*exp_arr)); | 			expect_eq_uint(arr[DIV_ROUND_UP(nbits, 32)], | ||||||
| 		expect_eq_u32_array(exp_arr, 32, arr, 32); | 								0xa5a5a5a5); | ||||||
| 
 |  | ||||||
| 		bitmap_fill(bmap2, 1024); |  | ||||||
| 		rv = bitmap_from_u32array(bmap2, nbits, arr, used_u32s); |  | ||||||
| 		expect_eq_uint(nbits, rv); |  | ||||||
| 		expect_eq_bitmap(bmap1, 1024, bmap2, 1024); |  | ||||||
| 
 |  | ||||||
| 		for (i = 0 ; i < nbits ; ++i) { |  | ||||||
| 			/*
 |  | ||||||
| 			 * test conversion bitmap -> u32[] |  | ||||||
| 			 */ |  | ||||||
| 
 |  | ||||||
| 			bitmap_zero(bmap1, 1024); |  | ||||||
| 			__set_bit(i, bmap1); |  | ||||||
| 			bitmap_set(bmap1, nbits, 1024 - nbits);  /* garbage */ |  | ||||||
| 
 |  | ||||||
| 			memset(arr, 0xff, sizeof(arr)); |  | ||||||
| 			rv = bitmap_to_u32array(arr, used_u32s, bmap1, nbits); |  | ||||||
| 			expect_eq_uint(nbits, rv); |  | ||||||
| 
 |  | ||||||
| 			/* 1st used u32 words contain expected bit set, the
 |  | ||||||
| 			 * remaining words are left unchanged (0xff) |  | ||||||
| 			 */ |  | ||||||
| 			memset(exp_arr, 0xff, sizeof(exp_arr)); |  | ||||||
| 			memset(exp_arr, 0, used_u32s*sizeof(*exp_arr)); |  | ||||||
| 			exp_arr[i/32] = (1U<<(i%32)); |  | ||||||
| 			expect_eq_u32_array(exp_arr, 32, arr, 32); |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| 			/* same, with longer array to fill
 |  | ||||||
| 			 */ |  | ||||||
| 			memset(arr, 0xff, sizeof(arr)); |  | ||||||
| 			rv = bitmap_to_u32array(arr, 32, bmap1, nbits); |  | ||||||
| 			expect_eq_uint(nbits, rv); |  | ||||||
| 
 |  | ||||||
| 			/* 1st used u32 words contain expected bit set, the
 |  | ||||||
| 			 * remaining words are all 0s |  | ||||||
| 			 */ |  | ||||||
| 			memset(exp_arr, 0, sizeof(exp_arr)); |  | ||||||
| 			exp_arr[i/32] = (1U<<(i%32)); |  | ||||||
| 			expect_eq_u32_array(exp_arr, 32, arr, 32); |  | ||||||
| 
 |  | ||||||
| 			/*
 |  | ||||||
| 			 * test conversion u32[] -> bitmap |  | ||||||
| 			 */ |  | ||||||
| 
 |  | ||||||
| 			/* the 1st nbits of bmap2 are identical to
 |  | ||||||
| 			 * bmap1, the remaining bits of bmap2 are left |  | ||||||
| 			 * unchanged (all 1s) |  | ||||||
| 			 */ |  | ||||||
| 			bitmap_fill(bmap2, 1024); |  | ||||||
| 			rv = bitmap_from_u32array(bmap2, nbits, |  | ||||||
| 						  exp_arr, used_u32s); |  | ||||||
| 			expect_eq_uint(nbits, rv); |  | ||||||
| 
 |  | ||||||
| 			expect_eq_bitmap(bmap1, 1024, bmap2, 1024); |  | ||||||
| 
 |  | ||||||
| 			/* same, with more bits to fill
 |  | ||||||
| 			 */ |  | ||||||
| 			memset(arr, 0xff, sizeof(arr));  /* garbage */ |  | ||||||
| 			memset(arr, 0, used_u32s*sizeof(u32)); |  | ||||||
| 			arr[i/32] = (1U<<(i%32)); |  | ||||||
| 
 |  | ||||||
| 			bitmap_fill(bmap2, 1024); |  | ||||||
| 			rv = bitmap_from_u32array(bmap2, 1024, arr, used_u32s); |  | ||||||
| 			expect_eq_uint(used_u32s*32, rv); |  | ||||||
| 
 |  | ||||||
| 			/* the 1st nbits of bmap2 are identical to
 |  | ||||||
| 			 * bmap1, the remaining bits of bmap2 are cleared |  | ||||||
| 			 */ |  | ||||||
| 			bitmap_zero(bmap1, 1024); |  | ||||||
| 			__set_bit(i, bmap1); |  | ||||||
| 			expect_eq_bitmap(bmap1, 1024, bmap2, 1024); |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| 			/*
 |  | ||||||
| 			 * test short conversion bitmap -> u32[] (1 |  | ||||||
| 			 * word too short) |  | ||||||
| 			 */ |  | ||||||
| 			if (used_u32s > 1) { |  | ||||||
| 				bitmap_zero(bmap1, 1024); |  | ||||||
| 				__set_bit(i, bmap1); |  | ||||||
| 				bitmap_set(bmap1, nbits, |  | ||||||
| 					   1024 - nbits);  /* garbage */ |  | ||||||
| 				memset(arr, 0xff, sizeof(arr)); |  | ||||||
| 
 |  | ||||||
| 				rv = bitmap_to_u32array(arr, used_u32s - 1, |  | ||||||
| 							bmap1, nbits); |  | ||||||
| 				expect_eq_uint((used_u32s - 1)*32, rv); |  | ||||||
| 
 |  | ||||||
| 				/* 1st used u32 words contain expected
 |  | ||||||
| 				 * bit set, the remaining words are |  | ||||||
| 				 * left unchanged (0xff) |  | ||||||
| 				 */ |  | ||||||
| 				memset(exp_arr, 0xff, sizeof(exp_arr)); |  | ||||||
| 				memset(exp_arr, 0, |  | ||||||
| 				       (used_u32s-1)*sizeof(*exp_arr)); |  | ||||||
| 				if ((i/32) < (used_u32s - 1)) |  | ||||||
| 					exp_arr[i/32] = (1U<<(i%32)); |  | ||||||
| 				expect_eq_u32_array(exp_arr, 32, arr, 32); |  | ||||||
| 			} |  | ||||||
| 
 |  | ||||||
| 			/*
 |  | ||||||
| 			 * test short conversion u32[] -> bitmap (3 |  | ||||||
| 			 * bits too short) |  | ||||||
| 			 */ |  | ||||||
| 			if (nbits > 3) { |  | ||||||
| 				memset(arr, 0xff, sizeof(arr));  /* garbage */ |  | ||||||
| 				memset(arr, 0, used_u32s*sizeof(*arr)); |  | ||||||
| 				arr[i/32] = (1U<<(i%32)); |  | ||||||
| 
 |  | ||||||
| 				bitmap_zero(bmap1, 1024); |  | ||||||
| 				rv = bitmap_from_u32array(bmap1, nbits - 3, |  | ||||||
| 							  arr, used_u32s); |  | ||||||
| 				expect_eq_uint(nbits - 3, rv); |  | ||||||
| 
 |  | ||||||
| 				/* we are expecting the bit < nbits -
 |  | ||||||
| 				 * 3 (none otherwise), and the rest of |  | ||||||
| 				 * bmap1 unchanged (0-filled) |  | ||||||
| 				 */ |  | ||||||
| 				bitmap_zero(bmap2, 1024); |  | ||||||
| 				if (i < nbits - 3) |  | ||||||
| 					__set_bit(i, bmap2); |  | ||||||
| 				expect_eq_bitmap(bmap2, 1024, bmap1, 1024); |  | ||||||
| 
 |  | ||||||
| 				/* do the same with bmap1 initially
 |  | ||||||
| 				 * 1-filled |  | ||||||
| 				 */ |  | ||||||
| 
 |  | ||||||
| 				bitmap_fill(bmap1, 1024); |  | ||||||
| 				rv = bitmap_from_u32array(bmap1, nbits - 3, |  | ||||||
| 							 arr, used_u32s); |  | ||||||
| 				expect_eq_uint(nbits - 3, rv); |  | ||||||
| 
 |  | ||||||
| 				/* we are expecting the bit < nbits -
 |  | ||||||
| 				 * 3 (none otherwise), and the rest of |  | ||||||
| 				 * bmap1 unchanged (1-filled) |  | ||||||
| 				 */ |  | ||||||
| 				bitmap_zero(bmap2, 1024); |  | ||||||
| 				if (i < nbits - 3) |  | ||||||
| 					__set_bit(i, bmap2); |  | ||||||
| 				bitmap_set(bmap2, nbits-3, 1024 - nbits + 3); |  | ||||||
| 				expect_eq_bitmap(bmap2, 1024, bmap1, 1024); |  | ||||||
| 			} |  | ||||||
| 		} |  | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | @ -454,7 +310,7 @@ static void noinline __init test_mem_optimisations(void) | ||||||
| static int __init test_bitmap_init(void) | static int __init test_bitmap_init(void) | ||||||
| { | { | ||||||
| 	test_zero_fill_copy(); | 	test_zero_fill_copy(); | ||||||
| 	test_bitmap_u32_array_conversions(); | 	test_bitmap_arr32(); | ||||||
| 	test_bitmap_parselist(); | 	test_bitmap_parselist(); | ||||||
| 	test_mem_optimisations(); | 	test_mem_optimisations(); | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -616,18 +616,15 @@ static int load_link_ksettings_from_user(struct ethtool_link_ksettings *to, | ||||||
| 		return -EFAULT; | 		return -EFAULT; | ||||||
| 
 | 
 | ||||||
| 	memcpy(&to->base, &link_usettings.base, sizeof(to->base)); | 	memcpy(&to->base, &link_usettings.base, sizeof(to->base)); | ||||||
| 	bitmap_from_u32array(to->link_modes.supported, | 	bitmap_from_arr32(to->link_modes.supported, | ||||||
| 			     __ETHTOOL_LINK_MODE_MASK_NBITS, | 			  link_usettings.link_modes.supported, | ||||||
| 			     link_usettings.link_modes.supported, | 			  __ETHTOOL_LINK_MODE_MASK_NBITS); | ||||||
| 			     __ETHTOOL_LINK_MODE_MASK_NU32); | 	bitmap_from_arr32(to->link_modes.advertising, | ||||||
| 	bitmap_from_u32array(to->link_modes.advertising, | 			  link_usettings.link_modes.advertising, | ||||||
| 			     __ETHTOOL_LINK_MODE_MASK_NBITS, | 			  __ETHTOOL_LINK_MODE_MASK_NBITS); | ||||||
| 			     link_usettings.link_modes.advertising, | 	bitmap_from_arr32(to->link_modes.lp_advertising, | ||||||
| 			     __ETHTOOL_LINK_MODE_MASK_NU32); | 			  link_usettings.link_modes.lp_advertising, | ||||||
| 	bitmap_from_u32array(to->link_modes.lp_advertising, | 			  __ETHTOOL_LINK_MODE_MASK_NBITS); | ||||||
| 			     __ETHTOOL_LINK_MODE_MASK_NBITS, |  | ||||||
| 			     link_usettings.link_modes.lp_advertising, |  | ||||||
| 			     __ETHTOOL_LINK_MODE_MASK_NU32); |  | ||||||
| 
 | 
 | ||||||
| 	return 0; | 	return 0; | ||||||
| } | } | ||||||
|  | @ -643,18 +640,15 @@ store_link_ksettings_for_user(void __user *to, | ||||||
| 	struct ethtool_link_usettings link_usettings; | 	struct ethtool_link_usettings link_usettings; | ||||||
| 
 | 
 | ||||||
| 	memcpy(&link_usettings.base, &from->base, sizeof(link_usettings)); | 	memcpy(&link_usettings.base, &from->base, sizeof(link_usettings)); | ||||||
| 	bitmap_to_u32array(link_usettings.link_modes.supported, | 	bitmap_to_arr32(link_usettings.link_modes.supported, | ||||||
| 			   __ETHTOOL_LINK_MODE_MASK_NU32, | 			from->link_modes.supported, | ||||||
| 			   from->link_modes.supported, | 			__ETHTOOL_LINK_MODE_MASK_NBITS); | ||||||
| 			   __ETHTOOL_LINK_MODE_MASK_NBITS); | 	bitmap_to_arr32(link_usettings.link_modes.advertising, | ||||||
| 	bitmap_to_u32array(link_usettings.link_modes.advertising, | 			from->link_modes.advertising, | ||||||
| 			   __ETHTOOL_LINK_MODE_MASK_NU32, | 			__ETHTOOL_LINK_MODE_MASK_NBITS); | ||||||
| 			   from->link_modes.advertising, | 	bitmap_to_arr32(link_usettings.link_modes.lp_advertising, | ||||||
| 			   __ETHTOOL_LINK_MODE_MASK_NBITS); | 			from->link_modes.lp_advertising, | ||||||
| 	bitmap_to_u32array(link_usettings.link_modes.lp_advertising, | 			__ETHTOOL_LINK_MODE_MASK_NBITS); | ||||||
| 			   __ETHTOOL_LINK_MODE_MASK_NU32, |  | ||||||
| 			   from->link_modes.lp_advertising, |  | ||||||
| 			   __ETHTOOL_LINK_MODE_MASK_NBITS); |  | ||||||
| 
 | 
 | ||||||
| 	if (copy_to_user(to, &link_usettings, sizeof(link_usettings))) | 	if (copy_to_user(to, &link_usettings, sizeof(link_usettings))) | ||||||
| 		return -EFAULT; | 		return -EFAULT; | ||||||
|  | @ -2358,10 +2352,8 @@ static int ethtool_get_per_queue_coalesce(struct net_device *dev, | ||||||
| 
 | 
 | ||||||
| 	useraddr += sizeof(*per_queue_opt); | 	useraddr += sizeof(*per_queue_opt); | ||||||
| 
 | 
 | ||||||
| 	bitmap_from_u32array(queue_mask, | 	bitmap_from_arr32(queue_mask, per_queue_opt->queue_mask, | ||||||
| 			     MAX_NUM_QUEUE, | 			  MAX_NUM_QUEUE); | ||||||
| 			     per_queue_opt->queue_mask, |  | ||||||
| 			     DIV_ROUND_UP(MAX_NUM_QUEUE, 32)); |  | ||||||
| 
 | 
 | ||||||
| 	for_each_set_bit(bit, queue_mask, MAX_NUM_QUEUE) { | 	for_each_set_bit(bit, queue_mask, MAX_NUM_QUEUE) { | ||||||
| 		struct ethtool_coalesce coalesce = { .cmd = ETHTOOL_GCOALESCE }; | 		struct ethtool_coalesce coalesce = { .cmd = ETHTOOL_GCOALESCE }; | ||||||
|  | @ -2393,10 +2385,7 @@ static int ethtool_set_per_queue_coalesce(struct net_device *dev, | ||||||
| 
 | 
 | ||||||
| 	useraddr += sizeof(*per_queue_opt); | 	useraddr += sizeof(*per_queue_opt); | ||||||
| 
 | 
 | ||||||
| 	bitmap_from_u32array(queue_mask, | 	bitmap_from_arr32(queue_mask, per_queue_opt->queue_mask, MAX_NUM_QUEUE); | ||||||
| 			     MAX_NUM_QUEUE, |  | ||||||
| 			     per_queue_opt->queue_mask, |  | ||||||
| 			     DIV_ROUND_UP(MAX_NUM_QUEUE, 32)); |  | ||||||
| 	n_queue = bitmap_weight(queue_mask, MAX_NUM_QUEUE); | 	n_queue = bitmap_weight(queue_mask, MAX_NUM_QUEUE); | ||||||
| 	tmp = backup = kmalloc_array(n_queue, sizeof(*backup), GFP_KERNEL); | 	tmp = backup = kmalloc_array(n_queue, sizeof(*backup), GFP_KERNEL); | ||||||
| 	if (!backup) | 	if (!backup) | ||||||
|  |  | ||||||
		Loading…
	
		Reference in a new issue
	
	 Yury Norov
						Yury Norov