Updated from Linux LTS 3.10.25 to 3.10.26
This commit is contained in:
parent
92cb237c3b
commit
c205d496ee
@ -1468,6 +1468,10 @@ bytes respectively. Such letter suffixes can also be entirely omitted.
|
||||
|
||||
* dump_id: dump IDENTIFY data.
|
||||
|
||||
* atapi_dmadir: Enable ATAPI DMADIR bridge support
|
||||
|
||||
* disable: Disable this device.
|
||||
|
||||
If there are multiple matching configurations changing
|
||||
the same attribute, the last one is used.
|
||||
|
||||
|
2
Makefile
2
Makefile
@ -1,6 +1,6 @@
|
||||
VERSION = 3
|
||||
PATCHLEVEL = 10
|
||||
SUBLEVEL = 25
|
||||
SUBLEVEL = 26
|
||||
EXTRAVERSION =
|
||||
NAME = TOSSUG Baby Fish
|
||||
|
||||
|
@ -80,15 +80,6 @@ static inline u32 arch_timer_get_cntfrq(void)
|
||||
return val;
|
||||
}
|
||||
|
||||
static inline u64 arch_counter_get_cntpct(void)
|
||||
{
|
||||
u64 cval;
|
||||
|
||||
isb();
|
||||
asm volatile("mrrc p15, 0, %Q0, %R0, c14" : "=r" (cval));
|
||||
return cval;
|
||||
}
|
||||
|
||||
static inline u64 arch_counter_get_cntvct(void)
|
||||
{
|
||||
u64 cval;
|
||||
|
@ -153,6 +153,8 @@ THUMB( orr r7, #(1 << 30) ) @ HSCTLR.TE
|
||||
mrc p15, 4, r7, c14, c1, 0 @ CNTHCTL
|
||||
orr r7, r7, #3 @ PL1PCEN | PL1PCTEN
|
||||
mcr p15, 4, r7, c14, c1, 0 @ CNTHCTL
|
||||
mov r7, #0
|
||||
mcrr p15, 4, r7, r7, c14 @ CNTVOFF
|
||||
1:
|
||||
#endif
|
||||
|
||||
|
@ -503,6 +503,10 @@ vcpu .req r0 @ vcpu pointer always in r0
|
||||
add r5, vcpu, r4
|
||||
strd r2, r3, [r5]
|
||||
|
||||
@ Ensure host CNTVCT == CNTPCT
|
||||
mov r2, #0
|
||||
mcrr p15, 4, r2, r2, c14 @ CNTVOFF
|
||||
|
||||
1:
|
||||
#endif
|
||||
@ Allow physical timer/counter access for the host
|
||||
|
@ -796,7 +796,7 @@ struct omap_hwmod omap2xxx_counter_32k_hwmod = {
|
||||
|
||||
/* gpmc */
|
||||
static struct omap_hwmod_irq_info omap2xxx_gpmc_irqs[] = {
|
||||
{ .irq = 20 },
|
||||
{ .irq = 20 + OMAP_INTC_START, },
|
||||
{ .irq = -1 }
|
||||
};
|
||||
|
||||
@ -841,7 +841,7 @@ static struct omap_hwmod_class omap2_rng_hwmod_class = {
|
||||
};
|
||||
|
||||
static struct omap_hwmod_irq_info omap2_rng_mpu_irqs[] = {
|
||||
{ .irq = 52 },
|
||||
{ .irq = 52 + OMAP_INTC_START, },
|
||||
{ .irq = -1 }
|
||||
};
|
||||
|
||||
|
@ -2152,7 +2152,7 @@ static struct omap_hwmod_class omap3xxx_gpmc_hwmod_class = {
|
||||
};
|
||||
|
||||
static struct omap_hwmod_irq_info omap3xxx_gpmc_irqs[] = {
|
||||
{ .irq = 20 },
|
||||
{ .irq = 20 + OMAP_INTC_START, },
|
||||
{ .irq = -1 }
|
||||
};
|
||||
|
||||
@ -2986,7 +2986,7 @@ static struct omap_mmu_dev_attr mmu_isp_dev_attr = {
|
||||
|
||||
static struct omap_hwmod omap3xxx_mmu_isp_hwmod;
|
||||
static struct omap_hwmod_irq_info omap3xxx_mmu_isp_irqs[] = {
|
||||
{ .irq = 24 },
|
||||
{ .irq = 24 + OMAP_INTC_START, },
|
||||
{ .irq = -1 }
|
||||
};
|
||||
|
||||
@ -3028,7 +3028,7 @@ static struct omap_mmu_dev_attr mmu_iva_dev_attr = {
|
||||
|
||||
static struct omap_hwmod omap3xxx_mmu_iva_hwmod;
|
||||
static struct omap_hwmod_irq_info omap3xxx_mmu_iva_irqs[] = {
|
||||
{ .irq = 28 },
|
||||
{ .irq = 28 + OMAP_INTC_START, },
|
||||
{ .irq = -1 }
|
||||
};
|
||||
|
||||
|
@ -6,6 +6,8 @@
|
||||
|
||||
/dts-v1/;
|
||||
|
||||
/memreserve/ 0x80000000 0x00010000;
|
||||
|
||||
/ {
|
||||
model = "Foundation-v8A";
|
||||
compatible = "arm,foundation-aarch64", "arm,vexpress";
|
||||
|
@ -110,16 +110,6 @@ static inline void __cpuinit arch_counter_set_user_access(void)
|
||||
asm volatile("msr cntkctl_el1, %0" : : "r" (cntkctl));
|
||||
}
|
||||
|
||||
static inline u64 arch_counter_get_cntpct(void)
|
||||
{
|
||||
u64 cval;
|
||||
|
||||
isb();
|
||||
asm volatile("mrs %0, cntpct_el0" : "=r" (cval));
|
||||
|
||||
return cval;
|
||||
}
|
||||
|
||||
static inline u64 arch_counter_get_cntvct(void)
|
||||
{
|
||||
u64 cval;
|
||||
|
@ -184,7 +184,7 @@ static inline void set_pte_at(struct mm_struct *mm, unsigned long addr,
|
||||
#define pgprot_noncached(prot) \
|
||||
__pgprot_modify(prot, PTE_ATTRINDX_MASK, PTE_ATTRINDX(MT_DEVICE_nGnRnE))
|
||||
#define pgprot_writecombine(prot) \
|
||||
__pgprot_modify(prot, PTE_ATTRINDX_MASK, PTE_ATTRINDX(MT_DEVICE_GRE))
|
||||
__pgprot_modify(prot, PTE_ATTRINDX_MASK, PTE_ATTRINDX(MT_NORMAL_NC))
|
||||
#define pgprot_dmacoherent(prot) \
|
||||
__pgprot_modify(prot, PTE_ATTRINDX_MASK, PTE_ATTRINDX(MT_NORMAL_NC))
|
||||
#define __HAVE_PHYS_MEM_ACCESS_PROT
|
||||
|
@ -59,9 +59,10 @@ static inline int arch_spin_trylock(arch_spinlock_t *lock)
|
||||
unsigned int tmp;
|
||||
|
||||
asm volatile(
|
||||
" ldaxr %w0, %1\n"
|
||||
"2: ldaxr %w0, %1\n"
|
||||
" cbnz %w0, 1f\n"
|
||||
" stxr %w0, %w2, %1\n"
|
||||
" cbnz %w0, 2b\n"
|
||||
"1:\n"
|
||||
: "=&r" (tmp), "+Q" (lock->lock)
|
||||
: "r" (1)
|
||||
|
@ -59,6 +59,9 @@ static inline void syscall_get_arguments(struct task_struct *task,
|
||||
unsigned int i, unsigned int n,
|
||||
unsigned long *args)
|
||||
{
|
||||
if (n == 0)
|
||||
return;
|
||||
|
||||
if (i + n > SYSCALL_MAX_ARGS) {
|
||||
unsigned long *args_bad = args + SYSCALL_MAX_ARGS - i;
|
||||
unsigned int n_bad = n + i - SYSCALL_MAX_ARGS;
|
||||
@ -82,6 +85,9 @@ static inline void syscall_set_arguments(struct task_struct *task,
|
||||
unsigned int i, unsigned int n,
|
||||
const unsigned long *args)
|
||||
{
|
||||
if (n == 0)
|
||||
return;
|
||||
|
||||
if (i + n > SYSCALL_MAX_ARGS) {
|
||||
pr_warning("%s called with max args %d, handling only %d\n",
|
||||
__func__, i + n, SYSCALL_MAX_ARGS);
|
||||
|
@ -24,10 +24,10 @@
|
||||
#include <linux/compiler.h>
|
||||
|
||||
#ifndef CONFIG_ARM64_64K_PAGES
|
||||
#define THREAD_SIZE_ORDER 1
|
||||
#define THREAD_SIZE_ORDER 2
|
||||
#endif
|
||||
|
||||
#define THREAD_SIZE 8192
|
||||
#define THREAD_SIZE 16384
|
||||
#define THREAD_START_SP (THREAD_SIZE - 16)
|
||||
|
||||
#ifndef __ASSEMBLY__
|
||||
|
@ -21,6 +21,7 @@
|
||||
#define BOOT_CPU_MODE_EL2 (0x0e12b007)
|
||||
|
||||
#ifndef __ASSEMBLY__
|
||||
#include <asm/cacheflush.h>
|
||||
|
||||
/*
|
||||
* __boot_cpu_mode records what mode CPUs were booted in.
|
||||
@ -36,9 +37,20 @@ extern u32 __boot_cpu_mode[2];
|
||||
void __hyp_set_vectors(phys_addr_t phys_vector_base);
|
||||
phys_addr_t __hyp_get_vectors(void);
|
||||
|
||||
static inline void sync_boot_mode(void)
|
||||
{
|
||||
/*
|
||||
* As secondaries write to __boot_cpu_mode with caches disabled, we
|
||||
* must flush the corresponding cache entries to ensure the visibility
|
||||
* of their writes.
|
||||
*/
|
||||
__flush_dcache_area(__boot_cpu_mode, sizeof(__boot_cpu_mode));
|
||||
}
|
||||
|
||||
/* Reports the availability of HYP mode */
|
||||
static inline bool is_hyp_mode_available(void)
|
||||
{
|
||||
sync_boot_mode();
|
||||
return (__boot_cpu_mode[0] == BOOT_CPU_MODE_EL2 &&
|
||||
__boot_cpu_mode[1] == BOOT_CPU_MODE_EL2);
|
||||
}
|
||||
@ -46,6 +58,7 @@ static inline bool is_hyp_mode_available(void)
|
||||
/* Check if the bootloader has booted CPUs in different modes */
|
||||
static inline bool is_hyp_mode_mismatched(void)
|
||||
{
|
||||
sync_boot_mode();
|
||||
return __boot_cpu_mode[0] != __boot_cpu_mode[1];
|
||||
}
|
||||
|
||||
|
@ -121,7 +121,7 @@
|
||||
|
||||
.macro get_thread_info, rd
|
||||
mov \rd, sp
|
||||
and \rd, \rd, #~((1 << 13) - 1) // top of 8K stack
|
||||
and \rd, \rd, #~(THREAD_SIZE - 1) // top of stack
|
||||
.endm
|
||||
|
||||
/*
|
||||
|
@ -79,8 +79,10 @@ void fpsimd_thread_switch(struct task_struct *next)
|
||||
|
||||
void fpsimd_flush_thread(void)
|
||||
{
|
||||
preempt_disable();
|
||||
memset(¤t->thread.fpsimd_state, 0, sizeof(struct fpsimd_state));
|
||||
fpsimd_load_state(¤t->thread.fpsimd_state);
|
||||
preempt_enable();
|
||||
}
|
||||
|
||||
/*
|
||||
|
@ -236,31 +236,29 @@ static int ptrace_hbp_fill_attr_ctrl(unsigned int note_type,
|
||||
{
|
||||
int err, len, type, disabled = !ctrl.enabled;
|
||||
|
||||
if (disabled) {
|
||||
len = 0;
|
||||
type = HW_BREAKPOINT_EMPTY;
|
||||
} else {
|
||||
err = arch_bp_generic_fields(ctrl, &len, &type);
|
||||
if (err)
|
||||
return err;
|
||||
attr->disabled = disabled;
|
||||
if (disabled)
|
||||
return 0;
|
||||
|
||||
switch (note_type) {
|
||||
case NT_ARM_HW_BREAK:
|
||||
if ((type & HW_BREAKPOINT_X) != type)
|
||||
return -EINVAL;
|
||||
break;
|
||||
case NT_ARM_HW_WATCH:
|
||||
if ((type & HW_BREAKPOINT_RW) != type)
|
||||
return -EINVAL;
|
||||
break;
|
||||
default:
|
||||
err = arch_bp_generic_fields(ctrl, &len, &type);
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
switch (note_type) {
|
||||
case NT_ARM_HW_BREAK:
|
||||
if ((type & HW_BREAKPOINT_X) != type)
|
||||
return -EINVAL;
|
||||
}
|
||||
break;
|
||||
case NT_ARM_HW_WATCH:
|
||||
if ((type & HW_BREAKPOINT_RW) != type)
|
||||
return -EINVAL;
|
||||
break;
|
||||
default:
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
attr->bp_len = len;
|
||||
attr->bp_type = type;
|
||||
attr->disabled = disabled;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
@ -199,13 +199,6 @@ asmlinkage void __cpuinit secondary_start_kernel(void)
|
||||
raw_spin_lock(&boot_lock);
|
||||
raw_spin_unlock(&boot_lock);
|
||||
|
||||
/*
|
||||
* Enable local interrupts.
|
||||
*/
|
||||
notify_cpu_starting(cpu);
|
||||
local_irq_enable();
|
||||
local_fiq_enable();
|
||||
|
||||
/*
|
||||
* OK, now it's safe to let the boot CPU continue. Wait for
|
||||
* the CPU migration code to notice that the CPU is online
|
||||
@ -214,6 +207,14 @@ asmlinkage void __cpuinit secondary_start_kernel(void)
|
||||
set_cpu_online(cpu, true);
|
||||
complete(&cpu_running);
|
||||
|
||||
/*
|
||||
* Enable GIC and timers.
|
||||
*/
|
||||
notify_cpu_starting(cpu);
|
||||
|
||||
local_irq_enable();
|
||||
local_fiq_enable();
|
||||
|
||||
/*
|
||||
* OK, it's off to the idle thread for us
|
||||
*/
|
||||
|
@ -77,14 +77,12 @@ void __flush_dcache_page(struct page *page)
|
||||
|
||||
void __sync_icache_dcache(pte_t pte, unsigned long addr)
|
||||
{
|
||||
unsigned long pfn;
|
||||
struct page *page;
|
||||
struct page *page = pte_page(pte);
|
||||
|
||||
pfn = pte_pfn(pte);
|
||||
if (!pfn_valid(pfn))
|
||||
/* no flushing needed for anonymous pages */
|
||||
if (!page_mapping(page))
|
||||
return;
|
||||
|
||||
page = pfn_to_page(pfn);
|
||||
if (!test_and_set_bit(PG_dcache_clean, &page->flags)) {
|
||||
__flush_dcache_page(page);
|
||||
__flush_icache_all();
|
||||
@ -94,28 +92,14 @@ void __sync_icache_dcache(pte_t pte, unsigned long addr)
|
||||
}
|
||||
|
||||
/*
|
||||
* Ensure cache coherency between kernel mapping and userspace mapping of this
|
||||
* page.
|
||||
* This function is called when a page has been modified by the kernel. Mark
|
||||
* it as dirty for later flushing when mapped in user space (if executable,
|
||||
* see __sync_icache_dcache).
|
||||
*/
|
||||
void flush_dcache_page(struct page *page)
|
||||
{
|
||||
struct address_space *mapping;
|
||||
|
||||
/*
|
||||
* The zero page is never written to, so never has any dirty cache
|
||||
* lines, and therefore never needs to be flushed.
|
||||
*/
|
||||
if (page == ZERO_PAGE(0))
|
||||
return;
|
||||
|
||||
mapping = page_mapping(page);
|
||||
if (mapping && mapping_mapped(mapping)) {
|
||||
__flush_dcache_page(page);
|
||||
__flush_icache_all();
|
||||
set_bit(PG_dcache_clean, &page->flags);
|
||||
} else {
|
||||
if (test_bit(PG_dcache_clean, &page->flags))
|
||||
clear_bit(PG_dcache_clean, &page->flags);
|
||||
}
|
||||
}
|
||||
EXPORT_SYMBOL(flush_dcache_page);
|
||||
|
||||
|
@ -339,7 +339,6 @@ void __init paging_init(void)
|
||||
bootmem_init();
|
||||
|
||||
empty_zero_page = virt_to_page(zero_page);
|
||||
__flush_dcache_page(empty_zero_page);
|
||||
|
||||
/*
|
||||
* TTBR0 is only used for the identity mapping at this stage. Make it
|
||||
|
@ -95,10 +95,6 @@ ENTRY(cpu_do_switch_mm)
|
||||
ret
|
||||
ENDPROC(cpu_do_switch_mm)
|
||||
|
||||
cpu_name:
|
||||
.ascii "AArch64 Processor"
|
||||
.align
|
||||
|
||||
.section ".text.init", #alloc, #execinstr
|
||||
|
||||
/*
|
||||
|
@ -264,7 +264,7 @@ do_kvm_##n: \
|
||||
subi r1,r1,INT_FRAME_SIZE; /* alloc frame on kernel stack */ \
|
||||
beq- 1f; \
|
||||
ld r1,PACAKSAVE(r13); /* kernel stack to use */ \
|
||||
1: cmpdi cr1,r1,0; /* check if r1 is in userspace */ \
|
||||
1: cmpdi cr1,r1,-INT_FRAME_SIZE; /* check if r1 is in userspace */ \
|
||||
blt+ cr1,3f; /* abort if it is */ \
|
||||
li r1,(n); /* will be reloaded later */ \
|
||||
sth r1,PACA_TRAP_SAVE(r13); \
|
||||
|
@ -467,6 +467,7 @@ _STATIC(__after_prom_start)
|
||||
mtctr r8
|
||||
bctr
|
||||
|
||||
.balign 8
|
||||
p_end: .llong _end - _stext
|
||||
|
||||
4: /* Now copy the rest of the kernel up to _end */
|
||||
|
@ -473,11 +473,14 @@ static int kvmppc_mmu_book3s_64_hv_xlate(struct kvm_vcpu *vcpu, gva_t eaddr,
|
||||
slb_v = vcpu->kvm->arch.vrma_slb_v;
|
||||
}
|
||||
|
||||
preempt_disable();
|
||||
/* Find the HPTE in the hash table */
|
||||
index = kvmppc_hv_find_lock_hpte(kvm, eaddr, slb_v,
|
||||
HPTE_V_VALID | HPTE_V_ABSENT);
|
||||
if (index < 0)
|
||||
if (index < 0) {
|
||||
preempt_enable();
|
||||
return -ENOENT;
|
||||
}
|
||||
hptep = (unsigned long *)(kvm->arch.hpt_virt + (index << 4));
|
||||
v = hptep[0] & ~HPTE_V_HVLOCK;
|
||||
gr = kvm->arch.revmap[index].guest_rpte;
|
||||
@ -485,6 +488,7 @@ static int kvmppc_mmu_book3s_64_hv_xlate(struct kvm_vcpu *vcpu, gva_t eaddr,
|
||||
/* Unlock the HPTE */
|
||||
asm volatile("lwsync" : : : "memory");
|
||||
hptep[0] = v;
|
||||
preempt_enable();
|
||||
|
||||
gpte->eaddr = eaddr;
|
||||
gpte->vpage = ((v & HPTE_V_AVPN) << 4) | ((eaddr >> 12) & 0xfff);
|
||||
|
@ -724,6 +724,10 @@ static int slb_base_page_shift[4] = {
|
||||
20, /* 1M, unsupported */
|
||||
};
|
||||
|
||||
/* When called from virtmode, this func should be protected by
|
||||
* preempt_disable(), otherwise, the holding of HPTE_V_HVLOCK
|
||||
* can trigger deadlock issue.
|
||||
*/
|
||||
long kvmppc_hv_find_lock_hpte(struct kvm *kvm, gva_t eaddr, unsigned long slb_v,
|
||||
unsigned long valid)
|
||||
{
|
||||
|
@ -20,6 +20,11 @@ EXPORT_SYMBOL(csum_partial_copy_generic);
|
||||
EXPORT_SYMBOL(copy_page);
|
||||
EXPORT_SYMBOL(__clear_user);
|
||||
EXPORT_SYMBOL(empty_zero_page);
|
||||
#ifdef CONFIG_FLATMEM
|
||||
/* need in pfn_valid macro */
|
||||
EXPORT_SYMBOL(min_low_pfn);
|
||||
EXPORT_SYMBOL(max_low_pfn);
|
||||
#endif
|
||||
|
||||
#define DECLARE_EXPORT(name) \
|
||||
extern void name(void);EXPORT_SYMBOL(name)
|
||||
|
@ -6,7 +6,7 @@ lib-y = delay.o memmove.o memchr.o \
|
||||
checksum.o strlen.o div64.o div64-generic.o
|
||||
|
||||
# Extracted from libgcc
|
||||
lib-y += movmem.o ashldi3.o ashrdi3.o lshrdi3.o \
|
||||
obj-y += movmem.o ashldi3.o ashrdi3.o lshrdi3.o \
|
||||
ashlsi3.o ashrsi3.o ashiftrt.o lshrsi3.o \
|
||||
udiv_qrnnd.o
|
||||
|
||||
|
@ -616,7 +616,7 @@ static inline unsigned long pte_present(pte_t pte)
|
||||
}
|
||||
|
||||
#define pte_accessible pte_accessible
|
||||
static inline unsigned long pte_accessible(pte_t a)
|
||||
static inline unsigned long pte_accessible(struct mm_struct *mm, pte_t a)
|
||||
{
|
||||
return pte_val(a) & _PAGE_VALID;
|
||||
}
|
||||
@ -806,7 +806,7 @@ static inline void __set_pte_at(struct mm_struct *mm, unsigned long addr,
|
||||
* SUN4V NOTE: _PAGE_VALID is the same value in both the SUN4U
|
||||
* and SUN4V pte layout, so this inline test is fine.
|
||||
*/
|
||||
if (likely(mm != &init_mm) && pte_accessible(orig))
|
||||
if (likely(mm != &init_mm) && pte_accessible(mm, orig))
|
||||
tlb_batch_add(mm, addr, ptep, orig, fullmm);
|
||||
}
|
||||
|
||||
|
@ -415,9 +415,16 @@ static inline int pte_present(pte_t a)
|
||||
}
|
||||
|
||||
#define pte_accessible pte_accessible
|
||||
static inline int pte_accessible(pte_t a)
|
||||
static inline bool pte_accessible(struct mm_struct *mm, pte_t a)
|
||||
{
|
||||
return pte_flags(a) & _PAGE_PRESENT;
|
||||
if (pte_flags(a) & _PAGE_PRESENT)
|
||||
return true;
|
||||
|
||||
if ((pte_flags(a) & (_PAGE_PROTNONE | _PAGE_NUMA)) &&
|
||||
mm_tlb_flush_pending(mm))
|
||||
return true;
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
static inline int pte_hidden(pte_t pte)
|
||||
|
@ -238,8 +238,4 @@ static inline void arch_write_unlock(arch_rwlock_t *rw)
|
||||
#define arch_read_relax(lock) cpu_relax()
|
||||
#define arch_write_relax(lock) cpu_relax()
|
||||
|
||||
/* The {read|write|spin}_lock() on x86 are full memory barriers. */
|
||||
static inline void smp_mb__after_lock(void) { }
|
||||
#define ARCH_HAS_SMP_MB_AFTER_LOCK
|
||||
|
||||
#endif /* _ASM_X86_SPINLOCK_H */
|
||||
|
@ -387,7 +387,8 @@ static void __cpuinit init_intel(struct cpuinfo_x86 *c)
|
||||
set_cpu_cap(c, X86_FEATURE_PEBS);
|
||||
}
|
||||
|
||||
if (c->x86 == 6 && c->x86_model == 29 && cpu_has_clflush)
|
||||
if (c->x86 == 6 && cpu_has_clflush &&
|
||||
(c->x86_model == 29 || c->x86_model == 46 || c->x86_model == 47))
|
||||
set_cpu_cap(c, X86_FEATURE_CLFLUSH_MONITOR);
|
||||
|
||||
#ifdef CONFIG_X86_64
|
||||
|
@ -1364,6 +1364,10 @@ void kvm_lapic_set_base(struct kvm_vcpu *vcpu, u64 value)
|
||||
return;
|
||||
}
|
||||
|
||||
if (!kvm_vcpu_is_bsp(apic->vcpu))
|
||||
value &= ~MSR_IA32_APICBASE_BSP;
|
||||
vcpu->arch.apic_base = value;
|
||||
|
||||
/* update jump label if enable bit changes */
|
||||
if ((vcpu->arch.apic_base ^ value) & MSR_IA32_APICBASE_ENABLE) {
|
||||
if (value & MSR_IA32_APICBASE_ENABLE)
|
||||
@ -1373,10 +1377,6 @@ void kvm_lapic_set_base(struct kvm_vcpu *vcpu, u64 value)
|
||||
recalculate_apic_map(vcpu->kvm);
|
||||
}
|
||||
|
||||
if (!kvm_vcpu_is_bsp(apic->vcpu))
|
||||
value &= ~MSR_IA32_APICBASE_BSP;
|
||||
|
||||
vcpu->arch.apic_base = value;
|
||||
if ((old_value ^ value) & X2APIC_ENABLE) {
|
||||
if (value & X2APIC_ENABLE) {
|
||||
u32 id = kvm_apic_id(apic);
|
||||
|
@ -2402,7 +2402,7 @@ int ata_dev_configure(struct ata_device *dev)
|
||||
cdb_intr_string = ", CDB intr";
|
||||
}
|
||||
|
||||
if (atapi_dmadir || atapi_id_dmadir(dev->id)) {
|
||||
if (atapi_dmadir || (dev->horkage & ATA_HORKAGE_ATAPI_DMADIR) || atapi_id_dmadir(dev->id)) {
|
||||
dev->flags |= ATA_DFLAG_DMADIR;
|
||||
dma_dir_string = ", DMADIR";
|
||||
}
|
||||
@ -4135,6 +4135,9 @@ static const struct ata_blacklist_entry ata_device_blacklist [] = {
|
||||
{ "ST3320[68]13AS", "SD1[5-9]", ATA_HORKAGE_NONCQ |
|
||||
ATA_HORKAGE_FIRMWARE_WARN },
|
||||
|
||||
/* Seagate Momentus SpinPoint M8 seem to have FPMDA_AA issues */
|
||||
{ "ST1000LM024 HN-M101MBB", "2AR10001", ATA_HORKAGE_BROKEN_FPDMA_AA },
|
||||
|
||||
/* Blacklist entries taken from Silicon Image 3124/3132
|
||||
Windows driver .inf file - also several Linux problem reports */
|
||||
{ "HTS541060G9SA00", "MB3OC60D", ATA_HORKAGE_NONCQ, },
|
||||
@ -6533,6 +6536,8 @@ static int __init ata_parse_force_one(char **cur,
|
||||
{ "nosrst", .lflags = ATA_LFLAG_NO_SRST },
|
||||
{ "norst", .lflags = ATA_LFLAG_NO_HRST | ATA_LFLAG_NO_SRST },
|
||||
{ "rstonce", .lflags = ATA_LFLAG_RST_ONCE },
|
||||
{ "atapi_dmadir", .horkage_on = ATA_HORKAGE_ATAPI_DMADIR },
|
||||
{ "disable", .horkage_on = ATA_HORKAGE_DISABLE },
|
||||
};
|
||||
char *start = *cur, *p = *cur;
|
||||
char *id, *val, *endp;
|
||||
|
@ -3864,6 +3864,27 @@ void ata_scsi_hotplug(struct work_struct *work)
|
||||
return;
|
||||
}
|
||||
|
||||
/*
|
||||
* XXX - UGLY HACK
|
||||
*
|
||||
* The block layer suspend/resume path is fundamentally broken due
|
||||
* to freezable kthreads and workqueue and may deadlock if a block
|
||||
* device gets removed while resume is in progress. I don't know
|
||||
* what the solution is short of removing freezable kthreads and
|
||||
* workqueues altogether.
|
||||
*
|
||||
* The following is an ugly hack to avoid kicking off device
|
||||
* removal while freezer is active. This is a joke but does avoid
|
||||
* this particular deadlock scenario.
|
||||
*
|
||||
* https://bugzilla.kernel.org/show_bug.cgi?id=62801
|
||||
* http://marc.info/?l=linux-kernel&m=138695698516487
|
||||
*/
|
||||
#ifdef CONFIG_FREEZER
|
||||
while (pm_freezing)
|
||||
msleep(10);
|
||||
#endif
|
||||
|
||||
DPRINTK("ENTER\n");
|
||||
mutex_lock(&ap->scsi_scan_mutex);
|
||||
|
||||
|
@ -937,12 +937,14 @@ static const char *rbd_dev_v1_snap_name(struct rbd_device *rbd_dev,
|
||||
u64 snap_id)
|
||||
{
|
||||
u32 which;
|
||||
const char *snap_name;
|
||||
|
||||
which = rbd_dev_snap_index(rbd_dev, snap_id);
|
||||
if (which == BAD_SNAP_INDEX)
|
||||
return NULL;
|
||||
return ERR_PTR(-ENOENT);
|
||||
|
||||
return _rbd_dev_v1_snap_name(rbd_dev, which);
|
||||
snap_name = _rbd_dev_v1_snap_name(rbd_dev, which);
|
||||
return snap_name ? snap_name : ERR_PTR(-ENOMEM);
|
||||
}
|
||||
|
||||
static const char *rbd_snap_name(struct rbd_device *rbd_dev, u64 snap_id)
|
||||
@ -1126,6 +1128,7 @@ static void zero_bio_chain(struct bio *chain, int start_ofs)
|
||||
buf = bvec_kmap_irq(bv, &flags);
|
||||
memset(buf + remainder, 0,
|
||||
bv->bv_len - remainder);
|
||||
flush_dcache_page(bv->bv_page);
|
||||
bvec_kunmap_irq(buf, &flags);
|
||||
}
|
||||
pos += bv->bv_len;
|
||||
@ -1158,6 +1161,7 @@ static void zero_pages(struct page **pages, u64 offset, u64 end)
|
||||
local_irq_save(flags);
|
||||
kaddr = kmap_atomic(*page);
|
||||
memset(kaddr + page_offset, 0, length);
|
||||
flush_dcache_page(*page);
|
||||
kunmap_atomic(kaddr);
|
||||
local_irq_restore(flags);
|
||||
|
||||
@ -2171,9 +2175,9 @@ static int rbd_img_request_fill(struct rbd_img_request *img_request,
|
||||
struct rbd_obj_request *obj_request = NULL;
|
||||
struct rbd_obj_request *next_obj_request;
|
||||
bool write_request = img_request_write_test(img_request);
|
||||
struct bio *bio_list;
|
||||
struct bio *bio_list = 0;
|
||||
unsigned int bio_offset = 0;
|
||||
struct page **pages;
|
||||
struct page **pages = 0;
|
||||
u64 img_offset;
|
||||
u64 resid;
|
||||
u16 opcode;
|
||||
@ -2211,6 +2215,11 @@ static int rbd_img_request_fill(struct rbd_img_request *img_request,
|
||||
rbd_segment_name_free(object_name);
|
||||
if (!obj_request)
|
||||
goto out_unwind;
|
||||
/*
|
||||
* set obj_request->img_request before creating the
|
||||
* osd_request so that it gets the right snapc
|
||||
*/
|
||||
rbd_img_obj_request_add(img_request, obj_request);
|
||||
|
||||
if (type == OBJ_REQUEST_BIO) {
|
||||
unsigned int clone_size;
|
||||
@ -2252,11 +2261,6 @@ static int rbd_img_request_fill(struct rbd_img_request *img_request,
|
||||
obj_request->pages, length,
|
||||
offset & ~PAGE_MASK, false, false);
|
||||
|
||||
/*
|
||||
* set obj_request->img_request before formatting
|
||||
* the osd_request so that it gets the right snapc
|
||||
*/
|
||||
rbd_img_obj_request_add(img_request, obj_request);
|
||||
if (write_request)
|
||||
rbd_osd_req_format_write(obj_request);
|
||||
else
|
||||
@ -2817,7 +2821,7 @@ out_err:
|
||||
obj_request_done_set(obj_request);
|
||||
}
|
||||
|
||||
static int rbd_obj_notify_ack(struct rbd_device *rbd_dev, u64 notify_id)
|
||||
static int rbd_obj_notify_ack_sync(struct rbd_device *rbd_dev, u64 notify_id)
|
||||
{
|
||||
struct rbd_obj_request *obj_request;
|
||||
struct ceph_osd_client *osdc = &rbd_dev->rbd_client->client->osdc;
|
||||
@ -2832,16 +2836,17 @@ static int rbd_obj_notify_ack(struct rbd_device *rbd_dev, u64 notify_id)
|
||||
obj_request->osd_req = rbd_osd_req_create(rbd_dev, false, obj_request);
|
||||
if (!obj_request->osd_req)
|
||||
goto out;
|
||||
obj_request->callback = rbd_obj_request_put;
|
||||
|
||||
osd_req_op_watch_init(obj_request->osd_req, 0, CEPH_OSD_OP_NOTIFY_ACK,
|
||||
notify_id, 0, 0);
|
||||
rbd_osd_req_format_read(obj_request);
|
||||
|
||||
ret = rbd_obj_request_submit(osdc, obj_request);
|
||||
out:
|
||||
if (ret)
|
||||
rbd_obj_request_put(obj_request);
|
||||
goto out;
|
||||
ret = rbd_obj_request_wait(obj_request);
|
||||
out:
|
||||
rbd_obj_request_put(obj_request);
|
||||
|
||||
return ret;
|
||||
}
|
||||
@ -2861,7 +2866,7 @@ static void rbd_watch_cb(u64 ver, u64 notify_id, u8 opcode, void *data)
|
||||
if (ret)
|
||||
rbd_warn(rbd_dev, ": header refresh error (%d)\n", ret);
|
||||
|
||||
rbd_obj_notify_ack(rbd_dev, notify_id);
|
||||
rbd_obj_notify_ack_sync(rbd_dev, notify_id);
|
||||
}
|
||||
|
||||
/*
|
||||
@ -3333,6 +3338,31 @@ static void rbd_exists_validate(struct rbd_device *rbd_dev)
|
||||
clear_bit(RBD_DEV_FLAG_EXISTS, &rbd_dev->flags);
|
||||
}
|
||||
|
||||
static void rbd_dev_update_size(struct rbd_device *rbd_dev)
|
||||
{
|
||||
sector_t size;
|
||||
bool removing;
|
||||
|
||||
/*
|
||||
* Don't hold the lock while doing disk operations,
|
||||
* or lock ordering will conflict with the bdev mutex via:
|
||||
* rbd_add() -> blkdev_get() -> rbd_open()
|
||||
*/
|
||||
spin_lock_irq(&rbd_dev->lock);
|
||||
removing = test_bit(RBD_DEV_FLAG_REMOVING, &rbd_dev->flags);
|
||||
spin_unlock_irq(&rbd_dev->lock);
|
||||
/*
|
||||
* If the device is being removed, rbd_dev->disk has
|
||||
* been destroyed, so don't try to update its size
|
||||
*/
|
||||
if (!removing) {
|
||||
size = (sector_t)rbd_dev->mapping.size / SECTOR_SIZE;
|
||||
dout("setting size to %llu sectors", (unsigned long long)size);
|
||||
set_capacity(rbd_dev->disk, size);
|
||||
revalidate_disk(rbd_dev->disk);
|
||||
}
|
||||
}
|
||||
|
||||
static int rbd_dev_refresh(struct rbd_device *rbd_dev)
|
||||
{
|
||||
u64 mapping_size;
|
||||
@ -3351,12 +3381,7 @@ static int rbd_dev_refresh(struct rbd_device *rbd_dev)
|
||||
rbd_exists_validate(rbd_dev);
|
||||
mutex_unlock(&ctl_mutex);
|
||||
if (mapping_size != rbd_dev->mapping.size) {
|
||||
sector_t size;
|
||||
|
||||
size = (sector_t)rbd_dev->mapping.size / SECTOR_SIZE;
|
||||
dout("setting size to %llu sectors", (unsigned long long)size);
|
||||
set_capacity(rbd_dev->disk, size);
|
||||
revalidate_disk(rbd_dev->disk);
|
||||
rbd_dev_update_size(rbd_dev);
|
||||
}
|
||||
|
||||
return ret;
|
||||
@ -3710,12 +3735,14 @@ static int _rbd_dev_v2_snap_size(struct rbd_device *rbd_dev, u64 snap_id,
|
||||
if (ret < sizeof (size_buf))
|
||||
return -ERANGE;
|
||||
|
||||
if (order)
|
||||
if (order) {
|
||||
*order = size_buf.order;
|
||||
dout(" order %u", (unsigned int)*order);
|
||||
}
|
||||
*snap_size = le64_to_cpu(size_buf.size);
|
||||
|
||||
dout(" snap_id 0x%016llx order = %u, snap_size = %llu\n",
|
||||
(unsigned long long)snap_id, (unsigned int)*order,
|
||||
dout(" snap_id 0x%016llx snap_size = %llu\n",
|
||||
(unsigned long long)snap_id,
|
||||
(unsigned long long)*snap_size);
|
||||
|
||||
return 0;
|
||||
@ -4030,8 +4057,13 @@ static u64 rbd_v2_snap_id_by_name(struct rbd_device *rbd_dev, const char *name)
|
||||
|
||||
snap_id = snapc->snaps[which];
|
||||
snap_name = rbd_dev_v2_snap_name(rbd_dev, snap_id);
|
||||
if (IS_ERR(snap_name))
|
||||
break;
|
||||
if (IS_ERR(snap_name)) {
|
||||
/* ignore no-longer existing snapshots */
|
||||
if (PTR_ERR(snap_name) == -ENOENT)
|
||||
continue;
|
||||
else
|
||||
break;
|
||||
}
|
||||
found = !strcmp(name, snap_name);
|
||||
kfree(snap_name);
|
||||
}
|
||||
@ -4110,8 +4142,8 @@ static int rbd_dev_spec_update(struct rbd_device *rbd_dev)
|
||||
/* Look up the snapshot name, and make a copy */
|
||||
|
||||
snap_name = rbd_snap_name(rbd_dev, spec->snap_id);
|
||||
if (!snap_name) {
|
||||
ret = -ENOMEM;
|
||||
if (IS_ERR(snap_name)) {
|
||||
ret = PTR_ERR(snap_name);
|
||||
goto out_err;
|
||||
}
|
||||
|
||||
@ -5059,23 +5091,6 @@ err_out_module:
|
||||
return (ssize_t)rc;
|
||||
}
|
||||
|
||||
static struct rbd_device *__rbd_get_dev(unsigned long dev_id)
|
||||
{
|
||||
struct list_head *tmp;
|
||||
struct rbd_device *rbd_dev;
|
||||
|
||||
spin_lock(&rbd_dev_list_lock);
|
||||
list_for_each(tmp, &rbd_dev_list) {
|
||||
rbd_dev = list_entry(tmp, struct rbd_device, node);
|
||||
if (rbd_dev->dev_id == dev_id) {
|
||||
spin_unlock(&rbd_dev_list_lock);
|
||||
return rbd_dev;
|
||||
}
|
||||
}
|
||||
spin_unlock(&rbd_dev_list_lock);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
static void rbd_dev_device_release(struct device *dev)
|
||||
{
|
||||
struct rbd_device *rbd_dev = dev_to_rbd_dev(dev);
|
||||
@ -5120,8 +5135,10 @@ static ssize_t rbd_remove(struct bus_type *bus,
|
||||
size_t count)
|
||||
{
|
||||
struct rbd_device *rbd_dev = NULL;
|
||||
int target_id;
|
||||
struct list_head *tmp;
|
||||
int dev_id;
|
||||
unsigned long ul;
|
||||
bool already = false;
|
||||
int ret;
|
||||
|
||||
ret = strict_strtoul(buf, 10, &ul);
|
||||
@ -5129,30 +5146,51 @@ static ssize_t rbd_remove(struct bus_type *bus,
|
||||
return ret;
|
||||
|
||||
/* convert to int; abort if we lost anything in the conversion */
|
||||
target_id = (int) ul;
|
||||
if (target_id != ul)
|
||||
dev_id = (int)ul;
|
||||
if (dev_id != ul)
|
||||
return -EINVAL;
|
||||
|
||||
mutex_lock_nested(&ctl_mutex, SINGLE_DEPTH_NESTING);
|
||||
|
||||
rbd_dev = __rbd_get_dev(target_id);
|
||||
if (!rbd_dev) {
|
||||
ret = -ENOENT;
|
||||
goto done;
|
||||
ret = -ENOENT;
|
||||
spin_lock(&rbd_dev_list_lock);
|
||||
list_for_each(tmp, &rbd_dev_list) {
|
||||
rbd_dev = list_entry(tmp, struct rbd_device, node);
|
||||
if (rbd_dev->dev_id == dev_id) {
|
||||
ret = 0;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
spin_lock_irq(&rbd_dev->lock);
|
||||
if (rbd_dev->open_count)
|
||||
ret = -EBUSY;
|
||||
else
|
||||
set_bit(RBD_DEV_FLAG_REMOVING, &rbd_dev->flags);
|
||||
spin_unlock_irq(&rbd_dev->lock);
|
||||
if (ret < 0)
|
||||
if (!ret) {
|
||||
spin_lock_irq(&rbd_dev->lock);
|
||||
if (rbd_dev->open_count)
|
||||
ret = -EBUSY;
|
||||
else
|
||||
already = test_and_set_bit(RBD_DEV_FLAG_REMOVING,
|
||||
&rbd_dev->flags);
|
||||
spin_unlock_irq(&rbd_dev->lock);
|
||||
}
|
||||
spin_unlock(&rbd_dev_list_lock);
|
||||
if (ret < 0 || already)
|
||||
goto done;
|
||||
rbd_bus_del_dev(rbd_dev);
|
||||
|
||||
ret = rbd_dev_header_watch_sync(rbd_dev, false);
|
||||
if (ret)
|
||||
rbd_warn(rbd_dev, "failed to cancel watch event (%d)\n", ret);
|
||||
|
||||
/*
|
||||
* flush remaining watch callbacks - these must be complete
|
||||
* before the osd_client is shutdown
|
||||
*/
|
||||
dout("%s: flushing notifies", __func__);
|
||||
ceph_osdc_flush_notifies(&rbd_dev->rbd_client->client->osdc);
|
||||
/*
|
||||
* Don't free anything from rbd_dev->disk until after all
|
||||
* notifies are completely processed. Otherwise
|
||||
* rbd_bus_del_dev() will race with rbd_watch_cb(), resulting
|
||||
* in a potential use after free of rbd_dev->disk or rbd_dev.
|
||||
*/
|
||||
rbd_bus_del_dev(rbd_dev);
|
||||
rbd_dev_image_release(rbd_dev);
|
||||
module_put(THIS_MODULE);
|
||||
ret = count;
|
||||
|
@ -186,27 +186,19 @@ u32 arch_timer_get_rate(void)
|
||||
return arch_timer_rate;
|
||||
}
|
||||
|
||||
/*
|
||||
* Some external users of arch_timer_read_counter (e.g. sched_clock) may try to
|
||||
* call it before it has been initialised. Rather than incur a performance
|
||||
* penalty checking for initialisation, provide a default implementation that
|
||||
* won't lead to time appearing to jump backwards.
|
||||
*/
|
||||
static u64 arch_timer_read_zero(void)
|
||||
u64 arch_timer_read_counter(void)
|
||||
{
|
||||
return 0;
|
||||
return arch_counter_get_cntvct();
|
||||
}
|
||||
|
||||
u64 (*arch_timer_read_counter)(void) = arch_timer_read_zero;
|
||||
|
||||
static cycle_t arch_counter_read(struct clocksource *cs)
|
||||
{
|
||||
return arch_timer_read_counter();
|
||||
return arch_counter_get_cntvct();
|
||||
}
|
||||
|
||||
static cycle_t arch_counter_read_cc(const struct cyclecounter *cc)
|
||||
{
|
||||
return arch_timer_read_counter();
|
||||
return arch_counter_get_cntvct();
|
||||
}
|
||||
|
||||
static struct clocksource clocksource_counter = {
|
||||
@ -287,7 +279,7 @@ static int __init arch_timer_register(void)
|
||||
cyclecounter.mult = clocksource_counter.mult;
|
||||
cyclecounter.shift = clocksource_counter.shift;
|
||||
timecounter_init(&timecounter, &cyclecounter,
|
||||
arch_counter_get_cntpct());
|
||||
arch_counter_get_cntvct());
|
||||
|
||||
if (arch_timer_use_virtual) {
|
||||
ppi = arch_timer_ppi[VIRT_PPI];
|
||||
@ -376,11 +368,6 @@ static void __init arch_timer_init(struct device_node *np)
|
||||
}
|
||||
}
|
||||
|
||||
if (arch_timer_use_virtual)
|
||||
arch_timer_read_counter = arch_counter_get_cntvct;
|
||||
else
|
||||
arch_timer_read_counter = arch_counter_get_cntpct;
|
||||
|
||||
arch_timer_register();
|
||||
arch_timer_arch_init();
|
||||
}
|
||||
|
@ -77,7 +77,7 @@ static void __iomem *sched_io_base;
|
||||
|
||||
static u32 read_sched_clock(void)
|
||||
{
|
||||
return __raw_readl(sched_io_base);
|
||||
return ~__raw_readl(sched_io_base);
|
||||
}
|
||||
|
||||
static const struct of_device_id sptimer_ids[] __initconst = {
|
||||
|
@ -755,6 +755,11 @@ static int intel_pstate_init_cpu(unsigned int cpunum)
|
||||
cpu = all_cpu_data[cpunum];
|
||||
|
||||
intel_pstate_get_cpu_pstates(cpu);
|
||||
if (!cpu->pstate.current_pstate) {
|
||||
all_cpu_data[cpunum] = NULL;
|
||||
kfree(cpu);
|
||||
return -ENODATA;
|
||||
}
|
||||
|
||||
cpu->cpu = cpunum;
|
||||
|
||||
|
@ -333,6 +333,7 @@ config NET_DMA
|
||||
bool "Network: TCP receive copy offload"
|
||||
depends on DMA_ENGINE && NET
|
||||
default (INTEL_IOATDMA || FSL_DMA)
|
||||
depends on BROKEN
|
||||
help
|
||||
This enables the use of DMA engines in the network stack to
|
||||
offload receive copy-to-user operations, freeing CPU cycles.
|
||||
|
@ -1626,7 +1626,6 @@ static struct scsi_host_template scsi_driver_template = {
|
||||
.cmd_per_lun = 1,
|
||||
.can_queue = 1,
|
||||
.sdev_attrs = sbp2_scsi_sysfs_attrs,
|
||||
.no_write_same = 1,
|
||||
};
|
||||
|
||||
MODULE_AUTHOR("Kristian Hoegsberg <krh@bitplanet.net>");
|
||||
|
@ -248,7 +248,7 @@ static void msm_gpio_irq_mask(struct irq_data *d)
|
||||
|
||||
spin_lock_irqsave(&tlmm_lock, irq_flags);
|
||||
writel(TARGET_PROC_NONE, GPIO_INTR_CFG_SU(gpio));
|
||||
clear_gpio_bits(INTR_RAW_STATUS_EN | INTR_ENABLE, GPIO_INTR_CFG(gpio));
|
||||
clear_gpio_bits(BIT(INTR_RAW_STATUS_EN) | BIT(INTR_ENABLE), GPIO_INTR_CFG(gpio));
|
||||
__clear_bit(gpio, msm_gpio.enabled_irqs);
|
||||
spin_unlock_irqrestore(&tlmm_lock, irq_flags);
|
||||
}
|
||||
@ -260,7 +260,7 @@ static void msm_gpio_irq_unmask(struct irq_data *d)
|
||||
|
||||
spin_lock_irqsave(&tlmm_lock, irq_flags);
|
||||
__set_bit(gpio, msm_gpio.enabled_irqs);
|
||||
set_gpio_bits(INTR_RAW_STATUS_EN | INTR_ENABLE, GPIO_INTR_CFG(gpio));
|
||||
set_gpio_bits(BIT(INTR_RAW_STATUS_EN) | BIT(INTR_ENABLE), GPIO_INTR_CFG(gpio));
|
||||
writel(TARGET_PROC_SCORPION, GPIO_INTR_CFG_SU(gpio));
|
||||
spin_unlock_irqrestore(&tlmm_lock, irq_flags);
|
||||
}
|
||||
|
@ -300,7 +300,7 @@ static int twl_direction_in(struct gpio_chip *chip, unsigned offset)
|
||||
if (offset < TWL4030_GPIO_MAX)
|
||||
ret = twl4030_set_gpio_direction(offset, 1);
|
||||
else
|
||||
ret = -EINVAL;
|
||||
ret = -EINVAL; /* LED outputs can't be set as input */
|
||||
|
||||
if (!ret)
|
||||
priv->direction &= ~BIT(offset);
|
||||
@ -354,11 +354,20 @@ static void twl_set(struct gpio_chip *chip, unsigned offset, int value)
|
||||
static int twl_direction_out(struct gpio_chip *chip, unsigned offset, int value)
|
||||
{
|
||||
struct gpio_twl4030_priv *priv = to_gpio_twl4030(chip);
|
||||
int ret = -EINVAL;
|
||||
int ret = 0;
|
||||
|
||||
mutex_lock(&priv->mutex);
|
||||
if (offset < TWL4030_GPIO_MAX)
|
||||
if (offset < TWL4030_GPIO_MAX) {
|
||||
ret = twl4030_set_gpio_direction(offset, 0);
|
||||
if (ret) {
|
||||
mutex_unlock(&priv->mutex);
|
||||
return ret;
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* LED gpios i.e. offset >= TWL4030_GPIO_MAX are always output
|
||||
*/
|
||||
|
||||
priv->direction |= BIT(offset);
|
||||
mutex_unlock(&priv->mutex);
|
||||
|
@ -68,10 +68,12 @@
|
||||
#define EDID_QUIRK_DETAILED_SYNC_PP (1 << 6)
|
||||
/* Force reduced-blanking timings for detailed modes */
|
||||
#define EDID_QUIRK_FORCE_REDUCED_BLANKING (1 << 7)
|
||||
/* Force 8bpc */
|
||||
#define EDID_QUIRK_FORCE_8BPC (1 << 8)
|
||||
/* The panel supports, but does not include a lower clocked mode for lvds */
|
||||
#define EDID_QUIRK_ADD_DOWNCLOCK_MODE (1 << 8)
|
||||
#define EDID_QUIRK_ADD_DOWNCLOCK_MODE (1 << 9)
|
||||
/* The panel can reduce consumption with shorter blanking intervals */
|
||||
#define EDID_QUIRK_SHORT_BLANKING (1 << 9)
|
||||
#define EDID_QUIRK_SHORT_BLANKING (1 << 10)
|
||||
|
||||
|
||||
struct detailed_mode_closure {
|
||||
@ -134,6 +136,9 @@ static struct edid_quirk {
|
||||
/* Medion MD 30217 PG */
|
||||
{ "MED", 0x7b8, EDID_QUIRK_PREFER_LARGE_75 },
|
||||
|
||||
/* Panel in Samsung NP700G7A-S01PL notebook reports 6bpc */
|
||||
{ "SEC", 0xd033, EDID_QUIRK_FORCE_8BPC },
|
||||
|
||||
/* Samsung TFT-LCD LTN121AT10-301 */
|
||||
{ "SEC", 0x3142, EDID_QUIRK_ADD_DOWNCLOCK_MODE },
|
||||
/* Acer B116XW03 */
|
||||
@ -3412,6 +3417,9 @@ int drm_add_edid_modes(struct drm_connector *connector, struct edid *edid)
|
||||
|
||||
drm_add_display_info(edid, &connector->display_info);
|
||||
|
||||
if (quirks & EDID_QUIRK_FORCE_8BPC)
|
||||
connector->display_info.bpc = 8;
|
||||
|
||||
return num_modes;
|
||||
}
|
||||
EXPORT_SYMBOL(drm_add_edid_modes);
|
||||
|
@ -84,6 +84,14 @@ void i915_update_dri1_breadcrumb(struct drm_device *dev)
|
||||
drm_i915_private_t *dev_priv = dev->dev_private;
|
||||
struct drm_i915_master_private *master_priv;
|
||||
|
||||
/*
|
||||
* The dri breadcrumb update races against the drm master disappearing.
|
||||
* Instead of trying to fix this (this is by far not the only ums issue)
|
||||
* just don't do the update in kms mode.
|
||||
*/
|
||||
if (drm_core_check_feature(dev, DRIVER_MODESET))
|
||||
return;
|
||||
|
||||
if (dev->primary->master) {
|
||||
master_priv = dev->primary->master->driver_priv;
|
||||
if (master_priv->sarea_priv)
|
||||
@ -1885,8 +1893,10 @@ void i915_driver_lastclose(struct drm_device * dev)
|
||||
|
||||
void i915_driver_preclose(struct drm_device * dev, struct drm_file *file_priv)
|
||||
{
|
||||
mutex_lock(&dev->struct_mutex);
|
||||
i915_gem_context_close(dev, file_priv);
|
||||
i915_gem_release(dev, file_priv);
|
||||
mutex_unlock(&dev->struct_mutex);
|
||||
}
|
||||
|
||||
void i915_driver_postclose(struct drm_device *dev, struct drm_file *file)
|
||||
|
@ -335,10 +335,8 @@ void i915_gem_context_close(struct drm_device *dev, struct drm_file *file)
|
||||
{
|
||||
struct drm_i915_file_private *file_priv = file->driver_priv;
|
||||
|
||||
mutex_lock(&dev->struct_mutex);
|
||||
idr_for_each(&file_priv->context_idr, context_idr_cleanup, NULL);
|
||||
idr_destroy(&file_priv->context_idr);
|
||||
mutex_unlock(&dev->struct_mutex);
|
||||
}
|
||||
|
||||
static struct i915_hw_context *
|
||||
|
@ -11027,7 +11027,9 @@ void intel_modeset_gem_init(struct drm_device *dev)
|
||||
|
||||
intel_setup_overlay(dev);
|
||||
|
||||
drm_modeset_lock_all(dev);
|
||||
intel_modeset_setup_hw_state(dev, false);
|
||||
drm_modeset_unlock_all(dev);
|
||||
}
|
||||
|
||||
void intel_modeset_cleanup(struct drm_device *dev)
|
||||
@ -11107,14 +11109,15 @@ void intel_connector_attach_encoder(struct intel_connector *connector,
|
||||
int intel_modeset_vga_set_state(struct drm_device *dev, bool state)
|
||||
{
|
||||
struct drm_i915_private *dev_priv = dev->dev_private;
|
||||
unsigned reg = INTEL_INFO(dev)->gen >= 6 ? SNB_GMCH_CTRL : INTEL_GMCH_CTRL;
|
||||
u16 gmch_ctrl;
|
||||
|
||||
pci_read_config_word(dev_priv->bridge_dev, INTEL_GMCH_CTRL, &gmch_ctrl);
|
||||
pci_read_config_word(dev_priv->bridge_dev, reg, &gmch_ctrl);
|
||||
if (state)
|
||||
gmch_ctrl &= ~INTEL_GMCH_VGA_DISABLE;
|
||||
else
|
||||
gmch_ctrl |= INTEL_GMCH_VGA_DISABLE;
|
||||
pci_write_config_word(dev_priv->bridge_dev, INTEL_GMCH_CTRL, gmch_ctrl);
|
||||
pci_write_config_word(dev_priv->bridge_dev, reg, gmch_ctrl);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -1176,7 +1176,9 @@ static int dce4_crtc_do_set_base(struct drm_crtc *crtc,
|
||||
if ((rdev->family == CHIP_TAHITI) ||
|
||||
(rdev->family == CHIP_PITCAIRN))
|
||||
fb_format |= SI_GRPH_PIPE_CONFIG(SI_ADDR_SURF_P8_32x32_8x16);
|
||||
else if (rdev->family == CHIP_VERDE)
|
||||
else if ((rdev->family == CHIP_VERDE) ||
|
||||
(rdev->family == CHIP_OLAND) ||
|
||||
(rdev->family == CHIP_HAINAN)) /* for completeness. HAINAN has no display hw */
|
||||
fb_format |= SI_GRPH_PIPE_CONFIG(SI_ADDR_SURF_P4_8x16);
|
||||
|
||||
switch (radeon_crtc->crtc_id) {
|
||||
|
@ -753,6 +753,10 @@ static void cayman_gpu_init(struct radeon_device *rdev)
|
||||
(rdev->pdev->device == 0x999C)) {
|
||||
rdev->config.cayman.max_simds_per_se = 6;
|
||||
rdev->config.cayman.max_backends_per_se = 2;
|
||||
rdev->config.cayman.max_hw_contexts = 8;
|
||||
rdev->config.cayman.sx_max_export_size = 256;
|
||||
rdev->config.cayman.sx_max_export_pos_size = 64;
|
||||
rdev->config.cayman.sx_max_export_smx_size = 192;
|
||||
} else if ((rdev->pdev->device == 0x9903) ||
|
||||
(rdev->pdev->device == 0x9904) ||
|
||||
(rdev->pdev->device == 0x990A) ||
|
||||
@ -763,6 +767,10 @@ static void cayman_gpu_init(struct radeon_device *rdev)
|
||||
(rdev->pdev->device == 0x999D)) {
|
||||
rdev->config.cayman.max_simds_per_se = 4;
|
||||
rdev->config.cayman.max_backends_per_se = 2;
|
||||
rdev->config.cayman.max_hw_contexts = 8;
|
||||
rdev->config.cayman.sx_max_export_size = 256;
|
||||
rdev->config.cayman.sx_max_export_pos_size = 64;
|
||||
rdev->config.cayman.sx_max_export_smx_size = 192;
|
||||
} else if ((rdev->pdev->device == 0x9919) ||
|
||||
(rdev->pdev->device == 0x9990) ||
|
||||
(rdev->pdev->device == 0x9991) ||
|
||||
@ -773,9 +781,17 @@ static void cayman_gpu_init(struct radeon_device *rdev)
|
||||
(rdev->pdev->device == 0x99A0)) {
|
||||
rdev->config.cayman.max_simds_per_se = 3;
|
||||
rdev->config.cayman.max_backends_per_se = 1;
|
||||
rdev->config.cayman.max_hw_contexts = 4;
|
||||
rdev->config.cayman.sx_max_export_size = 128;
|
||||
rdev->config.cayman.sx_max_export_pos_size = 32;
|
||||
rdev->config.cayman.sx_max_export_smx_size = 96;
|
||||
} else {
|
||||
rdev->config.cayman.max_simds_per_se = 2;
|
||||
rdev->config.cayman.max_backends_per_se = 1;
|
||||
rdev->config.cayman.max_hw_contexts = 4;
|
||||
rdev->config.cayman.sx_max_export_size = 128;
|
||||
rdev->config.cayman.sx_max_export_pos_size = 32;
|
||||
rdev->config.cayman.sx_max_export_smx_size = 96;
|
||||
}
|
||||
rdev->config.cayman.max_texture_channel_caches = 2;
|
||||
rdev->config.cayman.max_gprs = 256;
|
||||
@ -783,10 +799,6 @@ static void cayman_gpu_init(struct radeon_device *rdev)
|
||||
rdev->config.cayman.max_gs_threads = 32;
|
||||
rdev->config.cayman.max_stack_entries = 512;
|
||||
rdev->config.cayman.sx_num_of_sets = 8;
|
||||
rdev->config.cayman.sx_max_export_size = 256;
|
||||
rdev->config.cayman.sx_max_export_pos_size = 64;
|
||||
rdev->config.cayman.sx_max_export_smx_size = 192;
|
||||
rdev->config.cayman.max_hw_contexts = 8;
|
||||
rdev->config.cayman.sq_num_cf_insts = 2;
|
||||
|
||||
rdev->config.cayman.sc_prim_fifo_size = 0x40;
|
||||
|
@ -460,7 +460,7 @@ static int radeon_uvd_cs_reloc(struct radeon_cs_parser *p,
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
if ((start >> 28) != (end >> 28)) {
|
||||
if ((start >> 28) != ((end - 1) >> 28)) {
|
||||
DRM_ERROR("reloc %LX-%LX crossing 256MB boundary!\n",
|
||||
start, end);
|
||||
return -EINVAL;
|
||||
|
@ -162,6 +162,16 @@ static void rs690_mc_init(struct radeon_device *rdev)
|
||||
base = RREG32_MC(R_000100_MCCFG_FB_LOCATION);
|
||||
base = G_000100_MC_FB_START(base) << 16;
|
||||
rdev->mc.igp_sideport_enabled = radeon_atombios_sideport_present(rdev);
|
||||
/* Some boards seem to be configured for 128MB of sideport memory,
|
||||
* but really only have 64MB. Just skip the sideport and use
|
||||
* UMA memory.
|
||||
*/
|
||||
if (rdev->mc.igp_sideport_enabled &&
|
||||
(rdev->mc.real_vram_size == (384 * 1024 * 1024))) {
|
||||
base += 128 * 1024 * 1024;
|
||||
rdev->mc.real_vram_size -= 128 * 1024 * 1024;
|
||||
rdev->mc.mc_vram_size = rdev->mc.real_vram_size;
|
||||
}
|
||||
|
||||
/* Use K8 direct mapping for fast fb access. */
|
||||
rdev->fastfb_working = false;
|
||||
|
@ -409,6 +409,9 @@ static int intel_idle(struct cpuidle_device *dev,
|
||||
|
||||
if (!current_set_polling_and_test()) {
|
||||
|
||||
if (this_cpu_has(X86_FEATURE_CLFLUSH_MONITOR))
|
||||
clflush((void *)¤t_thread_info()->flags);
|
||||
|
||||
__monitor((void *)¤t_thread_info()->flags, 0, 0);
|
||||
smp_mb();
|
||||
if (!need_resched())
|
||||
|
@ -211,7 +211,13 @@ static const struct ad7887_chip_info ad7887_chip_info_tbl[] = {
|
||||
.info_mask_shared_by_type = BIT(IIO_CHAN_INFO_SCALE),
|
||||
.address = 1,
|
||||
.scan_index = 1,
|
||||
.scan_type = IIO_ST('u', 12, 16, 0),
|
||||
.scan_type = {
|
||||
.sign = 'u',
|
||||
.realbits = 12,
|
||||
.storagebits = 16,
|
||||
.shift = 0,
|
||||
.endianness = IIO_BE,
|
||||
},
|
||||
},
|
||||
.channel[1] = {
|
||||
.type = IIO_VOLTAGE,
|
||||
@ -221,7 +227,13 @@ static const struct ad7887_chip_info ad7887_chip_info_tbl[] = {
|
||||
.info_mask_shared_by_type = BIT(IIO_CHAN_INFO_SCALE),
|
||||
.address = 0,
|
||||
.scan_index = 0,
|
||||
.scan_type = IIO_ST('u', 12, 16, 0),
|
||||
.scan_type = {
|
||||
.sign = 'u',
|
||||
.realbits = 12,
|
||||
.storagebits = 16,
|
||||
.shift = 0,
|
||||
.endianness = IIO_BE,
|
||||
},
|
||||
},
|
||||
.channel[2] = IIO_CHAN_SOFT_TIMESTAMP(2),
|
||||
.int_vref_mv = 2500,
|
||||
|
@ -651,7 +651,12 @@ static const struct iio_chan_spec adis16448_channels[] = {
|
||||
.info_mask_shared_by_type = BIT(IIO_CHAN_INFO_SCALE),
|
||||
.address = ADIS16448_BARO_OUT,
|
||||
.scan_index = ADIS16400_SCAN_BARO,
|
||||
.scan_type = IIO_ST('s', 16, 16, 0),
|
||||
.scan_type = {
|
||||
.sign = 's',
|
||||
.realbits = 16,
|
||||
.storagebits = 16,
|
||||
.endianness = IIO_BE,
|
||||
},
|
||||
},
|
||||
ADIS16400_TEMP_CHAN(ADIS16448_TEMP_OUT, 12),
|
||||
IIO_CHAN_SOFT_TIMESTAMP(11)
|
||||
|
@ -242,21 +242,29 @@ isert_create_device_ib_res(struct isert_device *device)
|
||||
isert_cq_event_callback,
|
||||
(void *)&cq_desc[i],
|
||||
ISER_MAX_RX_CQ_LEN, i);
|
||||
if (IS_ERR(device->dev_rx_cq[i]))
|
||||
if (IS_ERR(device->dev_rx_cq[i])) {
|
||||
ret = PTR_ERR(device->dev_rx_cq[i]);
|
||||
device->dev_rx_cq[i] = NULL;
|
||||
goto out_cq;
|
||||
}
|
||||
|
||||
device->dev_tx_cq[i] = ib_create_cq(device->ib_device,
|
||||
isert_cq_tx_callback,
|
||||
isert_cq_event_callback,
|
||||
(void *)&cq_desc[i],
|
||||
ISER_MAX_TX_CQ_LEN, i);
|
||||
if (IS_ERR(device->dev_tx_cq[i]))
|
||||
if (IS_ERR(device->dev_tx_cq[i])) {
|
||||
ret = PTR_ERR(device->dev_tx_cq[i]);
|
||||
device->dev_tx_cq[i] = NULL;
|
||||
goto out_cq;
|
||||
}
|
||||
|
||||
ret = ib_req_notify_cq(device->dev_rx_cq[i], IB_CQ_NEXT_COMP);
|
||||
if (ret)
|
||||
goto out_cq;
|
||||
|
||||
if (ib_req_notify_cq(device->dev_rx_cq[i], IB_CQ_NEXT_COMP))
|
||||
goto out_cq;
|
||||
|
||||
if (ib_req_notify_cq(device->dev_tx_cq[i], IB_CQ_NEXT_COMP))
|
||||
ret = ib_req_notify_cq(device->dev_tx_cq[i], IB_CQ_NEXT_COMP);
|
||||
if (ret)
|
||||
goto out_cq;
|
||||
}
|
||||
|
||||
|
@ -1975,6 +1975,10 @@ void input_set_capability(struct input_dev *dev, unsigned int type, unsigned int
|
||||
break;
|
||||
|
||||
case EV_ABS:
|
||||
input_alloc_absinfo(dev);
|
||||
if (!dev->absinfo)
|
||||
return;
|
||||
|
||||
__set_bit(code, dev->absbit);
|
||||
break;
|
||||
|
||||
|
@ -927,6 +927,9 @@ static int pcan_usb_pro_init(struct peak_usb_device *dev)
|
||||
/* set LED in default state (end of init phase) */
|
||||
pcan_usb_pro_set_led(dev, 0, 1);
|
||||
|
||||
kfree(bi);
|
||||
kfree(fi);
|
||||
|
||||
return 0;
|
||||
|
||||
err_out:
|
||||
|
@ -7482,7 +7482,7 @@ static inline int tg3_4g_overflow_test(dma_addr_t mapping, int len)
|
||||
{
|
||||
u32 base = (u32) mapping & 0xffffffff;
|
||||
|
||||
return (base > 0xffffdcc0) && (base + len + 8 < base);
|
||||
return base + len + 8 < base;
|
||||
}
|
||||
|
||||
/* Test for TSO DMA buffers that cross into regions which are within MSS bytes
|
||||
|
@ -364,7 +364,12 @@ static int dm9601_bind(struct usbnet *dev, struct usb_interface *intf)
|
||||
dev->net->ethtool_ops = &dm9601_ethtool_ops;
|
||||
dev->net->hard_header_len += DM_TX_OVERHEAD;
|
||||
dev->hard_mtu = dev->net->mtu + dev->net->hard_header_len;
|
||||
dev->rx_urb_size = dev->net->mtu + ETH_HLEN + DM_RX_OVERHEAD;
|
||||
|
||||
/* dm9620/21a require room for 4 byte padding, even in dm9601
|
||||
* mode, so we need +1 to be able to receive full size
|
||||
* ethernet frames.
|
||||
*/
|
||||
dev->rx_urb_size = dev->net->mtu + ETH_HLEN + DM_RX_OVERHEAD + 1;
|
||||
|
||||
dev->mii.dev = dev->net;
|
||||
dev->mii.mdio_read = dm9601_mdio_read;
|
||||
@ -468,7 +473,7 @@ static int dm9601_rx_fixup(struct usbnet *dev, struct sk_buff *skb)
|
||||
static struct sk_buff *dm9601_tx_fixup(struct usbnet *dev, struct sk_buff *skb,
|
||||
gfp_t flags)
|
||||
{
|
||||
int len;
|
||||
int len, pad;
|
||||
|
||||
/* format:
|
||||
b1: packet length low
|
||||
@ -476,12 +481,23 @@ static struct sk_buff *dm9601_tx_fixup(struct usbnet *dev, struct sk_buff *skb,
|
||||
b3..n: packet data
|
||||
*/
|
||||
|
||||
len = skb->len;
|
||||
len = skb->len + DM_TX_OVERHEAD;
|
||||
|
||||
if (skb_headroom(skb) < DM_TX_OVERHEAD) {
|
||||
/* workaround for dm962x errata with tx fifo getting out of
|
||||
* sync if a USB bulk transfer retry happens right after a
|
||||
* packet with odd / maxpacket length by adding up to 3 bytes
|
||||
* padding.
|
||||
*/
|
||||
while ((len & 1) || !(len % dev->maxpacket))
|
||||
len++;
|
||||
|
||||
len -= DM_TX_OVERHEAD; /* hw header doesn't count as part of length */
|
||||
pad = len - skb->len;
|
||||
|
||||
if (skb_headroom(skb) < DM_TX_OVERHEAD || skb_tailroom(skb) < pad) {
|
||||
struct sk_buff *skb2;
|
||||
|
||||
skb2 = skb_copy_expand(skb, DM_TX_OVERHEAD, 0, flags);
|
||||
skb2 = skb_copy_expand(skb, DM_TX_OVERHEAD, pad, flags);
|
||||
dev_kfree_skb_any(skb);
|
||||
skb = skb2;
|
||||
if (!skb)
|
||||
@ -490,10 +506,10 @@ static struct sk_buff *dm9601_tx_fixup(struct usbnet *dev, struct sk_buff *skb,
|
||||
|
||||
__skb_push(skb, DM_TX_OVERHEAD);
|
||||
|
||||
/* usbnet adds padding if length is a multiple of packet size
|
||||
if so, adjust length value in header */
|
||||
if ((skb->len % dev->maxpacket) == 0)
|
||||
len++;
|
||||
if (pad) {
|
||||
memset(skb->data + skb->len, 0, pad);
|
||||
__skb_put(skb, pad);
|
||||
}
|
||||
|
||||
skb->data[0] = len;
|
||||
skb->data[1] = len >> 8;
|
||||
|
@ -76,9 +76,16 @@ static bool ar9002_hw_get_isr(struct ath_hw *ah, enum ath9k_int *masked)
|
||||
mask2 |= ATH9K_INT_CST;
|
||||
if (isr2 & AR_ISR_S2_TSFOOR)
|
||||
mask2 |= ATH9K_INT_TSFOOR;
|
||||
|
||||
if (!(pCap->hw_caps & ATH9K_HW_CAP_RAC_SUPPORTED)) {
|
||||
REG_WRITE(ah, AR_ISR_S2, isr2);
|
||||
isr &= ~AR_ISR_BCNMISC;
|
||||
}
|
||||
}
|
||||
|
||||
isr = REG_READ(ah, AR_ISR_RAC);
|
||||
if (pCap->hw_caps & ATH9K_HW_CAP_RAC_SUPPORTED)
|
||||
isr = REG_READ(ah, AR_ISR_RAC);
|
||||
|
||||
if (isr == 0xffffffff) {
|
||||
*masked = 0;
|
||||
return false;
|
||||
@ -97,11 +104,23 @@ static bool ar9002_hw_get_isr(struct ath_hw *ah, enum ath9k_int *masked)
|
||||
|
||||
*masked |= ATH9K_INT_TX;
|
||||
|
||||
s0_s = REG_READ(ah, AR_ISR_S0_S);
|
||||
if (pCap->hw_caps & ATH9K_HW_CAP_RAC_SUPPORTED) {
|
||||
s0_s = REG_READ(ah, AR_ISR_S0_S);
|
||||
s1_s = REG_READ(ah, AR_ISR_S1_S);
|
||||
} else {
|
||||
s0_s = REG_READ(ah, AR_ISR_S0);
|
||||
REG_WRITE(ah, AR_ISR_S0, s0_s);
|
||||
s1_s = REG_READ(ah, AR_ISR_S1);
|
||||
REG_WRITE(ah, AR_ISR_S1, s1_s);
|
||||
|
||||
isr &= ~(AR_ISR_TXOK |
|
||||
AR_ISR_TXDESC |
|
||||
AR_ISR_TXERR |
|
||||
AR_ISR_TXEOL);
|
||||
}
|
||||
|
||||
ah->intr_txqs |= MS(s0_s, AR_ISR_S0_QCU_TXOK);
|
||||
ah->intr_txqs |= MS(s0_s, AR_ISR_S0_QCU_TXDESC);
|
||||
|
||||
s1_s = REG_READ(ah, AR_ISR_S1_S);
|
||||
ah->intr_txqs |= MS(s1_s, AR_ISR_S1_QCU_TXERR);
|
||||
ah->intr_txqs |= MS(s1_s, AR_ISR_S1_QCU_TXEOL);
|
||||
}
|
||||
@ -114,13 +133,15 @@ static bool ar9002_hw_get_isr(struct ath_hw *ah, enum ath9k_int *masked)
|
||||
*masked |= mask2;
|
||||
}
|
||||
|
||||
if (AR_SREV_9100(ah))
|
||||
return true;
|
||||
|
||||
if (isr & AR_ISR_GENTMR) {
|
||||
if (!AR_SREV_9100(ah) && (isr & AR_ISR_GENTMR)) {
|
||||
u32 s5_s;
|
||||
|
||||
s5_s = REG_READ(ah, AR_ISR_S5_S);
|
||||
if (pCap->hw_caps & ATH9K_HW_CAP_RAC_SUPPORTED) {
|
||||
s5_s = REG_READ(ah, AR_ISR_S5_S);
|
||||
} else {
|
||||
s5_s = REG_READ(ah, AR_ISR_S5);
|
||||
}
|
||||
|
||||
ah->intr_gen_timer_trigger =
|
||||
MS(s5_s, AR_ISR_S5_GENTIMER_TRIG);
|
||||
|
||||
@ -133,8 +154,21 @@ static bool ar9002_hw_get_isr(struct ath_hw *ah, enum ath9k_int *masked)
|
||||
if ((s5_s & AR_ISR_S5_TIM_TIMER) &&
|
||||
!(pCap->hw_caps & ATH9K_HW_CAP_AUTOSLEEP))
|
||||
*masked |= ATH9K_INT_TIM_TIMER;
|
||||
|
||||
if (!(pCap->hw_caps & ATH9K_HW_CAP_RAC_SUPPORTED)) {
|
||||
REG_WRITE(ah, AR_ISR_S5, s5_s);
|
||||
isr &= ~AR_ISR_GENTMR;
|
||||
}
|
||||
}
|
||||
|
||||
if (!(pCap->hw_caps & ATH9K_HW_CAP_RAC_SUPPORTED)) {
|
||||
REG_WRITE(ah, AR_ISR, isr);
|
||||
REG_READ(ah, AR_ISR);
|
||||
}
|
||||
|
||||
if (AR_SREV_9100(ah))
|
||||
return true;
|
||||
|
||||
if (sync_cause) {
|
||||
ath9k_debug_sync_cause(common, sync_cause);
|
||||
fatal_int =
|
||||
|
@ -734,6 +734,8 @@ static void _rtl_pci_rx_interrupt(struct ieee80211_hw *hw)
|
||||
};
|
||||
int index = rtlpci->rx_ring[rx_queue_idx].idx;
|
||||
|
||||
if (rtlpci->driver_is_goingto_unload)
|
||||
return;
|
||||
/*RX NORMAL PKT */
|
||||
while (count--) {
|
||||
/*rx descriptor */
|
||||
@ -1630,6 +1632,7 @@ static void rtl_pci_stop(struct ieee80211_hw *hw)
|
||||
*/
|
||||
set_hal_stop(rtlhal);
|
||||
|
||||
rtlpci->driver_is_goingto_unload = true;
|
||||
rtlpriv->cfg->ops->disable_interrupt(hw);
|
||||
cancel_work_sync(&rtlpriv->works.lps_change_work);
|
||||
|
||||
@ -1647,7 +1650,6 @@ static void rtl_pci_stop(struct ieee80211_hw *hw)
|
||||
ppsc->rfchange_inprogress = true;
|
||||
spin_unlock_irqrestore(&rtlpriv->locks.rf_ps_lock, flags);
|
||||
|
||||
rtlpci->driver_is_goingto_unload = true;
|
||||
rtlpriv->cfg->ops->hw_disable(hw);
|
||||
/* some things are not needed if firmware not available */
|
||||
if (!rtlpriv->max_fw_size)
|
||||
|
@ -69,14 +69,6 @@ static u64 of_bus_default_map(__be32 *addr, const __be32 *range,
|
||||
(unsigned long long)cp, (unsigned long long)s,
|
||||
(unsigned long long)da);
|
||||
|
||||
/*
|
||||
* If the number of address cells is larger than 2 we assume the
|
||||
* mapping doesn't specify a physical address. Rather, the address
|
||||
* specifies an identifier that must match exactly.
|
||||
*/
|
||||
if (na > 2 && memcmp(range, addr, na * 4) != 0)
|
||||
return OF_BAD_ADDR;
|
||||
|
||||
if (da < cp || da >= (cp + s))
|
||||
return OF_BAD_ADDR;
|
||||
return da - cp;
|
||||
|
@ -942,7 +942,7 @@ static int tty3270_install(struct tty_driver *driver, struct tty_struct *tty)
|
||||
return rc;
|
||||
}
|
||||
|
||||
tp->screen = tty3270_alloc_screen(tp->view.cols, tp->view.rows);
|
||||
tp->screen = tty3270_alloc_screen(tp->view.rows, tp->view.cols);
|
||||
if (IS_ERR(tp->screen)) {
|
||||
rc = PTR_ERR(tp->screen);
|
||||
raw3270_put_view(&tp->view);
|
||||
|
@ -66,7 +66,8 @@ enum pci_8255_boardid {
|
||||
BOARD_ADLINK_PCI7296,
|
||||
BOARD_CB_PCIDIO24,
|
||||
BOARD_CB_PCIDIO24H,
|
||||
BOARD_CB_PCIDIO48H,
|
||||
BOARD_CB_PCIDIO48H_OLD,
|
||||
BOARD_CB_PCIDIO48H_NEW,
|
||||
BOARD_CB_PCIDIO96H,
|
||||
BOARD_NI_PCIDIO96,
|
||||
BOARD_NI_PCIDIO96B,
|
||||
@ -109,11 +110,16 @@ static const struct pci_8255_boardinfo pci_8255_boards[] = {
|
||||
.dio_badr = 2,
|
||||
.n_8255 = 1,
|
||||
},
|
||||
[BOARD_CB_PCIDIO48H] = {
|
||||
[BOARD_CB_PCIDIO48H_OLD] = {
|
||||
.name = "cb_pci-dio48h",
|
||||
.dio_badr = 1,
|
||||
.n_8255 = 2,
|
||||
},
|
||||
[BOARD_CB_PCIDIO48H_NEW] = {
|
||||
.name = "cb_pci-dio48h",
|
||||
.dio_badr = 2,
|
||||
.n_8255 = 2,
|
||||
},
|
||||
[BOARD_CB_PCIDIO96H] = {
|
||||
.name = "cb_pci-dio96h",
|
||||
.dio_badr = 2,
|
||||
@ -270,7 +276,10 @@ static DEFINE_PCI_DEVICE_TABLE(pci_8255_pci_table) = {
|
||||
{ PCI_VDEVICE(ADLINK, 0x7296), BOARD_ADLINK_PCI7296 },
|
||||
{ PCI_VDEVICE(CB, 0x0028), BOARD_CB_PCIDIO24 },
|
||||
{ PCI_VDEVICE(CB, 0x0014), BOARD_CB_PCIDIO24H },
|
||||
{ PCI_VDEVICE(CB, 0x000b), BOARD_CB_PCIDIO48H },
|
||||
{ PCI_DEVICE_SUB(PCI_VENDOR_ID_CB, 0x000b, 0x0000, 0x0000),
|
||||
.driver_data = BOARD_CB_PCIDIO48H_OLD },
|
||||
{ PCI_DEVICE_SUB(PCI_VENDOR_ID_CB, 0x000b, PCI_VENDOR_ID_CB, 0x000b),
|
||||
.driver_data = BOARD_CB_PCIDIO48H_NEW },
|
||||
{ PCI_VDEVICE(CB, 0x0017), BOARD_CB_PCIDIO96H },
|
||||
{ PCI_VDEVICE(NI, 0x0160), BOARD_NI_PCIDIO96 },
|
||||
{ PCI_VDEVICE(NI, 0x1630), BOARD_NI_PCIDIO96B },
|
||||
|
@ -838,24 +838,22 @@ int iscsit_setup_scsi_cmd(struct iscsi_conn *conn, struct iscsi_cmd *cmd,
|
||||
if (((hdr->flags & ISCSI_FLAG_CMD_READ) ||
|
||||
(hdr->flags & ISCSI_FLAG_CMD_WRITE)) && !hdr->data_length) {
|
||||
/*
|
||||
* Vmware ESX v3.0 uses a modified Cisco Initiator (v3.4.2)
|
||||
* that adds support for RESERVE/RELEASE. There is a bug
|
||||
* add with this new functionality that sets R/W bits when
|
||||
* neither CDB carries any READ or WRITE datapayloads.
|
||||
* From RFC-3720 Section 10.3.1:
|
||||
*
|
||||
* "Either or both of R and W MAY be 1 when either the
|
||||
* Expected Data Transfer Length and/or Bidirectional Read
|
||||
* Expected Data Transfer Length are 0"
|
||||
*
|
||||
* For this case, go ahead and clear the unnecssary bits
|
||||
* to avoid any confusion with ->data_direction.
|
||||
*/
|
||||
if ((hdr->cdb[0] == 0x16) || (hdr->cdb[0] == 0x17)) {
|
||||
hdr->flags &= ~ISCSI_FLAG_CMD_READ;
|
||||
hdr->flags &= ~ISCSI_FLAG_CMD_WRITE;
|
||||
goto done;
|
||||
}
|
||||
hdr->flags &= ~ISCSI_FLAG_CMD_READ;
|
||||
hdr->flags &= ~ISCSI_FLAG_CMD_WRITE;
|
||||
|
||||
pr_err("ISCSI_FLAG_CMD_READ or ISCSI_FLAG_CMD_WRITE"
|
||||
pr_warn("ISCSI_FLAG_CMD_READ or ISCSI_FLAG_CMD_WRITE"
|
||||
" set when Expected Data Transfer Length is 0 for"
|
||||
" CDB: 0x%02x. Bad iSCSI Initiator.\n", hdr->cdb[0]);
|
||||
return iscsit_add_reject_cmd(cmd,
|
||||
ISCSI_REASON_BOOKMARK_INVALID, buf);
|
||||
" CDB: 0x%02x, Fixing up flags\n", hdr->cdb[0]);
|
||||
}
|
||||
done:
|
||||
|
||||
if (!(hdr->flags & ISCSI_FLAG_CMD_READ) &&
|
||||
!(hdr->flags & ISCSI_FLAG_CMD_WRITE) && (hdr->data_length != 0)) {
|
||||
|
@ -1078,6 +1078,11 @@ int se_dev_set_block_size(struct se_device *dev, u32 block_size)
|
||||
dev->dev_attrib.block_size = block_size;
|
||||
pr_debug("dev[%p]: SE Device block_size changed to %u\n",
|
||||
dev, block_size);
|
||||
|
||||
if (dev->dev_attrib.max_bytes_per_io)
|
||||
dev->dev_attrib.hw_max_sectors =
|
||||
dev->dev_attrib.max_bytes_per_io / block_size;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -66,9 +66,8 @@ static int fd_attach_hba(struct se_hba *hba, u32 host_id)
|
||||
pr_debug("CORE_HBA[%d] - TCM FILEIO HBA Driver %s on Generic"
|
||||
" Target Core Stack %s\n", hba->hba_id, FD_VERSION,
|
||||
TARGET_CORE_MOD_VERSION);
|
||||
pr_debug("CORE_HBA[%d] - Attached FILEIO HBA: %u to Generic"
|
||||
" MaxSectors: %u\n",
|
||||
hba->hba_id, fd_host->fd_host_id, FD_MAX_SECTORS);
|
||||
pr_debug("CORE_HBA[%d] - Attached FILEIO HBA: %u to Generic\n",
|
||||
hba->hba_id, fd_host->fd_host_id);
|
||||
|
||||
return 0;
|
||||
}
|
||||
@ -220,7 +219,8 @@ static int fd_configure_device(struct se_device *dev)
|
||||
}
|
||||
|
||||
dev->dev_attrib.hw_block_size = fd_dev->fd_block_size;
|
||||
dev->dev_attrib.hw_max_sectors = FD_MAX_SECTORS;
|
||||
dev->dev_attrib.max_bytes_per_io = FD_MAX_BYTES;
|
||||
dev->dev_attrib.hw_max_sectors = FD_MAX_BYTES / fd_dev->fd_block_size;
|
||||
dev->dev_attrib.hw_queue_depth = FD_MAX_DEVICE_QUEUE_DEPTH;
|
||||
|
||||
if (fd_dev->fbd_flags & FDBD_HAS_BUFFERED_IO_WCE) {
|
||||
|
@ -7,7 +7,10 @@
|
||||
#define FD_DEVICE_QUEUE_DEPTH 32
|
||||
#define FD_MAX_DEVICE_QUEUE_DEPTH 128
|
||||
#define FD_BLOCKSIZE 512
|
||||
#define FD_MAX_SECTORS 2048
|
||||
/*
|
||||
* Limited by the number of iovecs (2048) per vfs_[writev,readv] call
|
||||
*/
|
||||
#define FD_MAX_BYTES 8388608
|
||||
|
||||
#define RRF_EMULATE_CDB 0x01
|
||||
#define RRF_GOT_LBA 0x02
|
||||
|
@ -369,6 +369,8 @@ MODULE_DEVICE_TABLE(of, dw8250_of_match);
|
||||
static const struct acpi_device_id dw8250_acpi_match[] = {
|
||||
{ "INT33C4", 0 },
|
||||
{ "INT33C5", 0 },
|
||||
{ "INT3434", 0 },
|
||||
{ "INT3435", 0 },
|
||||
{ "80860F0A", 0 },
|
||||
{ },
|
||||
};
|
||||
|
@ -2051,6 +2051,9 @@ static int __init pmz_console_init(void)
|
||||
/* Probe ports */
|
||||
pmz_probe();
|
||||
|
||||
if (pmz_ports_count == 0)
|
||||
return -ENODEV;
|
||||
|
||||
/* TODO: Autoprobe console based on OF */
|
||||
/* pmz_console.index = i; */
|
||||
register_console(&pmz_console);
|
||||
|
@ -176,14 +176,7 @@ retry:
|
||||
return result;
|
||||
}
|
||||
|
||||
/* Try sending off another urb, unless in irq context (in which case
|
||||
* there will be no free urb). */
|
||||
if (!in_irq())
|
||||
goto retry;
|
||||
|
||||
clear_bit_unlock(USB_SERIAL_WRITE_BUSY, &port->flags);
|
||||
|
||||
return 0;
|
||||
goto retry; /* try sending off another urb */
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -251,6 +251,7 @@ static void option_instat_callback(struct urb *urb);
|
||||
#define ZTE_PRODUCT_MF628 0x0015
|
||||
#define ZTE_PRODUCT_MF626 0x0031
|
||||
#define ZTE_PRODUCT_MC2718 0xffe8
|
||||
#define ZTE_PRODUCT_AC2726 0xfff1
|
||||
|
||||
#define BENQ_VENDOR_ID 0x04a5
|
||||
#define BENQ_PRODUCT_H10 0x4068
|
||||
@ -1456,6 +1457,7 @@ static const struct usb_device_id option_ids[] = {
|
||||
{ USB_VENDOR_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0xff, 0x02, 0x01) },
|
||||
{ USB_VENDOR_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0xff, 0x02, 0x05) },
|
||||
{ USB_VENDOR_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0xff, 0x86, 0x10) },
|
||||
{ USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, ZTE_PRODUCT_AC2726, 0xff, 0xff, 0xff) },
|
||||
|
||||
{ USB_DEVICE(BENQ_VENDOR_ID, BENQ_PRODUCT_H10) },
|
||||
{ USB_DEVICE(DLINK_VENDOR_ID, DLINK_PRODUCT_DWM_652) },
|
||||
|
@ -281,8 +281,7 @@ static const struct usb_device_id id_table[] = {
|
||||
{ USB_DEVICE(0x19d2, 0xfffd) },
|
||||
{ USB_DEVICE(0x19d2, 0xfffc) },
|
||||
{ USB_DEVICE(0x19d2, 0xfffb) },
|
||||
/* AC2726, AC8710_V3 */
|
||||
{ USB_DEVICE_AND_INTERFACE_INFO(0x19d2, 0xfff1, 0xff, 0xff, 0xff) },
|
||||
/* AC8710_V3 */
|
||||
{ USB_DEVICE(0x19d2, 0xfff6) },
|
||||
{ USB_DEVICE(0x19d2, 0xfff7) },
|
||||
{ USB_DEVICE(0x19d2, 0xfff8) },
|
||||
|
@ -213,9 +213,13 @@ static int readpage_nounlock(struct file *filp, struct page *page)
|
||||
if (err < 0) {
|
||||
SetPageError(page);
|
||||
goto out;
|
||||
} else if (err < PAGE_CACHE_SIZE) {
|
||||
} else {
|
||||
if (err < PAGE_CACHE_SIZE) {
|
||||
/* zero fill remainder of page */
|
||||
zero_user_segment(page, err, PAGE_CACHE_SIZE);
|
||||
zero_user_segment(page, err, PAGE_CACHE_SIZE);
|
||||
} else {
|
||||
flush_dcache_page(page);
|
||||
}
|
||||
}
|
||||
SetPageUptodate(page);
|
||||
|
||||
|
@ -313,9 +313,9 @@ static int striped_read(struct inode *inode,
|
||||
{
|
||||
struct ceph_fs_client *fsc = ceph_inode_to_client(inode);
|
||||
struct ceph_inode_info *ci = ceph_inode(inode);
|
||||
u64 pos, this_len;
|
||||
u64 pos, this_len, left;
|
||||
int io_align, page_align;
|
||||
int left, pages_left;
|
||||
int pages_left;
|
||||
int read;
|
||||
struct page **page_pos;
|
||||
int ret;
|
||||
@ -346,47 +346,40 @@ more:
|
||||
ret = 0;
|
||||
hit_stripe = this_len < left;
|
||||
was_short = ret >= 0 && ret < this_len;
|
||||
dout("striped_read %llu~%u (read %u) got %d%s%s\n", pos, left, read,
|
||||
dout("striped_read %llu~%llu (read %u) got %d%s%s\n", pos, left, read,
|
||||
ret, hit_stripe ? " HITSTRIPE" : "", was_short ? " SHORT" : "");
|
||||
|
||||
if (ret > 0) {
|
||||
int didpages = (page_align + ret) >> PAGE_CACHE_SHIFT;
|
||||
|
||||
if (read < pos - off) {
|
||||
dout(" zero gap %llu to %llu\n", off + read, pos);
|
||||
ceph_zero_page_vector_range(page_align + read,
|
||||
pos - off - read, pages);
|
||||
if (ret >= 0) {
|
||||
int didpages;
|
||||
if (was_short && (pos + ret < inode->i_size)) {
|
||||
u64 tmp = min(this_len - ret,
|
||||
inode->i_size - pos - ret);
|
||||
dout(" zero gap %llu to %llu\n",
|
||||
pos + ret, pos + ret + tmp);
|
||||
ceph_zero_page_vector_range(page_align + read + ret,
|
||||
tmp, pages);
|
||||
ret += tmp;
|
||||
}
|
||||
|
||||
didpages = (page_align + ret) >> PAGE_CACHE_SHIFT;
|
||||
pos += ret;
|
||||
read = pos - off;
|
||||
left -= ret;
|
||||
page_pos += didpages;
|
||||
pages_left -= didpages;
|
||||
|
||||
/* hit stripe? */
|
||||
if (left && hit_stripe)
|
||||
/* hit stripe and need continue*/
|
||||
if (left && hit_stripe && pos < inode->i_size)
|
||||
goto more;
|
||||
}
|
||||
|
||||
if (was_short) {
|
||||
if (read > 0) {
|
||||
ret = read;
|
||||
/* did we bounce off eof? */
|
||||
if (pos + left > inode->i_size)
|
||||
*checkeof = 1;
|
||||
|
||||
/* zero trailing bytes (inside i_size) */
|
||||
if (left > 0 && pos < inode->i_size) {
|
||||
if (pos + left > inode->i_size)
|
||||
left = inode->i_size - pos;
|
||||
|
||||
dout("zero tail %d\n", left);
|
||||
ceph_zero_page_vector_range(page_align + read, left,
|
||||
pages);
|
||||
read += left;
|
||||
}
|
||||
}
|
||||
|
||||
if (ret >= 0)
|
||||
ret = read;
|
||||
dout("striped_read returns %d\n", ret);
|
||||
return ret;
|
||||
}
|
||||
@ -618,6 +611,8 @@ out:
|
||||
if (check_caps)
|
||||
ceph_check_caps(ceph_inode(inode), CHECK_CAPS_AUTHONLY,
|
||||
NULL);
|
||||
} else if (ret != -EOLDSNAPC && written > 0) {
|
||||
ret = written;
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
@ -211,8 +211,12 @@ static long ceph_ioctl_get_dataloc(struct file *file, void __user *arg)
|
||||
snprintf(dl.object_name, sizeof(dl.object_name), "%llx.%08llx",
|
||||
ceph_ino(inode), dl.object_no);
|
||||
|
||||
ceph_calc_ceph_pg(&pgid, dl.object_name, osdc->osdmap,
|
||||
ceph_file_layout_pg_pool(ci->i_layout));
|
||||
r = ceph_calc_ceph_pg(&pgid, dl.object_name, osdc->osdmap,
|
||||
ceph_file_layout_pg_pool(ci->i_layout));
|
||||
if (r < 0) {
|
||||
up_read(&osdc->map_sem);
|
||||
return r;
|
||||
}
|
||||
|
||||
dl.osd = ceph_calc_pg_primary(osdc->osdmap, pgid);
|
||||
if (dl.osd >= 0) {
|
||||
|
@ -414,6 +414,9 @@ static struct ceph_mds_session *register_session(struct ceph_mds_client *mdsc,
|
||||
{
|
||||
struct ceph_mds_session *s;
|
||||
|
||||
if (mds >= mdsc->mdsmap->m_max_mds)
|
||||
return ERR_PTR(-EINVAL);
|
||||
|
||||
s = kzalloc(sizeof(*s), GFP_NOFS);
|
||||
if (!s)
|
||||
return ERR_PTR(-ENOMEM);
|
||||
@ -639,6 +642,8 @@ static void __unregister_request(struct ceph_mds_client *mdsc,
|
||||
req->r_unsafe_dir = NULL;
|
||||
}
|
||||
|
||||
complete_all(&req->r_safe_completion);
|
||||
|
||||
ceph_mdsc_put_request(req);
|
||||
}
|
||||
|
||||
@ -1840,8 +1845,11 @@ static int __do_request(struct ceph_mds_client *mdsc,
|
||||
int mds = -1;
|
||||
int err = -EAGAIN;
|
||||
|
||||
if (req->r_err || req->r_got_result)
|
||||
if (req->r_err || req->r_got_result) {
|
||||
if (req->r_aborted)
|
||||
__unregister_request(mdsc, req);
|
||||
goto out;
|
||||
}
|
||||
|
||||
if (req->r_timeout &&
|
||||
time_after_eq(jiffies, req->r_started + req->r_timeout)) {
|
||||
@ -2151,7 +2159,6 @@ static void handle_reply(struct ceph_mds_session *session, struct ceph_msg *msg)
|
||||
if (head->safe) {
|
||||
req->r_got_safe = true;
|
||||
__unregister_request(mdsc, req);
|
||||
complete_all(&req->r_safe_completion);
|
||||
|
||||
if (req->r_got_unsafe) {
|
||||
/*
|
||||
@ -3040,8 +3047,10 @@ int ceph_mdsc_init(struct ceph_fs_client *fsc)
|
||||
fsc->mdsc = mdsc;
|
||||
mutex_init(&mdsc->mutex);
|
||||
mdsc->mdsmap = kzalloc(sizeof(*mdsc->mdsmap), GFP_NOFS);
|
||||
if (mdsc->mdsmap == NULL)
|
||||
if (mdsc->mdsmap == NULL) {
|
||||
kfree(mdsc);
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
init_completion(&mdsc->safe_umount_waiters);
|
||||
init_waitqueue_head(&mdsc->session_close_wq);
|
||||
|
@ -138,6 +138,8 @@ struct ceph_mdsmap *ceph_mdsmap_decode(void **p, void *end)
|
||||
m->m_info[mds].export_targets =
|
||||
kcalloc(num_export_targets, sizeof(u32),
|
||||
GFP_NOFS);
|
||||
if (m->m_info[mds].export_targets == NULL)
|
||||
goto badmem;
|
||||
for (j = 0; j < num_export_targets; j++)
|
||||
m->m_info[mds].export_targets[j] =
|
||||
ceph_decode_32(&pexport_targets);
|
||||
@ -170,7 +172,7 @@ bad:
|
||||
DUMP_PREFIX_OFFSET, 16, 1,
|
||||
start, end - start, true);
|
||||
ceph_mdsmap_destroy(m);
|
||||
return ERR_PTR(-EINVAL);
|
||||
return ERR_PTR(err);
|
||||
}
|
||||
|
||||
void ceph_mdsmap_destroy(struct ceph_mdsmap *m)
|
||||
|
@ -357,7 +357,7 @@ static int parse_mount_options(struct ceph_mount_options **pfsopt,
|
||||
}
|
||||
err = -EINVAL;
|
||||
dev_name_end--; /* back up to ':' separator */
|
||||
if (*dev_name_end != ':') {
|
||||
if (dev_name_end < dev_name || *dev_name_end != ':') {
|
||||
pr_err("device name is missing path (no : separator in %s)\n",
|
||||
dev_name);
|
||||
goto out;
|
||||
|
@ -999,6 +999,7 @@ static ssize_t gfs2_direct_IO(int rw, struct kiocb *iocb,
|
||||
{
|
||||
struct file *file = iocb->ki_filp;
|
||||
struct inode *inode = file->f_mapping->host;
|
||||
struct address_space *mapping = inode->i_mapping;
|
||||
struct gfs2_inode *ip = GFS2_I(inode);
|
||||
struct gfs2_holder gh;
|
||||
int rv;
|
||||
@ -1019,6 +1020,35 @@ static ssize_t gfs2_direct_IO(int rw, struct kiocb *iocb,
|
||||
if (rv != 1)
|
||||
goto out; /* dio not valid, fall back to buffered i/o */
|
||||
|
||||
/*
|
||||
* Now since we are holding a deferred (CW) lock at this point, you
|
||||
* might be wondering why this is ever needed. There is a case however
|
||||
* where we've granted a deferred local lock against a cached exclusive
|
||||
* glock. That is ok provided all granted local locks are deferred, but
|
||||
* it also means that it is possible to encounter pages which are
|
||||
* cached and possibly also mapped. So here we check for that and sort
|
||||
* them out ahead of the dio. The glock state machine will take care of
|
||||
* everything else.
|
||||
*
|
||||
* If in fact the cached glock state (gl->gl_state) is deferred (CW) in
|
||||
* the first place, mapping->nr_pages will always be zero.
|
||||
*/
|
||||
if (mapping->nrpages) {
|
||||
loff_t lstart = offset & (PAGE_CACHE_SIZE - 1);
|
||||
loff_t len = iov_length(iov, nr_segs);
|
||||
loff_t end = PAGE_ALIGN(offset + len) - 1;
|
||||
|
||||
rv = 0;
|
||||
if (len == 0)
|
||||
goto out;
|
||||
if (test_and_clear_bit(GIF_SW_PAGED, &ip->i_flags))
|
||||
unmap_shared_mapping_range(ip->i_inode.i_mapping, offset, len);
|
||||
rv = filemap_write_and_wait_range(mapping, lstart, end);
|
||||
if (rv)
|
||||
return rv;
|
||||
truncate_inode_pages_range(mapping, lstart, end);
|
||||
}
|
||||
|
||||
rv = __blockdev_direct_IO(rw, iocb, inode, inode->i_sb->s_bdev, iov,
|
||||
offset, nr_segs, gfs2_get_block_direct,
|
||||
NULL, NULL, 0);
|
||||
|
@ -1317,8 +1317,18 @@ static struct dentry *gfs2_mount(struct file_system_type *fs_type, int flags,
|
||||
if (IS_ERR(s))
|
||||
goto error_bdev;
|
||||
|
||||
if (s->s_root)
|
||||
if (s->s_root) {
|
||||
/*
|
||||
* s_umount nests inside bd_mutex during
|
||||
* __invalidate_device(). blkdev_put() acquires
|
||||
* bd_mutex and can't be called under s_umount. Drop
|
||||
* s_umount temporarily. This is safe as we're
|
||||
* holding an active reference.
|
||||
*/
|
||||
up_write(&s->s_umount);
|
||||
blkdev_put(bdev, mode);
|
||||
down_write(&s->s_umount);
|
||||
}
|
||||
|
||||
memset(&args, 0, sizeof(args));
|
||||
args.ar_quota = GFS2_QUOTA_DEFAULT;
|
||||
|
@ -220,7 +220,7 @@ static inline int pmd_same(pmd_t pmd_a, pmd_t pmd_b)
|
||||
#endif
|
||||
|
||||
#ifndef pte_accessible
|
||||
# define pte_accessible(pte) ((void)(pte),1)
|
||||
# define pte_accessible(mm, pte) ((void)(pte), 1)
|
||||
#endif
|
||||
|
||||
#ifndef flush_tlb_fix_spurious_fault
|
||||
|
@ -32,7 +32,7 @@
|
||||
#ifdef CONFIG_ARM_ARCH_TIMER
|
||||
|
||||
extern u32 arch_timer_get_rate(void);
|
||||
extern u64 (*arch_timer_read_counter)(void);
|
||||
extern u64 arch_timer_read_counter(void);
|
||||
extern struct timecounter *arch_timer_get_timecounter(void);
|
||||
|
||||
#else
|
||||
|
@ -559,7 +559,7 @@
|
||||
{0x1002, 0x9645, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_SUMO2|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP|RADEON_IS_IGP}, \
|
||||
{0x1002, 0x9647, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_SUMO|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP|RADEON_IS_IGP},\
|
||||
{0x1002, 0x9648, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_SUMO|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP|RADEON_IS_IGP},\
|
||||
{0x1002, 0x9649, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_SUMO|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP|RADEON_IS_IGP},\
|
||||
{0x1002, 0x9649, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_SUMO2|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP|RADEON_IS_IGP},\
|
||||
{0x1002, 0x964a, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_SUMO|RADEON_NEW_MEMMAP|RADEON_IS_IGP}, \
|
||||
{0x1002, 0x964b, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_SUMO|RADEON_NEW_MEMMAP|RADEON_IS_IGP}, \
|
||||
{0x1002, 0x964c, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_SUMO|RADEON_NEW_MEMMAP|RADEON_IS_IGP}, \
|
||||
|
@ -3,6 +3,6 @@
|
||||
|
||||
#include <uapi/linux/auxvec.h>
|
||||
|
||||
#define AT_VECTOR_SIZE_BASE 19 /* NEW_AUX_ENT entries in auxiliary table */
|
||||
#define AT_VECTOR_SIZE_BASE 20 /* NEW_AUX_ENT entries in auxiliary table */
|
||||
/* number of "#define AT_.*" above, minus {AT_NULL, AT_IGNORE, AT_NOTELF} */
|
||||
#endif /* _LINUX_AUXVEC_H */
|
||||
|
@ -145,7 +145,6 @@ struct ceph_osd_request {
|
||||
s32 r_reply_op_result[CEPH_OSD_MAX_OP];
|
||||
int r_got_reply;
|
||||
int r_linger;
|
||||
int r_completed;
|
||||
|
||||
struct ceph_osd_client *r_osdc;
|
||||
struct kref r_kref;
|
||||
@ -336,6 +335,8 @@ extern int ceph_osdc_wait_request(struct ceph_osd_client *osdc,
|
||||
struct ceph_osd_request *req);
|
||||
extern void ceph_osdc_sync(struct ceph_osd_client *osdc);
|
||||
|
||||
extern void ceph_osdc_flush_notifies(struct ceph_osd_client *osdc);
|
||||
|
||||
extern int ceph_osdc_readpages(struct ceph_osd_client *osdc,
|
||||
struct ceph_vino vino,
|
||||
struct ceph_file_layout *layout,
|
||||
|
@ -399,6 +399,7 @@ enum {
|
||||
ATA_HORKAGE_BROKEN_FPDMA_AA = (1 << 15), /* skip AA */
|
||||
ATA_HORKAGE_DUMP_ID = (1 << 16), /* dump IDENTIFY data */
|
||||
ATA_HORKAGE_MAX_SEC_LBA48 = (1 << 17), /* Set max sects to 65535 */
|
||||
ATA_HORKAGE_ATAPI_DMADIR = (1 << 18), /* device requires dmadir */
|
||||
|
||||
/* DMA mask for user DMA control: User visible values; DO NOT
|
||||
renumber */
|
||||
|
@ -437,6 +437,14 @@ struct mm_struct {
|
||||
* a different node than Make PTE Scan Go Now.
|
||||
*/
|
||||
int first_nid;
|
||||
#endif
|
||||
#if defined(CONFIG_NUMA_BALANCING) || defined(CONFIG_COMPACTION)
|
||||
/*
|
||||
* An operation with batched TLB flushing is going on. Anything that
|
||||
* can move process memory needs to flush the TLB when moving a
|
||||
* PROT_NONE or PROT_NUMA mapped page.
|
||||
*/
|
||||
bool tlb_flush_pending;
|
||||
#endif
|
||||
struct uprobes_state uprobes_state;
|
||||
};
|
||||
@ -458,4 +466,45 @@ static inline cpumask_t *mm_cpumask(struct mm_struct *mm)
|
||||
return mm->cpu_vm_mask_var;
|
||||
}
|
||||
|
||||
#if defined(CONFIG_NUMA_BALANCING) || defined(CONFIG_COMPACTION)
|
||||
/*
|
||||
* Memory barriers to keep this state in sync are graciously provided by
|
||||
* the page table locks, outside of which no page table modifications happen.
|
||||
* The barriers below prevent the compiler from re-ordering the instructions
|
||||
* around the memory barriers that are already present in the code.
|
||||
*/
|
||||
static inline bool mm_tlb_flush_pending(struct mm_struct *mm)
|
||||
{
|
||||
barrier();
|
||||
return mm->tlb_flush_pending;
|
||||
}
|
||||
static inline void set_tlb_flush_pending(struct mm_struct *mm)
|
||||
{
|
||||
mm->tlb_flush_pending = true;
|
||||
|
||||
/*
|
||||
* Guarantee that the tlb_flush_pending store does not leak into the
|
||||
* critical section updating the page tables
|
||||
*/
|
||||
smp_mb__before_spinlock();
|
||||
}
|
||||
/* Clearing is done after a TLB flush, which also provides a barrier. */
|
||||
static inline void clear_tlb_flush_pending(struct mm_struct *mm)
|
||||
{
|
||||
barrier();
|
||||
mm->tlb_flush_pending = false;
|
||||
}
|
||||
#else
|
||||
static inline bool mm_tlb_flush_pending(struct mm_struct *mm)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
static inline void set_tlb_flush_pending(struct mm_struct *mm)
|
||||
{
|
||||
}
|
||||
static inline void clear_tlb_flush_pending(struct mm_struct *mm)
|
||||
{
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* _LINUX_MM_TYPES_H */
|
||||
|
@ -117,9 +117,17 @@ do { \
|
||||
#endif /*arch_spin_is_contended*/
|
||||
#endif
|
||||
|
||||
/* The lock does not imply full memory barrier. */
|
||||
#ifndef ARCH_HAS_SMP_MB_AFTER_LOCK
|
||||
static inline void smp_mb__after_lock(void) { smp_mb(); }
|
||||
/*
|
||||
* Despite its name it doesn't necessarily has to be a full barrier.
|
||||
* It should only guarantee that a STORE before the critical section
|
||||
* can not be reordered with a LOAD inside this section.
|
||||
* spin_lock() is the one-way barrier, this LOAD can not escape out
|
||||
* of the region. So the default implementation simply ensures that
|
||||
* a STORE can not move into the critical section, smp_wmb() should
|
||||
* serialize it with another STORE done by spin_lock().
|
||||
*/
|
||||
#ifndef smp_mb__before_spinlock
|
||||
#define smp_mb__before_spinlock() smp_wmb()
|
||||
#endif
|
||||
|
||||
/**
|
||||
|
@ -614,6 +614,7 @@ struct se_dev_attrib {
|
||||
u32 unmap_granularity;
|
||||
u32 unmap_granularity_alignment;
|
||||
u32 max_write_same_len;
|
||||
u32 max_bytes_per_io;
|
||||
struct se_device *da_dev;
|
||||
struct config_group da_group;
|
||||
};
|
||||
|
@ -561,6 +561,7 @@ static struct mm_struct *mm_init(struct mm_struct *mm, struct task_struct *p)
|
||||
mm->cached_hole_size = ~0UL;
|
||||
mm_init_aio(mm);
|
||||
mm_init_owner(mm, p);
|
||||
clear_tlb_flush_pending(mm);
|
||||
|
||||
if (likely(!mm_alloc_pgd(mm))) {
|
||||
mm->def_flags = 0;
|
||||
|
@ -19,6 +19,12 @@ EXPORT_SYMBOL(system_freezing_cnt);
|
||||
bool pm_freezing;
|
||||
bool pm_nosig_freezing;
|
||||
|
||||
/*
|
||||
* Temporary export for the deadlock workaround in ata_scsi_hotplug().
|
||||
* Remove once the hack becomes unnecessary.
|
||||
*/
|
||||
EXPORT_SYMBOL_GPL(pm_freezing);
|
||||
|
||||
/* protects freezing and frozen transitions */
|
||||
static DEFINE_SPINLOCK(freezer_lock);
|
||||
|
||||
|
@ -1488,7 +1488,13 @@ try_to_wake_up(struct task_struct *p, unsigned int state, int wake_flags)
|
||||
unsigned long flags;
|
||||
int cpu, success = 0;
|
||||
|
||||
smp_wmb();
|
||||
/*
|
||||
* If we are going to wake up a thread waiting for CONDITION we
|
||||
* need to ensure that CONDITION=1 done by the caller can not be
|
||||
* reordered with p->state check below. This pairs with mb() in
|
||||
* set_current_state() the waiting thread does.
|
||||
*/
|
||||
smp_mb__before_spinlock();
|
||||
raw_spin_lock_irqsave(&p->pi_lock, flags);
|
||||
if (!(p->state & state))
|
||||
goto out;
|
||||
@ -2995,6 +3001,12 @@ need_resched:
|
||||
if (sched_feat(HRTICK))
|
||||
hrtick_clear(rq);
|
||||
|
||||
/*
|
||||
* Make sure that signal_pending_state()->signal_pending() below
|
||||
* can't be reordered with __set_current_state(TASK_INTERRUPTIBLE)
|
||||
* done by the caller to avoid the race with signal_wake_up().
|
||||
*/
|
||||
smp_mb__before_spinlock();
|
||||
raw_spin_lock_irq(&rq->lock);
|
||||
|
||||
switch_count = &prev->nivcsw;
|
||||
|
@ -936,6 +936,13 @@ void task_numa_work(struct callback_head *work)
|
||||
if (vma->vm_end - vma->vm_start < HPAGE_SIZE)
|
||||
continue;
|
||||
|
||||
/*
|
||||
* Skip inaccessible VMAs to avoid any confusion between
|
||||
* PROT_NONE and NUMA hinting ptes
|
||||
*/
|
||||
if (!(vma->vm_flags & (VM_READ | VM_EXEC | VM_WRITE)))
|
||||
continue;
|
||||
|
||||
do {
|
||||
start = max(start, vma->vm_start);
|
||||
end = ALIGN(start + (pages << PAGE_SHIFT), HPAGE_SIZE);
|
||||
|
@ -924,6 +924,13 @@ inc_rt_prio_smp(struct rt_rq *rt_rq, int prio, int prev_prio)
|
||||
{
|
||||
struct rq *rq = rq_of_rt_rq(rt_rq);
|
||||
|
||||
#ifdef CONFIG_RT_GROUP_SCHED
|
||||
/*
|
||||
* Change rq's cpupri only if rt_rq is the top queue.
|
||||
*/
|
||||
if (&rq->rt != rt_rq)
|
||||
return;
|
||||
#endif
|
||||
if (rq->online && prio < prev_prio)
|
||||
cpupri_set(&rq->rd->cpupri, rq->cpu, prio);
|
||||
}
|
||||
@ -933,6 +940,13 @@ dec_rt_prio_smp(struct rt_rq *rt_rq, int prio, int prev_prio)
|
||||
{
|
||||
struct rq *rq = rq_of_rt_rq(rt_rq);
|
||||
|
||||
#ifdef CONFIG_RT_GROUP_SCHED
|
||||
/*
|
||||
* Change rq's cpupri only if rt_rq is the top queue.
|
||||
*/
|
||||
if (&rq->rt != rt_rq)
|
||||
return;
|
||||
#endif
|
||||
if (rq->online && rt_rq->highest_prio.curr != prev_prio)
|
||||
cpupri_set(&rq->rd->cpupri, rq->cpu, rt_rq->highest_prio.curr);
|
||||
}
|
||||
|
@ -750,7 +750,7 @@ static int ftrace_profile_init(void)
|
||||
int cpu;
|
||||
int ret = 0;
|
||||
|
||||
for_each_online_cpu(cpu) {
|
||||
for_each_possible_cpu(cpu) {
|
||||
ret = ftrace_profile_init_cpu(cpu);
|
||||
if (ret)
|
||||
break;
|
||||
|
@ -134,6 +134,10 @@ static void update_pageblock_skip(struct compact_control *cc,
|
||||
bool migrate_scanner)
|
||||
{
|
||||
struct zone *zone = cc->zone;
|
||||
|
||||
if (cc->ignore_skip_hint)
|
||||
return;
|
||||
|
||||
if (!page)
|
||||
return;
|
||||
|
||||
|
@ -203,9 +203,10 @@ get_write_lock:
|
||||
if (mapping_cap_account_dirty(mapping)) {
|
||||
unsigned long addr;
|
||||
struct file *file = get_file(vma->vm_file);
|
||||
/* mmap_region may free vma; grab the info now */
|
||||
vm_flags = vma->vm_flags;
|
||||
|
||||
addr = mmap_region(file, start, size,
|
||||
vma->vm_flags, pgoff);
|
||||
addr = mmap_region(file, start, size, vm_flags, pgoff);
|
||||
fput(file);
|
||||
if (IS_ERR_VALUE(addr)) {
|
||||
err = addr;
|
||||
@ -213,7 +214,7 @@ get_write_lock:
|
||||
BUG_ON(addr != start);
|
||||
err = 0;
|
||||
}
|
||||
goto out;
|
||||
goto out_freed;
|
||||
}
|
||||
mutex_lock(&mapping->i_mmap_mutex);
|
||||
flush_dcache_mmap_lock(mapping);
|
||||
@ -248,6 +249,7 @@ get_write_lock:
|
||||
out:
|
||||
if (vma)
|
||||
vm_flags = vma->vm_flags;
|
||||
out_freed:
|
||||
if (likely(!has_write_lock))
|
||||
up_read(&mm->mmap_sem);
|
||||
else
|
||||
|
@ -1344,6 +1344,20 @@ int do_huge_pmd_numa_page(struct mm_struct *mm, struct vm_area_struct *vma,
|
||||
goto out_unlock;
|
||||
}
|
||||
|
||||
/* Bail if we fail to protect against THP splits for any reason */
|
||||
if (unlikely(!anon_vma)) {
|
||||
put_page(page);
|
||||
page_nid = -1;
|
||||
goto clear_pmdnuma;
|
||||
}
|
||||
|
||||
/*
|
||||
* The page_table_lock above provides a memory barrier
|
||||
* with change_protection_range.
|
||||
*/
|
||||
if (mm_tlb_flush_pending(mm))
|
||||
flush_tlb_range(vma, haddr, haddr + HPAGE_PMD_SIZE);
|
||||
|
||||
/*
|
||||
* Migrate the THP to the requested node, returns with page unlocked
|
||||
* and pmd_numa cleared.
|
||||
|
@ -385,7 +385,7 @@ struct mem_cgroup {
|
||||
static size_t memcg_size(void)
|
||||
{
|
||||
return sizeof(struct mem_cgroup) +
|
||||
nr_node_ids * sizeof(struct mem_cgroup_per_node);
|
||||
nr_node_ids * sizeof(struct mem_cgroup_per_node *);
|
||||
}
|
||||
|
||||
/* internal only representation about the status of kmem accounting. */
|
||||
|
@ -936,6 +936,16 @@ static int hwpoison_user_mappings(struct page *p, unsigned long pfn,
|
||||
BUG_ON(!PageHWPoison(p));
|
||||
return SWAP_FAIL;
|
||||
}
|
||||
/*
|
||||
* We pinned the head page for hwpoison handling,
|
||||
* now we split the thp and we are interested in
|
||||
* the hwpoisoned raw page, so move the refcount
|
||||
* to it.
|
||||
*/
|
||||
if (hpage != p) {
|
||||
put_page(hpage);
|
||||
get_page(p);
|
||||
}
|
||||
/* THP is split, so ppage should be the real poisoned page. */
|
||||
ppage = p;
|
||||
}
|
||||
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
x
Reference in New Issue
Block a user