Linux 3.0.41
I'm announcing the release of the 3.0.41 kernel.
All users of the 3.0 kernel series must upgrade.
The updated 3.0.y git tree can be found at:
git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable.git linux-3.0.y
and can be browsed at the normal kernel.org git web browser:
http://git.kernel.org/?p=linux/kernel/git/stable/linux-stable.git;a=summary
thanks,
greg k-h
------------
MAINTAINERS | 2 Makefile | 2 arch/arm/configs/mxs_defconfig | 1 arch/arm/include/asm/cacheflush.h | 8 arch/arm/mm/tlb-v7.S | 12 + arch/ia64/include/asm/atomic.h | 4 arch/ia64/kernel/irq_ia64.c | 1 arch/x86/include/asm/processor.h | 2 arch/x86/kernel/alternative.c | 2 arch/x86/kernel/amd_nb.c | 8 arch/x86/kernel/cpu/amd.c | 2 arch/x86/kernel/cpu/common.c | 5 arch/x86/kernel/cpu/intel.c | 2 arch/x86/kernel/cpu/mcheck/mce.c | 2 arch/x86/kernel/cpu/mcheck/mce_amd.c | 5 arch/x86/kernel/cpu/proc.c | 4 arch/x86/kernel/microcode_core.c | 31 +- drivers/char/mspec.c | 2 drivers/char/random.c | 374 +++++++++++++++++++++++----------- drivers/edac/i7core_edac.c | 2 drivers/firmware/dmi_scan.c | 3 drivers/firmware/pcdp.c | 4 drivers/hwmon/coretemp.c | 7 drivers/input/tablet/wacom_wac.c | 2 drivers/mfd/ab3100-core.c | 5 drivers/mfd/ab3550-core.c | 2 drivers/mfd/ezx-pcap.c | 2 drivers/mfd/wm831x-otp.c | 8 drivers/net/e1000e/82571.c | 4 drivers/net/wireless/rt2x00/rt61pci.c | 3 drivers/rtc/rtc-wm831x.c | 24 ++ drivers/usb/core/hub.c | 9 fs/nilfs2/ioctl.c | 4 fs/nilfs2/super.c | 3 fs/nilfs2/the_nilfs.c | 1 fs/nilfs2/the_nilfs.h | 2 include/linux/irqdesc.h | 1 include/linux/mfd/ezx-pcap.h | 1 include/linux/random.h | 19 + include/trace/events/random.h | 134 ++++++++++++ kernel/irq/handle.c | 7 kernel/irq/manage.c | 17 - mm/hugetlb.c | 25 ++ mm/memory-failure.c | 6 mm/mmu_notifier.c | 45 ++-- net/core/dev.c | 3 net/core/rtnetlink.c | 1 net/mac80211/mesh.c | 1 net/sunrpc/rpcb_clnt.c | 4 net/wireless/core.c | 5 net/wireless/core.h | 1 net/wireless/util.c | 5 52 files changed, 585 insertions(+), 244 deletions(-)
Alan Cox (1):
x86, nops: Missing break resulting in incorrect selection on Intel
Arnd Bergmann (1):
ARM: pxa: remove irq_to_gpio from ezx-pcap driver
Borislav Petkov (1):
x86, microcode: Sanitize per-cpu microcode reloading interface
Chris Bagwell (1):
Input: wacom - Bamboo One 1024 pressure fix
Daniel Drake (1):
cfg80211: process pending events when unregistering net device
Greg Kroah-Hartman (1):
Linux 3.0.41
Greg Pearson (1):
pcdp: use early_ioremap/early_iounmap to access pcdp table
H. Peter Anvin (3):
random: Add support for architectural random hooks
random: Adjust the number of loops when initializing
random: mix in architectural randomness in extract_buf()
Johannes Berg (1):
mac80211: cancel mesh path timer
Joonsoo Kim (1):
mm: fix wrong argument of migrate_huge_pages() in soft_offline_huge_page()
Kevin Winchester (1):
x86: Simplify code by removing a !SMP #ifdefs from 'struct cpuinfo_x86'
Liang Li (1):
cfg80211: fix interface combinations check for ADHOC(IBSS)
Linus Torvalds (2):
random: Use arch_get_random_int instead of cycle counter if avail
random: create add_device_randomness() interface
Marek Vasut (1):
ARM: mxs: Remove MMAP_MIN_ADDR setting from mxs_defconfig
Mark Brown (2):
rtc: wm831x: Feed the write counter into device_add_randomness()
mfd: wm831x: Feed the device UUID into device_add_randomness()
Mathieu Desnoyers (1):
drivers/char/random.c: fix boot id uniqueness race
Mel Gorman (1):
mm: hugetlbfs: close race during teardown of hugetlbfs shared page tables
Ryusuke Konishi (1):
nilfs2: fix deadlock issue between chcp and thaw ioctls
Shuah Khan (1):
x86, microcode: microcode_core.c simple_strtoul cleanup
Stanislav Kinsbursky (1):
SUNRPC: return negative value in case rpcbind client creation error
Stanislaw Gruszka (1):
rt61pci: fix NULL pointer dereference in config_lna_gain
Theodore Ts'o (10):
random: Use arch-specific RNG to initialize the entropy store
random: make 'add_interrupt_randomness()' do something sane
random: use lockless techniques in the interrupt path
usb: feed USB device information to the /dev/random driver
net: feed /dev/random with the MAC address when registering a device
random: use the arch-specific rng in xfer_secondary_pool
random: add new get_random_bytes_arch() function
random: add tracepoints for easier debugging and verification
MAINTAINERS: Theodore Ts'o is taking over the random driver
random: remove rand_initialize_irq()
Tony Luck (4):
Redefine ATOMIC_INIT and ATOMIC64_INIT to drop the casts fix typo/thinko in get_random_bytes()
random: Add comment to random_initialize()
dmi: Feed DMI table to /dev/random driver
Tushar Dave (1):
e1000e: NIC goes up and immediately goes down
Will Deacon (2):
ARM: 7478/1: errata: extend workaround for erratum #720789
ARM: 7479/1: mm: avoid NULL dereference when flushing gate_vma with VIVT caches
Xiao Guangrong (1):
mm: mmu_notifier: fix freed page still mapped in secondary MMU
MAINTAINERS +1 -1
@@ -5247,7 +5247,7 @@ F: Documentation/blockdev/ramdisk.txt F: drivers/block/brd.c RANDOM NUMBER DRIVER -M: Matt Mackall <[email protected]> +M: Theodore Ts'o" <[email protected]> S: Maintained F: drivers/char/random.c
Makefile +1 -1
@@ -1,6 +1,6 @@ VERSION = 3 PATCHLEVEL = 0 -SUBLEVEL = 40 +SUBLEVEL = 41 EXTRAVERSION = NAME = Sneaky Weasel
arch/arm/configs/mxs_defconfig +0 -1
@@ -29,7 +29,6 @@ CONFIG_NO_HZ=y CONFIG_HIGH_RES_TIMERS=y CONFIG_PREEMPT_VOLUNTARY=y CONFIG_AEABI=y -CONFIG_DEFAULT_MMAP_MIN_ADDR=65536 CONFIG_AUTO_ZRELADDR=y CONFIG_FPE_NWFPE=y CONFIG_NET=y
arch/arm/include/asm/cacheflush.h +6 -2
@@ -215,7 +215,9 @@ static inline void vivt_flush_cache_mm(struct mm_struct *mm)static inline void vivt_flush_cache_range (struct vm_area_struct *vma,unsigned long start,unsigned long end) { -if (cpumask_test_cpu (smp_processor_id (),mm_cpumask (vma->vm_mm))) +struct mm_struct *mm = vma->vm_mm; + +if (!mm ||cpumask_test_cpu (smp_processor_id (),mm_cpumask (mm)))__cpuc_flush_user_range (start &PAGE_MASK ,PAGE_ALIGN (end), vma->vm_flags); }
@@ -223,7 +225,9 @@ vivt_flush_cache_range(struct vm_area_struct *vma, unsigned long start, unsignedstatic inline void vivt_flush_cache_page (struct vm_area_struct *vma,unsigned long user_addr,unsigned long pfn) { -if (cpumask_test_cpu (smp_processor_id (),mm_cpumask (vma->vm_mm))) { +struct mm_struct *mm = vma->vm_mm; + +if (!mm ||cpumask_test_cpu (smp_processor_id (),mm_cpumask (mm))) {unsigned long addr = user_addr &PAGE_MASK ;__cpuc_flush_user_range (addr, addr +PAGE_SIZE , vma->vm_flags); }
arch/arm/mm/tlb-v7.S +12 -0
@@ -38,11 +38,19 @@ ENTRY(v7wbi_flush_user_tlb_range) dsb mov r0, r0, lsr #PAGE_SHIFT @ align address mov r1, r1, lsr #PAGE_SHIFT +#ifdef CONFIG_ARM_ERRATA_720789 + mov r3, #0 +#else asid r3, r3 @ mask ASID +#endif orr r0, r3, r0, lsl #PAGE_SHIFT @ Create initial MVA mov r1, r1, lsl #PAGE_SHIFT 1: +#ifdef CONFIG_ARM_ERRATA_720789 + ALT_SMP(mcr p15, 0, r0, c8, c3, 3) @ TLB invalidate U MVA all ASID (shareable) +#else ALT_SMP(mcr p15, 0, r0, c8, c3, 1) @ TLB invalidate U MVA (shareable) +#endif ALT_UP(mcr p15, 0, r0, c8, c7, 1) @ TLB invalidate U MVA add r0, r0, #PAGE_SZ
@@ -70,7 +78,11 @@ ENTRY(v7wbi_flush_kern_tlb_range) mov r0, r0, lsl #PAGE_SHIFT mov r1, r1, lsl #PAGE_SHIFT 1: +#ifdef CONFIG_ARM_ERRATA_720789 + ALT_SMP(mcr p15, 0, r0, c8, c3, 3) @ TLB invalidate U MVA all ASID (shareable) +#else ALT_SMP(mcr p15, 0, r0, c8, c3, 1) @ TLB invalidate U MVA (shareable) +#endif ALT_UP(mcr p15, 0, r0, c8, c7, 1) @ TLB invalidate U MVA add r0, r0, #PAGE_SZ cmp r0, r1
arch/ia64/include/asm/atomic.h +2 -2
@@ -18,8 +18,8 @@#include <asm/system.h> -#define ATOMIC_INIT (i) ((atomic_t) { (i) }) -#define ATOMIC64_INIT (i) ((atomic64_t) { (i) }) +#define ATOMIC_INIT (i) { (i) } +#define ATOMIC64_INIT (i) { (i) }#define atomic_read (v) (*(volatile int *)&(v)->counter)#define atomic64_read (v) (*(volatile long *)&(v)->counter)
arch/ia64/kernel/irq_ia64.c +0 -1
@@ -23,7 +23,6 @@#include <linux/ioport.h> #include <linux/kernel_stat.h> #include <linux/ptrace.h> -#include <linux/random.h> /* for rand_initialize_irq() */ #include <linux/signal.h> #include <linux/smp.h> #include <linux/threads.h>
arch/x86/include/asm/processor.h +0 -2
@@ -99,7 +99,6 @@ struct cpuinfo_x86 {u16 apicid;u16 initial_apicid;u16 x86_clflush_size; -#ifdef CONFIG_SMP /* number of cores as seen by the OS: */ u16 booted_cores;/* Physical processor id: */
@@ -110,7 +109,6 @@ struct cpuinfo_x86 {u8 compute_unit_id;/* Index into per_cpu list: */ u16 cpu_index; -#endif } __attribute__((__aligned__(SMP_CACHE_BYTES)));#define X86_VENDOR_INTEL 0
arch/x86/kernel/alternative.c +1 -1
@@ -220,7 +220,7 @@ void __init arch_init_ideal_nops(void) ideal_nops = intel_nops;#endif } - +break ;default :#ifdef CONFIG_X86_64 ideal_nops = k8_nops;
arch/x86/kernel/amd_nb.c +2 -6
@@ -154,16 +154,14 @@ int amd_get_subcaches(int cpu) {struct pci_dev *link =node_to_amd_nb (amd_get_nb_id (cpu))->link;unsigned int mask; -int cuid =0 ; +int cuid;if (!amd_nb_has_feature (AMD_NB_L3_PARTITIONING ))return 0 ;pci_read_config_dword (link,0x1d4 , &mask); -#ifdef CONFIG_SMP cuid =cpu_data (cpu).compute_unit_id; -#endif return (mask >> (4 * cuid)) &0xf ; }
@@ -172,7 +170,7 @@ int amd_set_subcaches(int cpu, int mask)static unsigned int reset, ban;struct amd_northbridge *nb =node_to_amd_nb (amd_get_nb_id (cpu));unsigned int reg; -int cuid =0 ; +int cuid;if (!amd_nb_has_feature (AMD_NB_L3_PARTITIONING ) || mask >0xf )return -EINVAL ;
@@ -190,9 +188,7 @@ int amd_set_subcaches(int cpu, int mask)pci_write_config_dword (nb->misc,0x1b8 , reg & ~0x180000 ); } -#ifdef CONFIG_SMP cuid =cpu_data (cpu).compute_unit_id; -#endif mask <<=4 * cuid; mask |= (0xf ^ (1 << cuid)) <<26 ;
arch/x86/kernel/cpu/amd.c +0 -2
@@ -146,7 +146,6 @@ static void __cpuinit init_amd_k6(struct cpuinfo_x86 *c)static void __cpuinit amd_k7_smp_check (struct cpuinfo_x86 *c) { -#ifdef CONFIG_SMP /* calling is from identify_secondary_cpu() ? */ if (!c->cpu_index)return ;
@@ -190,7 +189,6 @@ static void __cpuinit amd_k7_smp_check(struct cpuinfo_x86 *c) valid_k7: ; -#endif }static void __cpuinit init_amd_k7 (struct cpuinfo_x86 *c)
arch/x86/kernel/cpu/common.c +0 -5
@@ -675,9 +675,7 @@ static void __init early_identify_cpu(struct cpuinfo_x86 *c)if (this_cpu->c_early_init) this_cpu->c_early_init (c); -#ifdef CONFIG_SMP c->cpu_index =0 ; -#endif filter_cpuid_features (c, false);setup_smep (c);
@@ -760,10 +758,7 @@ static void __cpuinit generic_identify(struct cpuinfo_x86 *c) c->apicid = c->initial_apicid;# endif #endif - -#ifdef CONFIG_X86_HT c->phys_proc_id = c->initial_apicid; -#endif }setup_smep (c);
arch/x86/kernel/cpu/intel.c +0 -2
@@ -179,7 +179,6 @@ static void __cpuinit trap_init_f00f_bug(void)static void __cpuinit intel_smp_check (struct cpuinfo_x86 *c) { -#ifdef CONFIG_SMP /* calling is from identify_secondary_cpu() ? */ if (!c->cpu_index)return ;
@@ -196,7 +195,6 @@ static void __cpuinit intel_smp_check(struct cpuinfo_x86 *c)WARN_ONCE (1 ,"WARNING: SMP operation may be unreliable" "with B stepping processors.\n" ); } -#endif }static void __cpuinit intel_workarounds (struct cpuinfo_x86 *c)
arch/x86/kernel/cpu/mcheck/mce.c +0 -2
@@ -122,9 +122,7 @@ void mce_setup(struct mce *m) m->time =get_seconds (); m->cpuvendor = boot_cpu_data.x86_vendor; m->cpuid =cpuid_eax (1 ); -#ifdef CONFIG_SMP m->socketid =cpu_data (m->extcpu).phys_proc_id; -#endif m->apicid =cpu_data (m->extcpu).initial_apicid;rdmsrl (MSR_IA32_MCG_CAP , m->mcgcap); }
arch/x86/kernel/cpu/mcheck/mce_amd.c +1 -4
@@ -65,11 +65,9 @@ struct threshold_bank { }; static DEFINE_PER_CPU(struct threshold_bank * [NR_BANKS], threshold_banks); -#ifdef CONFIG_SMP static unsigned char shared_bank[NR_BANKS ] = {0 ,0 ,0 ,0 ,1 }; -#endif static DEFINE_PER_CPU(unsigned char, bank_map); /* see which banks are on */
@@ -227,10 +225,9 @@ void mce_amd_feature_init(struct cpuinfo_x86 *c)if (!block)per_cpu (bank_map, cpu) |= (1 << bank); -#ifdef CONFIG_SMP +if (shared_bank[bank] && c->cpu_core_id)break ; -#endif memset (&b,0 ,sizeof (b)); b.cpu = cpu;
arch/x86/kernel/cpu/proc.c +1 -3
@@ -64,12 +64,10 @@ static void show_cpuinfo_misc(struct seq_file *m, struct cpuinfo_x86 *c)static int show_cpuinfo (struct seq_file *m,void *v) {struct cpuinfo_x86 *c = v; -unsigned int cpu =0 ; +unsigned int cpu;int i; -#ifdef CONFIG_SMP cpu = c->cpu_index; -#endif seq_printf (m,"processor\t: %u\n" "vendor_id\t: %s\n" "cpu family\t: %d\n"
arch/x86/kernel/microcode_core.c +21 -10
@@ -297,20 +297,31 @@ static ssize_t reload_store(struct sys_device *dev, const char *buf, size_t size) { unsigned long val; -int cpu = dev->id; -int ret =0 ; -char *end; +int cpu; +ssize_t ret =0 , tmp_ret; - val =simple_strtoul (buf, &end,0 ); -if (end == buf) +/* allow reload only from the BSP */ +if (boot_cpu_data.cpu_index != dev->id)return -EINVAL ; -if (val ==1 ) { -get_online_cpus (); -if (cpu_online (cpu)) - ret =reload_for_cpu (cpu); -put_online_cpus (); + ret =kstrtoul (buf,0 , &val); +if (ret) +return ret; + +if (val !=1 ) +return size; + +get_online_cpus (); +for_each_online_cpu (cpu) { + tmp_ret =reload_for_cpu (cpu); +if (tmp_ret !=0 ) +pr_warn ("Error reloading microcode on CPU %d\n" , cpu); + +/* save retval of the first encountered reload error */ +if (!ret) + ret = tmp_ret; } +put_online_cpus ();if (!ret) ret = size;
drivers/char/mspec.c +1 -1
@@ -284,7 +284,7 @@ mspec_mmap(struct file *file, struct vm_area_struct *vma, vdata->flags = flags; vdata->type = type;spin_lock_init (&vdata->lock); - vdata->refcnt =ATOMIC_INIT (1 ); +atomic_set (&vdata->refcnt,1 ); vma->vm_private_data = vdata; vma->vm_flags |= (VM_IO |VM_RESERVED |VM_PFNMAP |VM_DONTEXPAND );
drivers/char/random.c +256 -118
617 lines not on this page · raw message
drivers/edac/i7core_edac.c +0 -2
@@ -1842,11 +1842,9 @@ static int i7core_mce_check_error(void *priv, struct mce *mce)if (mce->bank !=8 )return 0 ; -#ifdef CONFIG_SMP /* Only handle if it is the right mc controller */ if (cpu_data (mce->cpu).phys_proc_id != pvt->i7core_dev->socket)return 0 ; -#endif smp_rmb ();if ((pvt->mce_out +1 ) %MCE_LOG_LEN == pvt->mce_in) {
drivers/firmware/dmi_scan.c +3 -0
@@ -6,6 +6,7 @@#include <linux/dmi.h> #include <linux/efi.h> #include <linux/bootmem.h> +#include <linux/random.h> #include <asm/dmi.h> /*
@@ -111,6 +112,8 @@ static int __init dmi_walk_early(void (*decode)(const struct dmi_header *,dmi_table (buf, dmi_len, dmi_num, decode,NULL ); +add_device_randomness (buf, dmi_len); +dmi_iounmap (buf, dmi_len);return 0 ; }
drivers/firmware/pcdp.c +2 -2
@@ -95,7 +95,7 @@ efi_setup_pcdp_console(char *cmdline)if (efi.hcdp ==EFI_INVALID_TABLE_ADDR )return -ENODEV ; - pcdp =ioremap (efi.hcdp,4096 ); + pcdp =early_ioremap (efi.hcdp,4096 );printk (KERN_INFO "PCDP: v%d at 0x%lx\n" , pcdp->rev, efi.hcdp);if (strstr (cmdline,"console=hcdp" )) {
@@ -131,6 +131,6 @@ efi_setup_pcdp_console(char *cmdline) } out: -iounmap (pcdp); +early_iounmap (pcdp,4096 );return rc; }
drivers/hwmon/coretemp.c +3 -4
@@ -47,16 +47,15 @@#define MAX_ATTRS 5/* Maximum no of per-core attrs */ #define MAX_CORE_DATA (NUM_REAL_CORES + BASE_SYSFS_ATTR_NO) -#ifdef CONFIG_SMP #define TO_PHYS_ID (cpu) cpu_data(cpu).phys_proc_id#define TO_CORE_ID (cpu) cpu_data(cpu).cpu_core_id +#define TO_ATTR_NO (cpu) (TO_CORE_ID(cpu) + BASE_SYSFS_ATTR_NO) + +#ifdef CONFIG_SMP #define for_each_sibling (i, cpu) for_each_cpu(i, cpu_sibling_mask(cpu))#else -#define TO_PHYS_ID (cpu) (cpu) -#define TO_CORE_ID (cpu) (cpu)#define for_each_sibling (i, cpu) for (i = 0; false; )#endif -#define TO_ATTR_NO (cpu) (TO_CORE_ID(cpu) + BASE_SYSFS_ATTR_NO)/* * Per-Core Temperature Data
drivers/input/tablet/wacom_wac.c +1 -1
@@ -242,7 +242,7 @@ static int wacom_graphire_irq(struct wacom_wac *wacom)input_report_abs (input,ABS_X ,le16_to_cpup ((__le16 *)&data[2 ]));input_report_abs (input,ABS_Y ,le16_to_cpup ((__le16 *)&data[4 ]));if (wacom->tool[0 ] !=BTN_TOOL_MOUSE ) { -input_report_abs (input,ABS_PRESSURE , data[6 ] | ((data[7 ] &0x01 ) <<8 )); +input_report_abs (input,ABS_PRESSURE , data[6 ] | ((data[7 ] &0x03 ) <<8 ));input_report_key (input,BTN_TOUCH , data[1 ] &0x01 );input_report_key (input,BTN_STYLUS , data[1 ] &0x02 );input_report_key (input,BTN_STYLUS2 , data[1 ] &0x04 );
drivers/mfd/ab3100-core.c +0 -5
@@ -408,8 +408,6 @@ static irqreturn_t ab3100_irq_handler(int irq, void *data)u32 fatevent;int err; -add_interrupt_randomness (irq); - err =ab3100_get_register_page_interruptible (ab3100,AB3100_EVENTA1 , event_regs,3 );if (err)
@@ -938,9 +936,6 @@ static int __devinit ab3100_probe(struct i2c_client *client, err =request_threaded_irq (client->irq,NULL , ab3100_irq_handler,IRQF_ONESHOT ,"ab3100-core" , ab3100); -/* This real unpredictable IRQ is of course sampled for entropy */ -rand_initialize_irq (client->irq); -if (err) goto exit_no_irq;
drivers/mfd/ab3550-core.c +0 -2
@@ -1309,8 +1309,6 @@ static int __init ab3550_probe(struct i2c_client *client, err =request_threaded_irq (client->irq,NULL , ab3550_irq_handler,IRQF_ONESHOT ,"ab3550-core" , ab); -/* This real unpredictable IRQ is of course sampled for entropy */ -rand_initialize_irq (client->irq);if (err) goto exit_no_irq;
drivers/mfd/ezx-pcap.c +1 -1
@@ -202,7 +202,7 @@ static void pcap_isr_work(struct work_struct *work) }local_irq_enable ();ezx_pcap_write (pcap,PCAP_REG_MSR , pcap->msr); - }while (gpio_get_value (irq_to_gpio (pcap->spi->irq))); + }while (gpio_get_value (pdata->gpio)); }static void pcap_irq_handler (unsigned int irq,struct irq_desc *desc)
drivers/mfd/wm831x-otp.c +8 -0
@@ -18,6 +18,7 @@#include <linux/bcd.h> #include <linux/delay.h> #include <linux/mfd/core.h> +#include <linux/random.h> #include <linux/mfd/wm831x/core.h> #include <linux/mfd/wm831x/otp.h>
@@ -66,6 +67,7 @@ static DEVICE_ATTR(unique_id, 0444, wm831x_unique_id_show, NULL);int wm831x_otp_init (struct wm831x *wm831x) { +char uuid[WM831X_UNIQUE_ID_LEN ];int ret; ret =device_create_file (wm831x->dev, &dev_attr_unique_id);
@@ -73,6 +75,12 @@ int wm831x_otp_init(struct wm831x *wm831x)dev_err (wm831x->dev,"Unique ID attribute not created: %d\n" , ret); + ret =wm831x_unique_id_read (wm831x, uuid); +if (ret ==0 ) +add_device_randomness (uuid,sizeof (uuid)); +else +dev_err (wm831x->dev,"Failed to read UUID: %d\n" , ret); +return ret; }
drivers/net/e1000e/82571.c +1 -3
@@ -1602,10 +1602,8 @@ static s32 e1000_check_for_serdes_link_82571(struct e1000_hw *hw)* auto-negotiation in the TXCW register and disable * forced link in the Device Control register in an * attempt to auto-negotiate with our link partner. -* If the partner code word is null, stop forcing -* and restart auto negotiation. */ -if ((rxcw &E1000_RXCW_C ) || !(rxcw &E1000_RXCW_CW )) { +if (rxcw &E1000_RXCW_C ) {/* Enable autoneg, and unforce link up */ ew32 (TXCW , mac->txcw);ew32 (CTRL , (ctrl & ~E1000_CTRL_SLU ));
drivers/net/wireless/rt2x00/rt61pci.c +1 -2
@@ -2254,8 +2254,7 @@ static void rt61pci_txdone(struct rt2x00_dev *rt2x00dev)static void rt61pci_wakeup (struct rt2x00_dev *rt2x00dev) { -struct ieee80211_conf conf = { .flags =0 }; -struct rt2x00lib_conf libconf = { .conf = &conf }; +struct rt2x00lib_conf libconf = { .conf = &rt2x00dev->hw->conf };rt61pci_config (rt2x00dev, &libconf,IEEE80211_CONF_CHANGE_PS ); }
drivers/rtc/rtc-wm831x.c +23 -1
@@ -24,7 +24,7 @@#include <linux/mfd/wm831x/core.h> #include <linux/delay.h> #include <linux/platform_device.h> - +#include <linux/random.h> /* * R16416 (0x4020) - RTC Write Counter
@@ -96,6 +96,26 @@ struct wm831x_rtc { unsigned int alarm_enabled:1; }; +static void wm831x_rtc_add_randomness (struct wm831x *wm831x) +{ +int ret; +u16 reg; + +/* +* The write counter contains a pseudo-random number which is +* regenerated every time we set the RTC so it should be a +* useful per-system source of entropy. +*/ + ret =wm831x_reg_read (wm831x,WM831X_RTC_WRITE_COUNTER ); +if (ret >=0 ) { + reg = ret; +add_device_randomness (®,sizeof (reg)); + }else { +dev_warn (wm831x->dev,"Failed to read RTC write counter: %d\n" , + ret); + } +} +/* * Read current time and date in RTC */
@@ -449,6 +469,8 @@ static int wm831x_rtc_probe(struct platform_device *pdev) alm_irq, ret); } +wm831x_rtc_add_randomness (wm831x); +return 0 ; err:
drivers/usb/core/hub.c +9 -0
@@ -24,6 +24,7 @@#include <linux/kthread.h> #include <linux/mutex.h> #include <linux/freezer.h> +#include <linux/random.h> #include <asm/uaccess.h> #include <asm/byteorder.h>
@@ -1902,6 +1903,14 @@ int usb_new_device(struct usb_device *udev)/* Tell the world! */ announce_device (udev); +if (udev->serial) +add_device_randomness (udev->serial,strlen (udev->serial)); +if (udev->product) +add_device_randomness (udev->product,strlen (udev->product)); +if (udev->manufacturer) +add_device_randomness (udev->manufacturer, +strlen (udev->manufacturer)); +device_enable_async_suspend (&udev->dev);/* Register the device. The device driver is responsible * for configuring the device and invoking the add-device
fs/nilfs2/ioctl.c +2 -2
@@ -182,7 +182,7 @@ static int nilfs_ioctl_change_cpmode(struct inode *inode, struct file *filp,if (copy_from_user (&cpmode, argp,sizeof (cpmode))) goto out; -down_read (&inode->i_sb->s_umount); +mutex_lock (&nilfs->ns_snapshot_mount_mutex);nilfs_transaction_begin (inode->i_sb, &ti,0 ); ret = nilfs_cpfile_change_cpmode(
@@ -192,7 +192,7 @@ static int nilfs_ioctl_change_cpmode(struct inode *inode, struct file *filp,else nilfs_transaction_commit (inode->i_sb);/* never fails */ -up_read (&inode->i_sb->s_umount); +mutex_unlock (&nilfs->ns_snapshot_mount_mutex); out:mnt_drop_write (filp->f_path.mnt);return ret;
fs/nilfs2/super.c +3 -0
@@ -951,6 +951,8 @@ static int nilfs_attach_snapshot(struct super_block *s, __u64 cno,struct nilfs_root *root;int ret; +mutex_lock (&nilfs->ns_snapshot_mount_mutex); +down_read (&nilfs->ns_segctor_sem); ret =nilfs_cpfile_is_snapshot (nilfs->ns_cpfile, cno);up_read (&nilfs->ns_segctor_sem);
@@ -975,6 +977,7 @@ static int nilfs_attach_snapshot(struct super_block *s, __u64 cno, ret =nilfs_get_root_dentry (s, root, root_dentry);nilfs_put_root (root); out: +mutex_unlock (&nilfs->ns_snapshot_mount_mutex);return ret; }
fs/nilfs2/the_nilfs.c +1 -0
@@ -76,6 +76,7 @@ struct the_nilfs *alloc_nilfs(struct block_device *bdev) nilfs->ns_bdev = bdev;atomic_set (&nilfs->ns_ndirtyblks,0 );init_rwsem (&nilfs->ns_sem); +mutex_init (&nilfs->ns_snapshot_mount_mutex);INIT_LIST_HEAD (&nilfs->ns_dirty_files);INIT_LIST_HEAD (&nilfs->ns_gc_inodes);spin_lock_init (&nilfs->ns_inode_lock);
fs/nilfs2/the_nilfs.h +2 -0
@@ -47,6 +47,7 @@ enum {* @ns_flags: flags * @ns_bdev: block device * @ns_sem: semaphore for shared states +* @ns_snapshot_mount_mutex: mutex to protect snapshot mounts * @ns_sbh: buffer heads of on-disk super blocks * @ns_sbp: pointers to super block data * @ns_sbwtime: previous write time of super block
@@ -99,6 +100,7 @@ struct the_nilfs {struct block_device *ns_bdev;struct rw_semaphore ns_sem; +struct mutex ns_snapshot_mount_mutex;/* * used for
include/linux/irqdesc.h +0 -1
@@ -38,7 +38,6 @@ struct timer_rand_state;*/ struct irq_desc {struct irq_data irq_data; -struct timer_rand_state *timer_rand_state;unsigned int __percpu *kstat_irqs;irq_flow_handler_t handle_irq;#ifdef CONFIG_IRQ_PREFLOW_FASTEOI
include/linux/mfd/ezx-pcap.h +1 -0
@@ -16,6 +16,7 @@ struct pcap_subdev {struct pcap_platform_data {unsigned int irq_base;unsigned int config; +int gpio;void (*init) (void *);/* board specific init */ int num_subdevs;struct pcap_subdev *subdevs;
include/linux/random.h +16 -3
@@ -48,13 +48,13 @@ struct rnd_state {#ifdef __KERNEL__ -extern void rand_initialize_irq (int irq); - +extern void add_device_randomness (const void *,unsigned int );extern void add_input_randomness (unsigned int type,unsigned int code,unsigned int value); -extern void add_interrupt_randomness (int irq); +extern void add_interrupt_randomness (int irq,int irq_flags);extern void get_random_bytes (void *buf,int nbytes); +extern void get_random_bytes_arch (void *buf,int nbytes);void generate_random_uuid (unsigned char uuid_out[16 ]);#ifndef MODULE
@@ -91,6 +91,19 @@ static inline void prandom32_seed(struct rnd_state *state, u64 seed) state->s3 =__seed (i,15 ); } +#ifdef CONFIG_ARCH_RANDOM +# include <asm/archrandom.h> +#else +static inline int arch_get_random_long (unsigned long *v) +{ +return 0 ; +} +static inline int arch_get_random_int (unsigned int *v) +{ +return 0 ; +} +#endif +#endif /* __KERNEL___ */ #endif /* _LINUX_RANDOM_H */
include/trace/events/random.h new file +134 -0
134 lines not on this page · raw message
kernel/irq/handle.c +3 -4
@@ -117,7 +117,7 @@ irqreturn_t handle_irq_event_percpu(struct irq_desc *desc, struct irqaction *action) { irqreturn_t retval = IRQ_NONE; -unsigned int random =0 , irq = desc->irq_data.irq; +unsigned int flags =0 , irq = desc->irq_data.irq; do { irqreturn_t res;
@@ -145,7 +145,7 @@ handle_irq_event_percpu(struct irq_desc *desc, struct irqaction *action)/* Fall through to add to randomness */ case IRQ_HANDLED : - random |= action->flags; + flags |= action->flags;break ;default :
@@ -156,8 +156,7 @@ handle_irq_event_percpu(struct irq_desc *desc, struct irqaction *action) action = action->next; }while (action); -if (random &IRQF_SAMPLE_RANDOM ) -add_interrupt_randomness (irq); +add_interrupt_randomness (irq, flags);if (!noirqdebug)note_interrupt (irq, desc, retval);
kernel/irq/manage.c +0 -17
@@ -886,22 +886,6 @@ __setup_irq(unsigned int irq, struct irq_desc *desc, struct irqaction *new)if (desc->irq_data.chip == &no_irq_chip)return -ENOSYS ; -/* -* Some drivers like serial.c use request_irq() heavily, -* so we have to be careful not to interfere with a -* running system. -*/ -if (new->flags &IRQF_SAMPLE_RANDOM ) { -/* -* This function might sleep, we want to call it first, -* outside of the atomic block. -* Yes, this might clear the entropy pool if the wrong -* driver is attempted to be loaded, without actually -* installing a new handler, but is this really a problem, -* only the sysadmin is able to do this. -*/ -rand_initialize_irq (irq); - }/* * Check whether the interrupt nests into another interrupt
@@ -1325,7 +1309,6 @@ EXPORT_SYMBOL(free_irq);* Flags: * * IRQF_SHARED Interrupt is shared -* IRQF_SAMPLE_RANDOM The interrupt can be used for entropy * IRQF_TRIGGER_* Specify active edge(s) or level * */
mm/hugetlb.c +23 -2
@@ -2301,6 +2301,22 @@ void unmap_hugepage_range(struct vm_area_struct *vma, unsigned long start, {mutex_lock (&vma->vm_file->f_mapping->i_mmap_mutex);__unmap_hugepage_range (vma, start, end, ref_page); +/* +* Clear this flag so that x86's huge_pmd_share page_table_shareable +* test will fail on a vma being torn down, and not grab a page table +* on its way out. We're lucky that the flag has such an appropriate +* name, and can in fact be safely cleared here. We could clear it +* before the __unmap_hugepage_range above, but all that's necessary +* is to clear it before releasing the i_mmap_mutex below. +* +* This works because in the contexts this is called, the VMA is +* going to be destroyed. It is not vunerable to madvise(DONTNEED) +* because madvise is not supported on hugetlbfs. The same applies +* for direct IO. unmap_hugepage_range() is only being called just +* before free_pgtables() so clearing VM_MAYSHARE will not cause +* surprises later. +*/ + vma->vm_flags &= ~VM_MAYSHARE ;mutex_unlock (&vma->vm_file->f_mapping->i_mmap_mutex); }
@@ -2853,9 +2869,14 @@ void hugetlb_change_protection(struct vm_area_struct *vma, } }spin_unlock (&mm->page_table_lock); -mutex_unlock (&vma->vm_file->f_mapping->i_mmap_mutex); - +/* +* Must flush TLB before releasing i_mmap_mutex: x86's huge_pmd_unshare +* may have cleared our pud entry and done put_page on the page table: +* once we release i_mmap_mutex, another task can do the final put_page +* and that page table be reused and filled with junk. +*/ flush_tlb_range (vma, start, end); +mutex_unlock (&vma->vm_file->f_mapping->i_mmap_mutex); } int hugetlb_reserve_pages(struct inode *inode,
mm/memory-failure.c +3 -3
@@ -1334,8 +1334,8 @@ static int soft_offline_huge_page(struct page *page, int flags)/* Keep page count to indicate a given hugepage is isolated. */ list_add (&hpage->lru, &pagelist); - ret =migrate_huge_pages (&pagelist, new_page,MPOL_MF_MOVE_ALL ,0 , - true); + ret =migrate_huge_pages (&pagelist, new_page,MPOL_MF_MOVE_ALL , false, +MIGRATE_SYNC );if (ret) {struct page *page1, *page2;list_for_each_entry_safe (page1, page2, &pagelist, lru)
@@ -1464,7 +1464,7 @@ int soft_offline_page(struct page *page, int flags) page_is_file_cache(page));list_add (&page->lru, &pagelist); ret =migrate_pages (&pagelist, new_page,MPOL_MF_MOVE_ALL , -0 ,MIGRATE_SYNC ); + false,MIGRATE_SYNC );if (ret) {putback_lru_pages (&pagelist); pr_info("soft offline: %#lx: migration failed %d, type %lx\n",
mm/mmu_notifier.c +23 -22
76 lines not on this page · raw message
net/core/dev.c +3 -0
@@ -1163,6 +1163,7 @@ static int __dev_open(struct net_device *dev)net_dmaengine_get ();dev_set_rx_mode (dev);dev_activate (dev); +add_device_randomness (dev->dev_addr, dev->addr_len); }return ret;
@@ -4730,6 +4731,7 @@ int dev_set_mac_address(struct net_device *dev, struct sockaddr *sa) err = ops->ndo_set_mac_address (dev, sa);if (!err)call_netdevice_notifiers (NETDEV_CHANGEADDR , dev); +add_device_randomness (dev->dev_addr, dev->addr_len);return err; }EXPORT_SYMBOL (dev_set_mac_address);
@@ -5507,6 +5509,7 @@ int register_netdevice(struct net_device *dev)dev_init_scheduler (dev);dev_hold (dev);list_netdevice (dev); +add_device_randomness (dev->dev_addr, dev->addr_len);/* Notify protocols, that a new device appeared. */ ret =call_netdevice_notifiers (NETDEV_REGISTER , dev);
net/core/rtnetlink.c +1 -0
@@ -1304,6 +1304,7 @@ static int do_setlink(struct net_device *dev, struct ifinfomsg *ifm, goto errout; send_addr_notify =1 ; modified =1 ; +add_device_randomness (dev->dev_addr, dev->addr_len); }if (tb[IFLA_MTU ]) {
net/mac80211/mesh.c +1 -0
@@ -490,6 +490,7 @@ void ieee80211_stop_mesh(struct ieee80211_sub_if_data *sdata)del_timer_sync (&sdata->u.mesh.housekeeping_timer);del_timer_sync (&sdata->u.mesh.mesh_path_root_timer); +del_timer_sync (&sdata->u.mesh.mesh_path_timer);/* * If the timer fired while we waited for it, it will have * requeued the work. Now the work will be running again
net/sunrpc/rpcb_clnt.c +2 -2
@@ -193,7 +193,7 @@ static int rpcb_create_local_unix(void)if (IS_ERR (clnt)) {dprintk ("RPC: failed to create AF_LOCAL rpcbind " "client (errno %ld).\n" ,PTR_ERR (clnt)); - result = -PTR_ERR (clnt); + result =PTR_ERR (clnt); goto out; }
@@ -242,7 +242,7 @@ static int rpcb_create_local_net(void)if (IS_ERR (clnt)) {dprintk ("RPC: failed to create local rpcbind " "client (errno %ld).\n" ,PTR_ERR (clnt)); - result = -PTR_ERR (clnt); + result =PTR_ERR (clnt); goto out; }
net/wireless/core.c +5 -0
@@ -959,6 +959,11 @@ static int cfg80211_netdev_notifier_call(struct notifier_block * nb,*/ synchronize_rcu ();INIT_LIST_HEAD (&wdev->list); +/* +* Ensure that all events have been processed and +* freed. +*/ +cfg80211_process_wdev_events (wdev);break ;case NETDEV_PRE_UP :if (!(wdev->wiphy->interface_modes &BIT (wdev->iftype)))
net/wireless/core.h +1 -0
@@ -426,6 +426,7 @@ int cfg80211_change_iface(struct cfg80211_registered_device *rdev, struct net_device *dev, enum nl80211_iftype ntype, u32 *flags, struct vif_params *params);void cfg80211_process_rdev_events (struct cfg80211_registered_device *rdev); +void cfg80211_process_wdev_events (struct wireless_dev *wdev); int cfg80211_can_change_interface(struct cfg80211_registered_device *rdev, struct wireless_dev *wdev,
net/wireless/util.c +4 -1
@@ -719,7 +719,7 @@ void cfg80211_upload_connect_keys(struct wireless_dev *wdev) wdev->connect_keys =NULL ; } -static void cfg80211_process_wdev_events (struct wireless_dev *wdev) +void cfg80211_process_wdev_events (struct wireless_dev *wdev) {struct cfg80211_event *ev;unsigned long flags;
@@ -975,6 +975,9 @@ int cfg80211_can_change_interface(struct cfg80211_registered_device *rdev, }mutex_unlock (&rdev->devlist_mtx); +if (total ==1 ) +return 0 ; +for (i =0 ; i < rdev->wiphy.n_iface_combinations; i++) {const struct ieee80211_iface_combination *c;struct ieee80211_iface_limit *limits;