mirror of
https://github.com/torvalds/linux.git
synced 2026-06-08 14:42:37 +02:00
Merge branch 'linux-linaro-lsk' into linux-linaro-lsk-android
Most of cpu feature which hardcode in commit 3868e7f8d4 are
included in compat_hwcap_str[]. We don't need repeat them.
Conflicts:
arch/arm64/kernel/setup.c
This commit is contained in:
commit
c577a32260
2
Makefile
2
Makefile
|
|
@ -1,6 +1,6 @@
|
|||
VERSION = 3
|
||||
PATCHLEVEL = 10
|
||||
SUBLEVEL = 68
|
||||
SUBLEVEL = 71
|
||||
EXTRAVERSION =
|
||||
NAME = TOSSUG Baby Fish
|
||||
|
||||
|
|
|
|||
|
|
@ -270,7 +270,8 @@ static inline void pmd_set(pmd_t *pmdp, pte_t *ptep)
|
|||
#define pmd_clear(xp) do { pmd_val(*(xp)) = 0; } while (0)
|
||||
|
||||
#define pte_page(x) (mem_map + \
|
||||
(unsigned long)(((pte_val(x) - PAGE_OFFSET) >> PAGE_SHIFT)))
|
||||
(unsigned long)(((pte_val(x) - CONFIG_LINUX_LINK_BASE) >> \
|
||||
PAGE_SHIFT)))
|
||||
|
||||
#define mk_pte(page, pgprot) \
|
||||
({ \
|
||||
|
|
|
|||
|
|
@ -26,6 +26,7 @@
|
|||
#include <linux/i2c.h>
|
||||
#include <linux/i2c/pxa-i2c.h>
|
||||
#include <linux/io.h>
|
||||
#include <linux/regulator/machine.h>
|
||||
#include <linux/spi/spi.h>
|
||||
#include <linux/spi/ads7846.h>
|
||||
#include <linux/spi/corgi_lcd.h>
|
||||
|
|
@ -711,6 +712,8 @@ static void __init corgi_init(void)
|
|||
sharpsl_nand_partitions[1].size = 53 * 1024 * 1024;
|
||||
|
||||
platform_add_devices(devices, ARRAY_SIZE(devices));
|
||||
|
||||
regulator_has_full_constraints();
|
||||
}
|
||||
|
||||
static void __init fixup_corgi(struct tag *tags, char **cmdline,
|
||||
|
|
|
|||
|
|
@ -891,6 +891,8 @@ static void __init hx4700_init(void)
|
|||
mdelay(10);
|
||||
gpio_set_value(GPIO71_HX4700_ASIC3_nRESET, 1);
|
||||
mdelay(10);
|
||||
|
||||
regulator_has_full_constraints();
|
||||
}
|
||||
|
||||
MACHINE_START(H4700, "HP iPAQ HX4700")
|
||||
|
|
|
|||
|
|
@ -25,6 +25,7 @@
|
|||
#include <linux/gpio.h>
|
||||
#include <linux/i2c.h>
|
||||
#include <linux/i2c/pxa-i2c.h>
|
||||
#include <linux/regulator/machine.h>
|
||||
#include <linux/spi/spi.h>
|
||||
#include <linux/spi/ads7846.h>
|
||||
#include <linux/spi/pxa2xx_spi.h>
|
||||
|
|
@ -452,6 +453,7 @@ static void __init poodle_init(void)
|
|||
pxa_set_i2c_info(NULL);
|
||||
i2c_register_board_info(0, ARRAY_AND_SIZE(poodle_i2c_devices));
|
||||
poodle_init_spi();
|
||||
regulator_has_full_constraints();
|
||||
}
|
||||
|
||||
static void __init fixup_poodle(struct tag *tags, char **cmdline,
|
||||
|
|
|
|||
|
|
@ -81,6 +81,7 @@ static int sa11x0_pm_enter(suspend_state_t state)
|
|||
/*
|
||||
* Ensure not to come back here if it wasn't intended
|
||||
*/
|
||||
RCSR = RCSR_SMR;
|
||||
PSPR = 0;
|
||||
|
||||
/*
|
||||
|
|
|
|||
|
|
@ -97,6 +97,8 @@ static inline u32 __attribute_const__ read_cpuid_cachetype(void)
|
|||
return read_cpuid(CTR_EL0);
|
||||
}
|
||||
|
||||
void cpuinfo_store_cpu(void);
|
||||
|
||||
#endif /* __ASSEMBLY__ */
|
||||
|
||||
#endif
|
||||
|
|
|
|||
|
|
@ -42,6 +42,7 @@
|
|||
#include <linux/of_fdt.h>
|
||||
#include <linux/of_platform.h>
|
||||
#include <linux/efi.h>
|
||||
#include <linux/personality.h>
|
||||
|
||||
#include <asm/fixmap.h>
|
||||
#include <asm/cputype.h>
|
||||
|
|
@ -112,6 +113,19 @@ void __init early_print(const char *str, ...)
|
|||
printk("%s", buf);
|
||||
}
|
||||
|
||||
struct cpuinfo_arm64 {
|
||||
struct cpu cpu;
|
||||
u32 reg_midr;
|
||||
};
|
||||
|
||||
static DEFINE_PER_CPU(struct cpuinfo_arm64, cpu_data);
|
||||
|
||||
void cpuinfo_store_cpu(void)
|
||||
{
|
||||
struct cpuinfo_arm64 *info = this_cpu_ptr(&cpu_data);
|
||||
info->reg_midr = read_cpuid_id();
|
||||
}
|
||||
|
||||
void __init smp_setup_processor_id(void)
|
||||
{
|
||||
/*
|
||||
|
|
@ -285,6 +299,8 @@ static void __init setup_machine_fdt(phys_addr_t dt_phys)
|
|||
struct boot_param_header *devtree;
|
||||
unsigned long dt_root;
|
||||
|
||||
cpuinfo_store_cpu();
|
||||
|
||||
/* Check we have a non-NULL DT pointer */
|
||||
if (!dt_phys) {
|
||||
early_print("\n"
|
||||
|
|
@ -455,14 +471,12 @@ static int __init arm64_device_init(void)
|
|||
}
|
||||
arch_initcall_sync(arm64_device_init);
|
||||
|
||||
static DEFINE_PER_CPU(struct cpu, cpu_data);
|
||||
|
||||
static int __init topology_init(void)
|
||||
{
|
||||
int i;
|
||||
|
||||
for_each_possible_cpu(i) {
|
||||
struct cpu *cpu = &per_cpu(cpu_data, i);
|
||||
struct cpu *cpu = &per_cpu(cpu_data.cpu, i);
|
||||
cpu->hotpluggable = 1;
|
||||
register_cpu(cpu, i);
|
||||
}
|
||||
|
|
@ -483,14 +497,41 @@ static const char *hwcap_str[] = {
|
|||
NULL
|
||||
};
|
||||
|
||||
#ifdef CONFIG_COMPAT
|
||||
static const char *compat_hwcap_str[] = {
|
||||
"swp",
|
||||
"half",
|
||||
"thumb",
|
||||
"26bit",
|
||||
"fastmult",
|
||||
"fpa",
|
||||
"vfp",
|
||||
"edsp",
|
||||
"java",
|
||||
"iwmmxt",
|
||||
"crunch",
|
||||
"thumbee",
|
||||
"neon",
|
||||
"vfpv3",
|
||||
"vfpv3d16",
|
||||
"tls",
|
||||
"vfpv4",
|
||||
"idiva",
|
||||
"idivt",
|
||||
"vfpd32",
|
||||
"lpae",
|
||||
"evtstrm"
|
||||
};
|
||||
#endif /* CONFIG_COMPAT */
|
||||
|
||||
static int c_show(struct seq_file *m, void *v)
|
||||
{
|
||||
int i;
|
||||
|
||||
seq_printf(m, "Processor\t: %s rev %d (%s)\n",
|
||||
cpu_name, read_cpuid_id() & 15, ELF_PLATFORM);
|
||||
int i, j;
|
||||
|
||||
for_each_online_cpu(i) {
|
||||
struct cpuinfo_arm64 *cpuinfo = &per_cpu(cpu_data, i);
|
||||
u32 midr = cpuinfo->reg_midr;
|
||||
|
||||
/*
|
||||
* glibc reads /proc/cpuinfo to determine the number of
|
||||
* online processors, looking for lines beginning with
|
||||
|
|
@ -499,35 +540,41 @@ static int c_show(struct seq_file *m, void *v)
|
|||
#ifdef CONFIG_SMP
|
||||
seq_printf(m, "processor\t: %d\n", i);
|
||||
#endif
|
||||
}
|
||||
|
||||
/* dump out the processor features */
|
||||
seq_puts(m, "Features\t: ");
|
||||
seq_printf(m, "BogoMIPS\t: %lu.%02lu\n",
|
||||
loops_per_jiffy / (500000UL/HZ),
|
||||
loops_per_jiffy / (5000UL/HZ) % 100);
|
||||
|
||||
for (i = 0; hwcap_str[i]; i++)
|
||||
if (elf_hwcap & (1 << i))
|
||||
seq_printf(m, "%s ", hwcap_str[i]);
|
||||
#ifdef CONFIG_ARMV7_COMPAT_CPUINFO
|
||||
if (is_compat_task()) {
|
||||
/* Print out the non-optional ARMv8 HW capabilities */
|
||||
seq_printf(m, "wp half thumb fastmult vfp edsp neon vfpv3 tlsi ");
|
||||
seq_printf(m, "vfpv4 idiva idivt ");
|
||||
}
|
||||
#endif
|
||||
/*
|
||||
* Dump out the common processor features in a single line.
|
||||
* Userspace should read the hwcaps with getauxval(AT_HWCAP)
|
||||
* rather than attempting to parse this, but there's a body of
|
||||
* software which does already (at least for 32-bit).
|
||||
*/
|
||||
seq_puts(m, "Features\t:");
|
||||
if (personality(current->personality) == PER_LINUX32) {
|
||||
#ifdef CONFIG_COMPAT
|
||||
for (j = 0; compat_hwcap_str[j]; j++)
|
||||
if (COMPAT_ELF_HWCAP & (1 << j))
|
||||
seq_printf(m, " %s", compat_hwcap_str[j]);
|
||||
#endif /* CONFIG_COMPAT */
|
||||
} else {
|
||||
for (j = 0; hwcap_str[j]; j++)
|
||||
if (elf_hwcap & (1 << j))
|
||||
seq_printf(m, " %s", hwcap_str[j]);
|
||||
}
|
||||
seq_puts(m, "\n");
|
||||
|
||||
seq_printf(m, "\nCPU implementer\t: 0x%02x\n", read_cpuid_id() >> 24);
|
||||
seq_printf(m, "CPU architecture: %s\n",
|
||||
seq_printf(m, "CPU implementer\t: 0x%02x\n", (midr >> 24));
|
||||
seq_printf(m, "CPU architecture: %s\n",
|
||||
#if IS_ENABLED(CONFIG_ARMV7_COMPAT_CPUINFO)
|
||||
is_compat_task() ? "8" :
|
||||
is_compat_task() ? "8" :
|
||||
#endif
|
||||
"AArch64");
|
||||
seq_printf(m, "CPU variant\t: 0x%x\n", (read_cpuid_id() >> 20) & 15);
|
||||
seq_printf(m, "CPU part\t: 0x%03x\n", (read_cpuid_id() >> 4) & 0xfff);
|
||||
seq_printf(m, "CPU revision\t: %d\n", read_cpuid_id() & 15);
|
||||
|
||||
seq_puts(m, "\n");
|
||||
|
||||
seq_printf(m, "Hardware\t: %s\n", machine_name);
|
||||
"AArch64");
|
||||
seq_printf(m, "CPU variant\t: 0x%x\n", ((midr >> 20) & 0xf));
|
||||
seq_printf(m, "CPU part\t: 0x%03x\n", ((midr >> 4) & 0xfff));
|
||||
seq_printf(m, "CPU revision\t: %d\n\n", (midr & 0xf));
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -151,8 +151,7 @@ int copy_siginfo_to_user32(compat_siginfo_t __user *to, siginfo_t *from)
|
|||
case __SI_TIMER:
|
||||
err |= __put_user(from->si_tid, &to->si_tid);
|
||||
err |= __put_user(from->si_overrun, &to->si_overrun);
|
||||
err |= __put_user((compat_uptr_t)(unsigned long)from->si_ptr,
|
||||
&to->si_ptr);
|
||||
err |= __put_user(from->si_int, &to->si_int);
|
||||
break;
|
||||
case __SI_POLL:
|
||||
err |= __put_user(from->si_band, &to->si_band);
|
||||
|
|
@ -181,7 +180,7 @@ int copy_siginfo_to_user32(compat_siginfo_t __user *to, siginfo_t *from)
|
|||
case __SI_MESGQ: /* But this is */
|
||||
err |= __put_user(from->si_pid, &to->si_pid);
|
||||
err |= __put_user(from->si_uid, &to->si_uid);
|
||||
err |= __put_user((compat_uptr_t)(unsigned long)from->si_ptr, &to->si_ptr);
|
||||
err |= __put_user(from->si_int, &to->si_int);
|
||||
break;
|
||||
#ifdef __ARCH_SIGSYS
|
||||
case __SI_SYS:
|
||||
|
|
|
|||
|
|
@ -162,6 +162,11 @@ asmlinkage void __cpuinit secondary_start_kernel(void)
|
|||
|
||||
smp_store_cpu_info(cpu);
|
||||
|
||||
/*
|
||||
* Log the CPU info before it is marked online and might get read.
|
||||
*/
|
||||
cpuinfo_store_cpu();
|
||||
|
||||
/*
|
||||
* OK, now it's safe to let the boot CPU continue. Wait for
|
||||
* the CPU migration code to notice that the CPU is online
|
||||
|
|
|
|||
|
|
@ -149,8 +149,8 @@ extern void exit_thread(void);
|
|||
|
||||
unsigned long get_wchan(struct task_struct *p);
|
||||
|
||||
#define KSTK_EIP(tsk) ((tsk)->thread.kernel_context->CurrPC)
|
||||
#define KSTK_ESP(tsk) ((tsk)->thread.kernel_context->AX[0].U0)
|
||||
#define KSTK_EIP(tsk) (task_pt_regs(tsk)->ctx.CurrPC)
|
||||
#define KSTK_ESP(tsk) (task_pt_regs(tsk)->ctx.AX[0].U0)
|
||||
|
||||
#define user_stack_pointer(regs) ((regs)->ctx.AX[0].U0)
|
||||
|
||||
|
|
|
|||
|
|
@ -56,6 +56,8 @@ static struct irq_chip mips_cpu_irq_controller = {
|
|||
.irq_mask_ack = mask_mips_irq,
|
||||
.irq_unmask = unmask_mips_irq,
|
||||
.irq_eoi = unmask_mips_irq,
|
||||
.irq_disable = mask_mips_irq,
|
||||
.irq_enable = unmask_mips_irq,
|
||||
};
|
||||
|
||||
/*
|
||||
|
|
@ -92,6 +94,8 @@ static struct irq_chip mips_mt_cpu_irq_controller = {
|
|||
.irq_mask_ack = mips_mt_cpu_irq_ack,
|
||||
.irq_unmask = unmask_mips_irq,
|
||||
.irq_eoi = unmask_mips_irq,
|
||||
.irq_disable = mask_mips_irq,
|
||||
.irq_enable = unmask_mips_irq,
|
||||
};
|
||||
|
||||
void __init mips_cpu_irq_init(void)
|
||||
|
|
|
|||
|
|
@ -14,6 +14,7 @@
|
|||
#include <linux/mm.h>
|
||||
#include <asm/uaccess.h>
|
||||
#include <asm/ftrace.h>
|
||||
#include <asm/fpu.h>
|
||||
|
||||
extern void *__bzero(void *__s, size_t __count);
|
||||
extern long __strncpy_from_user_nocheck_asm(char *__to,
|
||||
|
|
@ -25,6 +26,13 @@ extern long __strlen_user_asm(const char *s);
|
|||
extern long __strnlen_user_nocheck_asm(const char *s);
|
||||
extern long __strnlen_user_asm(const char *s);
|
||||
|
||||
/*
|
||||
* Core architecture code
|
||||
*/
|
||||
#ifdef CONFIG_CPU_R4K_FPU
|
||||
EXPORT_SYMBOL_GPL(_save_fp);
|
||||
#endif
|
||||
|
||||
/*
|
||||
* String functions
|
||||
*/
|
||||
|
|
|
|||
|
|
@ -109,10 +109,10 @@ asmlinkage __cpuinit void start_secondary(void)
|
|||
else
|
||||
#endif /* CONFIG_MIPS_MT_SMTC */
|
||||
cpu_probe();
|
||||
cpu_report();
|
||||
per_cpu_trap_init(false);
|
||||
mips_clockevent_init();
|
||||
mp_ops->init_secondary();
|
||||
cpu_report();
|
||||
|
||||
/*
|
||||
* XXX parity protection should be folded in here when it's converted
|
||||
|
|
|
|||
|
|
@ -431,7 +431,7 @@ __kvm_mips_return_to_guest:
|
|||
/* Setup status register for running guest in UM */
|
||||
.set at
|
||||
or v1, v1, (ST0_EXL | KSU_USER | ST0_IE)
|
||||
and v1, v1, ~ST0_CU0
|
||||
and v1, v1, ~(ST0_CU0 | ST0_MX)
|
||||
.set noat
|
||||
mtc0 v1, CP0_STATUS
|
||||
ehb
|
||||
|
|
|
|||
|
|
@ -15,6 +15,7 @@
|
|||
#include <linux/vmalloc.h>
|
||||
#include <linux/fs.h>
|
||||
#include <linux/bootmem.h>
|
||||
#include <asm/fpu.h>
|
||||
#include <asm/page.h>
|
||||
#include <asm/cacheflush.h>
|
||||
#include <asm/mmu_context.h>
|
||||
|
|
@ -418,11 +419,13 @@ int kvm_arch_vcpu_ioctl_run(struct kvm_vcpu *vcpu, struct kvm_run *run)
|
|||
vcpu->mmio_needed = 0;
|
||||
}
|
||||
|
||||
lose_fpu(1);
|
||||
|
||||
local_irq_disable();
|
||||
/* Check if we have any exceptions/interrupts pending */
|
||||
kvm_mips_deliver_interrupts(vcpu,
|
||||
kvm_read_c0_guest_cause(vcpu->arch.cop0));
|
||||
|
||||
local_irq_disable();
|
||||
kvm_guest_enter();
|
||||
|
||||
r = __kvm_mips_vcpu_run(run, vcpu);
|
||||
|
|
@ -1022,9 +1025,6 @@ void kvm_mips_set_c0_status(void)
|
|||
{
|
||||
uint32_t status = read_c0_status();
|
||||
|
||||
if (cpu_has_fpu)
|
||||
status |= (ST0_CU1);
|
||||
|
||||
if (cpu_has_dsp)
|
||||
status |= (ST0_MX);
|
||||
|
||||
|
|
|
|||
|
|
@ -155,7 +155,7 @@ axon_ram_direct_access(struct block_device *device, sector_t sector,
|
|||
}
|
||||
|
||||
*kaddr = (void *)(bank->ph_addr + offset);
|
||||
*pfn = virt_to_phys(kaddr) >> PAGE_SHIFT;
|
||||
*pfn = virt_to_phys(*kaddr) >> PAGE_SHIFT;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -67,6 +67,7 @@
|
|||
#define EXIT_REASON_EPT_MISCONFIG 49
|
||||
#define EXIT_REASON_INVEPT 50
|
||||
#define EXIT_REASON_PREEMPTION_TIMER 52
|
||||
#define EXIT_REASON_INVVPID 53
|
||||
#define EXIT_REASON_WBINVD 54
|
||||
#define EXIT_REASON_XSETBV 55
|
||||
#define EXIT_REASON_APIC_WRITE 56
|
||||
|
|
@ -112,6 +113,7 @@
|
|||
{ EXIT_REASON_EOI_INDUCED, "EOI_INDUCED" }, \
|
||||
{ EXIT_REASON_INVALID_STATE, "INVALID_STATE" }, \
|
||||
{ EXIT_REASON_INVD, "INVD" }, \
|
||||
{ EXIT_REASON_INVVPID, "INVVPID" }, \
|
||||
{ EXIT_REASON_INVPCID, "INVPCID" }, \
|
||||
{ EXIT_REASON_PREEMPTION_TIMER, "PREEMPTION_TIMER" }
|
||||
|
||||
|
|
|
|||
|
|
@ -438,6 +438,7 @@ struct vcpu_vmx {
|
|||
#endif
|
||||
int gs_ldt_reload_needed;
|
||||
int fs_reload_needed;
|
||||
unsigned long vmcs_host_cr4; /* May not match real cr4 */
|
||||
} host_state;
|
||||
struct {
|
||||
int vm86_active;
|
||||
|
|
@ -4076,11 +4077,16 @@ static void vmx_set_constant_host_state(struct vcpu_vmx *vmx)
|
|||
u32 low32, high32;
|
||||
unsigned long tmpl;
|
||||
struct desc_ptr dt;
|
||||
unsigned long cr4;
|
||||
|
||||
vmcs_writel(HOST_CR0, read_cr0() & ~X86_CR0_TS); /* 22.2.3 */
|
||||
vmcs_writel(HOST_CR4, read_cr4()); /* 22.2.3, 22.2.5 */
|
||||
vmcs_writel(HOST_CR3, read_cr3()); /* 22.2.3 FIXME: shadow tables */
|
||||
|
||||
/* Save the most likely value for this task's CR4 in the VMCS. */
|
||||
cr4 = read_cr4();
|
||||
vmcs_writel(HOST_CR4, cr4); /* 22.2.3, 22.2.5 */
|
||||
vmx->host_state.vmcs_host_cr4 = cr4;
|
||||
|
||||
vmcs_write16(HOST_CS_SELECTOR, __KERNEL_CS); /* 22.2.4 */
|
||||
#ifdef CONFIG_X86_64
|
||||
/*
|
||||
|
|
@ -6248,6 +6254,12 @@ static int handle_invept(struct kvm_vcpu *vcpu)
|
|||
return 1;
|
||||
}
|
||||
|
||||
static int handle_invvpid(struct kvm_vcpu *vcpu)
|
||||
{
|
||||
kvm_queue_exception(vcpu, UD_VECTOR);
|
||||
return 1;
|
||||
}
|
||||
|
||||
/*
|
||||
* The exit handlers return 1 if the exit was handled fully and guest execution
|
||||
* may resume. Otherwise they set the kvm_run parameter to indicate what needs
|
||||
|
|
@ -6293,6 +6305,7 @@ static int (*const kvm_vmx_exit_handlers[])(struct kvm_vcpu *vcpu) = {
|
|||
[EXIT_REASON_MWAIT_INSTRUCTION] = handle_invalid_op,
|
||||
[EXIT_REASON_MONITOR_INSTRUCTION] = handle_invalid_op,
|
||||
[EXIT_REASON_INVEPT] = handle_invept,
|
||||
[EXIT_REASON_INVVPID] = handle_invvpid,
|
||||
};
|
||||
|
||||
static const int kvm_vmx_max_exit_handlers =
|
||||
|
|
@ -6519,7 +6532,7 @@ static bool nested_vmx_exit_handled(struct kvm_vcpu *vcpu)
|
|||
case EXIT_REASON_VMPTRST: case EXIT_REASON_VMREAD:
|
||||
case EXIT_REASON_VMRESUME: case EXIT_REASON_VMWRITE:
|
||||
case EXIT_REASON_VMOFF: case EXIT_REASON_VMON:
|
||||
case EXIT_REASON_INVEPT:
|
||||
case EXIT_REASON_INVEPT: case EXIT_REASON_INVVPID:
|
||||
/*
|
||||
* VMX instructions trap unconditionally. This allows L1 to
|
||||
* emulate them for its L2 guest, i.e., allows 3-level nesting!
|
||||
|
|
@ -6964,7 +6977,7 @@ static void atomic_switch_perf_msrs(struct vcpu_vmx *vmx)
|
|||
static void __noclone vmx_vcpu_run(struct kvm_vcpu *vcpu)
|
||||
{
|
||||
struct vcpu_vmx *vmx = to_vmx(vcpu);
|
||||
unsigned long debugctlmsr;
|
||||
unsigned long debugctlmsr, cr4;
|
||||
|
||||
/* Record the guest's net vcpu time for enforced NMI injections. */
|
||||
if (unlikely(!cpu_has_virtual_nmis() && vmx->soft_vnmi_blocked))
|
||||
|
|
@ -6985,6 +6998,12 @@ static void __noclone vmx_vcpu_run(struct kvm_vcpu *vcpu)
|
|||
if (test_bit(VCPU_REGS_RIP, (unsigned long *)&vcpu->arch.regs_dirty))
|
||||
vmcs_writel(GUEST_RIP, vcpu->arch.regs[VCPU_REGS_RIP]);
|
||||
|
||||
cr4 = read_cr4();
|
||||
if (unlikely(cr4 != vmx->host_state.vmcs_host_cr4)) {
|
||||
vmcs_writel(HOST_CR4, cr4);
|
||||
vmx->host_state.vmcs_host_cr4 = cr4;
|
||||
}
|
||||
|
||||
/* When single-stepping over STI and MOV SS, we must clear the
|
||||
* corresponding interruptibility bits in the guest state. Otherwise
|
||||
* vmentry fails as it then expects bit 14 (BS) in pending debug
|
||||
|
|
|
|||
|
|
@ -1182,21 +1182,22 @@ void kvm_track_tsc_matching(struct kvm_vcpu *vcpu)
|
|||
{
|
||||
#ifdef CONFIG_X86_64
|
||||
bool vcpus_matched;
|
||||
bool do_request = false;
|
||||
struct kvm_arch *ka = &vcpu->kvm->arch;
|
||||
struct pvclock_gtod_data *gtod = &pvclock_gtod_data;
|
||||
|
||||
vcpus_matched = (ka->nr_vcpus_matched_tsc + 1 ==
|
||||
atomic_read(&vcpu->kvm->online_vcpus));
|
||||
|
||||
if (vcpus_matched && gtod->clock.vclock_mode == VCLOCK_TSC)
|
||||
if (!ka->use_master_clock)
|
||||
do_request = 1;
|
||||
|
||||
if (!vcpus_matched && ka->use_master_clock)
|
||||
do_request = 1;
|
||||
|
||||
if (do_request)
|
||||
/*
|
||||
* Once the masterclock is enabled, always perform request in
|
||||
* order to update it.
|
||||
*
|
||||
* In order to enable masterclock, the host clocksource must be TSC
|
||||
* and the vcpus need to have matched TSCs. When that happens,
|
||||
* perform request to enable masterclock.
|
||||
*/
|
||||
if (ka->use_master_clock ||
|
||||
(gtod->clock.vclock_mode == VCLOCK_TSC && vcpus_matched))
|
||||
kvm_make_request(KVM_REQ_MASTERCLOCK_UPDATE, vcpu);
|
||||
|
||||
trace_kvm_track_tsc(vcpu->vcpu_id, ka->nr_vcpus_matched_tsc,
|
||||
|
|
|
|||
|
|
@ -35,12 +35,12 @@ struct __read_mostly va_alignment va_align = {
|
|||
.flags = -1,
|
||||
};
|
||||
|
||||
static unsigned int stack_maxrandom_size(void)
|
||||
static unsigned long stack_maxrandom_size(void)
|
||||
{
|
||||
unsigned int max = 0;
|
||||
unsigned long max = 0;
|
||||
if ((current->flags & PF_RANDOMIZE) &&
|
||||
!(current->personality & ADDR_NO_RANDOMIZE)) {
|
||||
max = ((-1U) & STACK_RND_MASK) << PAGE_SHIFT;
|
||||
max = ((-1UL) & STACK_RND_MASK) << PAGE_SHIFT;
|
||||
}
|
||||
|
||||
return max;
|
||||
|
|
|
|||
|
|
@ -448,6 +448,22 @@ static const struct dmi_system_id pciprobe_dmi_table[] = {
|
|||
DMI_MATCH(DMI_PRODUCT_NAME, "ftServer"),
|
||||
},
|
||||
},
|
||||
{
|
||||
.callback = set_scan_all,
|
||||
.ident = "Stratus/NEC ftServer",
|
||||
.matches = {
|
||||
DMI_MATCH(DMI_SYS_VENDOR, "NEC"),
|
||||
DMI_MATCH(DMI_PRODUCT_NAME, "Express5800/R32"),
|
||||
},
|
||||
},
|
||||
{
|
||||
.callback = set_scan_all,
|
||||
.ident = "Stratus/NEC ftServer",
|
||||
.matches = {
|
||||
DMI_MATCH(DMI_SYS_VENDOR, "NEC"),
|
||||
DMI_MATCH(DMI_PRODUCT_NAME, "Express5800/R31"),
|
||||
},
|
||||
},
|
||||
{}
|
||||
};
|
||||
|
||||
|
|
|
|||
|
|
@ -942,6 +942,9 @@ static u64 tg_prfill_cpu_rwstat(struct seq_file *sf,
|
|||
struct blkg_rwstat rwstat = { }, tmp;
|
||||
int i, cpu;
|
||||
|
||||
if (tg->stats_cpu == NULL)
|
||||
return 0;
|
||||
|
||||
for_each_possible_cpu(cpu) {
|
||||
struct tg_stats_cpu *sc = per_cpu_ptr(tg->stats_cpu, cpu);
|
||||
|
||||
|
|
|
|||
|
|
@ -3575,6 +3575,11 @@ cfq_find_alloc_queue(struct cfq_data *cfqd, bool is_sync, struct cfq_io_cq *cic,
|
|||
|
||||
blkcg = bio_blkcg(bio);
|
||||
cfqg = cfq_lookup_create_cfqg(cfqd, blkcg);
|
||||
if (!cfqg) {
|
||||
cfqq = &cfqd->oom_cfqq;
|
||||
goto out;
|
||||
}
|
||||
|
||||
cfqq = cic_to_cfqq(cic, is_sync);
|
||||
|
||||
/*
|
||||
|
|
@ -3611,7 +3616,7 @@ cfq_find_alloc_queue(struct cfq_data *cfqd, bool is_sync, struct cfq_io_cq *cic,
|
|||
} else
|
||||
cfqq = &cfqd->oom_cfqq;
|
||||
}
|
||||
|
||||
out:
|
||||
if (new_cfqq)
|
||||
kmem_cache_free(cfq_pool, new_cfqq);
|
||||
|
||||
|
|
@ -3641,12 +3646,17 @@ static struct cfq_queue *
|
|||
cfq_get_queue(struct cfq_data *cfqd, bool is_sync, struct cfq_io_cq *cic,
|
||||
struct bio *bio, gfp_t gfp_mask)
|
||||
{
|
||||
const int ioprio_class = IOPRIO_PRIO_CLASS(cic->ioprio);
|
||||
const int ioprio = IOPRIO_PRIO_DATA(cic->ioprio);
|
||||
int ioprio_class = IOPRIO_PRIO_CLASS(cic->ioprio);
|
||||
int ioprio = IOPRIO_PRIO_DATA(cic->ioprio);
|
||||
struct cfq_queue **async_cfqq = NULL;
|
||||
struct cfq_queue *cfqq = NULL;
|
||||
|
||||
if (!is_sync) {
|
||||
if (!ioprio_valid(cic->ioprio)) {
|
||||
struct task_struct *tsk = current;
|
||||
ioprio = task_nice_ioprio(tsk);
|
||||
ioprio_class = task_nice_ioclass(tsk);
|
||||
}
|
||||
async_cfqq = cfq_async_queue_prio(cfqd, ioprio_class, ioprio);
|
||||
cfqq = *async_cfqq;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -170,3 +170,4 @@ module_exit(crc32c_mod_fini);
|
|||
MODULE_AUTHOR("Clay Haapala <chaapala@cisco.com>");
|
||||
MODULE_DESCRIPTION("CRC32c (Castagnoli) calculations wrapper for lib/crc32c");
|
||||
MODULE_LICENSE("GPL");
|
||||
MODULE_ALIAS_CRYPTO("crc32c");
|
||||
|
|
|
|||
|
|
@ -2149,7 +2149,6 @@ static void rbd_img_obj_callback(struct rbd_obj_request *obj_request)
|
|||
rbd_assert(img_request->obj_request_count > 0);
|
||||
rbd_assert(which != BAD_WHICH);
|
||||
rbd_assert(which < img_request->obj_request_count);
|
||||
rbd_assert(which >= img_request->next_completion);
|
||||
|
||||
spin_lock_irq(&img_request->completion_lock);
|
||||
if (which != img_request->next_completion)
|
||||
|
|
|
|||
|
|
@ -151,6 +151,8 @@ static struct usb_device_id ath3k_blist_tbl[] = {
|
|||
#define USB_REQ_DFU_DNLOAD 1
|
||||
#define BULK_SIZE 4096
|
||||
#define FW_HDR_SIZE 20
|
||||
#define TIMEGAP_USEC_MIN 50
|
||||
#define TIMEGAP_USEC_MAX 100
|
||||
|
||||
static int ath3k_load_firmware(struct usb_device *udev,
|
||||
const struct firmware *firmware)
|
||||
|
|
@ -181,6 +183,9 @@ static int ath3k_load_firmware(struct usb_device *udev,
|
|||
count -= 20;
|
||||
|
||||
while (count) {
|
||||
/* workaround the compatibility issue with xHCI controller*/
|
||||
usleep_range(TIMEGAP_USEC_MIN, TIMEGAP_USEC_MAX);
|
||||
|
||||
size = min_t(uint, count, BULK_SIZE);
|
||||
pipe = usb_sndbulkpipe(udev, 0x02);
|
||||
memcpy(send_buf, firmware->data + sent, size);
|
||||
|
|
@ -277,6 +282,9 @@ static int ath3k_load_fwfile(struct usb_device *udev,
|
|||
count -= size;
|
||||
|
||||
while (count) {
|
||||
/* workaround the compatibility issue with xHCI controller*/
|
||||
usleep_range(TIMEGAP_USEC_MIN, TIMEGAP_USEC_MAX);
|
||||
|
||||
size = min_t(uint, count, BULK_SIZE);
|
||||
pipe = usb_sndbulkpipe(udev, 0x02);
|
||||
|
||||
|
|
|
|||
|
|
@ -488,7 +488,7 @@ static int tpm_stm_i2c_send(struct tpm_chip *chip, unsigned char *buf,
|
|||
if (burstcnt < 0)
|
||||
return burstcnt;
|
||||
size = min_t(int, len - i - 1, burstcnt);
|
||||
ret = I2C_WRITE_DATA(client, TPM_DATA_FIFO, buf, size);
|
||||
ret = I2C_WRITE_DATA(client, TPM_DATA_FIFO, buf + i, size);
|
||||
if (ret < 0)
|
||||
goto out_err;
|
||||
|
||||
|
|
|
|||
|
|
@ -148,7 +148,8 @@ static int tpm_ibmvtpm_send(struct tpm_chip *chip, u8 *buf, size_t count)
|
|||
crq.len = (u16)count;
|
||||
crq.data = ibmvtpm->rtce_dma_handle;
|
||||
|
||||
rc = ibmvtpm_send_crq(ibmvtpm->vdev, word[0], word[1]);
|
||||
rc = ibmvtpm_send_crq(ibmvtpm->vdev, cpu_to_be64(word[0]),
|
||||
cpu_to_be64(word[1]));
|
||||
if (rc != H_SUCCESS) {
|
||||
dev_err(ibmvtpm->dev, "tpm_ibmvtpm_send failed rc=%d\n", rc);
|
||||
rc = 0;
|
||||
|
|
@ -186,7 +187,8 @@ static int ibmvtpm_crq_get_rtce_size(struct ibmvtpm_dev *ibmvtpm)
|
|||
crq.valid = (u8)IBMVTPM_VALID_CMD;
|
||||
crq.msg = (u8)VTPM_GET_RTCE_BUFFER_SIZE;
|
||||
|
||||
rc = ibmvtpm_send_crq(ibmvtpm->vdev, buf[0], buf[1]);
|
||||
rc = ibmvtpm_send_crq(ibmvtpm->vdev, cpu_to_be64(buf[0]),
|
||||
cpu_to_be64(buf[1]));
|
||||
if (rc != H_SUCCESS)
|
||||
dev_err(ibmvtpm->dev,
|
||||
"ibmvtpm_crq_get_rtce_size failed rc=%d\n", rc);
|
||||
|
|
@ -212,7 +214,8 @@ static int ibmvtpm_crq_get_version(struct ibmvtpm_dev *ibmvtpm)
|
|||
crq.valid = (u8)IBMVTPM_VALID_CMD;
|
||||
crq.msg = (u8)VTPM_GET_VERSION;
|
||||
|
||||
rc = ibmvtpm_send_crq(ibmvtpm->vdev, buf[0], buf[1]);
|
||||
rc = ibmvtpm_send_crq(ibmvtpm->vdev, cpu_to_be64(buf[0]),
|
||||
cpu_to_be64(buf[1]));
|
||||
if (rc != H_SUCCESS)
|
||||
dev_err(ibmvtpm->dev,
|
||||
"ibmvtpm_crq_get_version failed rc=%d\n", rc);
|
||||
|
|
@ -307,6 +310,14 @@ static int tpm_ibmvtpm_remove(struct vio_dev *vdev)
|
|||
static unsigned long tpm_ibmvtpm_get_desired_dma(struct vio_dev *vdev)
|
||||
{
|
||||
struct ibmvtpm_dev *ibmvtpm = ibmvtpm_get_data(&vdev->dev);
|
||||
|
||||
/* ibmvtpm initializes at probe time, so the data we are
|
||||
* asking for may not be set yet. Estimate that 4K required
|
||||
* for TCE-mapped buffer in addition to CRQ.
|
||||
*/
|
||||
if (!ibmvtpm)
|
||||
return CRQ_RES_BUF_SIZE + PAGE_SIZE;
|
||||
|
||||
return CRQ_RES_BUF_SIZE + ibmvtpm->rtce_size;
|
||||
}
|
||||
|
||||
|
|
@ -327,7 +338,8 @@ static int tpm_ibmvtpm_suspend(struct device *dev)
|
|||
crq.valid = (u8)IBMVTPM_VALID_CMD;
|
||||
crq.msg = (u8)VTPM_PREPARE_TO_SUSPEND;
|
||||
|
||||
rc = ibmvtpm_send_crq(ibmvtpm->vdev, buf[0], buf[1]);
|
||||
rc = ibmvtpm_send_crq(ibmvtpm->vdev, cpu_to_be64(buf[0]),
|
||||
cpu_to_be64(buf[1]));
|
||||
if (rc != H_SUCCESS)
|
||||
dev_err(ibmvtpm->dev,
|
||||
"tpm_ibmvtpm_suspend failed rc=%d\n", rc);
|
||||
|
|
@ -511,11 +523,11 @@ static void ibmvtpm_crq_process(struct ibmvtpm_crq *crq,
|
|||
case IBMVTPM_VALID_CMD:
|
||||
switch (crq->msg) {
|
||||
case VTPM_GET_RTCE_BUFFER_SIZE_RES:
|
||||
if (crq->len <= 0) {
|
||||
if (be16_to_cpu(crq->len) <= 0) {
|
||||
dev_err(ibmvtpm->dev, "Invalid rtce size\n");
|
||||
return;
|
||||
}
|
||||
ibmvtpm->rtce_size = crq->len;
|
||||
ibmvtpm->rtce_size = be16_to_cpu(crq->len);
|
||||
ibmvtpm->rtce_buf = kmalloc(ibmvtpm->rtce_size,
|
||||
GFP_KERNEL);
|
||||
if (!ibmvtpm->rtce_buf) {
|
||||
|
|
@ -536,11 +548,11 @@ static void ibmvtpm_crq_process(struct ibmvtpm_crq *crq,
|
|||
|
||||
return;
|
||||
case VTPM_GET_VERSION_RES:
|
||||
ibmvtpm->vtpm_version = crq->data;
|
||||
ibmvtpm->vtpm_version = be32_to_cpu(crq->data);
|
||||
return;
|
||||
case VTPM_TPM_COMMAND_RES:
|
||||
/* len of the data in rtce buffer */
|
||||
ibmvtpm->res_len = crq->len;
|
||||
ibmvtpm->res_len = be16_to_cpu(crq->len);
|
||||
wake_up_interruptible(&ibmvtpm->wq);
|
||||
return;
|
||||
default:
|
||||
|
|
|
|||
|
|
@ -75,6 +75,10 @@ enum tis_defaults {
|
|||
#define TPM_DID_VID(l) (0x0F00 | ((l) << 12))
|
||||
#define TPM_RID(l) (0x0F04 | ((l) << 12))
|
||||
|
||||
struct priv_data {
|
||||
bool irq_tested;
|
||||
};
|
||||
|
||||
static LIST_HEAD(tis_chips);
|
||||
static DEFINE_MUTEX(tis_lock);
|
||||
|
||||
|
|
@ -338,12 +342,27 @@ static int tpm_tis_send_data(struct tpm_chip *chip, u8 *buf, size_t len)
|
|||
return rc;
|
||||
}
|
||||
|
||||
static void disable_interrupts(struct tpm_chip *chip)
|
||||
{
|
||||
u32 intmask;
|
||||
|
||||
intmask =
|
||||
ioread32(chip->vendor.iobase +
|
||||
TPM_INT_ENABLE(chip->vendor.locality));
|
||||
intmask &= ~TPM_GLOBAL_INT_ENABLE;
|
||||
iowrite32(intmask,
|
||||
chip->vendor.iobase +
|
||||
TPM_INT_ENABLE(chip->vendor.locality));
|
||||
free_irq(chip->vendor.irq, chip);
|
||||
chip->vendor.irq = 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* If interrupts are used (signaled by an irq set in the vendor structure)
|
||||
* tpm.c can skip polling for the data to be available as the interrupt is
|
||||
* waited for here
|
||||
*/
|
||||
static int tpm_tis_send(struct tpm_chip *chip, u8 *buf, size_t len)
|
||||
static int tpm_tis_send_main(struct tpm_chip *chip, u8 *buf, size_t len)
|
||||
{
|
||||
int rc;
|
||||
u32 ordinal;
|
||||
|
|
@ -373,6 +392,30 @@ static int tpm_tis_send(struct tpm_chip *chip, u8 *buf, size_t len)
|
|||
return rc;
|
||||
}
|
||||
|
||||
static int tpm_tis_send(struct tpm_chip *chip, u8 *buf, size_t len)
|
||||
{
|
||||
int rc, irq;
|
||||
struct priv_data *priv = chip->vendor.priv;
|
||||
|
||||
if (!chip->vendor.irq || priv->irq_tested)
|
||||
return tpm_tis_send_main(chip, buf, len);
|
||||
|
||||
/* Verify receipt of the expected IRQ */
|
||||
irq = chip->vendor.irq;
|
||||
chip->vendor.irq = 0;
|
||||
rc = tpm_tis_send_main(chip, buf, len);
|
||||
chip->vendor.irq = irq;
|
||||
if (!priv->irq_tested)
|
||||
msleep(1);
|
||||
if (!priv->irq_tested) {
|
||||
disable_interrupts(chip);
|
||||
dev_err(chip->dev,
|
||||
FW_BUG "TPM interrupt not working, polling instead\n");
|
||||
}
|
||||
priv->irq_tested = true;
|
||||
return rc;
|
||||
}
|
||||
|
||||
struct tis_vendor_timeout_override {
|
||||
u32 did_vid;
|
||||
unsigned long timeout_us[4];
|
||||
|
|
@ -546,6 +589,7 @@ static irqreturn_t tis_int_handler(int dummy, void *dev_id)
|
|||
if (interrupt == 0)
|
||||
return IRQ_NONE;
|
||||
|
||||
((struct priv_data *)chip->vendor.priv)->irq_tested = true;
|
||||
if (interrupt & TPM_INTF_DATA_AVAIL_INT)
|
||||
wake_up_interruptible(&chip->vendor.read_queue);
|
||||
if (interrupt & TPM_INTF_LOCALITY_CHANGE_INT)
|
||||
|
|
@ -575,9 +619,14 @@ static int tpm_tis_init(struct device *dev, resource_size_t start,
|
|||
u32 vendor, intfcaps, intmask;
|
||||
int rc, i, irq_s, irq_e, probe;
|
||||
struct tpm_chip *chip;
|
||||
struct priv_data *priv;
|
||||
|
||||
priv = devm_kzalloc(dev, sizeof(struct priv_data), GFP_KERNEL);
|
||||
if (priv == NULL)
|
||||
return -ENOMEM;
|
||||
if (!(chip = tpm_register_hardware(dev, &tpm_tis)))
|
||||
return -ENODEV;
|
||||
chip->vendor.priv = priv;
|
||||
|
||||
chip->vendor.iobase = ioremap(start, len);
|
||||
if (!chip->vendor.iobase) {
|
||||
|
|
@ -646,19 +695,6 @@ static int tpm_tis_init(struct device *dev, resource_size_t start,
|
|||
if (intfcaps & TPM_INTF_DATA_AVAIL_INT)
|
||||
dev_dbg(dev, "\tData Avail Int Support\n");
|
||||
|
||||
/* get the timeouts before testing for irqs */
|
||||
if (tpm_get_timeouts(chip)) {
|
||||
dev_err(dev, "Could not get TPM timeouts and durations\n");
|
||||
rc = -ENODEV;
|
||||
goto out_err;
|
||||
}
|
||||
|
||||
if (tpm_do_selftest(chip)) {
|
||||
dev_err(dev, "TPM self test failed\n");
|
||||
rc = -ENODEV;
|
||||
goto out_err;
|
||||
}
|
||||
|
||||
/* INTERRUPT Setup */
|
||||
init_waitqueue_head(&chip->vendor.read_queue);
|
||||
init_waitqueue_head(&chip->vendor.int_queue);
|
||||
|
|
@ -760,6 +796,18 @@ static int tpm_tis_init(struct device *dev, resource_size_t start,
|
|||
}
|
||||
}
|
||||
|
||||
if (tpm_get_timeouts(chip)) {
|
||||
dev_err(dev, "Could not get TPM timeouts and durations\n");
|
||||
rc = -ENODEV;
|
||||
goto out_err;
|
||||
}
|
||||
|
||||
if (tpm_do_selftest(chip)) {
|
||||
dev_err(dev, "TPM self test failed\n");
|
||||
rc = -ENODEV;
|
||||
goto out_err;
|
||||
}
|
||||
|
||||
INIT_LIST_HEAD(&chip->vendor.list);
|
||||
mutex_lock(&tis_lock);
|
||||
list_add(&chip->vendor.list, &tis_chips);
|
||||
|
|
|
|||
|
|
@ -400,6 +400,7 @@ unsigned int speedstep_get_freqs(enum speedstep_processor processor,
|
|||
|
||||
pr_debug("previous speed is %u\n", prev_speed);
|
||||
|
||||
preempt_disable();
|
||||
local_irq_save(flags);
|
||||
|
||||
/* switch to low state */
|
||||
|
|
@ -464,6 +465,8 @@ unsigned int speedstep_get_freqs(enum speedstep_processor processor,
|
|||
|
||||
out:
|
||||
local_irq_restore(flags);
|
||||
preempt_enable();
|
||||
|
||||
return ret;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(speedstep_get_freqs);
|
||||
|
|
|
|||
|
|
@ -188,6 +188,7 @@ static void speedstep_set_state(unsigned int state)
|
|||
return;
|
||||
|
||||
/* Disable IRQs */
|
||||
preempt_disable();
|
||||
local_irq_save(flags);
|
||||
|
||||
command = (smi_sig & 0xffffff00) | (smi_cmd & 0xff);
|
||||
|
|
@ -198,9 +199,19 @@ static void speedstep_set_state(unsigned int state)
|
|||
|
||||
do {
|
||||
if (retry) {
|
||||
/*
|
||||
* We need to enable interrupts, otherwise the blockage
|
||||
* won't resolve.
|
||||
*
|
||||
* We disable preemption so that other processes don't
|
||||
* run. If other processes were running, they could
|
||||
* submit more DMA requests, making the blockage worse.
|
||||
*/
|
||||
pr_debug("retry %u, previous result %u, waiting...\n",
|
||||
retry, result);
|
||||
local_irq_enable();
|
||||
mdelay(retry * 50);
|
||||
local_irq_disable();
|
||||
}
|
||||
retry++;
|
||||
__asm__ __volatile__(
|
||||
|
|
@ -217,6 +228,7 @@ static void speedstep_set_state(unsigned int state)
|
|||
|
||||
/* enable IRQs */
|
||||
local_irq_restore(flags);
|
||||
preempt_enable();
|
||||
|
||||
if (new_state == state)
|
||||
pr_debug("change to %u MHz succeeded after %u tries "
|
||||
|
|
|
|||
|
|
@ -26,9 +26,12 @@ struct tps65912_gpio_data {
|
|||
struct gpio_chip gpio_chip;
|
||||
};
|
||||
|
||||
#define to_tgd(gc) container_of(gc, struct tps65912_gpio_data, gpio_chip)
|
||||
|
||||
static int tps65912_gpio_get(struct gpio_chip *gc, unsigned offset)
|
||||
{
|
||||
struct tps65912 *tps65912 = container_of(gc, struct tps65912, gpio);
|
||||
struct tps65912_gpio_data *tps65912_gpio = to_tgd(gc);
|
||||
struct tps65912 *tps65912 = tps65912_gpio->tps65912;
|
||||
int val;
|
||||
|
||||
val = tps65912_reg_read(tps65912, TPS65912_GPIO1 + offset);
|
||||
|
|
@ -42,7 +45,8 @@ static int tps65912_gpio_get(struct gpio_chip *gc, unsigned offset)
|
|||
static void tps65912_gpio_set(struct gpio_chip *gc, unsigned offset,
|
||||
int value)
|
||||
{
|
||||
struct tps65912 *tps65912 = container_of(gc, struct tps65912, gpio);
|
||||
struct tps65912_gpio_data *tps65912_gpio = to_tgd(gc);
|
||||
struct tps65912 *tps65912 = tps65912_gpio->tps65912;
|
||||
|
||||
if (value)
|
||||
tps65912_set_bits(tps65912, TPS65912_GPIO1 + offset,
|
||||
|
|
@ -55,7 +59,8 @@ static void tps65912_gpio_set(struct gpio_chip *gc, unsigned offset,
|
|||
static int tps65912_gpio_output(struct gpio_chip *gc, unsigned offset,
|
||||
int value)
|
||||
{
|
||||
struct tps65912 *tps65912 = container_of(gc, struct tps65912, gpio);
|
||||
struct tps65912_gpio_data *tps65912_gpio = to_tgd(gc);
|
||||
struct tps65912 *tps65912 = tps65912_gpio->tps65912;
|
||||
|
||||
/* Set the initial value */
|
||||
tps65912_gpio_set(gc, offset, value);
|
||||
|
|
@ -66,7 +71,8 @@ static int tps65912_gpio_output(struct gpio_chip *gc, unsigned offset,
|
|||
|
||||
static int tps65912_gpio_input(struct gpio_chip *gc, unsigned offset)
|
||||
{
|
||||
struct tps65912 *tps65912 = container_of(gc, struct tps65912, gpio);
|
||||
struct tps65912_gpio_data *tps65912_gpio = to_tgd(gc);
|
||||
struct tps65912 *tps65912 = tps65912_gpio->tps65912;
|
||||
|
||||
return tps65912_clear_bits(tps65912, TPS65912_GPIO1 + offset,
|
||||
GPIO_CFG_MASK);
|
||||
|
|
|
|||
|
|
@ -874,6 +874,7 @@ static int gpiod_export_link(struct device *dev, const char *name,
|
|||
if (tdev != NULL) {
|
||||
status = sysfs_create_link(&dev->kobj, &tdev->kobj,
|
||||
name);
|
||||
put_device(tdev);
|
||||
} else {
|
||||
status = -ENODEV;
|
||||
}
|
||||
|
|
@ -927,7 +928,7 @@ static int gpiod_sysfs_set_active_low(struct gpio_desc *desc, int value)
|
|||
}
|
||||
|
||||
status = sysfs_set_active_low(desc, dev, value);
|
||||
|
||||
put_device(dev);
|
||||
unlock:
|
||||
mutex_unlock(&sysfs_lock);
|
||||
|
||||
|
|
|
|||
|
|
@ -341,7 +341,10 @@ static int i2c_hid_hwreset(struct i2c_client *client)
|
|||
static void i2c_hid_get_input(struct i2c_hid *ihid)
|
||||
{
|
||||
int ret, ret_size;
|
||||
int size = ihid->bufsize;
|
||||
int size = le16_to_cpu(ihid->hdesc.wMaxInputLength);
|
||||
|
||||
if (size > ihid->bufsize)
|
||||
size = ihid->bufsize;
|
||||
|
||||
ret = i2c_master_recv(ihid->client, ihid->inbuf, size);
|
||||
if (ret != size) {
|
||||
|
|
|
|||
|
|
@ -557,7 +557,7 @@ static int read_balance(struct r1conf *conf, struct r1bio *r1_bio, int *max_sect
|
|||
if (test_bit(WriteMostly, &rdev->flags)) {
|
||||
/* Don't balance among write-mostly, just
|
||||
* use the first as a last resort */
|
||||
if (best_disk < 0) {
|
||||
if (best_dist_disk < 0) {
|
||||
if (is_badblock(rdev, this_sector, sectors,
|
||||
&first_bad, &bad_sectors)) {
|
||||
if (first_bad < this_sector)
|
||||
|
|
@ -566,7 +566,8 @@ static int read_balance(struct r1conf *conf, struct r1bio *r1_bio, int *max_sect
|
|||
best_good_sectors = first_bad - this_sector;
|
||||
} else
|
||||
best_good_sectors = sectors;
|
||||
best_disk = disk;
|
||||
best_dist_disk = disk;
|
||||
best_pending_disk = disk;
|
||||
}
|
||||
continue;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -2853,7 +2853,8 @@ static void handle_stripe_dirtying(struct r5conf *conf,
|
|||
* generate correct data from the parity.
|
||||
*/
|
||||
if (conf->max_degraded == 2 ||
|
||||
(recovery_cp < MaxSector && sh->sector >= recovery_cp)) {
|
||||
(recovery_cp < MaxSector && sh->sector >= recovery_cp &&
|
||||
s->failed == 0)) {
|
||||
/* Calculate the real rcw later - for now make it
|
||||
* look like rcw is cheaper
|
||||
*/
|
||||
|
|
|
|||
|
|
@ -42,11 +42,17 @@ static int ir_lirc_decode(struct rc_dev *dev, struct ir_raw_event ev)
|
|||
return -EINVAL;
|
||||
|
||||
/* Packet start */
|
||||
if (ev.reset)
|
||||
return 0;
|
||||
if (ev.reset) {
|
||||
/* Userspace expects a long space event before the start of
|
||||
* the signal to use as a sync. This may be done with repeat
|
||||
* packets and normal samples. But if a reset has been sent
|
||||
* then we assume that a long time has passed, so we send a
|
||||
* space with the maximum time value. */
|
||||
sample = LIRC_SPACE(LIRC_VALUE_MASK);
|
||||
IR_dprintk(2, "delivering reset sync space to lirc_dev\n");
|
||||
|
||||
/* Carrier reports */
|
||||
if (ev.carrier_report) {
|
||||
} else if (ev.carrier_report) {
|
||||
sample = LIRC_FREQUENCY(ev.carrier);
|
||||
IR_dprintk(2, "carrier report (freq: %d)\n", sample);
|
||||
|
||||
|
|
|
|||
|
|
@ -350,6 +350,7 @@ static int lme2510_int_read(struct dvb_usb_adapter *adap)
|
|||
{
|
||||
struct dvb_usb_device *d = adap_to_d(adap);
|
||||
struct lme2510_state *lme_int = adap_to_priv(adap);
|
||||
struct usb_host_endpoint *ep;
|
||||
|
||||
lme_int->lme_urb = usb_alloc_urb(0, GFP_ATOMIC);
|
||||
|
||||
|
|
@ -371,6 +372,12 @@ static int lme2510_int_read(struct dvb_usb_adapter *adap)
|
|||
adap,
|
||||
8);
|
||||
|
||||
/* Quirk of pipe reporting PIPE_BULK but behaves as interrupt */
|
||||
ep = usb_pipe_endpoint(d->udev, lme_int->lme_urb->pipe);
|
||||
|
||||
if (usb_endpoint_type(&ep->desc) == USB_ENDPOINT_XFER_BULK)
|
||||
lme_int->lme_urb->pipe = usb_rcvbulkpipe(d->udev, 0xa),
|
||||
|
||||
lme_int->lme_urb->transfer_flags |= URB_NO_TRANSFER_DMA_MAP;
|
||||
|
||||
usb_submit_urb(lme_int->lme_urb, GFP_ATOMIC);
|
||||
|
|
|
|||
|
|
@ -201,8 +201,8 @@ static struct sdhci_pxa_platdata *pxav3_get_mmc_pdata(struct device *dev)
|
|||
if (!pdata)
|
||||
return NULL;
|
||||
|
||||
of_property_read_u32(np, "mrvl,clk-delay-cycles", &clk_delay_cycles);
|
||||
if (clk_delay_cycles > 0)
|
||||
if (!of_property_read_u32(np, "mrvl,clk-delay-cycles",
|
||||
&clk_delay_cycles))
|
||||
pdata->clk_delay_cycles = clk_delay_cycles;
|
||||
|
||||
return pdata;
|
||||
|
|
|
|||
|
|
@ -2315,7 +2315,10 @@ static int netxen_nic_poll(struct napi_struct *napi, int budget)
|
|||
|
||||
work_done = netxen_process_rcv_ring(sds_ring, budget);
|
||||
|
||||
if ((work_done < budget) && tx_complete) {
|
||||
if (!tx_complete)
|
||||
work_done = budget;
|
||||
|
||||
if (work_done < budget) {
|
||||
napi_complete(&sds_ring->napi);
|
||||
if (test_bit(__NX_DEV_UP, &adapter->state))
|
||||
netxen_nic_enable_int(sds_ring);
|
||||
|
|
|
|||
|
|
@ -246,7 +246,7 @@ static int z_compress(void *arg, unsigned char *rptr, unsigned char *obuf,
|
|||
/*
|
||||
* See if we managed to reduce the size of the packet.
|
||||
*/
|
||||
if (olen < isize) {
|
||||
if (olen < isize && olen <= osize) {
|
||||
state->stats.comp_bytes += olen;
|
||||
state->stats.comp_packets++;
|
||||
} else {
|
||||
|
|
|
|||
|
|
@ -360,9 +360,6 @@ static void iwl_mvm_cleanup_iterator(void *data, u8 *mac,
|
|||
mvmvif->uploaded = false;
|
||||
mvmvif->ap_sta_id = IWL_MVM_STATION_COUNT;
|
||||
|
||||
/* does this make sense at all? */
|
||||
mvmvif->color++;
|
||||
|
||||
spin_lock_bh(&mvm->time_event_lock);
|
||||
iwl_mvm_te_clear_data(mvm, &mvmvif->time_event_data);
|
||||
spin_unlock_bh(&mvm->time_event_lock);
|
||||
|
|
@ -544,7 +541,7 @@ static int iwl_mvm_mac_add_interface(struct ieee80211_hw *hw,
|
|||
|
||||
ret = iwl_mvm_mac_ctxt_add(mvm, vif);
|
||||
if (ret)
|
||||
goto out_release;
|
||||
goto out_remove_mac;
|
||||
|
||||
/*
|
||||
* Update power state on the new interface. Admittedly, based on
|
||||
|
|
|
|||
|
|
@ -832,6 +832,11 @@ int iwl_mvm_rx_ba_notif(struct iwl_mvm *mvm, struct iwl_rx_cmd_buffer *rxb,
|
|||
sta_id = ba_notif->sta_id;
|
||||
tid = ba_notif->tid;
|
||||
|
||||
if (WARN_ONCE(sta_id >= IWL_MVM_STATION_COUNT ||
|
||||
tid >= IWL_MAX_TID_COUNT,
|
||||
"sta_id %d tid %d", sta_id, tid))
|
||||
return 0;
|
||||
|
||||
rcu_read_lock();
|
||||
|
||||
sta = rcu_dereference(mvm->fw_id_to_mac_id[sta_id]);
|
||||
|
|
|
|||
|
|
@ -720,7 +720,12 @@ void iwl_trans_pcie_tx_reset(struct iwl_trans *trans)
|
|||
iwl_write_direct32(trans, FH_KW_MEM_ADDR_REG,
|
||||
trans_pcie->kw.dma >> 4);
|
||||
|
||||
iwl_pcie_tx_start(trans, trans_pcie->scd_base_addr);
|
||||
/*
|
||||
* Send 0 as the scd_base_addr since the device may have be reset
|
||||
* while we were in WoWLAN in which case SCD_SRAM_BASE_ADDR will
|
||||
* contain garbage.
|
||||
*/
|
||||
iwl_pcie_tx_start(trans, 0);
|
||||
}
|
||||
|
||||
/*
|
||||
|
|
|
|||
|
|
@ -1267,7 +1267,7 @@ static int pci_uevent(struct device *dev, struct kobj_uevent_env *env)
|
|||
if (add_uevent_var(env, "PCI_SLOT_NAME=%s", pci_name(pdev)))
|
||||
return -ENOMEM;
|
||||
|
||||
if (add_uevent_var(env, "MODALIAS=pci:v%08Xd%08Xsv%08Xsd%08Xbc%02Xsc%02Xi%02x",
|
||||
if (add_uevent_var(env, "MODALIAS=pci:v%08Xd%08Xsv%08Xsd%08Xbc%02Xsc%02Xi%02X",
|
||||
pdev->vendor, pdev->device,
|
||||
pdev->subsystem_vendor, pdev->subsystem_device,
|
||||
(u8)(pdev->class >> 16), (u8)(pdev->class >> 8),
|
||||
|
|
|
|||
|
|
@ -69,6 +69,7 @@ size_t pci_get_rom_size(struct pci_dev *pdev, void __iomem *rom, size_t size)
|
|||
{
|
||||
void __iomem *image;
|
||||
int last_image;
|
||||
unsigned length;
|
||||
|
||||
image = rom;
|
||||
do {
|
||||
|
|
@ -91,9 +92,9 @@ size_t pci_get_rom_size(struct pci_dev *pdev, void __iomem *rom, size_t size)
|
|||
if (readb(pds + 3) != 'R')
|
||||
break;
|
||||
last_image = readb(pds + 21) & 0x80;
|
||||
/* this length is reliable */
|
||||
image += readw(pds + 16) * 512;
|
||||
} while (!last_image);
|
||||
length = readw(pds + 16);
|
||||
image += length * 512;
|
||||
} while (length && !last_image);
|
||||
|
||||
/* never return a size larger than the PCI resource window */
|
||||
/* there are known ROMs that get the size wrong */
|
||||
|
|
|
|||
|
|
@ -711,6 +711,7 @@ static int pm860x_charger_probe(struct platform_device *pdev)
|
|||
return 0;
|
||||
|
||||
out_irq:
|
||||
power_supply_unregister(&info->usb);
|
||||
while (--i >= 0)
|
||||
free_irq(info->irq[i], info);
|
||||
out:
|
||||
|
|
|
|||
|
|
@ -26,36 +26,22 @@
|
|||
#include "iscsi_target_tq.h"
|
||||
#include "iscsi_target.h"
|
||||
|
||||
static LIST_HEAD(active_ts_list);
|
||||
static LIST_HEAD(inactive_ts_list);
|
||||
static DEFINE_SPINLOCK(active_ts_lock);
|
||||
static DEFINE_SPINLOCK(inactive_ts_lock);
|
||||
static DEFINE_SPINLOCK(ts_bitmap_lock);
|
||||
|
||||
static void iscsi_add_ts_to_active_list(struct iscsi_thread_set *ts)
|
||||
{
|
||||
spin_lock(&active_ts_lock);
|
||||
list_add_tail(&ts->ts_list, &active_ts_list);
|
||||
iscsit_global->active_ts++;
|
||||
spin_unlock(&active_ts_lock);
|
||||
}
|
||||
|
||||
static void iscsi_add_ts_to_inactive_list(struct iscsi_thread_set *ts)
|
||||
{
|
||||
if (!list_empty(&ts->ts_list)) {
|
||||
WARN_ON(1);
|
||||
return;
|
||||
}
|
||||
spin_lock(&inactive_ts_lock);
|
||||
list_add_tail(&ts->ts_list, &inactive_ts_list);
|
||||
iscsit_global->inactive_ts++;
|
||||
spin_unlock(&inactive_ts_lock);
|
||||
}
|
||||
|
||||
static void iscsi_del_ts_from_active_list(struct iscsi_thread_set *ts)
|
||||
{
|
||||
spin_lock(&active_ts_lock);
|
||||
list_del(&ts->ts_list);
|
||||
iscsit_global->active_ts--;
|
||||
spin_unlock(&active_ts_lock);
|
||||
}
|
||||
|
||||
static struct iscsi_thread_set *iscsi_get_ts_from_inactive_list(void)
|
||||
{
|
||||
struct iscsi_thread_set *ts;
|
||||
|
|
@ -68,7 +54,7 @@ static struct iscsi_thread_set *iscsi_get_ts_from_inactive_list(void)
|
|||
|
||||
ts = list_first_entry(&inactive_ts_list, struct iscsi_thread_set, ts_list);
|
||||
|
||||
list_del(&ts->ts_list);
|
||||
list_del_init(&ts->ts_list);
|
||||
iscsit_global->inactive_ts--;
|
||||
spin_unlock(&inactive_ts_lock);
|
||||
|
||||
|
|
@ -219,8 +205,6 @@ static void iscsi_deallocate_extra_thread_sets(void)
|
|||
|
||||
void iscsi_activate_thread_set(struct iscsi_conn *conn, struct iscsi_thread_set *ts)
|
||||
{
|
||||
iscsi_add_ts_to_active_list(ts);
|
||||
|
||||
spin_lock_bh(&ts->ts_state_lock);
|
||||
conn->thread_set = ts;
|
||||
ts->conn = conn;
|
||||
|
|
@ -423,7 +407,6 @@ struct iscsi_conn *iscsi_rx_thread_pre_handler(struct iscsi_thread_set *ts)
|
|||
|
||||
if (ts->delay_inactive && (--ts->thread_count == 0)) {
|
||||
spin_unlock_bh(&ts->ts_state_lock);
|
||||
iscsi_del_ts_from_active_list(ts);
|
||||
|
||||
if (!iscsit_global->in_shutdown)
|
||||
iscsi_deallocate_extra_thread_sets();
|
||||
|
|
@ -476,7 +459,6 @@ struct iscsi_conn *iscsi_tx_thread_pre_handler(struct iscsi_thread_set *ts)
|
|||
|
||||
if (ts->delay_inactive && (--ts->thread_count == 0)) {
|
||||
spin_unlock_bh(&ts->ts_state_lock);
|
||||
iscsi_del_ts_from_active_list(ts);
|
||||
|
||||
if (!iscsit_global->in_shutdown)
|
||||
iscsi_deallocate_extra_thread_sets();
|
||||
|
|
|
|||
|
|
@ -215,6 +215,9 @@ static int pty_signal(struct tty_struct *tty, int sig)
|
|||
unsigned long flags;
|
||||
struct pid *pgrp;
|
||||
|
||||
if (sig != SIGINT && sig != SIGQUIT && sig != SIGTSTP)
|
||||
return -EINVAL;
|
||||
|
||||
if (tty->link) {
|
||||
spin_lock_irqsave(&tty->link->ctrl_lock, flags);
|
||||
pgrp = get_pid(tty->link->pgrp);
|
||||
|
|
|
|||
|
|
@ -498,6 +498,7 @@ void invert_screen(struct vc_data *vc, int offset, int count, int viewed)
|
|||
#endif
|
||||
if (DO_UPDATE(vc))
|
||||
do_update_region(vc, (unsigned long) p, count);
|
||||
notify_update(vc);
|
||||
}
|
||||
|
||||
/* used by selection: complement pointer position */
|
||||
|
|
@ -514,6 +515,7 @@ void complement_pos(struct vc_data *vc, int offset)
|
|||
scr_writew(old, screenpos(vc, old_offset, 1));
|
||||
if (DO_UPDATE(vc))
|
||||
vc->vc_sw->con_putc(vc, old, oldy, oldx);
|
||||
notify_update(vc);
|
||||
}
|
||||
|
||||
old_offset = offset;
|
||||
|
|
@ -531,8 +533,8 @@ void complement_pos(struct vc_data *vc, int offset)
|
|||
oldy = (offset >> 1) / vc->vc_cols;
|
||||
vc->vc_sw->con_putc(vc, new, oldy, oldx);
|
||||
}
|
||||
notify_update(vc);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
static void insert_char(struct vc_data *vc, unsigned int nr)
|
||||
|
|
|
|||
|
|
@ -22,17 +22,25 @@
|
|||
*/
|
||||
|
||||
/* FIXME tune these based on pool statistics ... */
|
||||
static const size_t pool_max[HCD_BUFFER_POOLS] = {
|
||||
/* platforms without dma-friendly caches might need to
|
||||
* prevent cacheline sharing...
|
||||
*/
|
||||
32,
|
||||
128,
|
||||
512,
|
||||
PAGE_SIZE / 2
|
||||
/* bigger --> allocate pages */
|
||||
static size_t pool_max[HCD_BUFFER_POOLS] = {
|
||||
32, 128, 512, 2048,
|
||||
};
|
||||
|
||||
void __init usb_init_pool_max(void)
|
||||
{
|
||||
/*
|
||||
* The pool_max values must never be smaller than
|
||||
* ARCH_KMALLOC_MINALIGN.
|
||||
*/
|
||||
if (ARCH_KMALLOC_MINALIGN <= 32)
|
||||
; /* Original value is okay */
|
||||
else if (ARCH_KMALLOC_MINALIGN <= 64)
|
||||
pool_max[0] = 64;
|
||||
else if (ARCH_KMALLOC_MINALIGN <= 128)
|
||||
pool_max[0] = 0; /* Don't use this pool */
|
||||
else
|
||||
BUILD_BUG(); /* We don't allow this */
|
||||
}
|
||||
|
||||
/* SETUP primitives */
|
||||
|
||||
|
|
|
|||
|
|
@ -1593,6 +1593,7 @@ static int unlink1(struct usb_hcd *hcd, struct urb *urb, int status)
|
|||
int usb_hcd_unlink_urb (struct urb *urb, int status)
|
||||
{
|
||||
struct usb_hcd *hcd;
|
||||
struct usb_device *udev = urb->dev;
|
||||
int retval = -EIDRM;
|
||||
unsigned long flags;
|
||||
|
||||
|
|
@ -1604,20 +1605,19 @@ int usb_hcd_unlink_urb (struct urb *urb, int status)
|
|||
spin_lock_irqsave(&hcd_urb_unlink_lock, flags);
|
||||
if (atomic_read(&urb->use_count) > 0) {
|
||||
retval = 0;
|
||||
usb_get_dev(urb->dev);
|
||||
usb_get_dev(udev);
|
||||
}
|
||||
spin_unlock_irqrestore(&hcd_urb_unlink_lock, flags);
|
||||
if (retval == 0) {
|
||||
hcd = bus_to_hcd(urb->dev->bus);
|
||||
retval = unlink1(hcd, urb, status);
|
||||
usb_put_dev(urb->dev);
|
||||
if (retval == 0)
|
||||
retval = -EINPROGRESS;
|
||||
else if (retval != -EIDRM && retval != -EBUSY)
|
||||
dev_dbg(&udev->dev, "hcd_unlink_urb %p fail %d\n",
|
||||
urb, retval);
|
||||
usb_put_dev(udev);
|
||||
}
|
||||
|
||||
if (retval == 0)
|
||||
retval = -EINPROGRESS;
|
||||
else if (retval != -EIDRM && retval != -EBUSY)
|
||||
dev_dbg(&urb->dev->dev, "hcd_unlink_urb %p fail %d\n",
|
||||
urb, retval);
|
||||
return retval;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -1003,6 +1003,7 @@ static int __init usb_init(void)
|
|||
pr_info("%s: USB support disabled\n", usbcore_name);
|
||||
return 0;
|
||||
}
|
||||
usb_init_pool_max();
|
||||
|
||||
retval = usb_debugfs_init();
|
||||
if (retval)
|
||||
|
|
|
|||
|
|
@ -56,6 +56,7 @@ static const struct usb_device_id id_table[] = {
|
|||
{ USB_DEVICE(0x0846, 0x1100) }, /* NetGear Managed Switch M4100 series, M5300 series, M7100 series */
|
||||
{ USB_DEVICE(0x08e6, 0x5501) }, /* Gemalto Prox-PU/CU contactless smartcard reader */
|
||||
{ USB_DEVICE(0x08FD, 0x000A) }, /* Digianswer A/S , ZigBee/802.15.4 MAC Device */
|
||||
{ USB_DEVICE(0x0908, 0x01FF) }, /* Siemens RUGGEDCOM USB Serial Console */
|
||||
{ USB_DEVICE(0x0BED, 0x1100) }, /* MEI (TM) Cashflow-SC Bill/Voucher Acceptor */
|
||||
{ USB_DEVICE(0x0BED, 0x1101) }, /* MEI series 2000 Combo Acceptor */
|
||||
{ USB_DEVICE(0x0FCF, 0x1003) }, /* Dynastream ANT development board */
|
||||
|
|
|
|||
|
|
@ -552,11 +552,12 @@ static unsigned long load_elf_interp(struct elfhdr *interp_elf_ex,
|
|||
|
||||
static unsigned long randomize_stack_top(unsigned long stack_top)
|
||||
{
|
||||
unsigned int random_variable = 0;
|
||||
unsigned long random_variable = 0;
|
||||
|
||||
if ((current->flags & PF_RANDOMIZE) &&
|
||||
!(current->personality & ADDR_NO_RANDOMIZE)) {
|
||||
random_variable = get_random_int() & STACK_RND_MASK;
|
||||
random_variable = (unsigned long) get_random_int();
|
||||
random_variable &= STACK_RND_MASK;
|
||||
random_variable <<= PAGE_SHIFT;
|
||||
}
|
||||
#ifdef CONFIG_STACK_GROWSUP
|
||||
|
|
|
|||
|
|
@ -100,7 +100,7 @@ ext4_file_dio_write(struct kiocb *iocb, const struct iovec *iov,
|
|||
struct blk_plug plug;
|
||||
int unaligned_aio = 0;
|
||||
ssize_t ret;
|
||||
int overwrite = 0;
|
||||
int *overwrite = iocb->private;
|
||||
size_t length = iov_length(iov, nr_segs);
|
||||
|
||||
if (ext4_test_inode_flag(inode, EXT4_INODE_EXTENTS) &&
|
||||
|
|
@ -118,8 +118,6 @@ ext4_file_dio_write(struct kiocb *iocb, const struct iovec *iov,
|
|||
mutex_lock(&inode->i_mutex);
|
||||
blk_start_plug(&plug);
|
||||
|
||||
iocb->private = &overwrite;
|
||||
|
||||
/* check whether we do a DIO overwrite or not */
|
||||
if (ext4_should_dioread_nolock(inode) && !unaligned_aio &&
|
||||
!file->f_mapping->nrpages && pos + length <= i_size_read(inode)) {
|
||||
|
|
@ -143,7 +141,7 @@ ext4_file_dio_write(struct kiocb *iocb, const struct iovec *iov,
|
|||
* So we should check these two conditions.
|
||||
*/
|
||||
if (err == len && (map.m_flags & EXT4_MAP_MAPPED))
|
||||
overwrite = 1;
|
||||
*overwrite = 1;
|
||||
}
|
||||
|
||||
ret = __generic_file_aio_write(iocb, iov, nr_segs, &iocb->ki_pos);
|
||||
|
|
@ -170,6 +168,7 @@ ext4_file_write(struct kiocb *iocb, const struct iovec *iov,
|
|||
{
|
||||
struct inode *inode = file_inode(iocb->ki_filp);
|
||||
ssize_t ret;
|
||||
int overwrite = 0;
|
||||
|
||||
/*
|
||||
* If we have encountered a bitmap-format file, the size limit
|
||||
|
|
@ -190,6 +189,7 @@ ext4_file_write(struct kiocb *iocb, const struct iovec *iov,
|
|||
}
|
||||
}
|
||||
|
||||
iocb->private = &overwrite;
|
||||
if (unlikely(iocb->ki_filp->f_flags & O_DIRECT))
|
||||
ret = ext4_file_dio_write(iocb, iov, nr_segs, pos);
|
||||
else
|
||||
|
|
|
|||
|
|
@ -510,6 +510,10 @@ static int jffs2_scan_eraseblock (struct jffs2_sb_info *c, struct jffs2_eraseblo
|
|||
sumlen = c->sector_size - je32_to_cpu(sm->offset);
|
||||
sumptr = buf + buf_size - sumlen;
|
||||
|
||||
/* sm->offset maybe wrong but MAGIC maybe right */
|
||||
if (sumlen > c->sector_size)
|
||||
goto full_scan;
|
||||
|
||||
/* Now, make sure the summary itself is available */
|
||||
if (sumlen > buf_size) {
|
||||
/* Need to kmalloc for this. */
|
||||
|
|
@ -544,6 +548,7 @@ static int jffs2_scan_eraseblock (struct jffs2_sb_info *c, struct jffs2_eraseblo
|
|||
}
|
||||
}
|
||||
|
||||
full_scan:
|
||||
buf_ofs = jeb->offset;
|
||||
|
||||
if (!buf_size) {
|
||||
|
|
|
|||
|
|
@ -128,22 +128,24 @@ nfs41_callback_svc(void *vrqstp)
|
|||
if (try_to_freeze())
|
||||
continue;
|
||||
|
||||
prepare_to_wait(&serv->sv_cb_waitq, &wq, TASK_INTERRUPTIBLE);
|
||||
prepare_to_wait(&serv->sv_cb_waitq, &wq, TASK_UNINTERRUPTIBLE);
|
||||
spin_lock_bh(&serv->sv_cb_lock);
|
||||
if (!list_empty(&serv->sv_cb_list)) {
|
||||
req = list_first_entry(&serv->sv_cb_list,
|
||||
struct rpc_rqst, rq_bc_list);
|
||||
list_del(&req->rq_bc_list);
|
||||
spin_unlock_bh(&serv->sv_cb_lock);
|
||||
finish_wait(&serv->sv_cb_waitq, &wq);
|
||||
dprintk("Invoking bc_svc_process()\n");
|
||||
error = bc_svc_process(serv, req, rqstp);
|
||||
dprintk("bc_svc_process() returned w/ error code= %d\n",
|
||||
error);
|
||||
} else {
|
||||
spin_unlock_bh(&serv->sv_cb_lock);
|
||||
schedule();
|
||||
/* schedule_timeout to game the hung task watchdog */
|
||||
schedule_timeout(60 * HZ);
|
||||
finish_wait(&serv->sv_cb_waitq, &wq);
|
||||
}
|
||||
finish_wait(&serv->sv_cb_waitq, &wq);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -464,8 +464,10 @@ static __be32 decode_cb_sequence_args(struct svc_rqst *rqstp,
|
|||
|
||||
for (i = 0; i < args->csa_nrclists; i++) {
|
||||
status = decode_rc_list(xdr, &args->csa_rclists[i]);
|
||||
if (status)
|
||||
if (status) {
|
||||
args->csa_nrclists = i;
|
||||
goto out_free;
|
||||
}
|
||||
}
|
||||
}
|
||||
status = 0;
|
||||
|
|
|
|||
|
|
@ -141,7 +141,6 @@ enum {
|
|||
* @ti_save: Backup of journal_info field of task_struct
|
||||
* @ti_flags: Flags
|
||||
* @ti_count: Nest level
|
||||
* @ti_garbage: List of inode to be put when releasing semaphore
|
||||
*/
|
||||
struct nilfs_transaction_info {
|
||||
u32 ti_magic;
|
||||
|
|
@ -150,7 +149,6 @@ struct nilfs_transaction_info {
|
|||
one of other filesystems has a bug. */
|
||||
unsigned short ti_flags;
|
||||
unsigned short ti_count;
|
||||
struct list_head ti_garbage;
|
||||
};
|
||||
|
||||
/* ti_magic */
|
||||
|
|
|
|||
|
|
@ -305,7 +305,6 @@ static void nilfs_transaction_lock(struct super_block *sb,
|
|||
ti->ti_count = 0;
|
||||
ti->ti_save = cur_ti;
|
||||
ti->ti_magic = NILFS_TI_MAGIC;
|
||||
INIT_LIST_HEAD(&ti->ti_garbage);
|
||||
current->journal_info = ti;
|
||||
|
||||
for (;;) {
|
||||
|
|
@ -332,8 +331,6 @@ static void nilfs_transaction_unlock(struct super_block *sb)
|
|||
|
||||
up_write(&nilfs->ns_segctor_sem);
|
||||
current->journal_info = ti->ti_save;
|
||||
if (!list_empty(&ti->ti_garbage))
|
||||
nilfs_dispose_list(nilfs, &ti->ti_garbage, 0);
|
||||
}
|
||||
|
||||
static void *nilfs_segctor_map_segsum_entry(struct nilfs_sc_info *sci,
|
||||
|
|
@ -746,6 +743,15 @@ static void nilfs_dispose_list(struct the_nilfs *nilfs,
|
|||
}
|
||||
}
|
||||
|
||||
static void nilfs_iput_work_func(struct work_struct *work)
|
||||
{
|
||||
struct nilfs_sc_info *sci = container_of(work, struct nilfs_sc_info,
|
||||
sc_iput_work);
|
||||
struct the_nilfs *nilfs = sci->sc_super->s_fs_info;
|
||||
|
||||
nilfs_dispose_list(nilfs, &sci->sc_iput_queue, 0);
|
||||
}
|
||||
|
||||
static int nilfs_test_metadata_dirty(struct the_nilfs *nilfs,
|
||||
struct nilfs_root *root)
|
||||
{
|
||||
|
|
@ -1899,8 +1905,8 @@ static int nilfs_segctor_collect_dirty_files(struct nilfs_sc_info *sci,
|
|||
static void nilfs_segctor_drop_written_files(struct nilfs_sc_info *sci,
|
||||
struct the_nilfs *nilfs)
|
||||
{
|
||||
struct nilfs_transaction_info *ti = current->journal_info;
|
||||
struct nilfs_inode_info *ii, *n;
|
||||
int defer_iput = false;
|
||||
|
||||
spin_lock(&nilfs->ns_inode_lock);
|
||||
list_for_each_entry_safe(ii, n, &sci->sc_dirty_files, i_dirty) {
|
||||
|
|
@ -1911,9 +1917,24 @@ static void nilfs_segctor_drop_written_files(struct nilfs_sc_info *sci,
|
|||
clear_bit(NILFS_I_BUSY, &ii->i_state);
|
||||
brelse(ii->i_bh);
|
||||
ii->i_bh = NULL;
|
||||
list_move_tail(&ii->i_dirty, &ti->ti_garbage);
|
||||
list_del_init(&ii->i_dirty);
|
||||
if (!ii->vfs_inode.i_nlink) {
|
||||
/*
|
||||
* Defer calling iput() to avoid a deadlock
|
||||
* over I_SYNC flag for inodes with i_nlink == 0
|
||||
*/
|
||||
list_add_tail(&ii->i_dirty, &sci->sc_iput_queue);
|
||||
defer_iput = true;
|
||||
} else {
|
||||
spin_unlock(&nilfs->ns_inode_lock);
|
||||
iput(&ii->vfs_inode);
|
||||
spin_lock(&nilfs->ns_inode_lock);
|
||||
}
|
||||
}
|
||||
spin_unlock(&nilfs->ns_inode_lock);
|
||||
|
||||
if (defer_iput)
|
||||
schedule_work(&sci->sc_iput_work);
|
||||
}
|
||||
|
||||
/*
|
||||
|
|
@ -2580,6 +2601,8 @@ static struct nilfs_sc_info *nilfs_segctor_new(struct super_block *sb,
|
|||
INIT_LIST_HEAD(&sci->sc_segbufs);
|
||||
INIT_LIST_HEAD(&sci->sc_write_logs);
|
||||
INIT_LIST_HEAD(&sci->sc_gc_inodes);
|
||||
INIT_LIST_HEAD(&sci->sc_iput_queue);
|
||||
INIT_WORK(&sci->sc_iput_work, nilfs_iput_work_func);
|
||||
init_timer(&sci->sc_timer);
|
||||
|
||||
sci->sc_interval = HZ * NILFS_SC_DEFAULT_TIMEOUT;
|
||||
|
|
@ -2606,6 +2629,8 @@ static void nilfs_segctor_write_out(struct nilfs_sc_info *sci)
|
|||
ret = nilfs_segctor_construct(sci, SC_LSEG_SR);
|
||||
nilfs_transaction_unlock(sci->sc_super);
|
||||
|
||||
flush_work(&sci->sc_iput_work);
|
||||
|
||||
} while (ret && retrycount-- > 0);
|
||||
}
|
||||
|
||||
|
|
@ -2630,6 +2655,9 @@ static void nilfs_segctor_destroy(struct nilfs_sc_info *sci)
|
|||
|| sci->sc_seq_request != sci->sc_seq_done);
|
||||
spin_unlock(&sci->sc_state_lock);
|
||||
|
||||
if (flush_work(&sci->sc_iput_work))
|
||||
flag = true;
|
||||
|
||||
if (flag || !nilfs_segctor_confirm(sci))
|
||||
nilfs_segctor_write_out(sci);
|
||||
|
||||
|
|
@ -2639,6 +2667,12 @@ static void nilfs_segctor_destroy(struct nilfs_sc_info *sci)
|
|||
nilfs_dispose_list(nilfs, &sci->sc_dirty_files, 1);
|
||||
}
|
||||
|
||||
if (!list_empty(&sci->sc_iput_queue)) {
|
||||
nilfs_warning(sci->sc_super, __func__,
|
||||
"iput queue is not empty\n");
|
||||
nilfs_dispose_list(nilfs, &sci->sc_iput_queue, 1);
|
||||
}
|
||||
|
||||
WARN_ON(!list_empty(&sci->sc_segbufs));
|
||||
WARN_ON(!list_empty(&sci->sc_write_logs));
|
||||
|
||||
|
|
|
|||
|
|
@ -26,6 +26,7 @@
|
|||
#include <linux/types.h>
|
||||
#include <linux/fs.h>
|
||||
#include <linux/buffer_head.h>
|
||||
#include <linux/workqueue.h>
|
||||
#include <linux/nilfs2_fs.h>
|
||||
#include "nilfs.h"
|
||||
|
||||
|
|
@ -92,6 +93,8 @@ struct nilfs_segsum_pointer {
|
|||
* @sc_nblk_inc: Block count of current generation
|
||||
* @sc_dirty_files: List of files to be written
|
||||
* @sc_gc_inodes: List of GC inodes having blocks to be written
|
||||
* @sc_iput_queue: list of inodes for which iput should be done
|
||||
* @sc_iput_work: work struct to defer iput call
|
||||
* @sc_freesegs: array of segment numbers to be freed
|
||||
* @sc_nfreesegs: number of segments on @sc_freesegs
|
||||
* @sc_dsync_inode: inode whose data pages are written for a sync operation
|
||||
|
|
@ -135,6 +138,8 @@ struct nilfs_sc_info {
|
|||
|
||||
struct list_head sc_dirty_files;
|
||||
struct list_head sc_gc_inodes;
|
||||
struct list_head sc_iput_queue;
|
||||
struct work_struct sc_iput_work;
|
||||
|
||||
__u64 *sc_freesegs;
|
||||
size_t sc_nfreesegs;
|
||||
|
|
|
|||
|
|
@ -296,6 +296,10 @@ xfs_buf_item_format(
|
|||
ASSERT(atomic_read(&bip->bli_refcount) > 0);
|
||||
ASSERT((bip->bli_flags & XFS_BLI_LOGGED) ||
|
||||
(bip->bli_flags & XFS_BLI_STALE));
|
||||
ASSERT((bip->bli_flags & XFS_BLI_STALE) ||
|
||||
(xfs_blft_from_flags(&bip->__bli_format) > XFS_BLFT_UNKNOWN_BUF
|
||||
&& xfs_blft_from_flags(&bip->__bli_format) < XFS_BLFT_MAX_BUF));
|
||||
|
||||
|
||||
/*
|
||||
* If it is an inode buffer, transfer the in-memory state to the
|
||||
|
|
|
|||
|
|
@ -1655,6 +1655,7 @@ xfs_iunlink(
|
|||
agi->agi_unlinked[bucket_index] = cpu_to_be32(agino);
|
||||
offset = offsetof(xfs_agi_t, agi_unlinked) +
|
||||
(sizeof(xfs_agino_t) * bucket_index);
|
||||
xfs_trans_buf_set_type(tp, agibp, XFS_BLFT_AGI_BUF);
|
||||
xfs_trans_log_buf(tp, agibp, offset,
|
||||
(offset + sizeof(xfs_agino_t) - 1));
|
||||
return 0;
|
||||
|
|
@ -1746,6 +1747,7 @@ xfs_iunlink_remove(
|
|||
agi->agi_unlinked[bucket_index] = cpu_to_be32(next_agino);
|
||||
offset = offsetof(xfs_agi_t, agi_unlinked) +
|
||||
(sizeof(xfs_agino_t) * bucket_index);
|
||||
xfs_trans_buf_set_type(tp, agibp, XFS_BLFT_AGI_BUF);
|
||||
xfs_trans_log_buf(tp, agibp, offset,
|
||||
(offset + sizeof(xfs_agino_t) - 1));
|
||||
} else {
|
||||
|
|
|
|||
|
|
@ -1100,6 +1100,7 @@ xfs_trans_apply_sb_deltas(
|
|||
whole = 1;
|
||||
}
|
||||
|
||||
xfs_trans_buf_set_type(tp, bp, XFS_BLFT_SB_BUF);
|
||||
if (whole)
|
||||
/*
|
||||
* Log the whole thing, the fields are noncontiguous.
|
||||
|
|
|
|||
|
|
@ -101,8 +101,10 @@ static inline void fsnotify_move(struct inode *old_dir, struct inode *new_dir,
|
|||
new_dir_mask |= FS_ISDIR;
|
||||
}
|
||||
|
||||
fsnotify(old_dir, old_dir_mask, old_dir, FSNOTIFY_EVENT_INODE, old_name, fs_cookie);
|
||||
fsnotify(new_dir, new_dir_mask, new_dir, FSNOTIFY_EVENT_INODE, new_name, fs_cookie);
|
||||
fsnotify(old_dir, old_dir_mask, source, FSNOTIFY_EVENT_INODE, old_name,
|
||||
fs_cookie);
|
||||
fsnotify(new_dir, new_dir_mask, source, FSNOTIFY_EVENT_INODE, new_name,
|
||||
fs_cookie);
|
||||
|
||||
if (target)
|
||||
fsnotify_link_count(target);
|
||||
|
|
|
|||
|
|
@ -416,6 +416,7 @@ extern const struct dev_pm_ops usb_hcd_pci_pm_ops;
|
|||
#endif /* CONFIG_PCI */
|
||||
|
||||
/* pci-ish (pdev null is ok) buffer alloc/mapping support */
|
||||
void usb_init_pool_max(void);
|
||||
int hcd_buffer_create(struct usb_hcd *hcd);
|
||||
void hcd_buffer_destroy(struct usb_hcd *hcd);
|
||||
|
||||
|
|
|
|||
|
|
@ -37,11 +37,12 @@ struct inet_skb_parm {
|
|||
struct ip_options opt; /* Compiled IP options */
|
||||
unsigned char flags;
|
||||
|
||||
#define IPSKB_FORWARDED 1
|
||||
#define IPSKB_XFRM_TUNNEL_SIZE 2
|
||||
#define IPSKB_XFRM_TRANSFORMED 4
|
||||
#define IPSKB_FRAG_COMPLETE 8
|
||||
#define IPSKB_REROUTED 16
|
||||
#define IPSKB_FORWARDED BIT(0)
|
||||
#define IPSKB_XFRM_TUNNEL_SIZE BIT(1)
|
||||
#define IPSKB_XFRM_TRANSFORMED BIT(2)
|
||||
#define IPSKB_FRAG_COMPLETE BIT(3)
|
||||
#define IPSKB_REROUTED BIT(4)
|
||||
#define IPSKB_DOREDIRECT BIT(5)
|
||||
|
||||
u16 frag_max_size;
|
||||
};
|
||||
|
|
@ -163,7 +164,7 @@ static inline __u8 ip_reply_arg_flowi_flags(const struct ip_reply_arg *arg)
|
|||
return (arg->flags & IP_REPLY_ARG_NOSRCCHECK) ? FLOWI_FLAG_ANYSRC : 0;
|
||||
}
|
||||
|
||||
void ip_send_unicast_reply(struct net *net, struct sk_buff *skb, __be32 daddr,
|
||||
void ip_send_unicast_reply(struct sock *sk, struct sk_buff *skb, __be32 daddr,
|
||||
__be32 saddr, const struct ip_reply_arg *arg,
|
||||
unsigned int len);
|
||||
|
||||
|
|
|
|||
|
|
@ -43,6 +43,7 @@ struct netns_ipv4 {
|
|||
struct inet_peer_base *peers;
|
||||
struct tcpm_hash_bucket *tcp_metrics_hash;
|
||||
unsigned int tcp_metrics_hash_log;
|
||||
struct sock * __percpu *tcp_sk;
|
||||
struct netns_frags frags;
|
||||
#ifdef CONFIG_NETFILTER
|
||||
struct xt_table *iptable_filter;
|
||||
|
|
|
|||
|
|
@ -286,7 +286,7 @@ struct ak4113 {
|
|||
ak4113_write_t *write;
|
||||
ak4113_read_t *read;
|
||||
void *private_data;
|
||||
unsigned int init:1;
|
||||
atomic_t wq_processing;
|
||||
spinlock_t lock;
|
||||
unsigned char regmap[AK4113_WRITABLE_REGS];
|
||||
struct snd_kcontrol *kctls[AK4113_CONTROLS];
|
||||
|
|
|
|||
|
|
@ -168,7 +168,7 @@ struct ak4114 {
|
|||
ak4114_write_t * write;
|
||||
ak4114_read_t * read;
|
||||
void * private_data;
|
||||
unsigned int init: 1;
|
||||
atomic_t wq_processing;
|
||||
spinlock_t lock;
|
||||
unsigned char regmap[7];
|
||||
unsigned char txcsb[5];
|
||||
|
|
|
|||
|
|
@ -2532,7 +2532,7 @@ static int kdb_summary(int argc, const char **argv)
|
|||
#define K(x) ((x) << (PAGE_SHIFT - 10))
|
||||
kdb_printf("\nMemTotal: %8lu kB\nMemFree: %8lu kB\n"
|
||||
"Buffers: %8lu kB\n",
|
||||
val.totalram, val.freeram, val.bufferram);
|
||||
K(val.totalram), K(val.freeram), K(val.bufferram));
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -279,6 +279,7 @@ int smpboot_register_percpu_thread(struct smp_hotplug_thread *plug_thread)
|
|||
unsigned int cpu;
|
||||
int ret = 0;
|
||||
|
||||
get_online_cpus();
|
||||
mutex_lock(&smpboot_threads_lock);
|
||||
for_each_online_cpu(cpu) {
|
||||
ret = __smpboot_create_thread(plug_thread, cpu);
|
||||
|
|
@ -291,6 +292,7 @@ int smpboot_register_percpu_thread(struct smp_hotplug_thread *plug_thread)
|
|||
list_add(&plug_thread->list, &hotplug_threads);
|
||||
out:
|
||||
mutex_unlock(&smpboot_threads_lock);
|
||||
put_online_cpus();
|
||||
return ret;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(smpboot_register_percpu_thread);
|
||||
|
|
|
|||
|
|
@ -631,10 +631,14 @@ int ntp_validate_timex(struct timex *txc)
|
|||
if ((txc->modes & ADJ_SETOFFSET) && (!capable(CAP_SYS_TIME)))
|
||||
return -EPERM;
|
||||
|
||||
if (txc->modes & ADJ_FREQUENCY) {
|
||||
if (LONG_MIN / PPM_SCALE > txc->freq)
|
||||
/*
|
||||
* Check for potential multiplication overflows that can
|
||||
* only happen on 64-bit systems:
|
||||
*/
|
||||
if ((txc->modes & ADJ_FREQUENCY) && (BITS_PER_LONG == 64)) {
|
||||
if (LLONG_MIN / PPM_SCALE > txc->freq)
|
||||
return -EINVAL;
|
||||
if (LONG_MAX / PPM_SCALE < txc->freq)
|
||||
if (LLONG_MAX / PPM_SCALE < txc->freq)
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -4679,7 +4679,7 @@ tracing_mark_write(struct file *filp, const char __user *ubuf,
|
|||
*fpos += written;
|
||||
|
||||
out_unlock:
|
||||
for (i = 0; i < nr_pages; i++){
|
||||
for (i = nr_pages - 1; i >= 0; i--) {
|
||||
kunmap_atomic(map_page[i]);
|
||||
put_page(pages[i]);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -181,6 +181,15 @@ csum_partial_copy(const void *src, void *dst, int len, __wsum sum)
|
|||
EXPORT_SYMBOL(csum_partial_copy);
|
||||
|
||||
#ifndef csum_tcpudp_nofold
|
||||
static inline u32 from64to32(u64 x)
|
||||
{
|
||||
/* add up 32-bit and 32-bit for 32+c bit */
|
||||
x = (x & 0xffffffff) + (x >> 32);
|
||||
/* add up carry.. */
|
||||
x = (x & 0xffffffff) + (x >> 32);
|
||||
return (u32)x;
|
||||
}
|
||||
|
||||
__wsum csum_tcpudp_nofold(__be32 saddr, __be32 daddr,
|
||||
unsigned short len,
|
||||
unsigned short proto,
|
||||
|
|
@ -195,8 +204,7 @@ __wsum csum_tcpudp_nofold(__be32 saddr, __be32 daddr,
|
|||
#else
|
||||
s += (proto + len) << 8;
|
||||
#endif
|
||||
s += (s >> 32);
|
||||
return (__force __wsum)s;
|
||||
return (__force __wsum)from64to32(s);
|
||||
}
|
||||
EXPORT_SYMBOL(csum_tcpudp_nofold);
|
||||
#endif
|
||||
|
|
|
|||
|
|
@ -199,7 +199,10 @@ int walk_page_range(unsigned long addr, unsigned long end,
|
|||
*/
|
||||
if ((vma->vm_start <= addr) &&
|
||||
(vma->vm_flags & VM_PFNMAP)) {
|
||||
next = vma->vm_end;
|
||||
if (walk->pte_hole)
|
||||
err = walk->pte_hole(addr, next, walk);
|
||||
if (err)
|
||||
break;
|
||||
pgd = pgd_offset(walk->mm, next);
|
||||
continue;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -967,12 +967,24 @@ static void put_osd(struct ceph_osd *osd)
|
|||
*/
|
||||
static void __remove_osd(struct ceph_osd_client *osdc, struct ceph_osd *osd)
|
||||
{
|
||||
dout("__remove_osd %p\n", osd);
|
||||
BUG_ON(!list_empty(&osd->o_requests));
|
||||
rb_erase(&osd->o_node, &osdc->osds);
|
||||
dout("%s %p osd%d\n", __func__, osd, osd->o_osd);
|
||||
WARN_ON(!list_empty(&osd->o_requests));
|
||||
WARN_ON(!list_empty(&osd->o_linger_requests));
|
||||
|
||||
list_del_init(&osd->o_osd_lru);
|
||||
ceph_con_close(&osd->o_con);
|
||||
put_osd(osd);
|
||||
rb_erase(&osd->o_node, &osdc->osds);
|
||||
RB_CLEAR_NODE(&osd->o_node);
|
||||
}
|
||||
|
||||
static void remove_osd(struct ceph_osd_client *osdc, struct ceph_osd *osd)
|
||||
{
|
||||
dout("%s %p osd%d\n", __func__, osd, osd->o_osd);
|
||||
|
||||
if (!RB_EMPTY_NODE(&osd->o_node)) {
|
||||
ceph_con_close(&osd->o_con);
|
||||
__remove_osd(osdc, osd);
|
||||
put_osd(osd);
|
||||
}
|
||||
}
|
||||
|
||||
static void remove_all_osds(struct ceph_osd_client *osdc)
|
||||
|
|
@ -982,7 +994,7 @@ static void remove_all_osds(struct ceph_osd_client *osdc)
|
|||
while (!RB_EMPTY_ROOT(&osdc->osds)) {
|
||||
struct ceph_osd *osd = rb_entry(rb_first(&osdc->osds),
|
||||
struct ceph_osd, o_node);
|
||||
__remove_osd(osdc, osd);
|
||||
remove_osd(osdc, osd);
|
||||
}
|
||||
mutex_unlock(&osdc->request_mutex);
|
||||
}
|
||||
|
|
@ -1012,7 +1024,7 @@ static void remove_old_osds(struct ceph_osd_client *osdc)
|
|||
list_for_each_entry_safe(osd, nosd, &osdc->osd_lru, o_osd_lru) {
|
||||
if (time_before(jiffies, osd->lru_ttl))
|
||||
break;
|
||||
__remove_osd(osdc, osd);
|
||||
remove_osd(osdc, osd);
|
||||
}
|
||||
mutex_unlock(&osdc->request_mutex);
|
||||
}
|
||||
|
|
@ -1027,8 +1039,7 @@ static int __reset_osd(struct ceph_osd_client *osdc, struct ceph_osd *osd)
|
|||
dout("__reset_osd %p osd%d\n", osd, osd->o_osd);
|
||||
if (list_empty(&osd->o_requests) &&
|
||||
list_empty(&osd->o_linger_requests)) {
|
||||
__remove_osd(osdc, osd);
|
||||
|
||||
remove_osd(osdc, osd);
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
|
|
@ -1610,6 +1621,7 @@ static void reset_changed_osds(struct ceph_osd_client *osdc)
|
|||
{
|
||||
struct rb_node *p, *n;
|
||||
|
||||
dout("%s %p\n", __func__, osdc);
|
||||
for (p = rb_first(&osdc->osds); p; p = n) {
|
||||
struct ceph_osd *osd = rb_entry(p, struct ceph_osd, o_node);
|
||||
|
||||
|
|
|
|||
|
|
@ -6015,10 +6015,20 @@ static int dev_cpu_callback(struct notifier_block *nfb,
|
|||
oldsd->output_queue = NULL;
|
||||
oldsd->output_queue_tailp = &oldsd->output_queue;
|
||||
}
|
||||
/* Append NAPI poll list from offline CPU. */
|
||||
if (!list_empty(&oldsd->poll_list)) {
|
||||
list_splice_init(&oldsd->poll_list, &sd->poll_list);
|
||||
raise_softirq_irqoff(NET_RX_SOFTIRQ);
|
||||
/* Append NAPI poll list from offline CPU, with one exception :
|
||||
* process_backlog() must be called by cpu owning percpu backlog.
|
||||
* We properly handle process_queue & input_pkt_queue later.
|
||||
*/
|
||||
while (!list_empty(&oldsd->poll_list)) {
|
||||
struct napi_struct *napi = list_first_entry(&oldsd->poll_list,
|
||||
struct napi_struct,
|
||||
poll_list);
|
||||
|
||||
list_del_init(&napi->poll_list);
|
||||
if (napi->poll == process_backlog)
|
||||
napi->state = 0;
|
||||
else
|
||||
____napi_schedule(sd, napi);
|
||||
}
|
||||
|
||||
raise_softirq_irqoff(NET_TX_SOFTIRQ);
|
||||
|
|
@ -6029,7 +6039,7 @@ static int dev_cpu_callback(struct notifier_block *nfb,
|
|||
netif_rx(skb);
|
||||
input_queue_head_incr(oldsd);
|
||||
}
|
||||
while ((skb = __skb_dequeue(&oldsd->input_pkt_queue))) {
|
||||
while ((skb = skb_dequeue(&oldsd->input_pkt_queue))) {
|
||||
netif_rx(skb);
|
||||
input_queue_head_incr(oldsd);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -2477,12 +2477,16 @@ static int rtnl_bridge_notify(struct net_device *dev, u16 flags)
|
|||
goto errout;
|
||||
}
|
||||
|
||||
if (!skb->len)
|
||||
goto errout;
|
||||
|
||||
rtnl_notify(skb, net, 0, RTNLGRP_LINK, NULL, GFP_ATOMIC);
|
||||
return 0;
|
||||
errout:
|
||||
WARN_ON(err == -EMSGSIZE);
|
||||
kfree_skb(skb);
|
||||
rtnl_set_sk_err(net, RTNLGRP_LINK, err);
|
||||
if (err)
|
||||
rtnl_set_sk_err(net, RTNLGRP_LINK, err);
|
||||
return err;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -175,7 +175,8 @@ int ip_forward(struct sk_buff *skb)
|
|||
* We now generate an ICMP HOST REDIRECT giving the route
|
||||
* we calculated.
|
||||
*/
|
||||
if (rt->rt_flags&RTCF_DOREDIRECT && !opt->srr && !skb_sec_path(skb))
|
||||
if (IPCB(skb)->flags & IPSKB_DOREDIRECT && !opt->srr &&
|
||||
!skb_sec_path(skb))
|
||||
ip_rt_send_redirect(skb);
|
||||
|
||||
skb->priority = rt_tos2priority(iph->tos);
|
||||
|
|
|
|||
|
|
@ -1454,23 +1454,8 @@ static int ip_reply_glue_bits(void *dptr, char *to, int offset,
|
|||
/*
|
||||
* Generic function to send a packet as reply to another packet.
|
||||
* Used to send some TCP resets/acks so far.
|
||||
*
|
||||
* Use a fake percpu inet socket to avoid false sharing and contention.
|
||||
*/
|
||||
static DEFINE_PER_CPU(struct inet_sock, unicast_sock) = {
|
||||
.sk = {
|
||||
.__sk_common = {
|
||||
.skc_refcnt = ATOMIC_INIT(1),
|
||||
},
|
||||
.sk_wmem_alloc = ATOMIC_INIT(1),
|
||||
.sk_allocation = GFP_ATOMIC,
|
||||
.sk_flags = (1UL << SOCK_USE_WRITE_QUEUE),
|
||||
},
|
||||
.pmtudisc = IP_PMTUDISC_WANT,
|
||||
.uc_ttl = -1,
|
||||
};
|
||||
|
||||
void ip_send_unicast_reply(struct net *net, struct sk_buff *skb, __be32 daddr,
|
||||
void ip_send_unicast_reply(struct sock *sk, struct sk_buff *skb, __be32 daddr,
|
||||
__be32 saddr, const struct ip_reply_arg *arg,
|
||||
unsigned int len)
|
||||
{
|
||||
|
|
@ -1478,9 +1463,8 @@ void ip_send_unicast_reply(struct net *net, struct sk_buff *skb, __be32 daddr,
|
|||
struct ipcm_cookie ipc;
|
||||
struct flowi4 fl4;
|
||||
struct rtable *rt = skb_rtable(skb);
|
||||
struct net *net = sock_net(sk);
|
||||
struct sk_buff *nskb;
|
||||
struct sock *sk;
|
||||
struct inet_sock *inet;
|
||||
int err;
|
||||
|
||||
if (ip_options_echo(&replyopts.opt.opt, skb))
|
||||
|
|
@ -1510,15 +1494,11 @@ void ip_send_unicast_reply(struct net *net, struct sk_buff *skb, __be32 daddr,
|
|||
if (IS_ERR(rt))
|
||||
return;
|
||||
|
||||
inet = &get_cpu_var(unicast_sock);
|
||||
inet_sk(sk)->tos = arg->tos;
|
||||
|
||||
inet->tos = arg->tos;
|
||||
sk = &inet->sk;
|
||||
sk->sk_priority = skb->priority;
|
||||
sk->sk_protocol = ip_hdr(skb)->protocol;
|
||||
sk->sk_bound_dev_if = arg->bound_dev_if;
|
||||
sock_net_set(sk, net);
|
||||
__skb_queue_head_init(&sk->sk_write_queue);
|
||||
sk->sk_sndbuf = sysctl_wmem_default;
|
||||
err = ip_append_data(sk, &fl4, ip_reply_glue_bits, arg->iov->iov_base,
|
||||
len, 0, &ipc, &rt, MSG_DONTWAIT);
|
||||
|
|
@ -1534,13 +1514,10 @@ void ip_send_unicast_reply(struct net *net, struct sk_buff *skb, __be32 daddr,
|
|||
arg->csumoffset) = csum_fold(csum_add(nskb->csum,
|
||||
arg->csum));
|
||||
nskb->ip_summed = CHECKSUM_NONE;
|
||||
skb_orphan(nskb);
|
||||
skb_set_queue_mapping(nskb, skb_get_queue_mapping(skb));
|
||||
ip_push_pending_frames(sk, &fl4);
|
||||
}
|
||||
out:
|
||||
put_cpu_var(unicast_sock);
|
||||
|
||||
ip_rt_put(rt);
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -410,15 +410,11 @@ int ip_recv_error(struct sock *sk, struct msghdr *msg, int len, int *addr_len)
|
|||
|
||||
memcpy(&errhdr.ee, &serr->ee, sizeof(struct sock_extended_err));
|
||||
sin = &errhdr.offender;
|
||||
sin->sin_family = AF_UNSPEC;
|
||||
memset(sin, 0, sizeof(*sin));
|
||||
if (serr->ee.ee_origin == SO_EE_ORIGIN_ICMP) {
|
||||
struct inet_sock *inet = inet_sk(sk);
|
||||
|
||||
sin->sin_family = AF_INET;
|
||||
sin->sin_addr.s_addr = ip_hdr(skb)->saddr;
|
||||
sin->sin_port = 0;
|
||||
memset(&sin->sin_zero, 0, sizeof(sin->sin_zero));
|
||||
if (inet->cmsg_flags)
|
||||
if (inet_sk(sk)->cmsg_flags)
|
||||
ip_cmsg_recv(msg, skb);
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -964,8 +964,11 @@ void ping_rcv(struct sk_buff *skb)
|
|||
|
||||
sk = ping_lookup(net, skb, ntohs(icmph->un.echo.id));
|
||||
if (sk != NULL) {
|
||||
struct sk_buff *skb2 = skb_clone(skb, GFP_ATOMIC);
|
||||
|
||||
pr_debug("rcv on socket %p\n", sk);
|
||||
ping_queue_rcv_skb(sk, skb_get(skb));
|
||||
if (skb2)
|
||||
ping_queue_rcv_skb(sk, skb2);
|
||||
sock_put(sk);
|
||||
return;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1523,11 +1523,10 @@ static int __mkroute_input(struct sk_buff *skb,
|
|||
|
||||
do_cache = res->fi && !itag;
|
||||
if (out_dev == in_dev && err && IN_DEV_TX_REDIRECTS(out_dev) &&
|
||||
skb->protocol == htons(ETH_P_IP) &&
|
||||
(IN_DEV_SHARED_MEDIA(out_dev) ||
|
||||
inet_addr_onlink(out_dev, saddr, FIB_RES_GW(*res)))) {
|
||||
flags |= RTCF_DOREDIRECT;
|
||||
do_cache = false;
|
||||
}
|
||||
inet_addr_onlink(out_dev, saddr, FIB_RES_GW(*res))))
|
||||
IPCB(skb)->flags |= IPSKB_DOREDIRECT;
|
||||
|
||||
if (skb->protocol != htons(ETH_P_IP)) {
|
||||
/* Not IP (i.e. ARP). Do not create route, if it is
|
||||
|
|
@ -2264,6 +2263,8 @@ static int rt_fill_info(struct net *net, __be32 dst, __be32 src,
|
|||
r->rtm_flags = (rt->rt_flags & ~0xFFFF) | RTM_F_CLONED;
|
||||
if (rt->rt_flags & RTCF_NOTIFY)
|
||||
r->rtm_flags |= RTM_F_NOTIFY;
|
||||
if (IPCB(skb)->flags & IPSKB_DOREDIRECT)
|
||||
r->rtm_flags |= RTCF_DOREDIRECT;
|
||||
|
||||
if (nla_put_be32(skb, RTA_DST, dst))
|
||||
goto nla_put_failure;
|
||||
|
|
|
|||
|
|
@ -707,7 +707,8 @@ static void tcp_v4_send_reset(struct sock *sk, struct sk_buff *skb)
|
|||
|
||||
net = dev_net(skb_dst(skb)->dev);
|
||||
arg.tos = ip_hdr(skb)->tos;
|
||||
ip_send_unicast_reply(net, skb, ip_hdr(skb)->saddr,
|
||||
ip_send_unicast_reply(*this_cpu_ptr(net->ipv4.tcp_sk),
|
||||
skb, ip_hdr(skb)->saddr,
|
||||
ip_hdr(skb)->daddr, &arg, arg.iov[0].iov_len);
|
||||
|
||||
TCP_INC_STATS_BH(net, TCP_MIB_OUTSEGS);
|
||||
|
|
@ -790,7 +791,8 @@ static void tcp_v4_send_ack(struct sk_buff *skb, u32 seq, u32 ack,
|
|||
if (oif)
|
||||
arg.bound_dev_if = oif;
|
||||
arg.tos = tos;
|
||||
ip_send_unicast_reply(net, skb, ip_hdr(skb)->saddr,
|
||||
ip_send_unicast_reply(*this_cpu_ptr(net->ipv4.tcp_sk),
|
||||
skb, ip_hdr(skb)->saddr,
|
||||
ip_hdr(skb)->daddr, &arg, arg.iov[0].iov_len);
|
||||
|
||||
TCP_INC_STATS_BH(net, TCP_MIB_OUTSEGS);
|
||||
|
|
@ -2899,14 +2901,39 @@ struct proto tcp_prot = {
|
|||
};
|
||||
EXPORT_SYMBOL(tcp_prot);
|
||||
|
||||
static int __net_init tcp_sk_init(struct net *net)
|
||||
{
|
||||
net->ipv4.sysctl_tcp_ecn = 2;
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void __net_exit tcp_sk_exit(struct net *net)
|
||||
{
|
||||
int cpu;
|
||||
|
||||
for_each_possible_cpu(cpu)
|
||||
inet_ctl_sock_destroy(*per_cpu_ptr(net->ipv4.tcp_sk, cpu));
|
||||
free_percpu(net->ipv4.tcp_sk);
|
||||
}
|
||||
|
||||
static int __net_init tcp_sk_init(struct net *net)
|
||||
{
|
||||
int res, cpu;
|
||||
|
||||
net->ipv4.tcp_sk = alloc_percpu(struct sock *);
|
||||
if (!net->ipv4.tcp_sk)
|
||||
return -ENOMEM;
|
||||
|
||||
for_each_possible_cpu(cpu) {
|
||||
struct sock *sk;
|
||||
|
||||
res = inet_ctl_sock_create(&sk, PF_INET, SOCK_RAW,
|
||||
IPPROTO_TCP, net);
|
||||
if (res)
|
||||
goto fail;
|
||||
*per_cpu_ptr(net->ipv4.tcp_sk, cpu) = sk;
|
||||
}
|
||||
net->ipv4.sysctl_tcp_ecn = 2;
|
||||
return 0;
|
||||
|
||||
fail:
|
||||
tcp_sk_exit(net);
|
||||
|
||||
return res;
|
||||
}
|
||||
|
||||
static void __net_exit tcp_sk_exit_batch(struct list_head *net_exit_list)
|
||||
|
|
|
|||
|
|
@ -99,11 +99,13 @@ static void udp_dump(struct udp_table *table, struct sk_buff *skb, struct netlin
|
|||
s_slot = cb->args[0];
|
||||
num = s_num = cb->args[1];
|
||||
|
||||
for (slot = s_slot; slot <= table->mask; num = s_num = 0, slot++) {
|
||||
for (slot = s_slot; slot <= table->mask; s_num = 0, slot++) {
|
||||
struct sock *sk;
|
||||
struct hlist_nulls_node *node;
|
||||
struct udp_hslot *hslot = &table->hash[slot];
|
||||
|
||||
num = 0;
|
||||
|
||||
if (hlist_nulls_empty(&hslot->head))
|
||||
continue;
|
||||
|
||||
|
|
|
|||
|
|
@ -374,11 +374,10 @@ int ipv6_recv_error(struct sock *sk, struct msghdr *msg, int len)
|
|||
|
||||
memcpy(&errhdr.ee, &serr->ee, sizeof(struct sock_extended_err));
|
||||
sin = &errhdr.offender;
|
||||
sin->sin6_family = AF_UNSPEC;
|
||||
memset(sin, 0, sizeof(*sin));
|
||||
|
||||
if (serr->ee.ee_origin != SO_EE_ORIGIN_LOCAL) {
|
||||
sin->sin6_family = AF_INET6;
|
||||
sin->sin6_flowinfo = 0;
|
||||
sin->sin6_port = 0;
|
||||
if (skb->protocol == htons(ETH_P_IPV6)) {
|
||||
sin->sin6_addr = ipv6_hdr(skb)->saddr;
|
||||
if (np->rxopt.all)
|
||||
|
|
@ -387,12 +386,9 @@ int ipv6_recv_error(struct sock *sk, struct msghdr *msg, int len)
|
|||
ipv6_iface_scope_id(&sin->sin6_addr,
|
||||
IP6CB(skb)->iif);
|
||||
} else {
|
||||
struct inet_sock *inet = inet_sk(sk);
|
||||
|
||||
ipv6_addr_set_v4mapped(ip_hdr(skb)->saddr,
|
||||
&sin->sin6_addr);
|
||||
sin->sin6_scope_id = 0;
|
||||
if (inet->cmsg_flags)
|
||||
if (inet_sk(sk)->cmsg_flags)
|
||||
ip_cmsg_recv(msg, skb);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -638,6 +638,29 @@ static inline bool rt6_qualify_for_ecmp(struct rt6_info *rt)
|
|||
RTF_GATEWAY;
|
||||
}
|
||||
|
||||
static void fib6_purge_rt(struct rt6_info *rt, struct fib6_node *fn,
|
||||
struct net *net)
|
||||
{
|
||||
if (atomic_read(&rt->rt6i_ref) != 1) {
|
||||
/* This route is used as dummy address holder in some split
|
||||
* nodes. It is not leaked, but it still holds other resources,
|
||||
* which must be released in time. So, scan ascendant nodes
|
||||
* and replace dummy references to this route with references
|
||||
* to still alive ones.
|
||||
*/
|
||||
while (fn) {
|
||||
if (!(fn->fn_flags & RTN_RTINFO) && fn->leaf == rt) {
|
||||
fn->leaf = fib6_find_prefix(net, fn);
|
||||
atomic_inc(&fn->leaf->rt6i_ref);
|
||||
rt6_release(rt);
|
||||
}
|
||||
fn = fn->parent;
|
||||
}
|
||||
/* No more references are possible at this point. */
|
||||
BUG_ON(atomic_read(&rt->rt6i_ref) != 1);
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Insert routing information in a node.
|
||||
*/
|
||||
|
|
@ -775,11 +798,12 @@ static int fib6_add_rt2node(struct fib6_node *fn, struct rt6_info *rt,
|
|||
rt->dst.rt6_next = iter->dst.rt6_next;
|
||||
atomic_inc(&rt->rt6i_ref);
|
||||
inet6_rt_notify(RTM_NEWROUTE, rt, info);
|
||||
rt6_release(iter);
|
||||
if (!(fn->fn_flags & RTN_RTINFO)) {
|
||||
info->nl_net->ipv6.rt6_stats->fib_route_nodes++;
|
||||
fn->fn_flags |= RTN_RTINFO;
|
||||
}
|
||||
fib6_purge_rt(iter, fn, info->nl_net);
|
||||
rt6_release(iter);
|
||||
}
|
||||
|
||||
return 0;
|
||||
|
|
@ -1284,24 +1308,7 @@ static void fib6_del_route(struct fib6_node *fn, struct rt6_info **rtp,
|
|||
fn = fib6_repair_tree(net, fn);
|
||||
}
|
||||
|
||||
if (atomic_read(&rt->rt6i_ref) != 1) {
|
||||
/* This route is used as dummy address holder in some split
|
||||
* nodes. It is not leaked, but it still holds other resources,
|
||||
* which must be released in time. So, scan ascendant nodes
|
||||
* and replace dummy references to this route with references
|
||||
* to still alive ones.
|
||||
*/
|
||||
while (fn) {
|
||||
if (!(fn->fn_flags & RTN_RTINFO) && fn->leaf == rt) {
|
||||
fn->leaf = fib6_find_prefix(net, fn);
|
||||
atomic_inc(&fn->leaf->rt6i_ref);
|
||||
rt6_release(rt);
|
||||
}
|
||||
fn = fn->parent;
|
||||
}
|
||||
/* No more references are possible at this point. */
|
||||
BUG_ON(atomic_read(&rt->rt6i_ref) != 1);
|
||||
}
|
||||
fib6_purge_rt(rt, fn, net);
|
||||
|
||||
inet6_rt_notify(RTM_DELROUTE, rt, info);
|
||||
rt6_release(rt);
|
||||
|
|
|
|||
|
|
@ -1137,12 +1137,9 @@ static void ip6_rt_update_pmtu(struct dst_entry *dst, struct sock *sk,
|
|||
struct net *net = dev_net(dst->dev);
|
||||
|
||||
rt6->rt6i_flags |= RTF_MODIFIED;
|
||||
if (mtu < IPV6_MIN_MTU) {
|
||||
u32 features = dst_metric(dst, RTAX_FEATURES);
|
||||
if (mtu < IPV6_MIN_MTU)
|
||||
mtu = IPV6_MIN_MTU;
|
||||
features |= RTAX_FEATURE_ALLFRAG;
|
||||
dst_metric_set(dst, RTAX_FEATURES, features);
|
||||
}
|
||||
|
||||
dst_metric_set(dst, RTAX_MTU, mtu);
|
||||
rt6_update_expires(rt6, net->ipv6.sysctl.ip6_rt_mtu_expires);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1297,7 +1297,6 @@ void sctp_assoc_update(struct sctp_association *asoc,
|
|||
asoc->peer.peer_hmacs = new->peer.peer_hmacs;
|
||||
new->peer.peer_hmacs = NULL;
|
||||
|
||||
sctp_auth_key_put(asoc->asoc_shared_key);
|
||||
sctp_auth_asoc_init_active_key(asoc, GFP_ATOMIC);
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -2595,7 +2595,7 @@ static int sctp_process_param(struct sctp_association *asoc,
|
|||
|
||||
addr_param = param.v + sizeof(sctp_addip_param_t);
|
||||
|
||||
af = sctp_get_af_specific(param_type2af(param.p->type));
|
||||
af = sctp_get_af_specific(param_type2af(addr_param->p.type));
|
||||
if (af == NULL)
|
||||
break;
|
||||
|
||||
|
|
|
|||
|
|
@ -56,8 +56,7 @@ static inline unsigned char reg_read(struct ak4113 *ak4113, unsigned char reg)
|
|||
|
||||
static void snd_ak4113_free(struct ak4113 *chip)
|
||||
{
|
||||
chip->init = 1; /* don't schedule new work */
|
||||
mb();
|
||||
atomic_inc(&chip->wq_processing); /* don't schedule new work */
|
||||
cancel_delayed_work_sync(&chip->work);
|
||||
kfree(chip);
|
||||
}
|
||||
|
|
@ -89,6 +88,7 @@ int snd_ak4113_create(struct snd_card *card, ak4113_read_t *read,
|
|||
chip->write = write;
|
||||
chip->private_data = private_data;
|
||||
INIT_DELAYED_WORK(&chip->work, ak4113_stats);
|
||||
atomic_set(&chip->wq_processing, 0);
|
||||
|
||||
for (reg = 0; reg < AK4113_WRITABLE_REGS ; reg++)
|
||||
chip->regmap[reg] = pgm[reg];
|
||||
|
|
@ -139,13 +139,11 @@ static void ak4113_init_regs(struct ak4113 *chip)
|
|||
|
||||
void snd_ak4113_reinit(struct ak4113 *chip)
|
||||
{
|
||||
chip->init = 1;
|
||||
mb();
|
||||
flush_delayed_work(&chip->work);
|
||||
if (atomic_inc_return(&chip->wq_processing) == 1)
|
||||
cancel_delayed_work_sync(&chip->work);
|
||||
ak4113_init_regs(chip);
|
||||
/* bring up statistics / event queing */
|
||||
chip->init = 0;
|
||||
if (chip->kctls[0])
|
||||
if (atomic_dec_and_test(&chip->wq_processing))
|
||||
schedule_delayed_work(&chip->work, HZ / 10);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(snd_ak4113_reinit);
|
||||
|
|
@ -632,8 +630,9 @@ static void ak4113_stats(struct work_struct *work)
|
|||
{
|
||||
struct ak4113 *chip = container_of(work, struct ak4113, work.work);
|
||||
|
||||
if (!chip->init)
|
||||
if (atomic_inc_return(&chip->wq_processing) == 1)
|
||||
snd_ak4113_check_rate_and_errors(chip, chip->check_flags);
|
||||
|
||||
schedule_delayed_work(&chip->work, HZ / 10);
|
||||
if (atomic_dec_and_test(&chip->wq_processing))
|
||||
schedule_delayed_work(&chip->work, HZ / 10);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -66,8 +66,7 @@ static void reg_dump(struct ak4114 *ak4114)
|
|||
|
||||
static void snd_ak4114_free(struct ak4114 *chip)
|
||||
{
|
||||
chip->init = 1; /* don't schedule new work */
|
||||
mb();
|
||||
atomic_inc(&chip->wq_processing); /* don't schedule new work */
|
||||
cancel_delayed_work_sync(&chip->work);
|
||||
kfree(chip);
|
||||
}
|
||||
|
|
@ -100,6 +99,7 @@ int snd_ak4114_create(struct snd_card *card,
|
|||
chip->write = write;
|
||||
chip->private_data = private_data;
|
||||
INIT_DELAYED_WORK(&chip->work, ak4114_stats);
|
||||
atomic_set(&chip->wq_processing, 0);
|
||||
|
||||
for (reg = 0; reg < 7; reg++)
|
||||
chip->regmap[reg] = pgm[reg];
|
||||
|
|
@ -152,13 +152,11 @@ static void ak4114_init_regs(struct ak4114 *chip)
|
|||
|
||||
void snd_ak4114_reinit(struct ak4114 *chip)
|
||||
{
|
||||
chip->init = 1;
|
||||
mb();
|
||||
flush_delayed_work(&chip->work);
|
||||
if (atomic_inc_return(&chip->wq_processing) == 1)
|
||||
cancel_delayed_work_sync(&chip->work);
|
||||
ak4114_init_regs(chip);
|
||||
/* bring up statistics / event queing */
|
||||
chip->init = 0;
|
||||
if (chip->kctls[0])
|
||||
if (atomic_dec_and_test(&chip->wq_processing))
|
||||
schedule_delayed_work(&chip->work, HZ / 10);
|
||||
}
|
||||
|
||||
|
|
@ -612,10 +610,10 @@ static void ak4114_stats(struct work_struct *work)
|
|||
{
|
||||
struct ak4114 *chip = container_of(work, struct ak4114, work.work);
|
||||
|
||||
if (!chip->init)
|
||||
if (atomic_inc_return(&chip->wq_processing) == 1)
|
||||
snd_ak4114_check_rate_and_errors(chip, chip->check_flags);
|
||||
|
||||
schedule_delayed_work(&chip->work, HZ / 10);
|
||||
if (atomic_dec_and_test(&chip->wq_processing))
|
||||
schedule_delayed_work(&chip->work, HZ / 10);
|
||||
}
|
||||
|
||||
EXPORT_SYMBOL(snd_ak4114_create);
|
||||
|
|
|
|||
|
|
@ -2032,32 +2032,43 @@ snd_riptide_joystick_probe(struct pci_dev *pci, const struct pci_device_id *id)
|
|||
{
|
||||
static int dev;
|
||||
struct gameport *gameport;
|
||||
int ret;
|
||||
|
||||
if (dev >= SNDRV_CARDS)
|
||||
return -ENODEV;
|
||||
|
||||
if (!enable[dev]) {
|
||||
dev++;
|
||||
return -ENOENT;
|
||||
ret = -ENOENT;
|
||||
goto inc_dev;
|
||||
}
|
||||
|
||||
if (!joystick_port[dev++])
|
||||
return 0;
|
||||
if (!joystick_port[dev]) {
|
||||
ret = 0;
|
||||
goto inc_dev;
|
||||
}
|
||||
|
||||
gameport = gameport_allocate_port();
|
||||
if (!gameport)
|
||||
return -ENOMEM;
|
||||
if (!gameport) {
|
||||
ret = -ENOMEM;
|
||||
goto inc_dev;
|
||||
}
|
||||
if (!request_region(joystick_port[dev], 8, "Riptide gameport")) {
|
||||
snd_printk(KERN_WARNING
|
||||
"Riptide: cannot grab gameport 0x%x\n",
|
||||
joystick_port[dev]);
|
||||
gameport_free_port(gameport);
|
||||
return -EBUSY;
|
||||
ret = -EBUSY;
|
||||
goto inc_dev;
|
||||
}
|
||||
|
||||
gameport->io = joystick_port[dev];
|
||||
gameport_register_port(gameport);
|
||||
pci_set_drvdata(pci, gameport);
|
||||
return 0;
|
||||
|
||||
ret = 0;
|
||||
inc_dev:
|
||||
dev++;
|
||||
return ret;
|
||||
}
|
||||
|
||||
static void snd_riptide_joystick_remove(struct pci_dev *pci)
|
||||
|
|
|
|||
|
|
@ -5789,6 +5789,9 @@ static int snd_hdspm_playback_open(struct snd_pcm_substream *substream)
|
|||
snd_pcm_hw_constraint_minmax(runtime,
|
||||
SNDRV_PCM_HW_PARAM_PERIOD_SIZE,
|
||||
64, 8192);
|
||||
snd_pcm_hw_constraint_minmax(runtime,
|
||||
SNDRV_PCM_HW_PARAM_PERIODS,
|
||||
2, 2);
|
||||
break;
|
||||
}
|
||||
|
||||
|
|
@ -5863,6 +5866,9 @@ static int snd_hdspm_capture_open(struct snd_pcm_substream *substream)
|
|||
snd_pcm_hw_constraint_minmax(runtime,
|
||||
SNDRV_PCM_HW_PARAM_PERIOD_SIZE,
|
||||
64, 8192);
|
||||
snd_pcm_hw_constraint_minmax(runtime,
|
||||
SNDRV_PCM_HW_PARAM_PERIODS,
|
||||
2, 2);
|
||||
break;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -331,7 +331,6 @@ static int atmel_ssc_hw_params(struct snd_pcm_substream *substream,
|
|||
struct atmel_pcm_dma_params *dma_params;
|
||||
int dir, channels, bits;
|
||||
u32 tfmr, rfmr, tcmr, rcmr;
|
||||
int start_event;
|
||||
int ret;
|
||||
|
||||
/*
|
||||
|
|
@ -450,19 +449,10 @@ static int atmel_ssc_hw_params(struct snd_pcm_substream *substream,
|
|||
* The SSC transmit clock is obtained from the BCLK signal on
|
||||
* on the TK line, and the SSC receive clock is
|
||||
* generated from the transmit clock.
|
||||
*
|
||||
* For single channel data, one sample is transferred
|
||||
* on the falling edge of the LRC clock.
|
||||
* For two channel data, one sample is
|
||||
* transferred on both edges of the LRC clock.
|
||||
*/
|
||||
start_event = ((channels == 1)
|
||||
? SSC_START_FALLING_RF
|
||||
: SSC_START_EDGE_RF);
|
||||
|
||||
rcmr = SSC_BF(RCMR_PERIOD, 0)
|
||||
| SSC_BF(RCMR_STTDLY, START_DELAY)
|
||||
| SSC_BF(RCMR_START, start_event)
|
||||
| SSC_BF(RCMR_START, SSC_START_FALLING_RF)
|
||||
| SSC_BF(RCMR_CKI, SSC_CKI_RISING)
|
||||
| SSC_BF(RCMR_CKO, SSC_CKO_NONE)
|
||||
| SSC_BF(RCMR_CKS, SSC_CKS_CLOCK);
|
||||
|
|
@ -470,14 +460,14 @@ static int atmel_ssc_hw_params(struct snd_pcm_substream *substream,
|
|||
rfmr = SSC_BF(RFMR_FSEDGE, SSC_FSEDGE_POSITIVE)
|
||||
| SSC_BF(RFMR_FSOS, SSC_FSOS_NONE)
|
||||
| SSC_BF(RFMR_FSLEN, 0)
|
||||
| SSC_BF(RFMR_DATNB, 0)
|
||||
| SSC_BF(RFMR_DATNB, (channels - 1))
|
||||
| SSC_BIT(RFMR_MSBF)
|
||||
| SSC_BF(RFMR_LOOP, 0)
|
||||
| SSC_BF(RFMR_DATLEN, (bits - 1));
|
||||
|
||||
tcmr = SSC_BF(TCMR_PERIOD, 0)
|
||||
| SSC_BF(TCMR_STTDLY, START_DELAY)
|
||||
| SSC_BF(TCMR_START, start_event)
|
||||
| SSC_BF(TCMR_START, SSC_START_FALLING_RF)
|
||||
| SSC_BF(TCMR_CKI, SSC_CKI_FALLING)
|
||||
| SSC_BF(TCMR_CKO, SSC_CKO_NONE)
|
||||
| SSC_BF(TCMR_CKS, SSC_CKS_PIN);
|
||||
|
|
@ -486,7 +476,7 @@ static int atmel_ssc_hw_params(struct snd_pcm_substream *substream,
|
|||
| SSC_BF(TFMR_FSDEN, 0)
|
||||
| SSC_BF(TFMR_FSOS, SSC_FSOS_NONE)
|
||||
| SSC_BF(TFMR_FSLEN, 0)
|
||||
| SSC_BF(TFMR_DATNB, 0)
|
||||
| SSC_BF(TFMR_DATNB, (channels - 1))
|
||||
| SSC_BIT(TFMR_MSBF)
|
||||
| SSC_BF(TFMR_DATDEF, 0)
|
||||
| SSC_BF(TFMR_DATLEN, (bits - 1));
|
||||
|
|
|
|||
|
|
@ -1242,6 +1242,9 @@ static int sgtl5000_enable_regulators(struct snd_soc_codec *codec)
|
|||
/* wait for all power rails bring up */
|
||||
udelay(10);
|
||||
|
||||
/* Need 8 clocks before I2C accesses */
|
||||
udelay(1);
|
||||
|
||||
/* read chip information */
|
||||
reg = snd_soc_read(codec, SGTL5000_CHIP_ID);
|
||||
if (((reg & SGTL5000_PARTID_MASK) >> SGTL5000_PARTID_SHIFT) !=
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user