Thadeu Lima de Souza Cascardo
eedce141cd
genalloc: stop crashing the system when destroying a pool
...
The genalloc code uses the bitmap API from include/linux/bitmap.h and
lib/bitmap.c, which is based on long values. Both bitmap_set from
lib/bitmap.c and bitmap_set_ll, which is the lockless version from
genalloc.c, use BITMAP_LAST_WORD_MASK to set the first bits in a long in
the bitmap.
That one uses (1 << bits) - 1, 0b111, if you are setting the first three
bits. This means that the API counts from the least significant bits
(LSB from now on) to the MSB. The LSB in the first long is bit 0, then.
The same works for the lookup functions.
The genalloc code uses longs for the bitmap, as it should. In
include/linux/genalloc.h, struct gen_pool_chunk has unsigned long
bits[0] as its last member. When allocating the struct, genalloc should
reserve enough space for the bitmap. This should be a proper number of
longs that can fit the amount of bits in the bitmap.
However, genalloc allocates an integer number of bytes that fit the
amount of bits, but may not be an integer amount of longs. 9 bytes, for
example, could be allocated for 70 bits.
This is a problem in itself if the Least Significat Bit in a long is in
the byte with the largest address, which happens in Big Endian machines.
This means genalloc is not allocating the byte in which it will try to
set or check for a bit.
This may end up in memory corruption, where genalloc will try to set the
bits it has not allocated. In fact, genalloc may not set these bits
because it may find them already set, because they were not zeroed since
they were not allocated. And that's what causes a BUG when
gen_pool_destroy is called and check for any set bits.
What really happens is that genalloc uses kmalloc_node with __GFP_ZERO
on gen_pool_add_virt. With SLAB and SLUB, this means the whole slab
will be cleared, not only the requested bytes. Since struct
gen_pool_chunk has a size that is a multiple of 8, and slab sizes are
multiples of 8, we get lucky and allocate and clear the right amount of
bytes.
Hower, this is not the case with SLOB or with older code that did memset
after allocating instead of using __GFP_ZERO.
So, a simple module as this (running 3.6.0), will cause a crash when
rmmod'ed.
[root@phantom-lp2 foo]# cat foo.c
#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/init.h>
#include <linux/genalloc.h>
MODULE_LICENSE("GPL");
MODULE_VERSION("0.1");
static struct gen_pool *foo_pool;
static __init int foo_init(void)
{
int ret;
foo_pool = gen_pool_create(10, -1);
if (!foo_pool)
return -ENOMEM;
ret = gen_pool_add(foo_pool, 0xa0000000, 32 << 10, -1);
if (ret) {
gen_pool_destroy(foo_pool);
return ret;
}
return 0;
}
static __exit void foo_exit(void)
{
gen_pool_destroy(foo_pool);
}
module_init(foo_init);
module_exit(foo_exit);
[root@phantom-lp2 foo]# zcat /proc/config.gz | grep SLOB
CONFIG_SLOB=y
[root@phantom-lp2 foo]# insmod ./foo.ko
[root@phantom-lp2 foo]# rmmod foo
------------[ cut here ]------------
kernel BUG at lib/genalloc.c:243!
cpu 0x4: Vector: 700 (Program Check) at [c0000000bb0e7960]
pc: c0000000003cb50c: .gen_pool_destroy+0xac/0x110
lr: c0000000003cb4fc: .gen_pool_destroy+0x9c/0x110
sp: c0000000bb0e7be0
msr: 8000000000029032
current = 0xc0000000bb0e0000
paca = 0xc000000006d30e00 softe: 0 irq_happened: 0x01
pid = 13044, comm = rmmod
kernel BUG at lib/genalloc.c:243!
[c0000000bb0e7ca0] d000000004b00020 .foo_exit+0x20/0x38 [foo]
[c0000000bb0e7d20] c0000000000dff98 .SyS_delete_module+0x1a8/0x290
[c0000000bb0e7e30] c0000000000097d4 syscall_exit+0x0/0x94
--- Exception: c00 (System Call) at 000000800753d1a0
SP (fffd0b0e640) is in userspace
Signed-off-by: Thadeu Lima de Souza Cascardo <cascardo@linux.vnet.ibm.com>
Cc: Paul Gortmaker <paul.gortmaker@windriver.com>
Cc: Benjamin Gaignard <benjamin.gaignard@stericsson.com>
Cc: <stable@vger.kernel.org>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
2012-10-25 14:37:52 -07:00
..
lzo
mpi
MPILIB: Provide a function to read raw data into an MPI
2012-10-08 13:50:21 +10:30
raid6
lib/raid6: fix sparse warnings in recovery functions
2012-05-28 14:10:22 +10:00
reed_solomon
xz
XZ: Fix incorrect XZ_BUF_ERROR
2011-09-21 13:39:59 -07:00
zlib_deflate
zlib: slim down zlib_deflate() workspace when possible
2011-03-22 17:44:17 -07:00
zlib_inflate
.gitignore
X.509: Implement simple static OID registry
2012-10-08 13:50:18 +10:30
argv_split.c
lib: reduce the use of module.h wherever possible
2012-03-07 15:04:04 -05:00
asn1_decoder.c
X.509: Fix indefinite length element skip error handling
2012-10-10 20:06:39 +10:30
atomic64.c
lib: reduce the use of module.h wherever possible
2012-03-07 15:04:04 -05:00
atomic64_test.c
atomic64_test: simplify the #ifdef for atomic64_dec_if_positive() test
2012-07-30 17:25:16 -07:00
audit.c
audit: support the "standard" <asm-generic/unistd.h>
2011-05-04 14:41:28 -04:00
average.c
lib: reduce the use of module.h wherever possible
2012-03-07 15:04:04 -05:00
bcd.c
usb/core: use bin2bcd() for bcdDevice in RH
2012-09-10 11:13:16 -07:00
bch.c
lib: add shared BCH ECC library
2011-03-11 14:25:50 +00:00
bitmap.c
lib/bitmap.c: fix documentation for scnprintf() functions
2012-05-29 16:22:32 -07:00
bitrev.c
bsearch.c
lib: reduce the use of module.h wherever possible
2012-03-07 15:04:04 -05:00
btree.c
btree: catch NULL value before it does harm
2012-06-07 14:43:55 -07:00
bug.c
bugs, x86: Fix printk levels for panic, softlockups and stack dumps
2012-01-26 21:28:45 +01:00
build_OID_registry
X.509: Implement simple static OID registry
2012-10-08 13:50:18 +10:30
bust_spinlocks.c
check_signature.c
lib: reduce the use of module.h wherever possible
2012-03-07 15:04:04 -05:00
checksum.c
lib: reduce the use of module.h wherever possible
2012-03-07 15:04:04 -05:00
clz_tab.c
lib: Fix multiple definitions of clz_tab
2012-02-02 10:34:23 +11:00
cmdline.c
lib: reduce the use of module.h wherever possible
2012-03-07 15:04:04 -05:00
cordic.c
Docs: wording: functions -> algorithm
2011-10-29 21:20:22 +02:00
cpu-notifier-error-inject.c
cpu: rewrite cpu-notifier-error-inject module
2012-07-30 17:25:22 -07:00
cpu_rmap.c
lib: reduce the use of module.h wherever possible
2012-03-07 15:04:04 -05:00
cpumask.c
lib/cpumask.c: remove __any_online_cpu()
2012-03-28 17:14:35 -07:00
crc-ccitt.c
crc-itu-t.c
crc-t10dif.c
crc7.c
crc8.c
lib: crc8: add new library module providing crc8 algorithm
2011-06-03 15:01:06 -04:00
crc16.c
crc32.c
sections: fix const sections for crc32 table
2012-10-06 03:04:46 +09:00
crc32defs.h
crc32: select an algorithm via Kconfig
2012-03-23 16:58:38 -07:00
ctype.c
lib: reduce the use of module.h wherever possible
2012-03-07 15:04:04 -05:00
debug_locks.c
lib: reduce the use of module.h wherever possible
2012-03-07 15:04:04 -05:00
debugobjects.c
debugobjects: Fill_pool() returns void now
2012-04-18 13:38:48 +02:00
dec_and_lock.c
lib: reduce the use of module.h wherever possible
2012-03-07 15:04:04 -05:00
decompress.c
lib/decompress.c add __init to decompress_method and data
2012-10-06 03:05:32 +09:00
decompress_bunzip2.c
decompress_bunzip2: remove invalid vi modeline
2011-12-06 10:00:05 +01:00
decompress_inflate.c
decompressors: check input size in decompress_inflate.c
2011-01-13 08:03:25 -08:00
decompress_unlzma.c
treewide: Fix comment and string typo 'bufer'
2011-12-06 09:53:40 +01:00
decompress_unlzo.c
unlzo: fix input buffer free
2012-01-12 20:13:13 -08:00
decompress_unxz.c
Fix common misspellings
2011-03-31 11:26:23 -03:00
devres.c
lib: reduce the use of module.h wherever possible
2012-03-07 15:04:04 -05:00
digsig.c
digsig: add hash size comparision on signature verification
2012-09-13 09:13:02 +08:00
div64.c
lib: correct link to the original source for div64_u64
2012-06-28 11:51:39 +02:00
dma-debug.c
lib/dma-debug.c: fix __hash_bucket_find()
2012-10-19 14:07:48 -07:00
dump_stack.c
lib: reduce the use of module.h wherever possible
2012-03-07 15:04:04 -05:00
dynamic_debug.c
device and dynamic_debug: Use dev_vprintk_emit and dev_printk_emit
2012-09-17 06:10:05 -07:00
dynamic_queue_limits.c
bql: Avoid possible inconsistent calculation.
2012-05-31 18:18:17 -04:00
extable.c
fault-inject.c
fault-inject: avoid call to random32() if fault injection is disabled
2012-06-20 14:39:36 -07:00
fdt.c
of/lib: Allow scripts/dtc/libfdt to be used from kernel code
2012-07-23 13:54:52 +01:00
fdt_ro.c
of/lib: Allow scripts/dtc/libfdt to be used from kernel code
2012-07-23 13:54:52 +01:00
fdt_rw.c
of/lib: Allow scripts/dtc/libfdt to be used from kernel code
2012-07-23 13:54:52 +01:00
fdt_strerror.c
of/lib: Allow scripts/dtc/libfdt to be used from kernel code
2012-07-23 13:54:52 +01:00
fdt_sw.c
of/lib: Allow scripts/dtc/libfdt to be used from kernel code
2012-07-23 13:54:52 +01:00
fdt_wip.c
of/lib: Allow scripts/dtc/libfdt to be used from kernel code
2012-07-23 13:54:52 +01:00
find_last_bit.c
lib: reduce the use of module.h wherever possible
2012-03-07 15:04:04 -05:00
find_next_bit.c
lib: reduce the use of module.h wherever possible
2012-03-07 15:04:04 -05:00
flex_array.c
lib: reduce the use of module.h wherever possible
2012-03-07 15:04:04 -05:00
flex_proportions.c
lib/flex_proportions.c: fix corruption of denominator in flexible proportions
2012-09-25 08:59:21 -07:00
gcd.c
lib/gcd.c: prevent possible div by 0
2012-10-06 03:04:57 +09:00
gen_crc32table.c
sections: fix const sections for crc32 table
2012-10-06 03:04:46 +09:00
genalloc.c
genalloc: stop crashing the system when destroying a pool
2012-10-25 14:37:52 -07:00
halfmd4.c
lib: reduce the use of module.h wherever possible
2012-03-07 15:04:04 -05:00
hexdump.c
lib: reduce the use of module.h wherever possible
2012-03-07 15:04:04 -05:00
hweight.c
lib: reduce the use of module.h wherever possible
2012-03-07 15:04:04 -05:00
idr.c
idr: rename MAX_LEVEL to MAX_IDR_LEVEL
2012-10-06 03:04:56 +09:00
inflate.c
int_sqrt.c
lib: reduce the use of module.h wherever possible
2012-03-07 15:04:04 -05:00
interval_tree.c
mm: interval tree updates
2012-10-09 16:22:40 +09:00
interval_tree_test_main.c
rbtree: add prio tree and interval tree tests
2012-10-09 16:22:39 +09:00
iomap.c
lib: reduce the use of module.h wherever possible
2012-03-07 15:04:04 -05:00
iomap_copy.c
lib: reduce the use of module.h wherever possible
2012-03-07 15:04:04 -05:00
iommu-helper.c
The following text was taken from the original review request:
2012-03-24 10:24:31 -07:00
ioremap.c
lib: reduce the use of module.h wherever possible
2012-03-07 15:04:04 -05:00
irq_regs.c
lib: reduce the use of module.h wherever possible
2012-03-07 15:04:04 -05:00
is_single_threaded.c
jedec_ddr_data.c
ddr: add LPDDR2 data from JESD209-2
2012-05-02 00:04:06 -07:00
kasprintf.c
lib/kasprintf.c: use kmalloc_track_caller() to get accurate traces for kvasprintf
2012-10-11 08:50:15 +09:00
Kconfig
X.509: Implement simple static OID registry
2012-10-08 13:50:18 +10:30
Kconfig.debug
mm: add CONFIG_DEBUG_VM_RB build option
2012-10-09 16:22:42 +09:00
Kconfig.kgdb
Kconfig.kmemcheck
klist.c
Revert "driver core: check start node in klist_iter_init_node"
2012-04-19 19:17:30 -07:00
kobject.c
kobject: fix the uncorrect comment
2012-05-07 16:51:19 -07:00
kobject_uevent.c
netlink: hide struct module parameter in netlink_kernel_create
2012-09-08 18:46:30 -04:00
kstrtox.c
lib: reduce the use of module.h wherever possible
2012-03-07 15:04:04 -05:00
kstrtox.h
lib/kstrtox: common code between kstrto*() and simple_strto*() functions
2011-10-31 17:30:56 -07:00
lcm.c
lib: reduce the use of module.h wherever possible
2012-03-07 15:04:04 -05:00
libcrc32c.c
list_debug.c
rcu: Fix broken strings in RCU's source code.
2012-07-06 06:01:49 -07:00
list_sort.c
llist.c
Disintegrate and delete asm/system.h
2012-03-28 15:58:21 -07:00
locking-selftest-hardirq.h
locking-selftest-mutex.h
locking-selftest-rlock-hardirq.h
locking-selftest-rlock-softirq.h
locking-selftest-rlock.h
locking-selftest-rsem.h
locking-selftest-softirq.h
locking-selftest-spin-hardirq.h
locking-selftest-spin-softirq.h
locking-selftest-spin.h
locking-selftest-wlock-hardirq.h
locking-selftest-wlock-softirq.h
locking-selftest-wlock.h
locking-selftest-wsem.h
locking-selftest.c
lib: reduce the use of module.h wherever possible
2012-03-07 15:04:04 -05:00
lru_cache.c
lru_cache: use correct type in sizeof for allocation
2011-05-25 08:39:52 -07:00
Makefile
Merge branch 'modules-next' of git://git.kernel.org/pub/scm/linux/kernel/git/rusty/linux
2012-10-14 13:39:34 -07:00
md5.c
lib: reduce the use of module.h wherever possible
2012-03-07 15:04:04 -05:00
memory-notifier-error-inject.c
memory: memory notifier error injection module
2012-07-30 17:25:22 -07:00
memweight.c
string: introduce memweight()
2012-07-30 17:25:16 -07:00
nlattr.c
netlink: add minlen validation for the new signed types
2012-08-30 13:11:46 -04:00
notifier-error-inject.c
fault-injection: notifier error injection
2012-07-30 17:25:22 -07:00
notifier-error-inject.h
fault-injection: notifier error injection
2012-07-30 17:25:22 -07:00
oid_registry.c
X.509: Add utility functions to render OIDs as strings
2012-10-08 13:50:18 +10:30
parser.c
lib/parser.c: avoid overflow in match_number()
2012-10-06 03:04:56 +09:00
pci_iomap.c
lib: add NO_GENERIC_PCI_IOPORT_MAP
2012-01-31 23:19:47 +02:00
percpu_counter.c
switch the protection of percpu_counter list to spinlock
2012-07-31 09:28:31 +04:00
plist.c
lib/plist.c: make plist test announcements KERN_DEBUG
2012-10-06 03:04:58 +09:00
pm-notifier-error-inject.c
PM: PM notifier error injection module
2012-07-30 17:25:22 -07:00
prio_heap.c
proportions.c
locking, lib/proportions: Annotate prop_local_percpu::lock as raw
2011-09-13 11:11:50 +02:00
pSeries-reconfig-notifier-error-inject.c
powerpc: pSeries reconfig notifier error injection module
2012-07-30 17:25:22 -07:00
radix-tree.c
radix-tree: fix contiguous iterator
2012-06-05 10:46:40 -07:00
random32.c
lib: reduce the use of module.h wherever possible
2012-03-07 15:04:04 -05:00
ratelimit.c
lib: reduce the use of module.h wherever possible
2012-03-07 15:04:04 -05:00
rational.c
lib: Change mail address of Oskar Schirmer
2012-05-17 15:18:37 +02:00
rbtree.c
rbtree: move augmented rbtree functionality to rbtree_augmented.h
2012-10-09 16:22:40 +09:00
rbtree_test.c
rbtree: move augmented rbtree functionality to rbtree_augmented.h
2012-10-09 16:22:40 +09:00
reciprocal_div.c
sch_red: Adaptative RED AQM
2011-12-08 19:52:43 -05:00
rwsem-spinlock.c
lib: reduce the use of module.h wherever possible
2012-03-07 15:04:04 -05:00
rwsem.c
lib: reduce the use of module.h wherever possible
2012-03-07 15:04:04 -05:00
scatterlist.c
Merge branch 'for-3.7/core' of git://git.kernel.dk/linux-block
2012-10-11 09:04:23 +09:00
sha1.c
lib: reduce the use of module.h wherever possible
2012-03-07 15:04:04 -05:00
show_mem.c
arch, mm: filter disallowed nodes from arch specific show_mem functions
2011-05-25 08:39:03 -07:00
smp_processor_id.c
lib: reduce the use of module.h wherever possible
2012-03-07 15:04:04 -05:00
sort.c
spinlock_debug.c
lib/spinlock_debug: avoid livelock in do_raw_spin_lock()
2012-10-06 03:04:57 +09:00
stmp_device.c
lib: add support for stmp-style devices
2012-04-20 23:27:08 +02:00
string.c
The following text was taken from the original review request:
2012-03-24 10:24:31 -07:00
string_helpers.c
lib/string_helpers.c: make arrays static
2012-05-29 16:22:32 -07:00
strncpy_from_user.c
word-at-a-time: make the interfaces truly generic
2012-05-26 11:33:40 -07:00
strnlen_user.c
lib: Fix generic strnlen_user for 32-bit big-endian machines
2012-05-27 20:59:46 -07:00
swiotlb.c
swiotlb: add the late swiotlb initialization function with iotlb memory
2012-08-21 14:47:25 -04:00
syscall.c
lib: reduce the use of module.h wherever possible
2012-03-07 15:04:04 -05:00
test-kstrtox.c
lib/test-kstrtox.c: mark const init data with __initconst instead of __initdata
2012-05-29 16:22:32 -07:00
textsearch.c
textsearch: doc - fix spelling in lib/textsearch.c.
2011-01-24 23:33:30 -08:00
timerqueue.c
The following text was taken from the original review request:
2012-03-24 10:24:31 -07:00
ts_bm.c
ts_fsm.c
ts_kmp.c
uuid.c
lib: reduce the use of module.h wherever possible
2012-03-07 15:04:04 -05:00
vsprintf.c
lib/vsprintf.c: improve standard conformance of sscanf()
2012-10-06 03:04:58 +09:00