diff options
| author | Clark Williams <williams@redhat.com> | 2012-04-14 09:13:39 -0500 | 
|---|---|---|
| committer | Clark Williams <williams@redhat.com> | 2012-04-14 09:13:39 -0500 | 
| commit | 4905660cd237e4c4ede46920851caa12739f006f (patch) | |
| tree | ef37e7c9f52c9ae9c2b206658556f37d67fe43eb | |
| parent | 1b5e39fc18a1b8ff7ea425ce5f49307cb28a880f (diff) | |
| parent | 0147c2ae9d602b5791dae30322ece475271acd10 (diff) | |
Merge commit 'v3.2.15' into rt-3.2.15-rt24v3.2.15-rt24
71 files changed, 549 insertions, 235 deletions
| @@ -1,6 +1,6 @@  VERSION = 3  PATCHLEVEL = 2 -SUBLEVEL = 14 +SUBLEVEL = 15  EXTRAVERSION =  NAME = Saber-toothed Squirrel diff --git a/arch/arm/mach-tegra/Kconfig b/arch/arm/mach-tegra/Kconfig index dbc59fafd1be..379cdc734817 100644 --- a/arch/arm/mach-tegra/Kconfig +++ b/arch/arm/mach-tegra/Kconfig @@ -61,11 +61,6 @@ config MACH_SEABOARD  config MACH_TEGRA_DT  	bool "Generic Tegra board (FDT support)"  	select USE_OF -	select ARM_ERRATA_743622 -	select ARM_ERRATA_751472 -	select ARM_ERRATA_754322 -	select ARM_ERRATA_764369 -	select PL310_ERRATA_769419 if CACHE_L2X0  	help  	  Support for generic nVidia Tegra boards using Flattened Device Tree diff --git a/arch/m68k/mac/config.c b/arch/m68k/mac/config.c index c247de02bc7e..1918d76aa06b 100644 --- a/arch/m68k/mac/config.c +++ b/arch/m68k/mac/config.c @@ -950,6 +950,9 @@ int __init mac_platform_init(void)  {  	u8 *swim_base; +	if (!MACH_IS_MAC) +		return -ENODEV; +  	/*  	 * Serial devices  	 */ diff --git a/arch/x86/include/asm/timer.h b/arch/x86/include/asm/timer.h index 431793e5d484..34baa0eb5d0c 100644 --- a/arch/x86/include/asm/timer.h +++ b/arch/x86/include/asm/timer.h @@ -57,14 +57,10 @@ DECLARE_PER_CPU(unsigned long long, cyc2ns_offset);  static inline unsigned long long __cycles_2_ns(unsigned long long cyc)  { -	unsigned long long quot; -	unsigned long long rem;  	int cpu = smp_processor_id();  	unsigned long long ns = per_cpu(cyc2ns_offset, cpu); -	quot = (cyc >> CYC2NS_SCALE_FACTOR); -	rem = cyc & ((1ULL << CYC2NS_SCALE_FACTOR) - 1); -	ns += quot * per_cpu(cyc2ns, cpu) + -		((rem * per_cpu(cyc2ns, cpu)) >> CYC2NS_SCALE_FACTOR); +	ns += mult_frac(cyc, per_cpu(cyc2ns, cpu), +			(1UL << CYC2NS_SCALE_FACTOR));  	return ns;  } diff --git a/arch/x86/kernel/apic/io_apic.c b/arch/x86/kernel/apic/io_apic.c index e568a3c9d810..91527bc8a621 100644 --- a/arch/x86/kernel/apic/io_apic.c +++ b/arch/x86/kernel/apic/io_apic.c @@ -3964,36 +3964,18 @@ int mp_find_ioapic_pin(int ioapic, u32 gsi)  static __init int bad_ioapic(unsigned long address)  {  	if (nr_ioapics >= MAX_IO_APICS) { -		pr_warn("WARNING: Max # of I/O APICs (%d) exceeded (found %d), skipping\n", -			MAX_IO_APICS, nr_ioapics); +		printk(KERN_WARNING "WARNING: Max # of I/O APICs (%d) exceeded " +		       "(found %d), skipping\n", MAX_IO_APICS, nr_ioapics);  		return 1;  	}  	if (!address) { -		pr_warn("WARNING: Bogus (zero) I/O APIC address found in table, skipping!\n"); +		printk(KERN_WARNING "WARNING: Bogus (zero) I/O APIC address" +		       " found in table, skipping!\n");  		return 1;  	}  	return 0;  } -static __init int bad_ioapic_register(int idx) -{ -	union IO_APIC_reg_00 reg_00; -	union IO_APIC_reg_01 reg_01; -	union IO_APIC_reg_02 reg_02; - -	reg_00.raw = io_apic_read(idx, 0); -	reg_01.raw = io_apic_read(idx, 1); -	reg_02.raw = io_apic_read(idx, 2); - -	if (reg_00.raw == -1 && reg_01.raw == -1 && reg_02.raw == -1) { -		pr_warn("I/O APIC 0x%x registers return all ones, skipping!\n", -			mpc_ioapic_addr(idx)); -		return 1; -	} - -	return 0; -} -  void __init mp_register_ioapic(int id, u32 address, u32 gsi_base)  {  	int idx = 0; @@ -4010,12 +3992,6 @@ void __init mp_register_ioapic(int id, u32 address, u32 gsi_base)  	ioapics[idx].mp_config.apicaddr = address;  	set_fixmap_nocache(FIX_IO_APIC_BASE_0 + idx, address); - -	if (bad_ioapic_register(idx)) { -		clear_fixmap(FIX_IO_APIC_BASE_0 + idx); -		return; -	} -  	ioapics[idx].mp_config.apicid = io_apic_unique_id(id);  	ioapics[idx].mp_config.apicver = io_apic_get_version(idx); @@ -4036,10 +4012,10 @@ void __init mp_register_ioapic(int id, u32 address, u32 gsi_base)  	if (gsi_cfg->gsi_end >= gsi_top)  		gsi_top = gsi_cfg->gsi_end + 1; -	pr_info("IOAPIC[%d]: apic_id %d, version %d, address 0x%x, GSI %d-%d\n", -		idx, mpc_ioapic_id(idx), -		mpc_ioapic_ver(idx), mpc_ioapic_addr(idx), -		gsi_cfg->gsi_base, gsi_cfg->gsi_end); +	printk(KERN_INFO "IOAPIC[%d]: apic_id %d, version %d, address 0x%x, " +	       "GSI %d-%d\n", idx, mpc_ioapic_id(idx), +	       mpc_ioapic_ver(idx), mpc_ioapic_addr(idx), +	       gsi_cfg->gsi_base, gsi_cfg->gsi_end);  	nr_ioapics++;  } diff --git a/arch/x86/kernel/kgdb.c b/arch/x86/kernel/kgdb.c index faba5771acad..2f45c4c0b9db 100644 --- a/arch/x86/kernel/kgdb.c +++ b/arch/x86/kernel/kgdb.c @@ -43,6 +43,8 @@  #include <linux/smp.h>  #include <linux/nmi.h>  #include <linux/hw_breakpoint.h> +#include <linux/uaccess.h> +#include <linux/memory.h>  #include <asm/debugreg.h>  #include <asm/apicdef.h> @@ -740,6 +742,64 @@ void kgdb_arch_set_pc(struct pt_regs *regs, unsigned long ip)  	regs->ip = ip;  } +int kgdb_arch_set_breakpoint(struct kgdb_bkpt *bpt) +{ +	int err; +	char opc[BREAK_INSTR_SIZE]; + +	bpt->type = BP_BREAKPOINT; +	err = probe_kernel_read(bpt->saved_instr, (char *)bpt->bpt_addr, +				BREAK_INSTR_SIZE); +	if (err) +		return err; +	err = probe_kernel_write((char *)bpt->bpt_addr, +				 arch_kgdb_ops.gdb_bpt_instr, BREAK_INSTR_SIZE); +#ifdef CONFIG_DEBUG_RODATA +	if (!err) +		return err; +	/* +	 * It is safe to call text_poke() because normal kernel execution +	 * is stopped on all cores, so long as the text_mutex is not locked. +	 */ +	if (mutex_is_locked(&text_mutex)) +		return -EBUSY; +	text_poke((void *)bpt->bpt_addr, arch_kgdb_ops.gdb_bpt_instr, +		  BREAK_INSTR_SIZE); +	err = probe_kernel_read(opc, (char *)bpt->bpt_addr, BREAK_INSTR_SIZE); +	if (err) +		return err; +	if (memcmp(opc, arch_kgdb_ops.gdb_bpt_instr, BREAK_INSTR_SIZE)) +		return -EINVAL; +	bpt->type = BP_POKE_BREAKPOINT; +#endif /* CONFIG_DEBUG_RODATA */ +	return err; +} + +int kgdb_arch_remove_breakpoint(struct kgdb_bkpt *bpt) +{ +#ifdef CONFIG_DEBUG_RODATA +	int err; +	char opc[BREAK_INSTR_SIZE]; + +	if (bpt->type != BP_POKE_BREAKPOINT) +		goto knl_write; +	/* +	 * It is safe to call text_poke() because normal kernel execution +	 * is stopped on all cores, so long as the text_mutex is not locked. +	 */ +	if (mutex_is_locked(&text_mutex)) +		goto knl_write; +	text_poke((void *)bpt->bpt_addr, bpt->saved_instr, BREAK_INSTR_SIZE); +	err = probe_kernel_read(opc, (char *)bpt->bpt_addr, BREAK_INSTR_SIZE); +	if (err || memcmp(opc, bpt->saved_instr, BREAK_INSTR_SIZE)) +		goto knl_write; +	return err; +knl_write: +#endif /* CONFIG_DEBUG_RODATA */ +	return probe_kernel_write((char *)bpt->bpt_addr, +				  (char *)bpt->saved_instr, BREAK_INSTR_SIZE); +} +  struct kgdb_arch arch_kgdb_ops = {  	/* Breakpoint instruction: */  	.gdb_bpt_instr		= { 0xcc }, diff --git a/arch/x86/kernel/tsc.c b/arch/x86/kernel/tsc.c index 3fe298abc7cf..1ec515bc39f9 100644 --- a/arch/x86/kernel/tsc.c +++ b/arch/x86/kernel/tsc.c @@ -622,7 +622,8 @@ static void set_cyc2ns_scale(unsigned long cpu_khz, int cpu)  	if (cpu_khz) {  		*scale = (NSEC_PER_MSEC << CYC2NS_SCALE_FACTOR)/cpu_khz; -		*offset = ns_now - (tsc_now * *scale >> CYC2NS_SCALE_FACTOR); +		*offset = ns_now - mult_frac(tsc_now, *scale, +					     (1UL << CYC2NS_SCALE_FACTOR));  	}  	sched_clock_idle_wakeup_event(0); diff --git a/arch/x86/net/bpf_jit_comp.c b/arch/x86/net/bpf_jit_comp.c index 5671752f8d9c..5a5b6e4dd738 100644 --- a/arch/x86/net/bpf_jit_comp.c +++ b/arch/x86/net/bpf_jit_comp.c @@ -289,7 +289,7 @@ void bpf_jit_compile(struct sk_filter *fp)  					EMIT2(0x24, K & 0xFF); /* and imm8,%al */  				} else if (K >= 0xFFFF0000) {  					EMIT2(0x66, 0x25);	/* and imm16,%ax */ -					EMIT2(K, 2); +					EMIT(K, 2);  				} else {  					EMIT1_off32(0x25, K);	/* and imm32,%eax */  				} diff --git a/arch/x86/pci/acpi.c b/arch/x86/pci/acpi.c index f8348ab10324..0ed97d804c71 100644 --- a/arch/x86/pci/acpi.c +++ b/arch/x86/pci/acpi.c @@ -54,6 +54,16 @@ static const struct dmi_system_id pci_use_crs_table[] __initconst = {  			DMI_MATCH(DMI_BIOS_VENDOR, "American Megatrends Inc."),  		},  	}, +	/* https://bugzilla.kernel.org/show_bug.cgi?id=42619 */ +	{ +		.callback = set_use_crs, +		.ident = "MSI MS-7253", +		.matches = { +			DMI_MATCH(DMI_BOARD_VENDOR, "MICRO-STAR INTERNATIONAL CO., LTD"), +			DMI_MATCH(DMI_BOARD_NAME, "MS-7253"), +			DMI_MATCH(DMI_BIOS_VENDOR, "Phoenix Technologies, LTD"), +		}, +	},  	{}  }; diff --git a/drivers/acpi/acpica/tbfadt.c b/drivers/acpi/acpica/tbfadt.c index 6f5588e62c0a..4c531b4a9625 100644 --- a/drivers/acpi/acpica/tbfadt.c +++ b/drivers/acpi/acpica/tbfadt.c @@ -350,10 +350,6 @@ static void acpi_tb_convert_fadt(void)  	u32 address32;  	u32 i; -	/* Update the local FADT table header length */ - -	acpi_gbl_FADT.header.length = sizeof(struct acpi_table_fadt); -  	/*  	 * Expand the 32-bit FACS and DSDT addresses to 64-bit as necessary.  	 * Later code will always use the X 64-bit field. Also, check for an @@ -395,6 +391,10 @@ static void acpi_tb_convert_fadt(void)  		acpi_gbl_FADT.boot_flags = 0;  	} +	/* Update the local FADT table header length */ + +	acpi_gbl_FADT.header.length = sizeof(struct acpi_table_fadt); +  	/*  	 * Expand the ACPI 1.0 32-bit addresses to the ACPI 2.0 64-bit "X"  	 * generic address structures as necessary. Later code will always use diff --git a/drivers/acpi/processor_thermal.c b/drivers/acpi/processor_thermal.c index 870550d6a4bf..4da7d9dcbe84 100644 --- a/drivers/acpi/processor_thermal.c +++ b/drivers/acpi/processor_thermal.c @@ -58,6 +58,27 @@ ACPI_MODULE_NAME("processor_thermal");  static DEFINE_PER_CPU(unsigned int, cpufreq_thermal_reduction_pctg);  static unsigned int acpi_thermal_cpufreq_is_init = 0; +#define reduction_pctg(cpu) \ +	per_cpu(cpufreq_thermal_reduction_pctg, phys_package_first_cpu(cpu)) + +/* + * Emulate "per package data" using per cpu data (which should really be + * provided elsewhere) + * + * Note we can lose a CPU on cpu hotunplug, in this case we forget the state + * temporarily. Fortunately that's not a big issue here (I hope) + */ +static int phys_package_first_cpu(int cpu) +{ +	int i; +	int id = topology_physical_package_id(cpu); + +	for_each_online_cpu(i) +		if (topology_physical_package_id(i) == id) +			return i; +	return 0; +} +  static int cpu_has_cpufreq(unsigned int cpu)  {  	struct cpufreq_policy policy; @@ -77,7 +98,7 @@ static int acpi_thermal_cpufreq_notifier(struct notifier_block *nb,  	max_freq = (  	    policy->cpuinfo.max_freq * -	    (100 - per_cpu(cpufreq_thermal_reduction_pctg, policy->cpu) * 20) +	    (100 - reduction_pctg(policy->cpu) * 20)  	) / 100;  	cpufreq_verify_within_limits(policy, 0, max_freq); @@ -103,16 +124,28 @@ static int cpufreq_get_cur_state(unsigned int cpu)  	if (!cpu_has_cpufreq(cpu))  		return 0; -	return per_cpu(cpufreq_thermal_reduction_pctg, cpu); +	return reduction_pctg(cpu);  }  static int cpufreq_set_cur_state(unsigned int cpu, int state)  { +	int i; +  	if (!cpu_has_cpufreq(cpu))  		return 0; -	per_cpu(cpufreq_thermal_reduction_pctg, cpu) = state; -	cpufreq_update_policy(cpu); +	reduction_pctg(cpu) = state; + +	/* +	 * Update all the CPUs in the same package because they all +	 * contribute to the temperature and often share the same +	 * frequency. +	 */ +	for_each_online_cpu(i) { +		if (topology_physical_package_id(i) == +		    topology_physical_package_id(cpu)) +			cpufreq_update_policy(i); +	}  	return 0;  } @@ -120,10 +153,6 @@ void acpi_thermal_cpufreq_init(void)  {  	int i; -	for (i = 0; i < nr_cpu_ids; i++) -		if (cpu_present(i)) -			per_cpu(cpufreq_thermal_reduction_pctg, i) = 0; -  	i = cpufreq_register_notifier(&acpi_thermal_cpufreq_notifier_block,  				      CPUFREQ_POLICY_NOTIFIER);  	if (!i) diff --git a/drivers/dma/ioat/dma.c b/drivers/dma/ioat/dma.c index a4d6cb0c0343..659518015972 100644 --- a/drivers/dma/ioat/dma.c +++ b/drivers/dma/ioat/dma.c @@ -548,9 +548,9 @@ void ioat_dma_unmap(struct ioat_chan_common *chan, enum dma_ctrl_flags flags,  			   PCI_DMA_TODEVICE, flags, 0);  } -unsigned long ioat_get_current_completion(struct ioat_chan_common *chan) +dma_addr_t ioat_get_current_completion(struct ioat_chan_common *chan)  { -	unsigned long phys_complete; +	dma_addr_t phys_complete;  	u64 completion;  	completion = *chan->completion; @@ -571,7 +571,7 @@ unsigned long ioat_get_current_completion(struct ioat_chan_common *chan)  }  bool ioat_cleanup_preamble(struct ioat_chan_common *chan, -			   unsigned long *phys_complete) +			   dma_addr_t *phys_complete)  {  	*phys_complete = ioat_get_current_completion(chan);  	if (*phys_complete == chan->last_completion) @@ -582,14 +582,14 @@ bool ioat_cleanup_preamble(struct ioat_chan_common *chan,  	return true;  } -static void __cleanup(struct ioat_dma_chan *ioat, unsigned long phys_complete) +static void __cleanup(struct ioat_dma_chan *ioat, dma_addr_t phys_complete)  {  	struct ioat_chan_common *chan = &ioat->base;  	struct list_head *_desc, *n;  	struct dma_async_tx_descriptor *tx; -	dev_dbg(to_dev(chan), "%s: phys_complete: %lx\n", -		 __func__, phys_complete); +	dev_dbg(to_dev(chan), "%s: phys_complete: %llx\n", +		 __func__, (unsigned long long) phys_complete);  	list_for_each_safe(_desc, n, &ioat->used_desc) {  		struct ioat_desc_sw *desc; @@ -655,7 +655,7 @@ static void __cleanup(struct ioat_dma_chan *ioat, unsigned long phys_complete)  static void ioat1_cleanup(struct ioat_dma_chan *ioat)  {  	struct ioat_chan_common *chan = &ioat->base; -	unsigned long phys_complete; +	dma_addr_t phys_complete;  	prefetch(chan->completion); @@ -701,7 +701,7 @@ static void ioat1_timer_event(unsigned long data)  		mod_timer(&chan->timer, jiffies + COMPLETION_TIMEOUT);  		spin_unlock_bh(&ioat->desc_lock);  	} else if (test_bit(IOAT_COMPLETION_PENDING, &chan->state)) { -		unsigned long phys_complete; +		dma_addr_t phys_complete;  		spin_lock_bh(&ioat->desc_lock);  		/* if we haven't made progress and we have already diff --git a/drivers/dma/ioat/dma.h b/drivers/dma/ioat/dma.h index 5216c8a92a21..8bebddd189c7 100644 --- a/drivers/dma/ioat/dma.h +++ b/drivers/dma/ioat/dma.h @@ -88,7 +88,7 @@ struct ioatdma_device {  struct ioat_chan_common {  	struct dma_chan common;  	void __iomem *reg_base; -	unsigned long last_completion; +	dma_addr_t last_completion;  	spinlock_t cleanup_lock;  	dma_cookie_t completed_cookie;  	unsigned long state; @@ -333,7 +333,7 @@ int __devinit ioat_dma_self_test(struct ioatdma_device *device);  void __devexit ioat_dma_remove(struct ioatdma_device *device);  struct dca_provider * __devinit ioat_dca_init(struct pci_dev *pdev,  					      void __iomem *iobase); -unsigned long ioat_get_current_completion(struct ioat_chan_common *chan); +dma_addr_t ioat_get_current_completion(struct ioat_chan_common *chan);  void ioat_init_channel(struct ioatdma_device *device,  		       struct ioat_chan_common *chan, int idx);  enum dma_status ioat_dma_tx_status(struct dma_chan *c, dma_cookie_t cookie, @@ -341,7 +341,7 @@ enum dma_status ioat_dma_tx_status(struct dma_chan *c, dma_cookie_t cookie,  void ioat_dma_unmap(struct ioat_chan_common *chan, enum dma_ctrl_flags flags,  		    size_t len, struct ioat_dma_descriptor *hw);  bool ioat_cleanup_preamble(struct ioat_chan_common *chan, -			   unsigned long *phys_complete); +			   dma_addr_t *phys_complete);  void ioat_kobject_add(struct ioatdma_device *device, struct kobj_type *type);  void ioat_kobject_del(struct ioatdma_device *device);  extern const struct sysfs_ops ioat_sysfs_ops; diff --git a/drivers/dma/ioat/dma_v2.c b/drivers/dma/ioat/dma_v2.c index 5d65f8377971..cb8864d45601 100644 --- a/drivers/dma/ioat/dma_v2.c +++ b/drivers/dma/ioat/dma_v2.c @@ -126,7 +126,7 @@ static void ioat2_start_null_desc(struct ioat2_dma_chan *ioat)  	spin_unlock_bh(&ioat->prep_lock);  } -static void __cleanup(struct ioat2_dma_chan *ioat, unsigned long phys_complete) +static void __cleanup(struct ioat2_dma_chan *ioat, dma_addr_t phys_complete)  {  	struct ioat_chan_common *chan = &ioat->base;  	struct dma_async_tx_descriptor *tx; @@ -178,7 +178,7 @@ static void __cleanup(struct ioat2_dma_chan *ioat, unsigned long phys_complete)  static void ioat2_cleanup(struct ioat2_dma_chan *ioat)  {  	struct ioat_chan_common *chan = &ioat->base; -	unsigned long phys_complete; +	dma_addr_t phys_complete;  	spin_lock_bh(&chan->cleanup_lock);  	if (ioat_cleanup_preamble(chan, &phys_complete)) @@ -259,7 +259,7 @@ int ioat2_reset_sync(struct ioat_chan_common *chan, unsigned long tmo)  static void ioat2_restart_channel(struct ioat2_dma_chan *ioat)  {  	struct ioat_chan_common *chan = &ioat->base; -	unsigned long phys_complete; +	dma_addr_t phys_complete;  	ioat2_quiesce(chan, 0);  	if (ioat_cleanup_preamble(chan, &phys_complete)) @@ -274,7 +274,7 @@ void ioat2_timer_event(unsigned long data)  	struct ioat_chan_common *chan = &ioat->base;  	if (test_bit(IOAT_COMPLETION_PENDING, &chan->state)) { -		unsigned long phys_complete; +		dma_addr_t phys_complete;  		u64 status;  		status = ioat_chansts(chan); diff --git a/drivers/dma/ioat/dma_v3.c b/drivers/dma/ioat/dma_v3.c index f519c93a61e7..2dbf32b02735 100644 --- a/drivers/dma/ioat/dma_v3.c +++ b/drivers/dma/ioat/dma_v3.c @@ -256,7 +256,7 @@ static bool desc_has_ext(struct ioat_ring_ent *desc)   * The difference from the dma_v2.c __cleanup() is that this routine   * handles extended descriptors and dma-unmapping raid operations.   */ -static void __cleanup(struct ioat2_dma_chan *ioat, unsigned long phys_complete) +static void __cleanup(struct ioat2_dma_chan *ioat, dma_addr_t phys_complete)  {  	struct ioat_chan_common *chan = &ioat->base;  	struct ioat_ring_ent *desc; @@ -314,7 +314,7 @@ static void __cleanup(struct ioat2_dma_chan *ioat, unsigned long phys_complete)  static void ioat3_cleanup(struct ioat2_dma_chan *ioat)  {  	struct ioat_chan_common *chan = &ioat->base; -	unsigned long phys_complete; +	dma_addr_t phys_complete;  	spin_lock_bh(&chan->cleanup_lock);  	if (ioat_cleanup_preamble(chan, &phys_complete)) @@ -333,7 +333,7 @@ static void ioat3_cleanup_event(unsigned long data)  static void ioat3_restart_channel(struct ioat2_dma_chan *ioat)  {  	struct ioat_chan_common *chan = &ioat->base; -	unsigned long phys_complete; +	dma_addr_t phys_complete;  	ioat2_quiesce(chan, 0);  	if (ioat_cleanup_preamble(chan, &phys_complete)) @@ -348,7 +348,7 @@ static void ioat3_timer_event(unsigned long data)  	struct ioat_chan_common *chan = &ioat->base;  	if (test_bit(IOAT_COMPLETION_PENDING, &chan->state)) { -		unsigned long phys_complete; +		dma_addr_t phys_complete;  		u64 status;  		status = ioat_chansts(chan); diff --git a/drivers/gpu/drm/drm_fb_helper.c b/drivers/gpu/drm/drm_fb_helper.c index 80fe39d98b0c..dd58373830de 100644 --- a/drivers/gpu/drm/drm_fb_helper.c +++ b/drivers/gpu/drm/drm_fb_helper.c @@ -610,9 +610,13 @@ int drm_fb_helper_check_var(struct fb_var_screeninfo *var,  		return -EINVAL;  	/* Need to resize the fb object !!! */ -	if (var->bits_per_pixel > fb->bits_per_pixel || var->xres > fb->width || var->yres > fb->height) { +	if (var->bits_per_pixel > fb->bits_per_pixel || +	    var->xres > fb->width || var->yres > fb->height || +	    var->xres_virtual > fb->width || var->yres_virtual > fb->height) {  		DRM_DEBUG("fb userspace requested width/height/bpp is greater than current fb " -			  "object %dx%d-%d > %dx%d-%d\n", var->xres, var->yres, var->bits_per_pixel, +			  "request %dx%d-%d (virtual %dx%d) > %dx%d-%d\n", +			  var->xres, var->yres, var->bits_per_pixel, +			  var->xres_virtual, var->yres_virtual,  			  fb->width, fb->height, fb->bits_per_pixel);  		return -EINVAL;  	} diff --git a/drivers/gpu/drm/i915/i915_drv.c b/drivers/gpu/drm/i915/i915_drv.c index d04597dfa52c..e52b7057d111 100644 --- a/drivers/gpu/drm/i915/i915_drv.c +++ b/drivers/gpu/drm/i915/i915_drv.c @@ -508,7 +508,9 @@ static int i915_drm_thaw(struct drm_device *dev)  		drm_irq_install(dev);  		/* Resume the modeset for every activated CRTC */ +		mutex_lock(&dev->mode_config.mutex);  		drm_helper_resume_force_mode(dev); +		mutex_unlock(&dev->mode_config.mutex);  		if (IS_IRONLAKE_M(dev))  			ironlake_enable_rc6(dev); diff --git a/drivers/gpu/drm/i915/i915_reg.h b/drivers/gpu/drm/i915/i915_reg.h index 1608d2a44935..2f99fd4cd715 100644 --- a/drivers/gpu/drm/i915/i915_reg.h +++ b/drivers/gpu/drm/i915/i915_reg.h @@ -2312,6 +2312,7 @@  #define   PIPECONF_DISABLE	0  #define   PIPECONF_DOUBLE_WIDE	(1<<30)  #define   I965_PIPECONF_ACTIVE	(1<<30) +#define   PIPECONF_FRAME_START_DELAY_MASK (3<<27)  #define   PIPECONF_SINGLE_WIDE	0  #define   PIPECONF_PIPE_UNLOCKED 0  #define   PIPECONF_PIPE_LOCKED	(1<<25) diff --git a/drivers/gpu/drm/i915/intel_bios.c b/drivers/gpu/drm/i915/intel_bios.c index 63880e2e5cfd..22efb084c421 100644 --- a/drivers/gpu/drm/i915/intel_bios.c +++ b/drivers/gpu/drm/i915/intel_bios.c @@ -24,6 +24,7 @@   *    Eric Anholt <eric@anholt.net>   *   */ +#include <linux/dmi.h>  #include <drm/drm_dp_helper.h>  #include "drmP.h"  #include "drm.h" @@ -621,6 +622,26 @@ init_vbt_defaults(struct drm_i915_private *dev_priv)  	dev_priv->edp.bpp = 18;  } +static int __init intel_no_opregion_vbt_callback(const struct dmi_system_id *id) +{ +	DRM_DEBUG_KMS("Falling back to manually reading VBT from " +		      "VBIOS ROM for %s\n", +		      id->ident); +	return 1; +} + +static const struct dmi_system_id intel_no_opregion_vbt[] = { +	{ +		.callback = intel_no_opregion_vbt_callback, +		.ident = "ThinkCentre A57", +		.matches = { +			DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"), +			DMI_MATCH(DMI_PRODUCT_NAME, "97027RG"), +		}, +	}, +	{ } +}; +  /**   * intel_parse_bios - find VBT and initialize settings from the BIOS   * @dev: DRM device @@ -641,7 +662,7 @@ intel_parse_bios(struct drm_device *dev)  	init_vbt_defaults(dev_priv);  	/* XXX Should this validation be moved to intel_opregion.c? */ -	if (dev_priv->opregion.vbt) { +	if (!dmi_check_system(intel_no_opregion_vbt) && dev_priv->opregion.vbt) {  		struct vbt_header *vbt = dev_priv->opregion.vbt;  		if (memcmp(vbt->signature, "$VBT", 4) == 0) {  			DRM_DEBUG_KMS("Using VBT from OpRegion: %20s\n", diff --git a/drivers/gpu/drm/i915/intel_display.c b/drivers/gpu/drm/i915/intel_display.c index 9ec9755c16ee..9011f48d3cb1 100644 --- a/drivers/gpu/drm/i915/intel_display.c +++ b/drivers/gpu/drm/i915/intel_display.c @@ -7278,6 +7278,12 @@ static void intel_sanitize_modesetting(struct drm_device *dev,  	struct drm_i915_private *dev_priv = dev->dev_private;  	u32 reg, val; +	/* Clear any frame start delays used for debugging left by the BIOS */ +	for_each_pipe(pipe) { +		reg = PIPECONF(pipe); +		I915_WRITE(reg, I915_READ(reg) & ~PIPECONF_FRAME_START_DELAY_MASK); +	} +  	if (HAS_PCH_SPLIT(dev))  		return; diff --git a/drivers/gpu/drm/i915/intel_lvds.c b/drivers/gpu/drm/i915/intel_lvds.c index b83f745cac19..583c2d003274 100644 --- a/drivers/gpu/drm/i915/intel_lvds.c +++ b/drivers/gpu/drm/i915/intel_lvds.c @@ -731,6 +731,14 @@ static const struct dmi_system_id intel_no_lvds[] = {  			DMI_MATCH(DMI_BOARD_NAME, "AT5NM10T-I"),  		},  	}, +	{ +		.callback = intel_no_lvds_dmi_callback, +		.ident = "MSI Wind Box DC500", +		.matches = { +			DMI_MATCH(DMI_BOARD_VENDOR, "MICRO-STAR INTERNATIONAL CO., LTD"), +			DMI_MATCH(DMI_BOARD_NAME, "MS-7469"), +		}, +	},  	{ }	/* terminating entry */  }; diff --git a/drivers/gpu/drm/radeon/atom.c b/drivers/gpu/drm/radeon/atom.c index 14cc88aaf3a7..3a05cdb1fda2 100644 --- a/drivers/gpu/drm/radeon/atom.c +++ b/drivers/gpu/drm/radeon/atom.c @@ -1304,8 +1304,11 @@ struct atom_context *atom_parse(struct card_info *card, void *bios)  int atom_asic_init(struct atom_context *ctx)  { +	struct radeon_device *rdev = ctx->card->dev->dev_private;  	int hwi = CU16(ctx->data_table + ATOM_DATA_FWI_PTR);  	uint32_t ps[16]; +	int ret; +  	memset(ps, 0, 64);  	ps[0] = cpu_to_le32(CU32(hwi + ATOM_FWI_DEFSCLK_PTR)); @@ -1315,7 +1318,17 @@ int atom_asic_init(struct atom_context *ctx)  	if (!CU16(ctx->cmd_table + 4 + 2 * ATOM_CMD_INIT))  		return 1; -	return atom_execute_table(ctx, ATOM_CMD_INIT, ps); +	ret = atom_execute_table(ctx, ATOM_CMD_INIT, ps); +	if (ret) +		return ret; + +	memset(ps, 0, 64); + +	if (rdev->family < CHIP_R600) { +		if (CU16(ctx->cmd_table + 4 + 2 * ATOM_CMD_SPDFANCNTL)) +			atom_execute_table(ctx, ATOM_CMD_SPDFANCNTL, ps); +	} +	return ret;  }  void atom_destroy(struct atom_context *ctx) diff --git a/drivers/gpu/drm/radeon/atom.h b/drivers/gpu/drm/radeon/atom.h index 93cfe2086ba0..25fea631dad2 100644 --- a/drivers/gpu/drm/radeon/atom.h +++ b/drivers/gpu/drm/radeon/atom.h @@ -44,6 +44,7 @@  #define ATOM_CMD_SETSCLK	0x0A  #define ATOM_CMD_SETMCLK	0x0B  #define ATOM_CMD_SETPCLK	0x0C +#define ATOM_CMD_SPDFANCNTL	0x39  #define ATOM_DATA_FWI_PTR	0xC  #define ATOM_DATA_IIO_PTR	0x32 diff --git a/drivers/iommu/amd_iommu_init.c b/drivers/iommu/amd_iommu_init.c index 5c741795a0c3..20d585202a4f 100644 --- a/drivers/iommu/amd_iommu_init.c +++ b/drivers/iommu/amd_iommu_init.c @@ -1033,8 +1033,9 @@ static int iommu_setup_msi(struct amd_iommu *iommu)  {  	int r; -	if (pci_enable_msi(iommu->dev)) -		return 1; +	r = pci_enable_msi(iommu->dev); +	if (r) +		return r;  	r = request_threaded_irq(iommu->dev->irq,  				 amd_iommu_int_handler, @@ -1044,24 +1045,33 @@ static int iommu_setup_msi(struct amd_iommu *iommu)  	if (r) {  		pci_disable_msi(iommu->dev); -		return 1; +		return r;  	}  	iommu->int_enabled = true; -	iommu_feature_enable(iommu, CONTROL_EVT_INT_EN);  	return 0;  }  static int iommu_init_msi(struct amd_iommu *iommu)  { +	int ret; +  	if (iommu->int_enabled) -		return 0; +		goto enable_faults;  	if (pci_find_capability(iommu->dev, PCI_CAP_ID_MSI)) -		return iommu_setup_msi(iommu); +		ret = iommu_setup_msi(iommu); +	else +		ret = -ENODEV; -	return 1; +	if (ret) +		return ret; + +enable_faults: +	iommu_feature_enable(iommu, CONTROL_EVT_INT_EN); + +	return 0;  }  /**************************************************************************** diff --git a/drivers/mfd/twl6030-irq.c b/drivers/mfd/twl6030-irq.c index 3eee45ffb096..83f49881e061 100644 --- a/drivers/mfd/twl6030-irq.c +++ b/drivers/mfd/twl6030-irq.c @@ -187,8 +187,17 @@ static int twl6030_irq_thread(void *data)  			}  		local_irq_enable();  		} -		ret = twl_i2c_write(TWL_MODULE_PIH, sts.bytes, -				REG_INT_STS_A, 3); /* clear INT_STS_A */ + +		/* +		 * NOTE: +		 * Simulation confirms that documentation is wrong w.r.t the +		 * interrupt status clear operation. A single *byte* write to +		 * any one of STS_A to STS_C register results in all three +		 * STS registers being reset. Since it does not matter which +		 * value is written, all three registers are cleared on a +		 * single byte write, so we just use 0x0 to clear. +		 */ +		ret = twl_i2c_write_u8(TWL_MODULE_PIH, 0x00, REG_INT_STS_A);  		if (ret)  			pr_warning("twl6030: I2C error in clearing PIH ISR\n"); diff --git a/drivers/misc/kgdbts.c b/drivers/misc/kgdbts.c index 3f7ad83ed740..3aa9a969b373 100644 --- a/drivers/misc/kgdbts.c +++ b/drivers/misc/kgdbts.c @@ -134,12 +134,17 @@ static int force_hwbrks;  static int hwbreaks_ok;  static int hw_break_val;  static int hw_break_val2; +static int cont_instead_of_sstep; +static unsigned long cont_thread_id; +static unsigned long sstep_thread_id;  #if defined(CONFIG_ARM) || defined(CONFIG_MIPS) || defined(CONFIG_SPARC)  static int arch_needs_sstep_emulation = 1;  #else  static int arch_needs_sstep_emulation;  #endif +static unsigned long cont_addr;  static unsigned long sstep_addr; +static int restart_from_top_after_write;  static int sstep_state;  /* Storage for the registers, in GDB format. */ @@ -187,7 +192,8 @@ static int kgdbts_unreg_thread(void *ptr)  	 */  	while (!final_ack)  		msleep_interruptible(1500); - +	/* Pause for any other threads to exit after final ack. */ +	msleep_interruptible(1000);  	if (configured)  		kgdb_unregister_io_module(&kgdbts_io_ops);  	configured = 0; @@ -211,7 +217,7 @@ static unsigned long lookup_addr(char *arg)  	if (!strcmp(arg, "kgdbts_break_test"))  		addr = (unsigned long)kgdbts_break_test;  	else if (!strcmp(arg, "sys_open")) -		addr = (unsigned long)sys_open; +		addr = (unsigned long)do_sys_open;  	else if (!strcmp(arg, "do_fork"))  		addr = (unsigned long)do_fork;  	else if (!strcmp(arg, "hw_break_val")) @@ -283,6 +289,16 @@ static void hw_break_val_write(void)  	hw_break_val++;  } +static int get_thread_id_continue(char *put_str, char *arg) +{ +	char *ptr = &put_str[11]; + +	if (put_str[1] != 'T' || put_str[2] != '0') +		return 1; +	kgdb_hex2long(&ptr, &cont_thread_id); +	return 0; +} +  static int check_and_rewind_pc(char *put_str, char *arg)  {  	unsigned long addr = lookup_addr(arg); @@ -299,13 +315,21 @@ static int check_and_rewind_pc(char *put_str, char *arg)  	if (addr + BREAK_INSTR_SIZE == ip)  		offset = -BREAK_INSTR_SIZE;  #endif -	if (strcmp(arg, "silent") && ip + offset != addr) { + +	if (arch_needs_sstep_emulation && sstep_addr && +	    ip + offset == sstep_addr && +	    ((!strcmp(arg, "sys_open") || !strcmp(arg, "do_fork")))) { +		/* This is special case for emulated single step */ +		v2printk("Emul: rewind hit single step bp\n"); +		restart_from_top_after_write = 1; +	} else if (strcmp(arg, "silent") && ip + offset != addr) {  		eprintk("kgdbts: BP mismatch %lx expected %lx\n",  			   ip + offset, addr);  		return 1;  	}  	/* Readjust the instruction pointer if needed */  	ip += offset; +	cont_addr = ip;  #ifdef GDB_ADJUSTS_BREAK_OFFSET  	instruction_pointer_set(&kgdbts_regs, ip);  #endif @@ -315,6 +339,8 @@ static int check_and_rewind_pc(char *put_str, char *arg)  static int check_single_step(char *put_str, char *arg)  {  	unsigned long addr = lookup_addr(arg); +	static int matched_id; +  	/*  	 * From an arch indepent point of view the instruction pointer  	 * should be on a different instruction @@ -324,6 +350,29 @@ static int check_single_step(char *put_str, char *arg)  	gdb_regs_to_pt_regs(kgdbts_gdb_regs, &kgdbts_regs);  	v2printk("Singlestep stopped at IP: %lx\n",  		   instruction_pointer(&kgdbts_regs)); + +	if (sstep_thread_id != cont_thread_id) { +		/* +		 * Ensure we stopped in the same thread id as before, else the +		 * debugger should continue until the original thread that was +		 * single stepped is scheduled again, emulating gdb's behavior. +		 */ +		v2printk("ThrID does not match: %lx\n", cont_thread_id); +		if (arch_needs_sstep_emulation) { +			if (matched_id && +			    instruction_pointer(&kgdbts_regs) != addr) +				goto continue_test; +			matched_id++; +			ts.idx -= 2; +			sstep_state = 0; +			return 0; +		} +		cont_instead_of_sstep = 1; +		ts.idx -= 4; +		return 0; +	} +continue_test: +	matched_id = 0;  	if (instruction_pointer(&kgdbts_regs) == addr) {  		eprintk("kgdbts: SingleStep failed at %lx\n",  			   instruction_pointer(&kgdbts_regs)); @@ -365,10 +414,40 @@ static int got_break(char *put_str, char *arg)  	return 1;  } +static void get_cont_catch(char *arg) +{ +	/* Always send detach because the test is completed at this point */ +	fill_get_buf("D"); +} + +static int put_cont_catch(char *put_str, char *arg) +{ +	/* This is at the end of the test and we catch any and all input */ +	v2printk("kgdbts: cleanup task: %lx\n", sstep_thread_id); +	ts.idx--; +	return 0; +} + +static int emul_reset(char *put_str, char *arg) +{ +	if (strncmp(put_str, "$OK", 3)) +		return 1; +	if (restart_from_top_after_write) { +		restart_from_top_after_write = 0; +		ts.idx = -1; +	} +	return 0; +} +  static void emul_sstep_get(char *arg)  {  	if (!arch_needs_sstep_emulation) { -		fill_get_buf(arg); +		if (cont_instead_of_sstep) { +			cont_instead_of_sstep = 0; +			fill_get_buf("c"); +		} else { +			fill_get_buf(arg); +		}  		return;  	}  	switch (sstep_state) { @@ -398,9 +477,11 @@ static void emul_sstep_get(char *arg)  static int emul_sstep_put(char *put_str, char *arg)  {  	if (!arch_needs_sstep_emulation) { -		if (!strncmp(put_str+1, arg, 2)) -			return 0; -		return 1; +		char *ptr = &put_str[11]; +		if (put_str[1] != 'T' || put_str[2] != '0') +			return 1; +		kgdb_hex2long(&ptr, &sstep_thread_id); +		return 0;  	}  	switch (sstep_state) {  	case 1: @@ -411,8 +492,7 @@ static int emul_sstep_put(char *put_str, char *arg)  		v2printk("Stopped at IP: %lx\n",  			 instruction_pointer(&kgdbts_regs));  		/* Want to stop at IP + break instruction size by default */ -		sstep_addr = instruction_pointer(&kgdbts_regs) + -			BREAK_INSTR_SIZE; +		sstep_addr = cont_addr + BREAK_INSTR_SIZE;  		break;  	case 2:  		if (strncmp(put_str, "$OK", 3)) { @@ -424,6 +504,9 @@ static int emul_sstep_put(char *put_str, char *arg)  		if (strncmp(put_str, "$T0", 3)) {  			eprintk("kgdbts: failed continue sstep\n");  			return 1; +		} else { +			char *ptr = &put_str[11]; +			kgdb_hex2long(&ptr, &sstep_thread_id);  		}  		break;  	case 4: @@ -502,10 +585,10 @@ static struct test_struct bad_read_test[] = {  static struct test_struct singlestep_break_test[] = {  	{ "?", "S0*" }, /* Clear break points */  	{ "kgdbts_break_test", "OK", sw_break, }, /* set sw breakpoint */ -	{ "c", "T0*", }, /* Continue */ +	{ "c", "T0*", NULL, get_thread_id_continue }, /* Continue */ +	{ "kgdbts_break_test", "OK", sw_rem_break }, /*remove breakpoint */  	{ "g", "kgdbts_break_test", NULL, check_and_rewind_pc },  	{ "write", "OK", write_regs }, /* Write registers */ -	{ "kgdbts_break_test", "OK", sw_rem_break }, /*remove breakpoint */  	{ "s", "T0*", emul_sstep_get, emul_sstep_put }, /* Single step */  	{ "g", "kgdbts_break_test", NULL, check_single_step },  	{ "kgdbts_break_test", "OK", sw_break, }, /* set sw breakpoint */ @@ -523,16 +606,16 @@ static struct test_struct singlestep_break_test[] = {  static struct test_struct do_fork_test[] = {  	{ "?", "S0*" }, /* Clear break points */  	{ "do_fork", "OK", sw_break, }, /* set sw breakpoint */ -	{ "c", "T0*", }, /* Continue */ -	{ "g", "do_fork", NULL, check_and_rewind_pc }, /* check location */ -	{ "write", "OK", write_regs }, /* Write registers */ +	{ "c", "T0*", NULL, get_thread_id_continue }, /* Continue */  	{ "do_fork", "OK", sw_rem_break }, /*remove breakpoint */ +	{ "g", "do_fork", NULL, check_and_rewind_pc }, /* check location */ +	{ "write", "OK", write_regs, emul_reset }, /* Write registers */  	{ "s", "T0*", emul_sstep_get, emul_sstep_put }, /* Single step */  	{ "g", "do_fork", NULL, check_single_step },  	{ "do_fork", "OK", sw_break, }, /* set sw breakpoint */  	{ "7", "T0*", skip_back_repeat_test }, /* Loop based on repeat_test */  	{ "D", "OK", NULL, final_ack_set }, /* detach and unregister I/O */ -	{ "", "" }, +	{ "", "", get_cont_catch, put_cont_catch },  };  /* Test for hitting a breakpoint at sys_open for what ever the number @@ -541,16 +624,16 @@ static struct test_struct do_fork_test[] = {  static struct test_struct sys_open_test[] = {  	{ "?", "S0*" }, /* Clear break points */  	{ "sys_open", "OK", sw_break, }, /* set sw breakpoint */ -	{ "c", "T0*", }, /* Continue */ -	{ "g", "sys_open", NULL, check_and_rewind_pc }, /* check location */ -	{ "write", "OK", write_regs }, /* Write registers */ +	{ "c", "T0*", NULL, get_thread_id_continue }, /* Continue */  	{ "sys_open", "OK", sw_rem_break }, /*remove breakpoint */ +	{ "g", "sys_open", NULL, check_and_rewind_pc }, /* check location */ +	{ "write", "OK", write_regs, emul_reset }, /* Write registers */  	{ "s", "T0*", emul_sstep_get, emul_sstep_put }, /* Single step */  	{ "g", "sys_open", NULL, check_single_step },  	{ "sys_open", "OK", sw_break, }, /* set sw breakpoint */  	{ "7", "T0*", skip_back_repeat_test }, /* Loop based on repeat_test */  	{ "D", "OK", NULL, final_ack_set }, /* detach and unregister I/O */ -	{ "", "" }, +	{ "", "", get_cont_catch, put_cont_catch },  };  /* @@ -693,8 +776,8 @@ static int run_simple_test(int is_get_char, int chr)  	/* This callback is a put char which is when kgdb sends data to  	 * this I/O module.  	 */ -	if (ts.tst[ts.idx].get[0] == '\0' && -		ts.tst[ts.idx].put[0] == '\0') { +	if (ts.tst[ts.idx].get[0] == '\0' && ts.tst[ts.idx].put[0] == '\0' && +	    !ts.tst[ts.idx].get_handler) {  		eprintk("kgdbts: ERROR: beyond end of test on"  			   " '%s' line %i\n", ts.name, ts.idx);  		return 0; @@ -907,6 +990,17 @@ static void kgdbts_run_tests(void)  	if (ptr)  		sstep_test = simple_strtol(ptr+1, NULL, 10); +	/* All HW break point tests */ +	if (arch_kgdb_ops.flags & KGDB_HW_BREAKPOINT) { +		hwbreaks_ok = 1; +		v1printk("kgdbts:RUN hw breakpoint test\n"); +		run_breakpoint_test(1); +		v1printk("kgdbts:RUN hw write breakpoint test\n"); +		run_hw_break_test(1); +		v1printk("kgdbts:RUN access write breakpoint test\n"); +		run_hw_break_test(0); +	} +  	/* required internal KGDB tests */  	v1printk("kgdbts:RUN plant and detach test\n");  	run_plant_and_detach_test(0); @@ -924,35 +1018,11 @@ static void kgdbts_run_tests(void)  	/* ===Optional tests=== */ -	/* All HW break point tests */ -	if (arch_kgdb_ops.flags & KGDB_HW_BREAKPOINT) { -		hwbreaks_ok = 1; -		v1printk("kgdbts:RUN hw breakpoint test\n"); -		run_breakpoint_test(1); -		v1printk("kgdbts:RUN hw write breakpoint test\n"); -		run_hw_break_test(1); -		v1printk("kgdbts:RUN access write breakpoint test\n"); -		run_hw_break_test(0); -	} -  	if (nmi_sleep) {  		v1printk("kgdbts:RUN NMI sleep %i seconds test\n", nmi_sleep);  		run_nmi_sleep_test(nmi_sleep);  	} -#ifdef CONFIG_DEBUG_RODATA -	/* Until there is an api to write to read-only text segments, use -	 * HW breakpoints for the remainder of any tests, else print a -	 * failure message if hw breakpoints do not work. -	 */ -	if (!(arch_kgdb_ops.flags & KGDB_HW_BREAKPOINT && hwbreaks_ok)) { -		eprintk("kgdbts: HW breakpoints do not work," -			"skipping remaining tests\n"); -		return; -	} -	force_hwbrks = 1; -#endif /* CONFIG_DEBUG_RODATA */ -  	/* If the do_fork test is run it will be the last test that is  	 * executed because a kernel thread will be spawned at the very  	 * end to unregister the debug hooks. diff --git a/drivers/mmc/host/atmel-mci.c b/drivers/mmc/host/atmel-mci.c index 98969338dd84..093202482e54 100644 --- a/drivers/mmc/host/atmel-mci.c +++ b/drivers/mmc/host/atmel-mci.c @@ -480,7 +480,14 @@ err:  static inline unsigned int atmci_ns_to_clocks(struct atmel_mci *host,  					unsigned int ns)  { -	return (ns * (host->bus_hz / 1000000) + 999) / 1000; +	/* +	 * It is easier here to use us instead of ns for the timeout, +	 * it prevents from overflows during calculation. +	 */ +	unsigned int us = DIV_ROUND_UP(ns, 1000); + +	/* Maximum clock frequency is host->bus_hz/2 */ +	return us * (DIV_ROUND_UP(host->bus_hz, 2000000));  }  static void atmci_set_timeout(struct atmel_mci *host, diff --git a/drivers/mmc/host/sdhci-dove.c b/drivers/mmc/host/sdhci-dove.c index a81312c91f70..31acb7064233 100644 --- a/drivers/mmc/host/sdhci-dove.c +++ b/drivers/mmc/host/sdhci-dove.c @@ -20,6 +20,7 @@   */  #include <linux/io.h> +#include <linux/module.h>  #include <linux/mmc/host.h>  #include "sdhci-pltfm.h" diff --git a/drivers/mtd/devices/block2mtd.c b/drivers/mtd/devices/block2mtd.c index b78f23169d4e..8cd983cdc643 100644 --- a/drivers/mtd/devices/block2mtd.c +++ b/drivers/mtd/devices/block2mtd.c @@ -284,6 +284,7 @@ static struct block2mtd_dev *add_device(char *devname, int erase_size)  	dev->mtd.size = dev->blkdev->bd_inode->i_size & PAGE_MASK;  	dev->mtd.erasesize = erase_size;  	dev->mtd.writesize = 1; +	dev->mtd.writebufsize = PAGE_SIZE;  	dev->mtd.type = MTD_RAM;  	dev->mtd.flags = MTD_CAP_RAM;  	dev->mtd.erase = block2mtd_erase; diff --git a/drivers/mtd/devices/lart.c b/drivers/mtd/devices/lart.c index 3a11ea628e58..5f12668efb8c 100644 --- a/drivers/mtd/devices/lart.c +++ b/drivers/mtd/devices/lart.c @@ -630,6 +630,7 @@ static int __init lart_flash_init (void)     mtd.name = module_name;     mtd.type = MTD_NORFLASH;     mtd.writesize = 1; +   mtd.writebufsize = 4;     mtd.flags = MTD_CAP_NORFLASH;     mtd.size = FLASH_BLOCKSIZE_PARAM * FLASH_NUMBLOCKS_16m_PARAM + FLASH_BLOCKSIZE_MAIN * FLASH_NUMBLOCKS_16m_MAIN;     mtd.erasesize = FLASH_BLOCKSIZE_MAIN; diff --git a/drivers/mtd/devices/m25p80.c b/drivers/mtd/devices/m25p80.c index 884904d3f9d2..9f9982ff5aab 100644 --- a/drivers/mtd/devices/m25p80.c +++ b/drivers/mtd/devices/m25p80.c @@ -932,6 +932,7 @@ static int __devinit m25p_probe(struct spi_device *spi)  	ppdata.of_node = spi->dev.of_node;  	flash->mtd.dev.parent = &spi->dev;  	flash->page_size = info->page_size; +	flash->mtd.writebufsize = flash->page_size;  	if (info->addr_width)  		flash->addr_width = info->addr_width; diff --git a/drivers/mtd/devices/sst25l.c b/drivers/mtd/devices/sst25l.c index d38ef3bffe8d..9c35250620e1 100644 --- a/drivers/mtd/devices/sst25l.c +++ b/drivers/mtd/devices/sst25l.c @@ -402,6 +402,7 @@ static int __devinit sst25l_probe(struct spi_device *spi)  	flash->mtd.flags	= MTD_CAP_NORFLASH;  	flash->mtd.erasesize	= flash_info->erase_size;  	flash->mtd.writesize	= flash_info->page_size; +	flash->mtd.writebufsize	= flash_info->page_size;  	flash->mtd.size		= flash_info->page_size * flash_info->nr_pages;  	flash->mtd.erase	= sst25l_erase;  	flash->mtd.read		= sst25l_read; diff --git a/drivers/mtd/maps/ixp4xx.c b/drivers/mtd/maps/ixp4xx.c index 30409015a3de..696372fe0440 100644 --- a/drivers/mtd/maps/ixp4xx.c +++ b/drivers/mtd/maps/ixp4xx.c @@ -182,6 +182,9 @@ static int ixp4xx_flash_probe(struct platform_device *dev)  {  	struct flash_platform_data *plat = dev->dev.platform_data;  	struct ixp4xx_flash_info *info; +	struct mtd_part_parser_data ppdata = { +		.origin = dev->resource->start, +	};  	int err = -1;  	if (!plat) @@ -247,7 +250,7 @@ static int ixp4xx_flash_probe(struct platform_device *dev)  	/* Use the fast version */  	info->map.write = ixp4xx_write16; -	err = mtd_device_parse_register(info->mtd, probes, dev->resource->start, +	err = mtd_device_parse_register(info->mtd, probes, &ppdata,  			plat->parts, plat->nr_parts);  	if (err) {  		printk(KERN_ERR "Could not parse partitions\n"); diff --git a/drivers/mtd/maps/lantiq-flash.c b/drivers/mtd/maps/lantiq-flash.c index 4f10e27ada55..764d4681671c 100644 --- a/drivers/mtd/maps/lantiq-flash.c +++ b/drivers/mtd/maps/lantiq-flash.c @@ -45,6 +45,7 @@ struct ltq_mtd {  };  static char ltq_map_name[] = "ltq_nor"; +static const char *ltq_probe_types[] __devinitconst = { "cmdlinepart", NULL };  static map_word  ltq_read16(struct map_info *map, unsigned long adr) @@ -168,7 +169,7 @@ ltq_mtd_probe(struct platform_device *pdev)  	cfi->addr_unlock1 ^= 1;  	cfi->addr_unlock2 ^= 1; -	err = mtd_device_parse_register(ltq_mtd->mtd, NULL, 0, +	err = mtd_device_parse_register(ltq_mtd->mtd, ltq_probe_types, 0,  			ltq_mtd_data->parts, ltq_mtd_data->nr_parts);  	if (err) {  		dev_err(&pdev->dev, "failed to add partitions\n"); diff --git a/drivers/mtd/nand/gpmi-nand/gpmi-nand.c b/drivers/mtd/nand/gpmi-nand/gpmi-nand.c index 493ec2fcf97f..f39f83e2e971 100644 --- a/drivers/mtd/nand/gpmi-nand/gpmi-nand.c +++ b/drivers/mtd/nand/gpmi-nand/gpmi-nand.c @@ -1124,7 +1124,7 @@ static int gpmi_block_markbad(struct mtd_info *mtd, loff_t ofs)  		chip->bbt[block >> 2] |= 0x01 << ((block & 0x03) << 1);  	/* Do we have a flash based bad block table ? */ -	if (chip->options & NAND_BBT_USE_FLASH) +	if (chip->bbt_options & NAND_BBT_USE_FLASH)  		ret = nand_update_bbt(mtd, ofs);  	else {  		chipnr = (int)(ofs >> chip->chip_shift); diff --git a/drivers/net/ethernet/broadcom/tg3.c b/drivers/net/ethernet/broadcom/tg3.c index bf4074167d6a..3d55883d6f87 100644 --- a/drivers/net/ethernet/broadcom/tg3.c +++ b/drivers/net/ethernet/broadcom/tg3.c @@ -2794,7 +2794,9 @@ static void tg3_power_down_phy(struct tg3 *tp, bool do_low_power)  	if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5700 ||  	    GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5704 ||  	    (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5780 && -	     (tp->phy_flags & TG3_PHYFLG_MII_SERDES))) +	     (tp->phy_flags & TG3_PHYFLG_MII_SERDES)) || +	    (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5717 && +	     !tp->pci_fn))  		return;  	if (GET_CHIP_REV(tp->pci_chip_rev_id) == CHIPREV_5784_AX || diff --git a/drivers/net/ethernet/freescale/fsl_pq_mdio.c b/drivers/net/ethernet/freescale/fsl_pq_mdio.c index 4d9f84b8ab97..ada234afabf5 100644 --- a/drivers/net/ethernet/freescale/fsl_pq_mdio.c +++ b/drivers/net/ethernet/freescale/fsl_pq_mdio.c @@ -356,16 +356,15 @@ static int fsl_pq_mdio_probe(struct platform_device *ofdev)  		if (prop)  			tbiaddr = *prop; -	} - -	if (tbiaddr == -1) { -		err = -EBUSY; -		goto err_free_irqs; +		if (tbiaddr == -1) { +			err = -EBUSY; +			goto err_free_irqs; +		} else { +			out_be32(tbipa, tbiaddr); +		}  	} -	out_be32(tbipa, tbiaddr); -  	err = of_mdiobus_register(new_bus, np);  	if (err) {  		printk (KERN_ERR "%s: Cannot register as MDIO bus\n", diff --git a/drivers/net/ethernet/marvell/sky2.c b/drivers/net/ethernet/marvell/sky2.c index f612b35c08ac..7eb8a0023166 100644 --- a/drivers/net/ethernet/marvell/sky2.c +++ b/drivers/net/ethernet/marvell/sky2.c @@ -1766,13 +1766,14 @@ static int sky2_open(struct net_device *dev)  	sky2_hw_up(sky2); +	/* Enable interrupts from phy/mac for port */ +	imask = sky2_read32(hw, B0_IMSK); +  	if (hw->chip_id == CHIP_ID_YUKON_OPT ||  	    hw->chip_id == CHIP_ID_YUKON_PRM ||  	    hw->chip_id == CHIP_ID_YUKON_OP_2)  		imask |= Y2_IS_PHY_QLNK;	/* enable PHY Quick Link */ -	/* Enable interrupts from phy/mac for port */ -	imask = sky2_read32(hw, B0_IMSK);  	imask |= portirq_msk[port];  	sky2_write32(hw, B0_IMSK, imask);  	sky2_read32(hw, B0_IMSK); diff --git a/drivers/net/ethernet/realtek/r8169.c b/drivers/net/ethernet/realtek/r8169.c index 0cf2351fbaff..697cae37a10f 100644 --- a/drivers/net/ethernet/realtek/r8169.c +++ b/drivers/net/ethernet/realtek/r8169.c @@ -6194,6 +6194,9 @@ static void rtl_shutdown(struct pci_dev *pdev)  {  	struct net_device *dev = pci_get_drvdata(pdev);  	struct rtl8169_private *tp = netdev_priv(dev); +	struct device *d = &pdev->dev; + +	pm_runtime_get_sync(d);  	rtl8169_net_suspend(dev); @@ -6215,6 +6218,8 @@ static void rtl_shutdown(struct pci_dev *pdev)  		pci_wake_from_d3(pdev, true);  		pci_set_power_state(pdev, PCI_D3hot);  	} + +	pm_runtime_put_noidle(d);  }  static struct pci_driver rtl8169_pci_driver = { diff --git a/drivers/net/usb/cdc_eem.c b/drivers/net/usb/cdc_eem.c index 882f53f708df..82d43b214f93 100644 --- a/drivers/net/usb/cdc_eem.c +++ b/drivers/net/usb/cdc_eem.c @@ -93,6 +93,7 @@ static int eem_bind(struct usbnet *dev, struct usb_interface *intf)  	/* no jumbogram (16K) support for now */  	dev->net->hard_header_len += EEM_HEAD + ETH_FCS_LEN; +	dev->hard_mtu = dev->net->mtu + dev->net->hard_header_len;  	return 0;  } diff --git a/drivers/net/usb/zaurus.c b/drivers/net/usb/zaurus.c index 246b3bb14f23..c1e6a446d13c 100644 --- a/drivers/net/usb/zaurus.c +++ b/drivers/net/usb/zaurus.c @@ -332,6 +332,11 @@ static const struct usb_device_id	products [] = {  	.driver_info = ZAURUS_PXA_INFO,  },  { +	/* Motorola Rokr E6 */ +	USB_DEVICE_AND_INTERFACE_INFO(0x22b8, 0x6027, USB_CLASS_COMM, +			USB_CDC_SUBCLASS_MDLM, USB_CDC_PROTO_NONE), +	.driver_info = (unsigned long) &bogus_mdlm_info, +}, {  	/* Motorola MOTOMAGX phones */  	USB_DEVICE_AND_INTERFACE_INFO(0x22b8, 0x6425, USB_CLASS_COMM,  			USB_CDC_SUBCLASS_MDLM, USB_CDC_PROTO_NONE), diff --git a/drivers/net/wireless/rtlwifi/rtl8192c/phy_common.c b/drivers/net/wireless/rtlwifi/rtl8192c/phy_common.c index 1f07558debf2..f20678a13117 100644 --- a/drivers/net/wireless/rtlwifi/rtl8192c/phy_common.c +++ b/drivers/net/wireless/rtlwifi/rtl8192c/phy_common.c @@ -1968,7 +1968,7 @@ void rtl92c_phy_set_io(struct ieee80211_hw *hw)  		break;  	case IO_CMD_PAUSE_DM_BY_SCAN:  		rtlphy->initgain_backup.xaagccore1 = dm_digtable.cur_igvalue; -		dm_digtable.cur_igvalue = 0x17; +		dm_digtable.cur_igvalue = 0x37;  		rtl92c_dm_write_dig(hw);  		break;  	default: diff --git a/drivers/net/wireless/rtlwifi/rtl8192de/phy.c b/drivers/net/wireless/rtlwifi/rtl8192de/phy.c index 0883349e1c83..2cf4c5f25cf0 100644 --- a/drivers/net/wireless/rtlwifi/rtl8192de/phy.c +++ b/drivers/net/wireless/rtlwifi/rtl8192de/phy.c @@ -3192,7 +3192,7 @@ static void rtl92d_phy_set_io(struct ieee80211_hw *hw)  		break;  	case IO_CMD_PAUSE_DM_BY_SCAN:  		rtlphy->initgain_backup.xaagccore1 = de_digtable.cur_igvalue; -		de_digtable.cur_igvalue = 0x17; +		de_digtable.cur_igvalue = 0x37;  		rtl92d_dm_write_dig(hw);  		break;  	default: diff --git a/drivers/platform/x86/acer-wmi.c b/drivers/platform/x86/acer-wmi.c index 1e5290b5396d..110e4af07640 100644 --- a/drivers/platform/x86/acer-wmi.c +++ b/drivers/platform/x86/acer-wmi.c @@ -692,6 +692,7 @@ static const struct acpi_device_id norfkill_ids[] = {  	{ "VPC2004", 0},  	{ "IBM0068", 0},  	{ "LEN0068", 0}, +	{ "SNY5001", 0},	/* sony-laptop in charge */  	{ "", 0},  }; diff --git a/drivers/pnp/pnpacpi/core.c b/drivers/pnp/pnpacpi/core.c index b00c17612a89..d21e8f59c84e 100644 --- a/drivers/pnp/pnpacpi/core.c +++ b/drivers/pnp/pnpacpi/core.c @@ -321,9 +321,14 @@ static int __init acpi_pnp_match(struct device *dev, void *_pnp)  {  	struct acpi_device *acpi = to_acpi_device(dev);  	struct pnp_dev *pnp = _pnp; +	struct device *physical_device; + +	physical_device = acpi_get_physical_device(acpi->handle); +	if (physical_device) +		put_device(physical_device);  	/* true means it matched */ -	return !acpi_get_physical_device(acpi->handle) +	return !physical_device  	    && compare_pnp_id(pnp->id, acpi_device_hid(acpi));  } diff --git a/drivers/target/target_core_transport.c b/drivers/target/target_core_transport.c index cdb774bbf1d9..56609160d5a0 100644 --- a/drivers/target/target_core_transport.c +++ b/drivers/target/target_core_transport.c @@ -2666,7 +2666,7 @@ static int transport_generic_cmd_sequencer(  			cmd->se_cmd_flags |= SCF_SCSI_CONTROL_SG_IO_CDB;  			if (target_check_write_same_discard(&cdb[10], dev) < 0) -				goto out_invalid_cdb_field; +				goto out_unsupported_cdb;  			if (!passthrough)  				cmd->execute_task = target_emulate_write_same;  			break; @@ -2949,7 +2949,7 @@ static int transport_generic_cmd_sequencer(  		cmd->se_cmd_flags |= SCF_SCSI_CONTROL_SG_IO_CDB;  		if (target_check_write_same_discard(&cdb[1], dev) < 0) -			goto out_invalid_cdb_field; +			goto out_unsupported_cdb;  		if (!passthrough)  			cmd->execute_task = target_emulate_write_same;  		break; @@ -2972,7 +2972,7 @@ static int transport_generic_cmd_sequencer(  		 * of byte 1 bit 3 UNMAP instead of original reserved field  		 */  		if (target_check_write_same_discard(&cdb[1], dev) < 0) -			goto out_invalid_cdb_field; +			goto out_unsupported_cdb;  		if (!passthrough)  			cmd->execute_task = target_emulate_write_same;  		break; diff --git a/drivers/target/tcm_fc/tcm_fc.h b/drivers/target/tcm_fc/tcm_fc.h index e05c55100ec6..be7ed12aad1d 100644 --- a/drivers/target/tcm_fc/tcm_fc.h +++ b/drivers/target/tcm_fc/tcm_fc.h @@ -124,6 +124,7 @@ struct ft_cmd {  	/* Local sense buffer */  	unsigned char ft_sense_buffer[TRANSPORT_SENSE_BUFFER];  	u32 was_ddp_setup:1;		/* Set only if ddp is setup */ +	u32 aborted:1;			/* Set if aborted by reset or timeout */  	struct scatterlist *sg;		/* Set only if DDP is setup */  	u32 sg_cnt;			/* No. of item in scatterlist */  }; diff --git a/drivers/target/tcm_fc/tfc_cmd.c b/drivers/target/tcm_fc/tfc_cmd.c index 754b669f796e..d95cfe2eb48c 100644 --- a/drivers/target/tcm_fc/tfc_cmd.c +++ b/drivers/target/tcm_fc/tfc_cmd.c @@ -130,6 +130,8 @@ int ft_queue_status(struct se_cmd *se_cmd)  	struct fc_exch *ep;  	size_t len; +	if (cmd->aborted) +		return 0;  	ft_dump_cmd(cmd, __func__);  	ep = fc_seq_exch(cmd->seq);  	lport = ep->lp; @@ -196,6 +198,8 @@ int ft_write_pending(struct se_cmd *se_cmd)  	ft_dump_cmd(cmd, __func__); +	if (cmd->aborted) +		return 0;  	ep = fc_seq_exch(cmd->seq);  	lport = ep->lp;  	fp = fc_frame_alloc(lport, sizeof(*txrdy)); @@ -266,10 +270,10 @@ static void ft_recv_seq(struct fc_seq *sp, struct fc_frame *fp, void *arg)  	struct ft_cmd *cmd = arg;  	struct fc_frame_header *fh; -	if (IS_ERR(fp)) { +	if (unlikely(IS_ERR(fp))) {  		/* XXX need to find cmd if queued */  		cmd->seq = NULL; -		transport_generic_free_cmd(&cmd->se_cmd, 0); +		cmd->aborted = true;  		return;  	} @@ -447,6 +451,8 @@ int ft_queue_tm_resp(struct se_cmd *se_cmd)  	struct se_tmr_req *tmr = se_cmd->se_tmr_req;  	enum fcp_resp_rsp_codes code; +	if (cmd->aborted) +		return 0;  	switch (tmr->response) {  	case TMR_FUNCTION_COMPLETE:  		code = FCP_TMF_CMPL; diff --git a/drivers/target/tcm_fc/tfc_conf.c b/drivers/target/tcm_fc/tfc_conf.c index 9402b7387cac..7962325afc32 100644 --- a/drivers/target/tcm_fc/tfc_conf.c +++ b/drivers/target/tcm_fc/tfc_conf.c @@ -304,6 +304,7 @@ static struct se_portal_group *ft_add_tpg(  {  	struct ft_lport_acl *lacl;  	struct ft_tpg *tpg; +	struct workqueue_struct *wq;  	unsigned long index;  	int ret; @@ -325,18 +326,20 @@ static struct se_portal_group *ft_add_tpg(  	tpg->lport_acl = lacl;  	INIT_LIST_HEAD(&tpg->lun_list); -	ret = core_tpg_register(&ft_configfs->tf_ops, wwn, &tpg->se_tpg, -				tpg, TRANSPORT_TPG_TYPE_NORMAL); -	if (ret < 0) { +	wq = alloc_workqueue("tcm_fc", 0, 1); +	if (!wq) {  		kfree(tpg);  		return NULL;  	} -	tpg->workqueue = alloc_workqueue("tcm_fc", 0, 1); -	if (!tpg->workqueue) { +	ret = core_tpg_register(&ft_configfs->tf_ops, wwn, &tpg->se_tpg, +				tpg, TRANSPORT_TPG_TYPE_NORMAL); +	if (ret < 0) { +		destroy_workqueue(wq);  		kfree(tpg);  		return NULL;  	} +	tpg->workqueue = wq;  	mutex_lock(&ft_lport_lock);  	list_add_tail(&tpg->list, &lacl->tpg_list); diff --git a/drivers/target/tcm_fc/tfc_io.c b/drivers/target/tcm_fc/tfc_io.c index 1369b1cb103d..ada131c136e3 100644 --- a/drivers/target/tcm_fc/tfc_io.c +++ b/drivers/target/tcm_fc/tfc_io.c @@ -84,6 +84,8 @@ int ft_queue_data_in(struct se_cmd *se_cmd)  	void *from;  	void *to = NULL; +	if (cmd->aborted) +		return 0;  	ep = fc_seq_exch(cmd->seq);  	lport = ep->lp;  	cmd->seq = lport->tt.seq_start_next(cmd->seq); diff --git a/fs/cifs/file.c b/fs/cifs/file.c index 159fcc56dc2d..0f7dc228c10a 100644 --- a/fs/cifs/file.c +++ b/fs/cifs/file.c @@ -835,13 +835,21 @@ cifs_posix_lock_set(struct file *file, struct file_lock *flock)  	if ((flock->fl_flags & FL_POSIX) == 0)  		return rc; +try_again:  	mutex_lock(&cinode->lock_mutex);  	if (!cinode->can_cache_brlcks) {  		mutex_unlock(&cinode->lock_mutex);  		return rc;  	} -	rc = posix_lock_file_wait(file, flock); + +	rc = posix_lock_file(file, flock, NULL);  	mutex_unlock(&cinode->lock_mutex); +	if (rc == FILE_LOCK_DEFERRED) { +		rc = wait_event_interruptible(flock->fl_wait, !flock->fl_next); +		if (!rc) +			goto try_again; +		locks_delete_block(flock); +	}  	return rc;  } diff --git a/fs/locks.c b/fs/locks.c index 637694bf3a03..0d68f1f81799 100644 --- a/fs/locks.c +++ b/fs/locks.c @@ -510,12 +510,13 @@ static void __locks_delete_block(struct file_lock *waiter)  /*   */ -static void locks_delete_block(struct file_lock *waiter) +void locks_delete_block(struct file_lock *waiter)  {  	lock_flocks();  	__locks_delete_block(waiter);  	unlock_flocks();  } +EXPORT_SYMBOL(locks_delete_block);  /* Insert waiter into blocker's block list.   * We use a circular list so that processes can be easily woken up in diff --git a/fs/nfs/nfs4proc.c b/fs/nfs/nfs4proc.c index d9457002ca04..757293b66dbb 100644 --- a/fs/nfs/nfs4proc.c +++ b/fs/nfs/nfs4proc.c @@ -3618,7 +3618,7 @@ static ssize_t __nfs4_get_acl_uncached(struct inode *inode, void *buf, size_t bu  		if (acl_len > buflen)  			goto out_free;  		_copy_from_pages(buf, pages, res.acl_data_offset, -				res.acl_len); +				acl_len);  	}  	ret = acl_len;  out_free: diff --git a/include/linux/fs.h b/include/linux/fs.h index 10b228818b10..11f19515be6f 100644 --- a/include/linux/fs.h +++ b/include/linux/fs.h @@ -1203,6 +1203,7 @@ extern int vfs_setlease(struct file *, long, struct file_lock **);  extern int lease_modify(struct file_lock **, int);  extern int lock_may_read(struct inode *, loff_t start, unsigned long count);  extern int lock_may_write(struct inode *, loff_t start, unsigned long count); +extern void locks_delete_block(struct file_lock *waiter);  extern void lock_flocks(void);  extern void unlock_flocks(void);  #else /* !CONFIG_FILE_LOCKING */ @@ -1347,6 +1348,10 @@ static inline int lock_may_write(struct inode *inode, loff_t start,  	return 1;  } +static inline void locks_delete_block(struct file_lock *waiter) +{ +} +  static inline void lock_flocks(void)  {  } diff --git a/include/linux/kernel.h b/include/linux/kernel.h index c485aaa618d6..22bdd4bf0e1b 100644 --- a/include/linux/kernel.h +++ b/include/linux/kernel.h @@ -85,6 +85,19 @@  }							\  ) +/* + * Multiplies an integer by a fraction, while avoiding unnecessary + * overflow or loss of precision. + */ +#define mult_frac(x, numer, denom)(			\ +{							\ +	typeof(x) quot = (x) / (denom);			\ +	typeof(x) rem  = (x) % (denom);			\ +	(quot * (numer)) + ((rem * (numer)) / (denom));	\ +}							\ +) + +  #define _RET_IP_		(unsigned long)__builtin_return_address(0)  #define _THIS_IP_  ({ __label__ __here; __here: (unsigned long)&&__here; }) diff --git a/include/linux/kgdb.h b/include/linux/kgdb.h index fa391835508d..c4d2fc194ede 100644 --- a/include/linux/kgdb.h +++ b/include/linux/kgdb.h @@ -63,7 +63,8 @@ enum kgdb_bptype {  	BP_HARDWARE_BREAKPOINT,  	BP_WRITE_WATCHPOINT,  	BP_READ_WATCHPOINT, -	BP_ACCESS_WATCHPOINT +	BP_ACCESS_WATCHPOINT, +	BP_POKE_BREAKPOINT,  };  enum kgdb_bpstate { @@ -207,8 +208,8 @@ extern void kgdb_arch_set_pc(struct pt_regs *regs, unsigned long pc);  /* Optional functions. */  extern int kgdb_validate_break_address(unsigned long addr); -extern int kgdb_arch_set_breakpoint(unsigned long addr, char *saved_instr); -extern int kgdb_arch_remove_breakpoint(unsigned long addr, char *bundle); +extern int kgdb_arch_set_breakpoint(struct kgdb_bkpt *bpt); +extern int kgdb_arch_remove_breakpoint(struct kgdb_bkpt *bpt);  /**   *	kgdb_arch_late - Perform any architecture specific initalization. diff --git a/kernel/cred.c b/kernel/cred.c index 944761380c37..482a0e3bdd75 100644 --- a/kernel/cred.c +++ b/kernel/cred.c @@ -385,6 +385,8 @@ int copy_creds(struct task_struct *p, unsigned long clone_flags)  	struct cred *new;  	int ret; +	p->replacement_session_keyring = NULL; +  	if (  #ifdef CONFIG_KEYS  		!p->cred->thread_keyring && diff --git a/kernel/debug/debug_core.c b/kernel/debug/debug_core.c index 0d7c08784efb..7fda904fbacd 100644 --- a/kernel/debug/debug_core.c +++ b/kernel/debug/debug_core.c @@ -157,37 +157,39 @@ early_param("nokgdbroundup", opt_nokgdbroundup);   * Weak aliases for breakpoint management,   * can be overriden by architectures when needed:   */ -int __weak kgdb_arch_set_breakpoint(unsigned long addr, char *saved_instr) +int __weak kgdb_arch_set_breakpoint(struct kgdb_bkpt *bpt)  {  	int err; -	err = probe_kernel_read(saved_instr, (char *)addr, BREAK_INSTR_SIZE); +	err = probe_kernel_read(bpt->saved_instr, (char *)bpt->bpt_addr, +				BREAK_INSTR_SIZE);  	if (err)  		return err; - -	return probe_kernel_write((char *)addr, arch_kgdb_ops.gdb_bpt_instr, -				  BREAK_INSTR_SIZE); +	err = probe_kernel_write((char *)bpt->bpt_addr, +				 arch_kgdb_ops.gdb_bpt_instr, BREAK_INSTR_SIZE); +	return err;  } -int __weak kgdb_arch_remove_breakpoint(unsigned long addr, char *bundle) +int __weak kgdb_arch_remove_breakpoint(struct kgdb_bkpt *bpt)  { -	return probe_kernel_write((char *)addr, -				  (char *)bundle, BREAK_INSTR_SIZE); +	return probe_kernel_write((char *)bpt->bpt_addr, +				  (char *)bpt->saved_instr, BREAK_INSTR_SIZE);  }  int __weak kgdb_validate_break_address(unsigned long addr)  { -	char tmp_variable[BREAK_INSTR_SIZE]; +	struct kgdb_bkpt tmp;  	int err; -	/* Validate setting the breakpoint and then removing it.  In the +	/* Validate setting the breakpoint and then removing it.  If the  	 * remove fails, the kernel needs to emit a bad message because we  	 * are deep trouble not being able to put things back the way we  	 * found them.  	 */ -	err = kgdb_arch_set_breakpoint(addr, tmp_variable); +	tmp.bpt_addr = addr; +	err = kgdb_arch_set_breakpoint(&tmp);  	if (err)  		return err; -	err = kgdb_arch_remove_breakpoint(addr, tmp_variable); +	err = kgdb_arch_remove_breakpoint(&tmp);  	if (err)  		printk(KERN_ERR "KGDB: Critical breakpoint error, kernel "  		   "memory destroyed at: %lx", addr); @@ -231,7 +233,6 @@ static void kgdb_flush_swbreak_addr(unsigned long addr)   */  int dbg_activate_sw_breakpoints(void)  { -	unsigned long addr;  	int error;  	int ret = 0;  	int i; @@ -240,16 +241,15 @@ int dbg_activate_sw_breakpoints(void)  		if (kgdb_break[i].state != BP_SET)  			continue; -		addr = kgdb_break[i].bpt_addr; -		error = kgdb_arch_set_breakpoint(addr, -				kgdb_break[i].saved_instr); +		error = kgdb_arch_set_breakpoint(&kgdb_break[i]);  		if (error) {  			ret = error; -			printk(KERN_INFO "KGDB: BP install failed: %lx", addr); +			printk(KERN_INFO "KGDB: BP install failed: %lx", +			       kgdb_break[i].bpt_addr);  			continue;  		} -		kgdb_flush_swbreak_addr(addr); +		kgdb_flush_swbreak_addr(kgdb_break[i].bpt_addr);  		kgdb_break[i].state = BP_ACTIVE;  	}  	return ret; @@ -298,7 +298,6 @@ int dbg_set_sw_break(unsigned long addr)  int dbg_deactivate_sw_breakpoints(void)  { -	unsigned long addr;  	int error;  	int ret = 0;  	int i; @@ -306,15 +305,14 @@ int dbg_deactivate_sw_breakpoints(void)  	for (i = 0; i < KGDB_MAX_BREAKPOINTS; i++) {  		if (kgdb_break[i].state != BP_ACTIVE)  			continue; -		addr = kgdb_break[i].bpt_addr; -		error = kgdb_arch_remove_breakpoint(addr, -					kgdb_break[i].saved_instr); +		error = kgdb_arch_remove_breakpoint(&kgdb_break[i]);  		if (error) { -			printk(KERN_INFO "KGDB: BP remove failed: %lx\n", addr); +			printk(KERN_INFO "KGDB: BP remove failed: %lx\n", +			       kgdb_break[i].bpt_addr);  			ret = error;  		} -		kgdb_flush_swbreak_addr(addr); +		kgdb_flush_swbreak_addr(kgdb_break[i].bpt_addr);  		kgdb_break[i].state = BP_SET;  	}  	return ret; @@ -348,7 +346,6 @@ int kgdb_isremovedbreak(unsigned long addr)  int dbg_remove_all_break(void)  { -	unsigned long addr;  	int error;  	int i; @@ -356,12 +353,10 @@ int dbg_remove_all_break(void)  	for (i = 0; i < KGDB_MAX_BREAKPOINTS; i++) {  		if (kgdb_break[i].state != BP_ACTIVE)  			goto setundefined; -		addr = kgdb_break[i].bpt_addr; -		error = kgdb_arch_remove_breakpoint(addr, -				kgdb_break[i].saved_instr); +		error = kgdb_arch_remove_breakpoint(&kgdb_break[i]);  		if (error)  			printk(KERN_ERR "KGDB: breakpoint remove failed: %lx\n", -			   addr); +			       kgdb_break[i].bpt_addr);  setundefined:  		kgdb_break[i].state = BP_UNDEFINED;  	} diff --git a/kernel/irq/migration.c b/kernel/irq/migration.c index 47420908fba0..c3c89751b327 100644 --- a/kernel/irq/migration.c +++ b/kernel/irq/migration.c @@ -43,12 +43,16 @@ void irq_move_masked_irq(struct irq_data *idata)  	 * masking the irqs.  	 */  	if (likely(cpumask_any_and(desc->pending_mask, cpu_online_mask) -		   < nr_cpu_ids)) -		if (!chip->irq_set_affinity(&desc->irq_data, -					    desc->pending_mask, false)) { +		   < nr_cpu_ids)) { +		int ret = chip->irq_set_affinity(&desc->irq_data, +						 desc->pending_mask, false); +		switch (ret) { +		case IRQ_SET_MASK_OK:  			cpumask_copy(desc->irq_data.affinity, desc->pending_mask); +		case IRQ_SET_MASK_OK_NOCOPY:  			irq_set_thread_affinity(desc);  		} +	}  	cpumask_clear(desc->pending_mask);  } diff --git a/kernel/sysctl.c b/kernel/sysctl.c index ae2719643854..ea7ec7f197c4 100644 --- a/kernel/sysctl.c +++ b/kernel/sysctl.c @@ -166,7 +166,7 @@ static int proc_taint(struct ctl_table *table, int write,  #endif  #ifdef CONFIG_PRINTK -static int proc_dmesg_restrict(struct ctl_table *table, int write, +static int proc_dointvec_minmax_sysadmin(struct ctl_table *table, int write,  				void __user *buffer, size_t *lenp, loff_t *ppos);  #endif @@ -713,7 +713,7 @@ static struct ctl_table kern_table[] = {  		.data		= &dmesg_restrict,  		.maxlen		= sizeof(int),  		.mode		= 0644, -		.proc_handler	= proc_dointvec_minmax, +		.proc_handler	= proc_dointvec_minmax_sysadmin,  		.extra1		= &zero,  		.extra2		= &one,  	}, @@ -722,7 +722,7 @@ static struct ctl_table kern_table[] = {  		.data		= &kptr_restrict,  		.maxlen		= sizeof(int),  		.mode		= 0644, -		.proc_handler	= proc_dmesg_restrict, +		.proc_handler	= proc_dointvec_minmax_sysadmin,  		.extra1		= &zero,  		.extra2		= &two,  	}, @@ -2422,7 +2422,7 @@ static int proc_taint(struct ctl_table *table, int write,  }  #ifdef CONFIG_PRINTK -static int proc_dmesg_restrict(struct ctl_table *table, int write, +static int proc_dointvec_minmax_sysadmin(struct ctl_table *table, int write,  				void __user *buffer, size_t *lenp, loff_t *ppos)  {  	if (write && !capable(CAP_SYS_ADMIN)) diff --git a/kernel/trace/trace.c b/kernel/trace/trace.c index 9b2e20893033..f4de7ab04e19 100644 --- a/kernel/trace/trace.c +++ b/kernel/trace/trace.c @@ -1652,6 +1652,7 @@ __find_next_entry(struct trace_iterator *iter, int *ent_cpu,  	int cpu_file = iter->cpu_file;  	u64 next_ts = 0, ts;  	int next_cpu = -1; +	int next_size = 0;  	int cpu;  	/* @@ -1683,9 +1684,12 @@ __find_next_entry(struct trace_iterator *iter, int *ent_cpu,  			next_cpu = cpu;  			next_ts = ts;  			next_lost = lost_events; +			next_size = iter->ent_size;  		}  	} +	iter->ent_size = next_size; +  	if (ent_cpu)  		*ent_cpu = next_cpu; diff --git a/kernel/trace/trace_entries.h b/kernel/trace/trace_entries.h index 93365907f219..205dcac89206 100644 --- a/kernel/trace/trace_entries.h +++ b/kernel/trace/trace_entries.h @@ -156,6 +156,12 @@ FTRACE_ENTRY_DUP(wakeup, ctx_switch_entry,  #define FTRACE_STACK_ENTRIES	8 +#ifndef CONFIG_64BIT +# define IP_FMT "%08lx" +#else +# define IP_FMT "%016lx" +#endif +  FTRACE_ENTRY(kernel_stack, stack_entry,  	TRACE_STACK, @@ -165,8 +171,9 @@ FTRACE_ENTRY(kernel_stack, stack_entry,  		__dynamic_array(unsigned long,	caller	)  	), -	F_printk("\t=> (%08lx)\n\t=> (%08lx)\n\t=> (%08lx)\n\t=> (%08lx)\n" -		 "\t=> (%08lx)\n\t=> (%08lx)\n\t=> (%08lx)\n\t=> (%08lx)\n", +	F_printk("\t=> (" IP_FMT ")\n\t=> (" IP_FMT ")\n\t=> (" IP_FMT ")\n" +		 "\t=> (" IP_FMT ")\n\t=> (" IP_FMT ")\n\t=> (" IP_FMT ")\n" +		 "\t=> (" IP_FMT ")\n\t=> (" IP_FMT ")\n",  		 __entry->caller[0], __entry->caller[1], __entry->caller[2],  		 __entry->caller[3], __entry->caller[4], __entry->caller[5],  		 __entry->caller[6], __entry->caller[7]) @@ -181,8 +188,9 @@ FTRACE_ENTRY(user_stack, userstack_entry,  		__array(	unsigned long,	caller, FTRACE_STACK_ENTRIES	)  	), -	F_printk("\t=> (%08lx)\n\t=> (%08lx)\n\t=> (%08lx)\n\t=> (%08lx)\n" -		 "\t=> (%08lx)\n\t=> (%08lx)\n\t=> (%08lx)\n\t=> (%08lx)\n", +	F_printk("\t=> (" IP_FMT ")\n\t=> (" IP_FMT ")\n\t=> (" IP_FMT ")\n" +		 "\t=> (" IP_FMT ")\n\t=> (" IP_FMT ")\n\t=> (" IP_FMT ")\n" +		 "\t=> (" IP_FMT ")\n\t=> (" IP_FMT ")\n",  		 __entry->caller[0], __entry->caller[1], __entry->caller[2],  		 __entry->caller[3], __entry->caller[4], __entry->caller[5],  		 __entry->caller[6], __entry->caller[7]) diff --git a/kernel/trace/trace_export.c b/kernel/trace/trace_export.c index bbeec31e0ae3..ad4000c71be0 100644 --- a/kernel/trace/trace_export.c +++ b/kernel/trace/trace_export.c @@ -150,7 +150,7 @@ ftrace_define_fields_##name(struct ftrace_event_call *event_call)	\  #define __dynamic_array(type, item)  #undef F_printk -#define F_printk(fmt, args...) #fmt ", "  __stringify(args) +#define F_printk(fmt, args...) __stringify(fmt) ", "  __stringify(args)  #undef FTRACE_ENTRY  #define FTRACE_ENTRY(call, struct_name, etype, tstruct, print)		\ diff --git a/net/bluetooth/hci_conn.c b/net/bluetooth/hci_conn.c index c1c597e3e198..98bfbd5b0bde 100644 --- a/net/bluetooth/hci_conn.c +++ b/net/bluetooth/hci_conn.c @@ -608,6 +608,10 @@ static int hci_conn_auth(struct hci_conn *conn, __u8 sec_level, __u8 auth_type)  	if (!test_and_set_bit(HCI_CONN_AUTH_PEND, &conn->pend)) {  		struct hci_cp_auth_requested cp; + +		/* encrypt must be pending if auth is also pending */ +		set_bit(HCI_CONN_ENCRYPT_PEND, &conn->pend); +  		cp.handle = cpu_to_le16(conn->handle);  		hci_send_cmd(conn->hdev, HCI_OP_AUTH_REQUESTED,  							sizeof(cp), &cp); diff --git a/net/mac80211/agg-rx.c b/net/mac80211/agg-rx.c index 41c2310eb3ca..aea15599ab0d 100644 --- a/net/mac80211/agg-rx.c +++ b/net/mac80211/agg-rx.c @@ -49,6 +49,8 @@ static void ieee80211_free_tid_rx(struct rcu_head *h)  		container_of(h, struct tid_ampdu_rx, rcu_head);  	int i; +	del_timer_sync(&tid_rx->reorder_timer); +  	for (i = 0; i < tid_rx->buf_size; i++)  		dev_kfree_skb(tid_rx->reorder_buf[i]);  	kfree(tid_rx->reorder_buf); @@ -88,7 +90,6 @@ void ___ieee80211_stop_rx_ba_session(struct sta_info *sta, u16 tid,  				     tid, 0, reason);  	del_timer_sync(&tid_rx->session_timer); -	del_timer_sync(&tid_rx->reorder_timer);  	call_rcu(&tid_rx->rcu_head, ieee80211_free_tid_rx);  } diff --git a/net/rose/rose_dev.c b/net/rose/rose_dev.c index 178ff4f73c85..2679507ad333 100644 --- a/net/rose/rose_dev.c +++ b/net/rose/rose_dev.c @@ -96,11 +96,11 @@ static int rose_set_mac_address(struct net_device *dev, void *addr)  	struct sockaddr *sa = addr;  	int err; -	if (!memcpy(dev->dev_addr, sa->sa_data, dev->addr_len)) +	if (!memcmp(dev->dev_addr, sa->sa_data, dev->addr_len))  		return 0;  	if (dev->flags & IFF_UP) { -		err = rose_add_loopback_node((rose_address *)dev->dev_addr); +		err = rose_add_loopback_node((rose_address *)sa->sa_data);  		if (err)  			return err; diff --git a/scripts/mod/modpost.c b/scripts/mod/modpost.c index 2bd594e6d1b4..619228d156c4 100644 --- a/scripts/mod/modpost.c +++ b/scripts/mod/modpost.c @@ -132,8 +132,10 @@ static struct module *new_module(char *modname)  	/* strip trailing .o */  	s = strrchr(p, '.');  	if (s != NULL) -		if (strcmp(s, ".o") == 0) +		if (strcmp(s, ".o") == 0) {  			*s = '\0'; +			mod->is_dot_o = 1; +		}  	/* add to list */  	mod->name = p; @@ -587,7 +589,8 @@ static void handle_modversions(struct module *mod, struct elf_info *info,  	unsigned int crc;  	enum export export; -	if (!is_vmlinux(mod->name) && strncmp(symname, "__ksymtab", 9) == 0) +	if ((!is_vmlinux(mod->name) || mod->is_dot_o) && +	    strncmp(symname, "__ksymtab", 9) == 0)  		export = export_from_secname(info, get_secindex(info, sym));  	else  		export = export_from_sec(info, get_secindex(info, sym)); @@ -849,7 +852,7 @@ static void check_section(const char *modname, struct elf_info *elf,  #define ALL_INIT_DATA_SECTIONS \  	".init.setup$", ".init.rodata$", \ -	".devinit.rodata$", ".cpuinit.rodata$", ".meminit.rodata$" \ +	".devinit.rodata$", ".cpuinit.rodata$", ".meminit.rodata$", \  	".init.data$", ".devinit.data$", ".cpuinit.data$", ".meminit.data$"  #define ALL_EXIT_DATA_SECTIONS \  	".exit.data$", ".devexit.data$", ".cpuexit.data$", ".memexit.data$" diff --git a/scripts/mod/modpost.h b/scripts/mod/modpost.h index 2031119080dc..51207e4d5f8b 100644 --- a/scripts/mod/modpost.h +++ b/scripts/mod/modpost.h @@ -113,6 +113,7 @@ struct module {  	int has_cleanup;  	struct buffer dev_table_buf;  	char	     srcversion[25]; +	int is_dot_o;  };  struct elf_info { diff --git a/security/tomoyo/mount.c b/security/tomoyo/mount.c index bee09d062057..fe00cdfd0267 100644 --- a/security/tomoyo/mount.c +++ b/security/tomoyo/mount.c @@ -199,30 +199,32 @@ int tomoyo_mount_permission(char *dev_name, struct path *path,  	if (flags & MS_REMOUNT) {  		type = tomoyo_mounts[TOMOYO_MOUNT_REMOUNT];  		flags &= ~MS_REMOUNT; -	} -	if (flags & MS_MOVE) { -		type = tomoyo_mounts[TOMOYO_MOUNT_MOVE]; -		flags &= ~MS_MOVE; -	} -	if (flags & MS_BIND) { +	} else if (flags & MS_BIND) {  		type = tomoyo_mounts[TOMOYO_MOUNT_BIND];  		flags &= ~MS_BIND; -	} -	if (flags & MS_UNBINDABLE) { -		type = tomoyo_mounts[TOMOYO_MOUNT_MAKE_UNBINDABLE]; -		flags &= ~MS_UNBINDABLE; -	} -	if (flags & MS_PRIVATE) { +	} else if (flags & MS_SHARED) { +		if (flags & (MS_PRIVATE | MS_SLAVE | MS_UNBINDABLE)) +			return -EINVAL; +		type = tomoyo_mounts[TOMOYO_MOUNT_MAKE_SHARED]; +		flags &= ~MS_SHARED; +	} else if (flags & MS_PRIVATE) { +		if (flags & (MS_SHARED | MS_SLAVE | MS_UNBINDABLE)) +			return -EINVAL;  		type = tomoyo_mounts[TOMOYO_MOUNT_MAKE_PRIVATE];  		flags &= ~MS_PRIVATE; -	} -	if (flags & MS_SLAVE) { +	} else if (flags & MS_SLAVE) { +		if (flags & (MS_SHARED | MS_PRIVATE | MS_UNBINDABLE)) +			return -EINVAL;  		type = tomoyo_mounts[TOMOYO_MOUNT_MAKE_SLAVE];  		flags &= ~MS_SLAVE; -	} -	if (flags & MS_SHARED) { -		type = tomoyo_mounts[TOMOYO_MOUNT_MAKE_SHARED]; -		flags &= ~MS_SHARED; +	} else if (flags & MS_UNBINDABLE) { +		if (flags & (MS_SHARED | MS_PRIVATE | MS_SLAVE)) +			return -EINVAL; +		type = tomoyo_mounts[TOMOYO_MOUNT_MAKE_UNBINDABLE]; +		flags &= ~MS_UNBINDABLE; +	} else if (flags & MS_MOVE) { +		type = tomoyo_mounts[TOMOYO_MOUNT_MOVE]; +		flags &= ~MS_MOVE;  	}  	if (!type)  		type = "<NULL>"; diff --git a/sound/soc/codecs/ak4642.c b/sound/soc/codecs/ak4642.c index 12c1bdef6732..1c4999d1758b 100644 --- a/sound/soc/codecs/ak4642.c +++ b/sound/soc/codecs/ak4642.c @@ -144,7 +144,7 @@   * min : 0xFE : -115.0 dB   * mute: 0xFF   */ -static const DECLARE_TLV_DB_SCALE(out_tlv, -11500, 50, 1); +static const DECLARE_TLV_DB_SCALE(out_tlv, -11550, 50, 1);  static const struct snd_kcontrol_new ak4642_snd_controls[] = { diff --git a/sound/soc/codecs/wm8994.c b/sound/soc/codecs/wm8994.c index 6e502af762ec..2f1f5f829871 100644 --- a/sound/soc/codecs/wm8994.c +++ b/sound/soc/codecs/wm8994.c @@ -3190,7 +3190,7 @@ static int wm8994_codec_probe(struct snd_soc_codec *codec)  		case 2:  		case 3:  			wm8994->hubs.dcs_codes_l = -9; -			wm8994->hubs.dcs_codes_r = -5; +			wm8994->hubs.dcs_codes_r = -7;  			break;  		default:  			break; | 
