Merge branch 'master' of /home/davem/src/GIT/linux-2.6/
Conflicts: drivers/firmware/iscsi_ibft.c
This commit is contained in:
@@ -355,7 +355,7 @@ config SLUB_STATS
|
||||
config DEBUG_KMEMLEAK
|
||||
bool "Kernel memory leak detector"
|
||||
depends on DEBUG_KERNEL && EXPERIMENTAL && !MEMORY_HOTPLUG && \
|
||||
(X86 || ARM || PPC || S390)
|
||||
(X86 || ARM || PPC || S390 || SUPERH)
|
||||
|
||||
select DEBUG_FS if SYSFS
|
||||
select STACKTRACE if STACKTRACE_SUPPORT
|
||||
@@ -499,6 +499,18 @@ config PROVE_LOCKING
|
||||
|
||||
For more details, see Documentation/lockdep-design.txt.
|
||||
|
||||
config PROVE_RCU
|
||||
bool "RCU debugging: prove RCU correctness"
|
||||
depends on PROVE_LOCKING
|
||||
default n
|
||||
help
|
||||
This feature enables lockdep extensions that check for correct
|
||||
use of RCU APIs. This is currently under development. Say Y
|
||||
if you want to debug RCU usage or help work on the PROVE_RCU
|
||||
feature.
|
||||
|
||||
Say N if you are unsure.
|
||||
|
||||
config LOCKDEP
|
||||
bool
|
||||
depends on DEBUG_KERNEL && TRACE_IRQFLAGS_SUPPORT && STACKTRACE_SUPPORT && LOCKDEP_SUPPORT
|
||||
@@ -765,10 +777,22 @@ config RCU_CPU_STALL_DETECTOR
|
||||
CPUs are delaying the current grace period, but only when
|
||||
the grace period extends for excessive time periods.
|
||||
|
||||
Say Y if you want RCU to perform such checks.
|
||||
Say N if you want to disable such checks.
|
||||
|
||||
Say Y if you are unsure.
|
||||
|
||||
config RCU_CPU_STALL_VERBOSE
|
||||
bool "Print additional per-task information for RCU_CPU_STALL_DETECTOR"
|
||||
depends on RCU_CPU_STALL_DETECTOR && TREE_PREEMPT_RCU
|
||||
default n
|
||||
help
|
||||
This option causes RCU to printk detailed per-task information
|
||||
for any tasks that are stalling the current RCU grace period.
|
||||
|
||||
Say N if you are unsure.
|
||||
|
||||
Say Y if you want to enable such checks.
|
||||
|
||||
config KPROBES_SANITY_TEST
|
||||
bool "Kprobes sanity tests"
|
||||
depends on DEBUG_KERNEL
|
||||
|
@@ -23,6 +23,7 @@
|
||||
* shut up after that.
|
||||
*/
|
||||
int debug_locks = 1;
|
||||
EXPORT_SYMBOL_GPL(debug_locks);
|
||||
|
||||
/*
|
||||
* The locking-testsuite uses <debug_locks_silent> to get a
|
||||
|
@@ -11,11 +11,18 @@
|
||||
|
||||
unsigned int hweight32(unsigned int w)
|
||||
{
|
||||
#ifdef ARCH_HAS_FAST_MULTIPLIER
|
||||
w -= (w >> 1) & 0x55555555;
|
||||
w = (w & 0x33333333) + ((w >> 2) & 0x33333333);
|
||||
w = (w + (w >> 4)) & 0x0f0f0f0f;
|
||||
return (w * 0x01010101) >> 24;
|
||||
#else
|
||||
unsigned int res = w - ((w >> 1) & 0x55555555);
|
||||
res = (res & 0x33333333) + ((res >> 2) & 0x33333333);
|
||||
res = (res + (res >> 4)) & 0x0F0F0F0F;
|
||||
res = res + (res >> 8);
|
||||
return (res + (res >> 16)) & 0x000000FF;
|
||||
#endif
|
||||
}
|
||||
EXPORT_SYMBOL(hweight32);
|
||||
|
||||
|
12
lib/idr.c
12
lib/idr.c
@@ -156,10 +156,12 @@ static int sub_alloc(struct idr *idp, int *starting_id, struct idr_layer **pa)
|
||||
id = (id | ((1 << (IDR_BITS * l)) - 1)) + 1;
|
||||
|
||||
/* if already at the top layer, we need to grow */
|
||||
if (!(p = pa[l])) {
|
||||
if (id >= 1 << (idp->layers * IDR_BITS)) {
|
||||
*starting_id = id;
|
||||
return IDR_NEED_TO_GROW;
|
||||
}
|
||||
p = pa[l];
|
||||
BUG_ON(!p);
|
||||
|
||||
/* If we need to go up one layer, continue the
|
||||
* loop; otherwise, restart from the top.
|
||||
@@ -502,7 +504,7 @@ void *idr_find(struct idr *idp, int id)
|
||||
int n;
|
||||
struct idr_layer *p;
|
||||
|
||||
p = rcu_dereference(idp->top);
|
||||
p = rcu_dereference_raw(idp->top);
|
||||
if (!p)
|
||||
return NULL;
|
||||
n = (p->layer+1) * IDR_BITS;
|
||||
@@ -517,7 +519,7 @@ void *idr_find(struct idr *idp, int id)
|
||||
while (n > 0 && p) {
|
||||
n -= IDR_BITS;
|
||||
BUG_ON(n != p->layer*IDR_BITS);
|
||||
p = rcu_dereference(p->ary[(id >> n) & IDR_MASK]);
|
||||
p = rcu_dereference_raw(p->ary[(id >> n) & IDR_MASK]);
|
||||
}
|
||||
return((void *)p);
|
||||
}
|
||||
@@ -550,7 +552,7 @@ int idr_for_each(struct idr *idp,
|
||||
struct idr_layer **paa = &pa[0];
|
||||
|
||||
n = idp->layers * IDR_BITS;
|
||||
p = rcu_dereference(idp->top);
|
||||
p = rcu_dereference_raw(idp->top);
|
||||
max = 1 << n;
|
||||
|
||||
id = 0;
|
||||
@@ -558,7 +560,7 @@ int idr_for_each(struct idr *idp,
|
||||
while (n > 0 && p) {
|
||||
n -= IDR_BITS;
|
||||
*paa++ = p;
|
||||
p = rcu_dereference(p->ary[(id >> n) & IDR_MASK]);
|
||||
p = rcu_dereference_raw(p->ary[(id >> n) & IDR_MASK]);
|
||||
}
|
||||
|
||||
if (p) {
|
||||
|
13
lib/lmb.c
13
lib/lmb.c
@@ -205,9 +205,8 @@ long lmb_add(u64 base, u64 size)
|
||||
|
||||
}
|
||||
|
||||
long lmb_remove(u64 base, u64 size)
|
||||
static long __lmb_remove(struct lmb_region *rgn, u64 base, u64 size)
|
||||
{
|
||||
struct lmb_region *rgn = &(lmb.memory);
|
||||
u64 rgnbegin, rgnend;
|
||||
u64 end = base + size;
|
||||
int i;
|
||||
@@ -254,6 +253,16 @@ long lmb_remove(u64 base, u64 size)
|
||||
return lmb_add_region(rgn, end, rgnend - end);
|
||||
}
|
||||
|
||||
long lmb_remove(u64 base, u64 size)
|
||||
{
|
||||
return __lmb_remove(&lmb.memory, base, size);
|
||||
}
|
||||
|
||||
long __init lmb_free(u64 base, u64 size)
|
||||
{
|
||||
return __lmb_remove(&lmb.reserved, base, size);
|
||||
}
|
||||
|
||||
long __init lmb_reserve(u64 base, u64 size)
|
||||
{
|
||||
struct lmb_region *_rgn = &lmb.reserved;
|
||||
|
@@ -364,7 +364,7 @@ static void *radix_tree_lookup_element(struct radix_tree_root *root,
|
||||
unsigned int height, shift;
|
||||
struct radix_tree_node *node, **slot;
|
||||
|
||||
node = rcu_dereference(root->rnode);
|
||||
node = rcu_dereference_raw(root->rnode);
|
||||
if (node == NULL)
|
||||
return NULL;
|
||||
|
||||
@@ -384,7 +384,7 @@ static void *radix_tree_lookup_element(struct radix_tree_root *root,
|
||||
do {
|
||||
slot = (struct radix_tree_node **)
|
||||
(node->slots + ((index>>shift) & RADIX_TREE_MAP_MASK));
|
||||
node = rcu_dereference(*slot);
|
||||
node = rcu_dereference_raw(*slot);
|
||||
if (node == NULL)
|
||||
return NULL;
|
||||
|
||||
@@ -568,7 +568,7 @@ int radix_tree_tag_get(struct radix_tree_root *root,
|
||||
if (!root_tag_get(root, tag))
|
||||
return 0;
|
||||
|
||||
node = rcu_dereference(root->rnode);
|
||||
node = rcu_dereference_raw(root->rnode);
|
||||
if (node == NULL)
|
||||
return 0;
|
||||
|
||||
@@ -602,7 +602,7 @@ int radix_tree_tag_get(struct radix_tree_root *root,
|
||||
BUG_ON(ret && saw_unset_tag);
|
||||
return !!ret;
|
||||
}
|
||||
node = rcu_dereference(node->slots[offset]);
|
||||
node = rcu_dereference_raw(node->slots[offset]);
|
||||
shift -= RADIX_TREE_MAP_SHIFT;
|
||||
height--;
|
||||
}
|
||||
@@ -711,7 +711,7 @@ __lookup(struct radix_tree_node *slot, void ***results, unsigned long index,
|
||||
}
|
||||
|
||||
shift -= RADIX_TREE_MAP_SHIFT;
|
||||
slot = rcu_dereference(slot->slots[i]);
|
||||
slot = rcu_dereference_raw(slot->slots[i]);
|
||||
if (slot == NULL)
|
||||
goto out;
|
||||
}
|
||||
@@ -758,7 +758,7 @@ radix_tree_gang_lookup(struct radix_tree_root *root, void **results,
|
||||
unsigned long cur_index = first_index;
|
||||
unsigned int ret;
|
||||
|
||||
node = rcu_dereference(root->rnode);
|
||||
node = rcu_dereference_raw(root->rnode);
|
||||
if (!node)
|
||||
return 0;
|
||||
|
||||
@@ -787,7 +787,7 @@ radix_tree_gang_lookup(struct radix_tree_root *root, void **results,
|
||||
slot = *(((void ***)results)[ret + i]);
|
||||
if (!slot)
|
||||
continue;
|
||||
results[ret + nr_found] = rcu_dereference(slot);
|
||||
results[ret + nr_found] = rcu_dereference_raw(slot);
|
||||
nr_found++;
|
||||
}
|
||||
ret += nr_found;
|
||||
@@ -826,7 +826,7 @@ radix_tree_gang_lookup_slot(struct radix_tree_root *root, void ***results,
|
||||
unsigned long cur_index = first_index;
|
||||
unsigned int ret;
|
||||
|
||||
node = rcu_dereference(root->rnode);
|
||||
node = rcu_dereference_raw(root->rnode);
|
||||
if (!node)
|
||||
return 0;
|
||||
|
||||
@@ -915,7 +915,7 @@ __lookup_tag(struct radix_tree_node *slot, void ***results, unsigned long index,
|
||||
}
|
||||
}
|
||||
shift -= RADIX_TREE_MAP_SHIFT;
|
||||
slot = rcu_dereference(slot->slots[i]);
|
||||
slot = rcu_dereference_raw(slot->slots[i]);
|
||||
if (slot == NULL)
|
||||
break;
|
||||
}
|
||||
@@ -951,7 +951,7 @@ radix_tree_gang_lookup_tag(struct radix_tree_root *root, void **results,
|
||||
if (!root_tag_get(root, tag))
|
||||
return 0;
|
||||
|
||||
node = rcu_dereference(root->rnode);
|
||||
node = rcu_dereference_raw(root->rnode);
|
||||
if (!node)
|
||||
return 0;
|
||||
|
||||
@@ -980,7 +980,7 @@ radix_tree_gang_lookup_tag(struct radix_tree_root *root, void **results,
|
||||
slot = *(((void ***)results)[ret + i]);
|
||||
if (!slot)
|
||||
continue;
|
||||
results[ret + nr_found] = rcu_dereference(slot);
|
||||
results[ret + nr_found] = rcu_dereference_raw(slot);
|
||||
nr_found++;
|
||||
}
|
||||
ret += nr_found;
|
||||
@@ -1020,7 +1020,7 @@ radix_tree_gang_lookup_tag_slot(struct radix_tree_root *root, void ***results,
|
||||
if (!root_tag_get(root, tag))
|
||||
return 0;
|
||||
|
||||
node = rcu_dereference(root->rnode);
|
||||
node = rcu_dereference_raw(root->rnode);
|
||||
if (!node)
|
||||
return 0;
|
||||
|
||||
|
Reference in New Issue
Block a user