Commit 6b2ada82 authored by Ingo Molnar's avatar Ingo Molnar

Merge branches 'core/softlockup', 'core/softirq', 'core/resources',...

Merge branches 'core/softlockup', 'core/softirq', 'core/resources', 'core/printk' and 'core/misc' into core-v28-for-linus
...@@ -111,9 +111,9 @@ unsigned long __init setup_memory(void) ...@@ -111,9 +111,9 @@ unsigned long __init setup_memory(void)
initrd_start, INITRD_SIZE); initrd_start, INITRD_SIZE);
} else { } else {
printk("initrd extends beyond end of memory " printk("initrd extends beyond end of memory "
"(0x%08lx > 0x%08lx)\ndisabling initrd\n", "(0x%08lx > 0x%08llx)\ndisabling initrd\n",
INITRD_START + INITRD_SIZE, INITRD_START + INITRD_SIZE,
PFN_PHYS(max_low_pfn)); (unsigned long long)PFN_PHYS(max_low_pfn));
initrd_start = 0; initrd_start = 0;
} }
......
...@@ -22,6 +22,9 @@ config WORD_SIZE ...@@ -22,6 +22,9 @@ config WORD_SIZE
config PPC_MERGE config PPC_MERGE
def_bool y def_bool y
config ARCH_PHYS_ADDR_T_64BIT
def_bool PPC64 || PHYS_64BIT
config MMU config MMU
bool bool
default y default y
......
...@@ -48,13 +48,6 @@ typedef struct { ...@@ -48,13 +48,6 @@ typedef struct {
typedef __vector128 vector128; typedef __vector128 vector128;
/* Physical address used by some IO functions */
#if defined(CONFIG_PPC64) || defined(CONFIG_PHYS_64BIT)
typedef u64 phys_addr_t;
#else
typedef u32 phys_addr_t;
#endif
#ifdef __powerpc64__ #ifdef __powerpc64__
typedef u64 dma_addr_t; typedef u64 dma_addr_t;
#else #else
......
...@@ -135,7 +135,6 @@ config PTE_64BIT ...@@ -135,7 +135,6 @@ config PTE_64BIT
config PHYS_64BIT config PHYS_64BIT
bool 'Large physical address support' if E500 bool 'Large physical address support' if E500
depends on 44x || E500 depends on 44x || E500
select RESOURCES_64BIT
default y if 44x default y if 44x
---help--- ---help---
This option enables kernel support for larger than 32-bit physical This option enables kernel support for larger than 32-bit physical
......
...@@ -41,13 +41,10 @@ extern unsigned long total_memory; ...@@ -41,13 +41,10 @@ extern unsigned long total_memory;
#define U64_TO_U32_LOW(val) ((u32)((val) & 0x00000000ffffffffULL)) #define U64_TO_U32_LOW(val) ((u32)((val) & 0x00000000ffffffffULL))
#define U64_TO_U32_HIGH(val) ((u32)((val) >> 32)) #define U64_TO_U32_HIGH(val) ((u32)((val) >> 32))
#ifdef CONFIG_RESOURCES_64BIT #define RES_TO_U32_LOW(val) \
#define RES_TO_U32_LOW(val) U64_TO_U32_LOW(val) ((sizeof(resource_size_t) > sizeof(u32)) ? U64_TO_U32_LOW(val) : (val))
#define RES_TO_U32_HIGH(val) U64_TO_U32_HIGH(val) #define RES_TO_U32_HIGH(val) \
#else ((sizeof(resource_size_t) > sizeof(u32)) ? U64_TO_U32_HIGH(val) : (0))
#define RES_TO_U32_LOW(val) (val)
#define RES_TO_U32_HIGH(val) (0)
#endif
static inline int ppc440spe_revA(void) static inline int ppc440spe_revA(void)
{ {
...@@ -145,12 +142,11 @@ static int __init ppc4xx_parse_dma_ranges(struct pci_controller *hose, ...@@ -145,12 +142,11 @@ static int __init ppc4xx_parse_dma_ranges(struct pci_controller *hose,
/* Use that */ /* Use that */
res->start = pci_addr; res->start = pci_addr;
#ifndef CONFIG_RESOURCES_64BIT
/* Beware of 32 bits resources */ /* Beware of 32 bits resources */
if ((pci_addr + size) > 0x100000000ull) if (sizeof(resource_size_t) == sizeof(u32) &&
(pci_addr + size) > 0x100000000ull)
res->end = 0xffffffff; res->end = 0xffffffff;
else else
#endif
res->end = res->start + size - 1; res->end = res->start + size - 1;
break; break;
} }
......
...@@ -947,13 +947,15 @@ config X86_PAE ...@@ -947,13 +947,15 @@ config X86_PAE
def_bool n def_bool n
prompt "PAE (Physical Address Extension) Support" prompt "PAE (Physical Address Extension) Support"
depends on X86_32 && !HIGHMEM4G depends on X86_32 && !HIGHMEM4G
select RESOURCES_64BIT
help help
PAE is required for NX support, and furthermore enables PAE is required for NX support, and furthermore enables
larger swapspace support for non-overcommit purposes. It larger swapspace support for non-overcommit purposes. It
has the cost of more pagetable lookup overhead, and also has the cost of more pagetable lookup overhead, and also
consumes more pagetable space per process. consumes more pagetable space per process.
config ARCH_PHYS_ADDR_T_64BIT
def_bool X86_64 || X86_PAE
# Common NUMA Features # Common NUMA Features
config NUMA config NUMA
bool "Numa Memory Allocation and Scheduler Support (EXPERIMENTAL)" bool "Numa Memory Allocation and Scheduler Support (EXPERIMENTAL)"
......
...@@ -1282,12 +1282,10 @@ void __init e820_reserve_resources(void) ...@@ -1282,12 +1282,10 @@ void __init e820_reserve_resources(void)
e820_res = res; e820_res = res;
for (i = 0; i < e820.nr_map; i++) { for (i = 0; i < e820.nr_map; i++) {
end = e820.map[i].addr + e820.map[i].size - 1; end = e820.map[i].addr + e820.map[i].size - 1;
#ifndef CONFIG_RESOURCES_64BIT if (end != (resource_size_t)end) {
if (end > 0x100000000ULL) {
res++; res++;
continue; continue;
} }
#endif
res->name = e820_type_to_string(e820.map[i].type); res->name = e820_type_to_string(e820.map[i].type);
res->start = e820.map[i].addr; res->start = e820.map[i].addr;
res->end = end; res->end = end;
......
...@@ -219,6 +219,12 @@ static void __iomem *__ioremap_caller(resource_size_t phys_addr, ...@@ -219,6 +219,12 @@ static void __iomem *__ioremap_caller(resource_size_t phys_addr,
if (is_ISA_range(phys_addr, last_addr)) if (is_ISA_range(phys_addr, last_addr))
return (__force void __iomem *)phys_to_virt(phys_addr); return (__force void __iomem *)phys_to_virt(phys_addr);
/*
* Check if the request spans more than any BAR in the iomem resource
* tree.
*/
WARN_ON(iomem_map_sanity_check(phys_addr, size));
/* /*
* Don't allow anybody to remap normal RAM that we're using.. * Don't allow anybody to remap normal RAM that we're using..
*/ */
......
...@@ -15,6 +15,11 @@ ...@@ -15,6 +15,11 @@
*/ */
static char dmi_empty_string[] = " "; static char dmi_empty_string[] = " ";
/*
* Catch too early calls to dmi_check_system():
*/
static int dmi_initialized;
static const char * __init dmi_string_nosave(const struct dmi_header *dm, u8 s) static const char * __init dmi_string_nosave(const struct dmi_header *dm, u8 s)
{ {
const u8 *bp = ((u8 *) dm) + dm->length; const u8 *bp = ((u8 *) dm) + dm->length;
...@@ -366,7 +371,7 @@ void __init dmi_scan_machine(void) ...@@ -366,7 +371,7 @@ void __init dmi_scan_machine(void)
if (efi_enabled) { if (efi_enabled) {
if (efi.smbios == EFI_INVALID_TABLE_ADDR) if (efi.smbios == EFI_INVALID_TABLE_ADDR)
goto out; goto error;
/* This is called as a core_initcall() because it isn't /* This is called as a core_initcall() because it isn't
* needed during early boot. This also means we can * needed during early boot. This also means we can
...@@ -374,13 +379,13 @@ void __init dmi_scan_machine(void) ...@@ -374,13 +379,13 @@ void __init dmi_scan_machine(void)
*/ */
p = dmi_ioremap(efi.smbios, 32); p = dmi_ioremap(efi.smbios, 32);
if (p == NULL) if (p == NULL)
goto out; goto error;
rc = dmi_present(p + 0x10); /* offset of _DMI_ string */ rc = dmi_present(p + 0x10); /* offset of _DMI_ string */
dmi_iounmap(p, 32); dmi_iounmap(p, 32);
if (!rc) { if (!rc) {
dmi_available = 1; dmi_available = 1;
return; goto out;
} }
} }
else { else {
...@@ -391,19 +396,22 @@ void __init dmi_scan_machine(void) ...@@ -391,19 +396,22 @@ void __init dmi_scan_machine(void)
*/ */
p = dmi_ioremap(0xF0000, 0x10000); p = dmi_ioremap(0xF0000, 0x10000);
if (p == NULL) if (p == NULL)
goto out; goto error;
for (q = p; q < p + 0x10000; q += 16) { for (q = p; q < p + 0x10000; q += 16) {
rc = dmi_present(q); rc = dmi_present(q);
if (!rc) { if (!rc) {
dmi_available = 1; dmi_available = 1;
dmi_iounmap(p, 0x10000); dmi_iounmap(p, 0x10000);
return; goto out;
} }
} }
dmi_iounmap(p, 0x10000); dmi_iounmap(p, 0x10000);
} }
out: printk(KERN_INFO "DMI not present or invalid.\n"); error:
printk(KERN_INFO "DMI not present or invalid.\n");
out:
dmi_initialized = 1;
} }
/** /**
...@@ -424,6 +432,8 @@ int dmi_check_system(const struct dmi_system_id *list) ...@@ -424,6 +432,8 @@ int dmi_check_system(const struct dmi_system_id *list)
int i, count = 0; int i, count = 0;
const struct dmi_system_id *d = list; const struct dmi_system_id *d = list;
WARN(!dmi_initialized, KERN_ERR "dmi check: not initialized yet.\n");
while (d->ident) { while (d->ident) {
for (i = 0; i < ARRAY_SIZE(d->matches); i++) { for (i = 0; i < ARRAY_SIZE(d->matches); i++) {
int s = d->matches[i].slot; int s = d->matches[i].slot;
......
...@@ -276,7 +276,7 @@ int __init ibmphp_access_ebda (void) ...@@ -276,7 +276,7 @@ int __init ibmphp_access_ebda (void)
iounmap (io_mem); iounmap (io_mem);
debug ("returned ebda segment: %x\n", ebda_seg); debug ("returned ebda segment: %x\n", ebda_seg);
io_mem = ioremap (ebda_seg<<4, 65000); io_mem = ioremap(ebda_seg<<4, 1024);
if (!io_mem ) if (!io_mem )
return -ENOMEM; return -ENOMEM;
next_offset = 0x180; next_offset = 0x180;
......
...@@ -378,11 +378,10 @@ static int pbus_size_mem(struct pci_bus *bus, unsigned long mask, unsigned long ...@@ -378,11 +378,10 @@ static int pbus_size_mem(struct pci_bus *bus, unsigned long mask, unsigned long
align = 0; align = 0;
min_align = 0; min_align = 0;
for (order = 0; order <= max_order; order++) { for (order = 0; order <= max_order; order++) {
#ifdef CONFIG_RESOURCES_64BIT resource_size_t align1 = 1;
resource_size_t align1 = 1ULL << (order + 20);
#else align1 <<= (order + 20);
resource_size_t align1 = 1U << (order + 20);
#endif
if (!align) if (!align)
min_align = align1; min_align = align1;
else if (ALIGN(align + min_align, min_align) < align1) else if (ALIGN(align + min_align, min_align) < align1)
......
...@@ -39,7 +39,6 @@ typedef u64 pmdval_t; ...@@ -39,7 +39,6 @@ typedef u64 pmdval_t;
typedef u64 pudval_t; typedef u64 pudval_t;
typedef u64 pgdval_t; typedef u64 pgdval_t;
typedef u64 pgprotval_t; typedef u64 pgprotval_t;
typedef u64 phys_addr_t;
typedef union { typedef union {
struct { struct {
...@@ -60,7 +59,6 @@ typedef unsigned long pmdval_t; ...@@ -60,7 +59,6 @@ typedef unsigned long pmdval_t;
typedef unsigned long pudval_t; typedef unsigned long pudval_t;
typedef unsigned long pgdval_t; typedef unsigned long pgdval_t;
typedef unsigned long pgprotval_t; typedef unsigned long pgprotval_t;
typedef unsigned long phys_addr_t;
typedef union { typedef union {
pteval_t pte; pteval_t pte;
......
...@@ -79,7 +79,6 @@ typedef unsigned long pmdval_t; ...@@ -79,7 +79,6 @@ typedef unsigned long pmdval_t;
typedef unsigned long pudval_t; typedef unsigned long pudval_t;
typedef unsigned long pgdval_t; typedef unsigned long pgdval_t;
typedef unsigned long pgprotval_t; typedef unsigned long pgprotval_t;
typedef unsigned long phys_addr_t;
typedef struct page *pgtable_t; typedef struct page *pgtable_t;
......
...@@ -76,13 +76,13 @@ static inline unsigned long mfn_to_pfn(unsigned long mfn) ...@@ -76,13 +76,13 @@ static inline unsigned long mfn_to_pfn(unsigned long mfn)
static inline xmaddr_t phys_to_machine(xpaddr_t phys) static inline xmaddr_t phys_to_machine(xpaddr_t phys)
{ {
unsigned offset = phys.paddr & ~PAGE_MASK; unsigned offset = phys.paddr & ~PAGE_MASK;
return XMADDR(PFN_PHYS((u64)pfn_to_mfn(PFN_DOWN(phys.paddr))) | offset); return XMADDR(PFN_PHYS(pfn_to_mfn(PFN_DOWN(phys.paddr))) | offset);
} }
static inline xpaddr_t machine_to_phys(xmaddr_t machine) static inline xpaddr_t machine_to_phys(xmaddr_t machine)
{ {
unsigned offset = machine.maddr & ~PAGE_MASK; unsigned offset = machine.maddr & ~PAGE_MASK;
return XPADDR(PFN_PHYS((u64)mfn_to_pfn(PFN_DOWN(machine.maddr))) | offset); return XPADDR(PFN_PHYS(mfn_to_pfn(PFN_DOWN(machine.maddr))) | offset);
} }
/* /*
......
...@@ -252,6 +252,8 @@ enum ...@@ -252,6 +252,8 @@ enum
HRTIMER_SOFTIRQ, HRTIMER_SOFTIRQ,
#endif #endif
RCU_SOFTIRQ, /* Preferable RCU should always be the last softirq */ RCU_SOFTIRQ, /* Preferable RCU should always be the last softirq */
NR_SOFTIRQS
}; };
/* softirq mask and active fields moved to irq_cpustat_t in /* softirq mask and active fields moved to irq_cpustat_t in
......
...@@ -169,6 +169,7 @@ extern struct resource * __devm_request_region(struct device *dev, ...@@ -169,6 +169,7 @@ extern struct resource * __devm_request_region(struct device *dev,
extern void __devm_release_region(struct device *dev, struct resource *parent, extern void __devm_release_region(struct device *dev, struct resource *parent,
resource_size_t start, resource_size_t n); resource_size_t start, resource_size_t n);
extern int iomem_map_sanity_check(resource_size_t addr, unsigned long size);
#endif /* __ASSEMBLY__ */ #endif /* __ASSEMBLY__ */
#endif /* _LINUX_IOPORT_H */ #endif /* _LINUX_IOPORT_H */
...@@ -213,6 +213,9 @@ static inline bool printk_timed_ratelimit(unsigned long *caller_jiffies, \ ...@@ -213,6 +213,9 @@ static inline bool printk_timed_ratelimit(unsigned long *caller_jiffies, \
{ return false; } { return false; }
#endif #endif
extern int printk_needs_cpu(int cpu);
extern void printk_tick(void);
extern void asmlinkage __attribute__((format(printf, 1, 2))) extern void asmlinkage __attribute__((format(printf, 1, 2)))
early_printk(const char *fmt, ...); early_printk(const char *fmt, ...);
......
#ifndef _LINUX_PFN_H_ #ifndef _LINUX_PFN_H_
#define _LINUX_PFN_H_ #define _LINUX_PFN_H_
#ifndef __ASSEMBLY__
#include <linux/types.h>
#endif
#define PFN_ALIGN(x) (((unsigned long)(x) + (PAGE_SIZE - 1)) & PAGE_MASK) #define PFN_ALIGN(x) (((unsigned long)(x) + (PAGE_SIZE - 1)) & PAGE_MASK)
#define PFN_UP(x) (((x) + PAGE_SIZE-1) >> PAGE_SHIFT) #define PFN_UP(x) (((x) + PAGE_SIZE-1) >> PAGE_SHIFT)
#define PFN_DOWN(x) ((x) >> PAGE_SHIFT) #define PFN_DOWN(x) ((x) >> PAGE_SHIFT)
#define PFN_PHYS(x) ((x) << PAGE_SHIFT) #define PFN_PHYS(x) ((phys_addr_t)(x) << PAGE_SHIFT)
#endif #endif
...@@ -191,12 +191,14 @@ typedef __u32 __bitwise __wsum; ...@@ -191,12 +191,14 @@ typedef __u32 __bitwise __wsum;
#ifdef __KERNEL__ #ifdef __KERNEL__
typedef unsigned __bitwise__ gfp_t; typedef unsigned __bitwise__ gfp_t;
#ifdef CONFIG_RESOURCES_64BIT #ifdef CONFIG_PHYS_ADDR_T_64BIT
typedef u64 resource_size_t; typedef u64 phys_addr_t;
#else #else
typedef u32 resource_size_t; typedef u32 phys_addr_t;
#endif #endif
typedef phys_addr_t resource_size_t;
struct ustat { struct ustat {
__kernel_daddr_t f_tfree; __kernel_daddr_t f_tfree;
__kernel_ino_t f_tinode; __kernel_ino_t f_tinode;
......
...@@ -577,9 +577,6 @@ static int have_callable_console(void) ...@@ -577,9 +577,6 @@ static int have_callable_console(void)
* @fmt: format string * @fmt: format string
* *
* This is printk(). It can be called from any context. We want it to work. * This is printk(). It can be called from any context. We want it to work.
* Be aware of the fact that if oops_in_progress is not set, we might try to
* wake klogd up which could deadlock on runqueue lock if printk() is called
* from scheduler code.
* *
* We try to grab the console_sem. If we succeed, it's easy - we log the output and * We try to grab the console_sem. If we succeed, it's easy - we log the output and
* call the console drivers. If we fail to get the semaphore we place the output * call the console drivers. If we fail to get the semaphore we place the output
...@@ -982,10 +979,25 @@ int is_console_locked(void) ...@@ -982,10 +979,25 @@ int is_console_locked(void)
return console_locked; return console_locked;
} }
void wake_up_klogd(void) static DEFINE_PER_CPU(int, printk_pending);
void printk_tick(void)
{ {
if (!oops_in_progress && waitqueue_active(&log_wait)) if (__get_cpu_var(printk_pending)) {
__get_cpu_var(printk_pending) = 0;
wake_up_interruptible(&log_wait); wake_up_interruptible(&log_wait);
}
}
int printk_needs_cpu(int cpu)
{
return per_cpu(printk_pending, cpu);
}
void wake_up_klogd(void)
{
if (waitqueue_active(&log_wait))
__raw_get_cpu_var(printk_pending) = 1;
} }
/** /**
......
...@@ -38,10 +38,6 @@ EXPORT_SYMBOL(iomem_resource); ...@@ -38,10 +38,6 @@ EXPORT_SYMBOL(iomem_resource);
static DEFINE_RWLOCK(resource_lock); static DEFINE_RWLOCK(resource_lock);
#ifdef CONFIG_PROC_FS
enum { MAX_IORES_LEVEL = 5 };
static void *r_next(struct seq_file *m, void *v, loff_t *pos) static void *r_next(struct seq_file *m, void *v, loff_t *pos)
{ {
struct resource *p = v; struct resource *p = v;
...@@ -53,6 +49,10 @@ static void *r_next(struct seq_file *m, void *v, loff_t *pos) ...@@ -53,6 +49,10 @@ static void *r_next(struct seq_file *m, void *v, loff_t *pos)
return p->sibling; return p->sibling;
} }
#ifdef CONFIG_PROC_FS
enum { MAX_IORES_LEVEL = 5 };
static void *r_start(struct seq_file *m, loff_t *pos) static void *r_start(struct seq_file *m, loff_t *pos)
__acquires(resource_lock) __acquires(resource_lock)
{ {
...@@ -549,13 +549,9 @@ static void __init __reserve_region_with_split(struct resource *root, ...@@ -549,13 +549,9 @@ static void __init __reserve_region_with_split(struct resource *root,
} }
if (!res) { if (!res) {
printk(KERN_DEBUG " __reserve_region_with_split: (%s) [%llx, %llx], res: (%s) [%llx, %llx]\n",
conflict->name, conflict->start, conflict->end,
name, start, end);
/* failed, split and try again */ /* failed, split and try again */
/* conflict coverred whole area */ /* conflict covered whole area */
if (conflict->start <= start && conflict->end >= end) if (conflict->start <= start && conflict->end >= end)
return; return;
...@@ -831,3 +827,40 @@ static int __init reserve_setup(char *str) ...@@ -831,3 +827,40 @@ static int __init reserve_setup(char *str)
} }
__setup("reserve=", reserve_setup); __setup("reserve=", reserve_setup);
/*
* Check if the requested addr and size spans more than any slot in the
* iomem resource tree.
*/
int iomem_map_sanity_check(resource_size_t addr, unsigned long size)
{
struct resource *p = &iomem_resource;
int err = 0;
loff_t l;
read_lock(&resource_lock);
for (p = p->child; p ; p = r_next(NULL, p, &l)) {
/*
* We can probably skip the resources without
* IORESOURCE_IO attribute?
*/
if (p->start >= addr + size)
continue;
if (p->end < addr)
continue;
if (p->start <= addr && (p->end >= addr + size - 1))
continue;
printk(KERN_WARNING "resource map sanity check conflict: "
"0x%llx 0x%llx 0x%llx 0x%llx %s\n",
(unsigned long long)addr,
(unsigned long long)(addr + size - 1),
(unsigned long long)p->start,
(unsigned long long)p->end,
p->name);
err = -1;
break;
}
read_unlock(&resource_lock);
return err;
}
...@@ -46,7 +46,7 @@ irq_cpustat_t irq_stat[NR_CPUS] ____cacheline_aligned; ...@@ -46,7 +46,7 @@ irq_cpustat_t irq_stat[NR_CPUS] ____cacheline_aligned;
EXPORT_SYMBOL(irq_stat); EXPORT_SYMBOL(irq_stat);
#endif #endif
static struct softirq_action softirq_vec[32] __cacheline_aligned_in_smp; static struct softirq_action softirq_vec[NR_SOFTIRQS] __cacheline_aligned_in_smp;
static DEFINE_PER_CPU(struct task_struct *, ksoftirqd); static DEFINE_PER_CPU(struct task_struct *, ksoftirqd);
...@@ -205,7 +205,18 @@ asmlinkage void __do_softirq(void) ...@@ -205,7 +205,18 @@ asmlinkage void __do_softirq(void)
do { do {
if (pending & 1) { if (pending & 1) {
int prev_count = preempt_count();
h->action(h); h->action(h);
if (unlikely(prev_count != preempt_count())) {
printk(KERN_ERR "huh, entered softirq %d %p"
"with preempt_count %08x,"
" exited with %08x?\n", h - softirq_vec,
h->action, prev_count, preempt_count());
preempt_count() = prev_count;
}
rcu_bh_qsctr_inc(cpu); rcu_bh_qsctr_inc(cpu);
} }
h++; h++;
......
...@@ -270,7 +270,7 @@ void tick_nohz_stop_sched_tick(int inidle) ...@@ -270,7 +270,7 @@ void tick_nohz_stop_sched_tick(int inidle)
next_jiffies = get_next_timer_interrupt(last_jiffies); next_jiffies = get_next_timer_interrupt(last_jiffies);
delta_jiffies = next_jiffies - last_jiffies; delta_jiffies = next_jiffies - last_jiffies;
if (rcu_needs_cpu(cpu)) if (rcu_needs_cpu(cpu) || printk_needs_cpu(cpu))
delta_jiffies = 1; delta_jiffies = 1;
/* /*
* Do not stop the tick, if we are only one off * Do not stop the tick, if we are only one off
......
...@@ -978,6 +978,7 @@ void update_process_times(int user_tick) ...@@ -978,6 +978,7 @@ void update_process_times(int user_tick)
run_local_timers(); run_local_timers();
if (rcu_pending(cpu)) if (rcu_pending(cpu))
rcu_check_callbacks(cpu, user_tick); rcu_check_callbacks(cpu, user_tick);
printk_tick();
scheduler_tick(); scheduler_tick();
run_posix_cpu_timers(p); run_posix_cpu_timers(p);
} }
......
...@@ -187,6 +187,9 @@ config RESOURCES_64BIT ...@@ -187,6 +187,9 @@ config RESOURCES_64BIT
help help
This option allows memory and IO resources to be 64 bit. This option allows memory and IO resources to be 64 bit.
config PHYS_ADDR_T_64BIT
def_bool 64BIT || ARCH_PHYS_ADDR_T_64BIT
config ZONE_DMA_FLAG config ZONE_DMA_FLAG
int int
default "0" if !ZONE_DMA default "0" if !ZONE_DMA
......
...@@ -1100,8 +1100,9 @@ static void do_generic_file_read(struct file *filp, loff_t *ppos, ...@@ -1100,8 +1100,9 @@ static void do_generic_file_read(struct file *filp, loff_t *ppos,
page_not_up_to_date: page_not_up_to_date:
/* Get exclusive access to the page ... */ /* Get exclusive access to the page ... */
if (lock_page_killable(page)) error = lock_page_killable(page);
goto readpage_eio; if (unlikely(error))
goto readpage_error;
page_not_up_to_date_locked: page_not_up_to_date_locked:
/* Did it get truncated before we got the lock? */ /* Did it get truncated before we got the lock? */
...@@ -1130,8 +1131,9 @@ static void do_generic_file_read(struct file *filp, loff_t *ppos, ...@@ -1130,8 +1131,9 @@ static void do_generic_file_read(struct file *filp, loff_t *ppos,
} }
if (!PageUptodate(page)) { if (!PageUptodate(page)) {
if (lock_page_killable(page)) error = lock_page_killable(page);
goto readpage_eio; if (unlikely(error))
goto readpage_error;
if (!PageUptodate(page)) { if (!PageUptodate(page)) {
if (page->mapping == NULL) { if (page->mapping == NULL) {
/* /*
...@@ -1143,15 +1145,14 @@ static void do_generic_file_read(struct file *filp, loff_t *ppos, ...@@ -1143,15 +1145,14 @@ static void do_generic_file_read(struct file *filp, loff_t *ppos,
} }
unlock_page(page); unlock_page(page);
shrink_readahead_size_eio(filp, ra); shrink_readahead_size_eio(filp, ra);
goto readpage_eio; error = -EIO;
goto readpage_error;
} }
unlock_page(page); unlock_page(page);
} }
goto page_ok; goto page_ok;
readpage_eio:
error = -EIO;
readpage_error: readpage_error:
/* UHHUH! A synchronous read error occurred. Report it */ /* UHHUH! A synchronous read error occurred. Report it */
desc->error = error; desc->error = error;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment