Merge branch 'core-fixes-for-linus-2' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/linux-2.6-tip
* 'core-fixes-for-linus-2' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/linux-2.6-tip: dma-debug: Fix the overlap() function to be correct and readable oprofile: reset bt_lost_no_mapping with other stats x86/oprofile: rename kernel parameter for architectural perfmon to arch_perfmon signals: declare sys_rt_tgsigqueueinfo in syscalls.h rcu: Mark Hierarchical RCU no longer experimental dma-debug: Put all hash-chain locks into the same lock class dma-debug: fix off-by-one error in overlap function
This commit is contained in:
@@ -1720,8 +1720,8 @@ and is between 256 and 4096 characters. It is defined in the file
|
|||||||
oprofile.cpu_type= Force an oprofile cpu type
|
oprofile.cpu_type= Force an oprofile cpu type
|
||||||
This might be useful if you have an older oprofile
|
This might be useful if you have an older oprofile
|
||||||
userland or if you want common events.
|
userland or if you want common events.
|
||||||
Format: { archperfmon }
|
Format: { arch_perfmon }
|
||||||
archperfmon: [X86] Force use of architectural
|
arch_perfmon: [X86] Force use of architectural
|
||||||
perfmon on Intel CPUs instead of the
|
perfmon on Intel CPUs instead of the
|
||||||
CPU specific event set.
|
CPU specific event set.
|
||||||
|
|
||||||
|
@@ -390,7 +390,7 @@ static int __init p4_init(char **cpu_type)
|
|||||||
static int force_arch_perfmon;
|
static int force_arch_perfmon;
|
||||||
static int force_cpu_type(const char *str, struct kernel_param *kp)
|
static int force_cpu_type(const char *str, struct kernel_param *kp)
|
||||||
{
|
{
|
||||||
if (!strcmp(str, "archperfmon")) {
|
if (!strcmp(str, "arch_perfmon")) {
|
||||||
force_arch_perfmon = 1;
|
force_arch_perfmon = 1;
|
||||||
printk(KERN_INFO "oprofile: forcing architectural perfmon\n");
|
printk(KERN_INFO "oprofile: forcing architectural perfmon\n");
|
||||||
}
|
}
|
||||||
|
@@ -33,6 +33,7 @@ void oprofile_reset_stats(void)
|
|||||||
atomic_set(&oprofile_stats.sample_lost_no_mm, 0);
|
atomic_set(&oprofile_stats.sample_lost_no_mm, 0);
|
||||||
atomic_set(&oprofile_stats.sample_lost_no_mapping, 0);
|
atomic_set(&oprofile_stats.sample_lost_no_mapping, 0);
|
||||||
atomic_set(&oprofile_stats.event_lost_overflow, 0);
|
atomic_set(&oprofile_stats.event_lost_overflow, 0);
|
||||||
|
atomic_set(&oprofile_stats.bt_lost_no_mapping, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@@ -321,6 +321,8 @@ asmlinkage long sys_rt_sigtimedwait(const sigset_t __user *uthese,
|
|||||||
siginfo_t __user *uinfo,
|
siginfo_t __user *uinfo,
|
||||||
const struct timespec __user *uts,
|
const struct timespec __user *uts,
|
||||||
size_t sigsetsize);
|
size_t sigsetsize);
|
||||||
|
asmlinkage long sys_rt_tgsigqueueinfo(pid_t tgid, pid_t pid, int sig,
|
||||||
|
siginfo_t __user *uinfo);
|
||||||
asmlinkage long sys_kill(int pid, int sig);
|
asmlinkage long sys_kill(int pid, int sig);
|
||||||
asmlinkage long sys_tgkill(int tgid, int pid, int sig);
|
asmlinkage long sys_tgkill(int tgid, int pid, int sig);
|
||||||
asmlinkage long sys_tkill(int pid, int sig);
|
asmlinkage long sys_tkill(int pid, int sig);
|
||||||
|
@@ -1533,7 +1533,7 @@ void __init __rcu_init(void)
|
|||||||
int j;
|
int j;
|
||||||
struct rcu_node *rnp;
|
struct rcu_node *rnp;
|
||||||
|
|
||||||
printk(KERN_WARNING "Experimental hierarchical RCU implementation.\n");
|
printk(KERN_INFO "Hierarchical RCU implementation.\n");
|
||||||
#ifdef CONFIG_RCU_CPU_STALL_DETECTOR
|
#ifdef CONFIG_RCU_CPU_STALL_DETECTOR
|
||||||
printk(KERN_INFO "RCU-based detection of stalled CPUs is enabled.\n");
|
printk(KERN_INFO "RCU-based detection of stalled CPUs is enabled.\n");
|
||||||
#endif /* #ifdef CONFIG_RCU_CPU_STALL_DETECTOR */
|
#endif /* #ifdef CONFIG_RCU_CPU_STALL_DETECTOR */
|
||||||
@@ -1546,7 +1546,6 @@ void __init __rcu_init(void)
|
|||||||
rcu_cpu_notify(&rcu_nb, CPU_UP_PREPARE, (void *)(long)i);
|
rcu_cpu_notify(&rcu_nb, CPU_UP_PREPARE, (void *)(long)i);
|
||||||
/* Register notifier for non-boot CPUs */
|
/* Register notifier for non-boot CPUs */
|
||||||
register_cpu_notifier(&rcu_nb);
|
register_cpu_notifier(&rcu_nb);
|
||||||
printk(KERN_WARNING "Experimental hierarchical RCU init done.\n");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
module_param(blimit, int, 0);
|
module_param(blimit, int, 0);
|
||||||
|
@@ -716,7 +716,7 @@ void dma_debug_init(u32 num_entries)
|
|||||||
|
|
||||||
for (i = 0; i < HASH_SIZE; ++i) {
|
for (i = 0; i < HASH_SIZE; ++i) {
|
||||||
INIT_LIST_HEAD(&dma_entry_hash[i].list);
|
INIT_LIST_HEAD(&dma_entry_hash[i].list);
|
||||||
dma_entry_hash[i].lock = SPIN_LOCK_UNLOCKED;
|
spin_lock_init(&dma_entry_hash[i].lock);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (dma_debug_fs_init() != 0) {
|
if (dma_debug_fs_init() != 0) {
|
||||||
@@ -856,22 +856,21 @@ static void check_for_stack(struct device *dev, void *addr)
|
|||||||
"stack [addr=%p]\n", addr);
|
"stack [addr=%p]\n", addr);
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline bool overlap(void *addr, u64 size, void *start, void *end)
|
static inline bool overlap(void *addr, unsigned long len, void *start, void *end)
|
||||||
{
|
{
|
||||||
void *addr2 = (char *)addr + size;
|
unsigned long a1 = (unsigned long)addr;
|
||||||
|
unsigned long b1 = a1 + len;
|
||||||
|
unsigned long a2 = (unsigned long)start;
|
||||||
|
unsigned long b2 = (unsigned long)end;
|
||||||
|
|
||||||
return ((addr >= start && addr < end) ||
|
return !(b1 <= a2 || a1 >= b2);
|
||||||
(addr2 >= start && addr2 < end) ||
|
|
||||||
((addr < start) && (addr2 >= end)));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void check_for_illegal_area(struct device *dev, void *addr, u64 size)
|
static void check_for_illegal_area(struct device *dev, void *addr, unsigned long len)
|
||||||
{
|
{
|
||||||
if (overlap(addr, size, _text, _etext) ||
|
if (overlap(addr, len, _text, _etext) ||
|
||||||
overlap(addr, size, __start_rodata, __end_rodata))
|
overlap(addr, len, __start_rodata, __end_rodata))
|
||||||
err_printk(dev, NULL, "DMA-API: device driver maps "
|
err_printk(dev, NULL, "DMA-API: device driver maps memory from kernel text or rodata [addr=%p] [len=%lu]\n", addr, len);
|
||||||
"memory from kernel text or rodata "
|
|
||||||
"[addr=%p] [size=%llu]\n", addr, size);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void check_sync(struct device *dev,
|
static void check_sync(struct device *dev,
|
||||||
@@ -969,7 +968,8 @@ void debug_dma_map_page(struct device *dev, struct page *page, size_t offset,
|
|||||||
entry->type = dma_debug_single;
|
entry->type = dma_debug_single;
|
||||||
|
|
||||||
if (!PageHighMem(page)) {
|
if (!PageHighMem(page)) {
|
||||||
void *addr = ((char *)page_address(page)) + offset;
|
void *addr = page_address(page) + offset;
|
||||||
|
|
||||||
check_for_stack(dev, addr);
|
check_for_stack(dev, addr);
|
||||||
check_for_illegal_area(dev, addr, size);
|
check_for_illegal_area(dev, addr, size);
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user