patch "drivers/base: cacheinfo: handle absence of caches" added to driver-core-linus
Subsystems (2)
This is a note to let you know that I've just added the patch titled
drivers/base: cacheinfo: handle absence of caches
to my driver-core git tree which can be found at
git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/driver-core.git
in the driver-core-linus branch.
The patch will show up in the next release of the linux-next tree (usually sometime within the next 24 hours during the week.)
The patch will hopefully also be merged in Linus's tree for the next -rc kernel release.
If you have any questions about this process, please let me know.
Quoted 1 line
From
3370e13aa463adb84488ebf0e599e3dc0024315bMon Sep 17 00:00:00 2001
From: Sudeep Holla <[email protected]>
Date: Wed, 27 May 2015 11:26:13 +0100
Subject: drivers/base: cacheinfo: handle absence of caches
On some simulators like GEM5, caches may not be simulated. In those cases, the cache levels and leaves will be zero and will result in following exception:
Unable to handle kernel NULL pointer dereference at virtual address 0040 pgd = ffffffc0008fa000 [00000040] *pgd=00000009f6807003, *pud=00000009f6807003, *pmd=00000009f6808003, *pte=006000002c010707 Internal error: Oops: 96000005 [#1] PREEMPT SMP Modules linked in: CPU: 1 PID: 1 Comm: swapper/0 Not tainted 4.1.0-rc5 #198 task: ffffffc9768a0000 ti: ffffffc9768a8000 task.ti: ffffffc9768a8000 PC is at detect_cache_attributes+0x98/0x2c8 LR is at detect_cache_attributes+0x88/0x2c8
kcalloc(0) returns a special value ZERO_SIZE_PTR which is non-NULL value but results in fault only on any attempt to dereferencing it. So checking for the non-NULL pointer will not suffice.
This patch checks for non-zero cache leaf nodes and returns error if there are no cache leaves in detect_cache_attributes.
--- drivers/base/cacheinfo.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/base/cacheinfo.c +1 -1
@@ -179,7 +179,7 @@ static int detect_cache_attributes(unsigned int cpu) {int ret; -if (init_cache_level (cpu)) +if (init_cache_level (cpu) || !cache_leaves (cpu))return -ENOENT ; per_cpu_cacheinfo(cpu) = kcalloc(cache_leaves(cpu),
Signature · 1 line
2.4.2