sparc/srmmu: clear trailing edge of bitmap properly
srmmu_nocache_bitmap is cleared by bit_map_init(). But bit_map_init() attempts to clear by memset(), so it can't clear the trailing edge of bitmap properly on big-endian architecture if the number of bits is not a multiple of BITS_PER_LONG. Actually, the number of bits in srmmu_nocache_bitmap is not always a multiple of BITS_PER_LONG. It is calculated as below: bitmap_bits = srmmu_nocache_size >> SRMMU_NOCACHE_BITMAP_SHIFT; srmmu_nocache_size is decided proportionally by the amount of system RAM and it is rounded to a multiple of PAGE_SIZE. SRMMU_NOCACHE_BITMAP_SHIFT is defined as (PAGE_SHIFT - 4). So it can only be said that bitmap_bits is a multiple of 16. This fixes the problem by using bitmap_clear() instead of memset() in bit_map_init() and this also uses BITS_TO_LONGS() to calculate correct size at bitmap allocation time. Signed-off-by: Akinobu Mita <akinobu.mita@gmail.com> Cc: "David S. Miller" <davem@davemloft.net> Cc: sparclinux@vger.kernel.org Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
71196a26d8
commit
54df2db36c
|
@ -119,11 +119,7 @@ void bit_map_clear(struct bit_map *t, int offset, int len)
|
||||||
|
|
||||||
void bit_map_init(struct bit_map *t, unsigned long *map, int size)
|
void bit_map_init(struct bit_map *t, unsigned long *map, int size)
|
||||||
{
|
{
|
||||||
|
bitmap_zero(map, size);
|
||||||
if ((size & 07) != 0)
|
|
||||||
BUG();
|
|
||||||
memset(map, 0, size>>3);
|
|
||||||
|
|
||||||
memset(t, 0, sizeof *t);
|
memset(t, 0, sizeof *t);
|
||||||
spin_lock_init(&t->lock);
|
spin_lock_init(&t->lock);
|
||||||
t->map = map;
|
t->map = map;
|
||||||
|
|
|
@ -280,7 +280,9 @@ static void __init srmmu_nocache_init(void)
|
||||||
SRMMU_NOCACHE_ALIGN_MAX, 0UL);
|
SRMMU_NOCACHE_ALIGN_MAX, 0UL);
|
||||||
memset(srmmu_nocache_pool, 0, srmmu_nocache_size);
|
memset(srmmu_nocache_pool, 0, srmmu_nocache_size);
|
||||||
|
|
||||||
srmmu_nocache_bitmap = __alloc_bootmem(bitmap_bits >> 3, SMP_CACHE_BYTES, 0UL);
|
srmmu_nocache_bitmap =
|
||||||
|
__alloc_bootmem(BITS_TO_LONGS(bitmap_bits) * sizeof(long),
|
||||||
|
SMP_CACHE_BYTES, 0UL);
|
||||||
bit_map_init(&srmmu_nocache_map, srmmu_nocache_bitmap, bitmap_bits);
|
bit_map_init(&srmmu_nocache_map, srmmu_nocache_bitmap, bitmap_bits);
|
||||||
|
|
||||||
srmmu_swapper_pg_dir = __srmmu_get_nocache(SRMMU_PGD_TABLE_SIZE, SRMMU_PGD_TABLE_SIZE);
|
srmmu_swapper_pg_dir = __srmmu_get_nocache(SRMMU_PGD_TABLE_SIZE, SRMMU_PGD_TABLE_SIZE);
|
||||||
|
|
Loading…
Reference in New Issue