revert "mm: vmalloc use mutex for purge"
Revert commit e97a630eb0
("mm: vmalloc use
mutex for purge")
Bryan Donlan reports:
: After testing 2.6.29-rc1 on xen-x86 with a btrfs root filesystem, I
: got the OOPS quoted below and a hard freeze shortly after boot.
: Boot messages and config are attached.
:
: ------------[ cut here ]------------
: Kernel BUG at c05ef80d [verbose debug info unavailable]
: invalid opcode: 0000 [#1] SMP
: last sysfs file: /sys/block/xvdc/size
: Modules linked in:
:
: Pid: 0, comm: swapper Not tainted (2.6.29-rc1 #6)
: EIP: 0061:[<c05ef80d>] EFLAGS: 00010087 CPU: 2
: EIP is at schedule+0x7cd/0x950
: EAX: d5aeca80 EBX: 00000002 ECX: 00000000 EDX: d4cb9a40
: ESI: c12f5600 EDI: d4cb9a40 EBP: d6033fa4 ESP: d6033ef4
: DS: 007b ES: 007b FS: 00d8 GS: 0000 SS: 0069
: Process swapper (pid: 0, ti=d6032000 task=d6020b70 task.ti=d6032000)
: Stack:
: 000d85bc 00000000 000186a0 00000000 0dd11410 c0105417 c12efe00 0dc367c3
: 00000011 c0105d46 d5a5d310 deadbeef d4cb9a40 c07cc600 c05f1340 c12e0060
: deadbeef d6020b70 d6020d08 00000002 c014377d 00000000 c12f5600 00002c22
: Call Trace:
: [<c0105417>] xen_force_evtchn_callback+0x17/0x30
: [<c0105d46>] check_events+0x8/0x12
: [<c05f1340>] _spin_unlock_irqrestore+0x20/0x40
: [<c014377d>] hrtimer_start_range_ns+0x12d/0x2e0
: [<c014c4f6>] tick_nohz_restart_sched_tick+0x146/0x160
: [<c0107485>] cpu_idle+0xa5/0xc0
and bisected it to this commit.
Let's remove it now while we have a think about the problem.
Reported-by: Bryan Donlan <bdonlan@gmail.com>
Tested-by: Christophe Saout <christophe@saout.de>
Cc: Nick Piggin <nickpiggin@yahoo.com.au>
Cc: Ingo Molnar <mingo@elte.hu>
Cc: Jeremy Fitzhardinge <jeremy@goop.org>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
This commit is contained in:
Родитель
4d1c627389
Коммит
46666d8ac4
|
@ -14,7 +14,6 @@
|
|||
#include <linux/highmem.h>
|
||||
#include <linux/slab.h>
|
||||
#include <linux/spinlock.h>
|
||||
#include <linux/mutex.h>
|
||||
#include <linux/interrupt.h>
|
||||
#include <linux/proc_fs.h>
|
||||
#include <linux/seq_file.h>
|
||||
|
@ -496,7 +495,7 @@ static atomic_t vmap_lazy_nr = ATOMIC_INIT(0);
|
|||
static void __purge_vmap_area_lazy(unsigned long *start, unsigned long *end,
|
||||
int sync, int force_flush)
|
||||
{
|
||||
static DEFINE_MUTEX(purge_lock);
|
||||
static DEFINE_SPINLOCK(purge_lock);
|
||||
LIST_HEAD(valist);
|
||||
struct vmap_area *va;
|
||||
int nr = 0;
|
||||
|
@ -507,10 +506,10 @@ static void __purge_vmap_area_lazy(unsigned long *start, unsigned long *end,
|
|||
* the case that isn't actually used at the moment anyway.
|
||||
*/
|
||||
if (!sync && !force_flush) {
|
||||
if (!mutex_trylock(&purge_lock))
|
||||
if (!spin_trylock(&purge_lock))
|
||||
return;
|
||||
} else
|
||||
mutex_lock(&purge_lock);
|
||||
spin_lock(&purge_lock);
|
||||
|
||||
rcu_read_lock();
|
||||
list_for_each_entry_rcu(va, &vmap_area_list, list) {
|
||||
|
@ -542,7 +541,7 @@ static void __purge_vmap_area_lazy(unsigned long *start, unsigned long *end,
|
|||
__free_vmap_area(va);
|
||||
spin_unlock(&vmap_area_lock);
|
||||
}
|
||||
mutex_unlock(&purge_lock);
|
||||
spin_unlock(&purge_lock);
|
||||
}
|
||||
|
||||
/*
|
||||
|
|
Загрузка…
Ссылка в новой задаче