1. 26 Aug, 2012 12 commits
    • Bjørn Mork's avatar
      USB: option: add ZTE K5006-Z · bb82df1a
      Bjørn Mork authored
      commit f1b5c997 upstream.
      
      The ZTE (Vodafone) K5006-Z use the following
      interface layout:
      
      00 DIAG
      01 secondary
      02 modem
      03 networkcard
      04 storage
      
      Ignoring interface #3 which is handled by the qmi_wwan
      driver.
      Signed-off-by: default avatarBjørn Mork <bjorn@mork.no>
      Cc: Thomas Schäfer <tschaefer@t-online.de>
      Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      bb82df1a
    • fangxiaozhi's avatar
      USB: support the new interfaces of Huawei Data Card devices in option driver · 0dfcf2c7
      fangxiaozhi authored
      commit ee6f827d upstream.
      
      In this patch, we add new declarations into option.c to support the new
      interfaces of Huawei Data Card devices. And at the same time, remove the
      redundant declarations from option.c.
      Signed-off-by: default avatarfangxiaozhi <huananhu@huawei.com>
      Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      0dfcf2c7
    • Gustavo Padovan's avatar
      USB: add USB_VENDOR_AND_INTERFACE_INFO() macro · 1289a4da
      Gustavo Padovan authored
      commit d81a5d19 upstream.
      
      A lot of Broadcom Bluetooth devices provides vendor specific interface
      class and we are getting flooded by patches adding new device support.
      This change will help us enable support for any other Broadcom with vendor
      specific device that arrives in the future.
      
      Only the product id changes for those devices, so this macro would be
      perfect for us:
      
      { USB_VENDOR_AND_INTERFACE_INFO(0x0a5c, 0xff, 0x01, 0x01) }
      Signed-off-by: default avatarMarcel Holtmann <marcel@holtmann.org>
      Signed-off-by: default avatarGustavo Padovan <gustavo.padovan@collabora.co.uk>
      Acked-by: default avatarHenrik Rydberg <rydberg@bitmath.se>
      Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      1289a4da
    • Sarah Sharp's avatar
      xhci: Switch PPT ports to EHCI on shutdown. · 0135372d
      Sarah Sharp authored
      commit e95829f4 upstream.
      
      The Intel desktop boards DH77EB and DH77DF have a hardware issue that
      can be worked around by BIOS.  If the USB ports are switched to xHCI on
      shutdown, the xHCI host will send a spurious interrupt, which will wake
      the system.  Some BIOS will work around this, but not all.
      
      The bug can be avoided if the USB ports are switched back to EHCI on
      shutdown.  The Intel Windows driver switches the ports back to EHCI, so
      change the Linux xHCI driver to do the same.
      
      Unfortunately, we can't tell the two effected boards apart from other
      working motherboards, because the vendors will change the DMI strings
      for the DH77EB and DH77DF boards to their own custom names.  One example
      is Compulab's mini-desktop, the Intense-PC.  Instead, key off the
      Panther Point xHCI host PCI vendor and device ID, and switch the ports
      over for all PPT xHCI hosts.
      
      The only impact this will have on non-effected boards is to add a couple
      hundred milliseconds delay on boot when the BIOS has to switch the ports
      over from EHCI to xHCI.
      
      This patch should be backported to kernels as old as 3.0, that contain
      the commit 69e848c2 "Intel xhci: Support
      EHCI/xHCI port switching."
      Signed-off-by: default avatarSarah Sharp <sarah.a.sharp@linux.intel.com>
      Reported-by: default avatarDenis Turischev <denis@compulab.co.il>
      Tested-by: default avatarDenis Turischev <denis@compulab.co.il>
      Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      0135372d
    • Sarah Sharp's avatar
      xhci: Increase reset timeout for Renesas 720201 host. · b474a496
      Sarah Sharp authored
      commit 22ceac19 upstream.
      
      The NEC/Renesas 720201 xHCI host controller does not complete its reset
      within 250 milliseconds.  In fact, it takes about 9 seconds to reset the
      host controller, and 1 second for the host to be ready for doorbell
      rings.  Extend the reset and CNR polling timeout to 10 seconds each.
      
      This patch should be backported to kernels as old as 2.6.31, that
      contain the commit 66d4eadd "USB: xhci:
      BIOS handoff and HW initialization."
      Signed-off-by: default avatarSarah Sharp <sarah.a.sharp@linux.intel.com>
      Reported-by: default avatarEdwin Klein Mentink <e.kleinmentink@zonnet.nl>
      Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      b474a496
    • Sarah Sharp's avatar
      xhci: Add Etron XHCI_TRUST_TX_LENGTH quirk. · 6216cf6a
      Sarah Sharp authored
      commit 5cb7df2b upstream.
      
      Gary reports that with recent kernels, he notices more xHCI driver
      warnings:
      
      xhci_hcd 0000:03:00.0: WARN Successful completion on short TX: needs XHCI_TRUST_TX_LENGTH quirk?
      
      We think his Etron xHCI host controller may have the same buggy behavior
      as the Fresco Logic xHCI host.  When a short transfer is received, the
      host will mark the transfer as successfully completed when it should be
      marking it with a short completion.
      
      Fix this by turning on the XHCI_TRUST_TX_LENGTH quirk when the Etron
      host is discovered.  Note that Gary has revision 1, but if Etron fixes
      this bug in future revisions, the quirk will have no effect.
      
      This patch should be backported to kernels as old as 2.6.36, that
      contain a backported version of commit
      1530bbc6 "xhci: Add new short TX quirk
      for Fresco Logic host."
      Signed-off-by: default avatarSarah Sharp <sarah.a.sharp@linux.intel.com>
      Reported-by: default avatarGary E. Miller <gem@rellim.com>
      Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      6216cf6a
    • Theodore Ts'o's avatar
      ext4: avoid kmemcheck complaint from reading uninitialized memory · b1aa47ae
      Theodore Ts'o authored
      commit 7e731bc9 upstream.
      
      Commit 03179fe9 introduced a kmemcheck complaint in
      ext4_da_get_block_prep() because we save and restore
      ei->i_da_metadata_calc_last_lblock even though it is left
      uninitialized in the case where i_da_metadata_calc_len is zero.
      
      This doesn't hurt anything, but silencing the kmemcheck complaint
      makes it easier for people to find real bugs.
      
      Addresses https://bugzilla.kernel.org/show_bug.cgi?id=45631
      (which is marked as a regression).
      Signed-off-by: default avatar"Theodore Ts'o" <tytso@mit.edu>
      Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      b1aa47ae
    • Jerome Glisse's avatar
      drm/radeon: do not reenable crtc after moving vram start address · f5a5aa3a
      Jerome Glisse authored
      commit 81ee8fb6 upstream.
      
      It seems we can not update the crtc scanout address. After disabling
      crtc, update to base address do not take effect after crtc being
      reenable leading to at least frame being scanout from the old crtc
      base address. Disabling crtc display request lead to same behavior.
      
      So after changing the vram address if we don't keep crtc disabled
      we will have the GPU trying to read some random system memory address
      with some iommu this will broke the crtc engine and will lead to
      broken display and iommu error message.
      
      So to avoid this, disable crtc. For flicker less boot we will need
      to avoid moving the vram start address.
      
      This patch should also fix :
      
      https://bugs.freedesktop.org/show_bug.cgi?id=42373Signed-off-by: default avatarJerome Glisse <jglisse@redhat.com>
      Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      f5a5aa3a
    • Daniel Vetter's avatar
      drm/i915: correctly order the ring init sequence · 413b13d9
      Daniel Vetter authored
      commit 0d8957c8 upstream.
      
      We may only start to set up the new register values after having
      confirmed that the ring is truely off. Otherwise the hw might lose the
      newly written register values. This is caught later on in the init
      sequence, when we check whether the register writes have stuck.
      Reviewed-by: default avatarJani Nikula <jani.nikula@intel.com>
      Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=50522Tested-by: default avatarYang Guang <guang.a.yang@intel.com>
      Signed-off-by: default avatarDaniel Vetter <daniel.vetter@ffwll.ch>
      Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      413b13d9
    • Stefano Stabellini's avatar
      xen: mark local pages as FOREIGN in the m2p_override · 318095d3
      Stefano Stabellini authored
      commit b9e0d95c upstream.
      
      When the frontend and the backend reside on the same domain, even if we
      add pages to the m2p_override, these pages will never be returned by
      mfn_to_pfn because the check "get_phys_to_machine(pfn) != mfn" will
      always fail, so the pfn of the frontend will be returned instead
      (resulting in a deadlock because the frontend pages are already locked).
      
      INFO: task qemu-system-i38:1085 blocked for more than 120 seconds.
      "echo 0 > /proc/sys/kernel/hung_task_timeout_secs" disables this message.
      qemu-system-i38 D ffff8800cfc137c0     0  1085      1 0x00000000
       ffff8800c47ed898 0000000000000282 ffff8800be4596b0 00000000000137c0
       ffff8800c47edfd8 ffff8800c47ec010 00000000000137c0 00000000000137c0
       ffff8800c47edfd8 00000000000137c0 ffffffff82213020 ffff8800be4596b0
      Call Trace:
       [<ffffffff81101ee0>] ? __lock_page+0x70/0x70
       [<ffffffff81a0fdd9>] schedule+0x29/0x70
       [<ffffffff81a0fe80>] io_schedule+0x60/0x80
       [<ffffffff81101eee>] sleep_on_page+0xe/0x20
       [<ffffffff81a0e1ca>] __wait_on_bit_lock+0x5a/0xc0
       [<ffffffff81101ed7>] __lock_page+0x67/0x70
       [<ffffffff8106f750>] ? autoremove_wake_function+0x40/0x40
       [<ffffffff811867e6>] ? bio_add_page+0x36/0x40
       [<ffffffff8110b692>] set_page_dirty_lock+0x52/0x60
       [<ffffffff81186021>] bio_set_pages_dirty+0x51/0x70
       [<ffffffff8118c6b4>] do_blockdev_direct_IO+0xb24/0xeb0
       [<ffffffff811e71a0>] ? ext3_get_blocks_handle+0xe00/0xe00
       [<ffffffff8118ca95>] __blockdev_direct_IO+0x55/0x60
       [<ffffffff811e71a0>] ? ext3_get_blocks_handle+0xe00/0xe00
       [<ffffffff811e91c8>] ext3_direct_IO+0xf8/0x390
       [<ffffffff811e71a0>] ? ext3_get_blocks_handle+0xe00/0xe00
       [<ffffffff81004b60>] ? xen_mc_flush+0xb0/0x1b0
       [<ffffffff81104027>] generic_file_aio_read+0x737/0x780
       [<ffffffff813bedeb>] ? gnttab_map_refs+0x15b/0x1e0
       [<ffffffff811038f0>] ? find_get_pages+0x150/0x150
       [<ffffffff8119736c>] aio_rw_vect_retry+0x7c/0x1d0
       [<ffffffff811972f0>] ? lookup_ioctx+0x90/0x90
       [<ffffffff81198856>] aio_run_iocb+0x66/0x1a0
       [<ffffffff811998b8>] do_io_submit+0x708/0xb90
       [<ffffffff81199d50>] sys_io_submit+0x10/0x20
       [<ffffffff81a18d69>] system_call_fastpath+0x16/0x1b
      
      The explanation is in the comment within the code:
      
      We need to do this because the pages shared by the frontend
      (xen-blkfront) can be already locked (lock_page, called by
      do_read_cache_page); when the userspace backend tries to use them
      with direct_IO, mfn_to_pfn returns the pfn of the frontend, so
      do_blockdev_direct_IO is going to try to lock the same pages
      again resulting in a deadlock.
      
      A simplified call graph looks like this:
      
      pygrub                          QEMU
      -----------------------------------------------
      do_read_cache_page              io_submit
        |                              |
      lock_page                       ext3_direct_IO
                                       |
                                      bio_add_page
                                       |
                                      lock_page
      
      Internally the xen-blkback uses m2p_add_override to swizzle (temporarily)
      a 'struct page' to have a different MFN (so that it can point to another
      guest). It also can easily find out whether another pfn corresponding
      to the mfn exists in the m2p, and can set the FOREIGN bit
      in the p2m, making sure that mfn_to_pfn returns the pfn of the backend.
      
      This allows the backend to perform direct_IO on these pages, but as a
      side effect prevents the frontend from using get_user_pages_fast on
      them while they are being shared with the backend.
      Signed-off-by: default avatarStefano Stabellini <stefano.stabellini@eu.citrix.com>
      Signed-off-by: default avatarKonrad Rzeszutek Wilk <konrad.wilk@oracle.com>
      Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      318095d3
    • Zach Brown's avatar
      fuse: verify all ioctl retry iov elements · bd697182
      Zach Brown authored
      commit fb6ccff6 upstream.
      
      Commit 7572777e attempted to verify that
      the total iovec from the client doesn't overflow iov_length() but it
      only checked the first element.  The iovec could still overflow by
      starting with a small element.  The obvious fix is to check all the
      elements.
      
      The overflow case doesn't look dangerous to the kernel as the copy is
      limited by the length after the overflow.  This fix restores the
      intention of returning an error instead of successfully copying less
      than the iovec represented.
      
      I found this by code inspection.  I built it but don't have a test case.
      I'm cc:ing stable because the initial commit did as well.
      Signed-off-by: default avatarZach Brown <zab@redhat.com>
      Signed-off-by: default avatarMiklos Szeredi <mszeredi@suse.cz>
      Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      bd697182
    • Heiko Carstens's avatar
      s390/compat: fix mmap compat system calls · 44d33984
      Heiko Carstens authored
      commit e8587121 upstream.
      
      The native 31 bit and the compat behaviour for the mmap system calls differ:
      
      In native 31 bit mode the passed in address for the mmap system call will be
      unmodified passed to sys_mmap_pgoff().
      In compat mode however the passed in address will be modified with
      compat_ptr() which masks out the most significant bit.
      
      The result is that in native 31 bit mode each mmap request (with MAP_FIXED)
      will fail where the most significat bit is set, while in compat mode it
      may succeed.
      
      This odd behaviour was introduced with d3815898 "[S390] mmap: add missing
      compat_ptr conversion to both mmap compat syscalls".
      
      To restore a consistent behaviour accross native and compat mode this
      patch functionally reverts the above mentioned commit.
      Signed-off-by: default avatarHeiko Carstens <heiko.carstens@de.ibm.com>
      Signed-off-by: default avatarMartin Schwidefsky <schwidefsky@de.ibm.com>
      Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      44d33984
  2. 15 Aug, 2012 28 commits
    • Greg Kroah-Hartman's avatar
      Linux 3.0.41 · a422ca75
      Greg Kroah-Hartman authored
      a422ca75
    • Stanislaw Gruszka's avatar
      rt61pci: fix NULL pointer dereference in config_lna_gain · 931d5990
      Stanislaw Gruszka authored
      commit deee0214 upstream.
      
      We can not pass NULL libconf->conf->channel to rt61pci_config() as it
      is dereferenced unconditionally in rt61pci_config_lna_gain() subroutine.
      
      Resolves:
      https://bugzilla.kernel.org/show_bug.cgi?id=44361
      
      Reported-and-tested-by: <dolohow@gmail.com>
      Signed-off-by: default avatarStanislaw Gruszka <sgruszka@redhat.com>
      Signed-off-by: default avatarJohn W. Linville <linville@tuxdriver.com>
      Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      931d5990
    • Chris Bagwell's avatar
      Input: wacom - Bamboo One 1024 pressure fix · ab7029e6
      Chris Bagwell authored
      commit 6dc46351 upstream.
      
      Bamboo One's with ID of 0x6a and 0x6b were added with correct
      indication of 1024 pressure levels but the Graphire packet routine
      was only looking at 9 bits.  Increased to 10 bits.
      
      This bug caused these devices to roll over to zero pressure at half
      way mark.
      
      The other devices using this routine only support 256 or 512 range
      and look to fix unused bits at zero.
      Signed-off-by: default avatarChris Bagwell <chris@cnpbagwell.com>
      Reported-by: default avatarTushant Mirchandani <tushantin@gmail.com>
      Reviewed-by: default avatarPing Cheng <pingc@wacom.com>
      Signed-off-by: default avatarDmitry Torokhov <dtor@mail.ru>
      Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      ab7029e6
    • Tushar Dave's avatar
      e1000e: NIC goes up and immediately goes down · 5a4cebe9
      Tushar Dave authored
      commit b7ec70be upstream.
      
      Found that commit d478eb44 was a bad commit.
      If the link partner is transmitting codeword (even if NULL codeword),
      then the RXCW.C bit will be set so check for RXCW.CW is unnecessary.
      Ref: RH BZ 840642
      Reported-by: default avatarFabio Futigami <ffutigam@redhat.com>
      Signed-off-by: default avatarTushar Dave <tushar.n.dave@intel.com>
      CC: Marcelo Ricardo Leitner <mleitner@redhat.com>
      Tested-by: default avatarAaron Brown <aaron.f.brown@intel.com>
      Signed-off-by: default avatarPeter P Waskiewicz Jr <peter.p.waskiewicz.jr@intel.com>
      Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      5a4cebe9
    • Liang Li's avatar
      cfg80211: fix interface combinations check for ADHOC(IBSS) · 4f5a5866
      Liang Li authored
      partial of commit 8e8b41f9 upstream.
      
      As part of commit 463454b5 ("cfg80211: fix interface
      combinations check"), this extra check was introduced:
      
             if ((all_iftypes & used_iftypes) != used_iftypes)
                     goto cont;
      
      However, most wireless NIC drivers did not advertise ADHOC in
      wiphy.iface_combinations[i].limits[] and hence we'll get -EBUSY
      when we bring up a ADHOC wlan with commands similar to:
      
       # iwconfig wlan0 mode ad-hoc && ifconfig wlan0 up
      
      In commit 8e8b41f9 ("cfg80211: enforce lack of interface
      combinations"), the change below fixes the issue:
      
             if (total == 1)
                     return 0;
      
      But it also introduces other dependencies for stable. For example,
      a full cherry pick of 8e8b41f9 would introduce additional
      regressions unless we also start cherry picking driver specific
      fixes like the following:
      
        9b4760e3  ath5k: add possible wiphy interface combinations
        1ae2fc25  mac80211_hwsim: advertise interface combinations
        20c8e8dc  ath9k: add possible wiphy interface combinations
      
      And the purpose of the 'if (total == 1)' is to cover the specific
      use case (IBSS, adhoc) that was mentioned above. So we just pick
      the specific part out from 8e8b41f9 here.
      
      Doing so gives stable kernels a way to fix the change introduced
      by 463454b5, without having to make cherry picks specific to
      various NIC drivers.
      Signed-off-by: default avatarLiang Li <liang.li@windriver.com>
      Signed-off-by: default avatarPaul Gortmaker <paul.gortmaker@windriver.com>
      Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      4f5a5866
    • Daniel Drake's avatar
      cfg80211: process pending events when unregistering net device · b27c59d2
      Daniel Drake authored
      commit 1f6fc43e upstream.
      
      libertas currently calls cfg80211_disconnected() when it is being
      brought down. This causes an event to be allocated, but since the
      wdev is already removed from the rdev by the time that the event
      processing work executes, the event is never processed or freed.
      http://article.gmane.org/gmane.linux.kernel.wireless.general/95666
      
      Fix this leak, and other possible situations, by processing the event
      queue when a device is being unregistered. Thanks to Johannes Berg for
      the suggestion.
      Signed-off-by: default avatarDaniel Drake <dsd@laptop.org>
      Reviewed-by: default avatarJohannes Berg <johannes@sipsolutions.net>
      Signed-off-by: default avatarJohn W. Linville <linville@tuxdriver.com>
      Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      b27c59d2
    • Arnd Bergmann's avatar
      ARM: pxa: remove irq_to_gpio from ezx-pcap driver · 9f75ebd8
      Arnd Bergmann authored
      commit 59ee93a5 upstream.
      
      The irq_to_gpio function was removed from the pxa platform
      in linux-3.2, and this driver has been broken since.
      
      There is actually no in-tree user of this driver that adds
      this platform device, but the driver can and does get enabled
      on some platforms.
      
      Without this patch, building ezx_defconfig results in:
      
      drivers/mfd/ezx-pcap.c: In function 'pcap_isr_work':
      drivers/mfd/ezx-pcap.c:205:2: error: implicit declaration of function 'irq_to_gpio' [-Werror=implicit-function-declaration]
      Signed-off-by: default avatarArnd Bergmann <arnd@arndb.de>
      Acked-by: default avatarHaojian Zhuang <haojian.zhuang@gmail.com>
      Cc: Samuel Ortiz <sameo@linux.intel.com>
      Cc: Daniel Ribeiro <drwyrm@gmail.com>
      Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      9f75ebd8
    • Marek Vasut's avatar
      ARM: mxs: Remove MMAP_MIN_ADDR setting from mxs_defconfig · c75f1f09
      Marek Vasut authored
      commit 3bed491c upstream.
      
      The CONFIG_DEFAULT_MMAP_MIN_ADDR was set to 65536 in mxs_defconfig,
      this caused severe breakage of userland applications since the upper
      limit for ARM is 32768. By default CONFIG_DEFAULT_MMAP_MIN_ADDR is
      set to 4096 and can also be changed via /proc/sys/vm/mmap_min_addr
      if needed.
      
      Quoting Russell King [1]:
      
      "4096 is also fine for ARM too. There's not much point in having
      defconfigs change it - that would just be pure noise in the config
      files."
      
      the CONFIG_DEFAULT_MMAP_MIN_ADDR can be removed from the defconfig
      altogether.
      
      This problem was introduced by commit cde7c41f (ARM: configs: add
      defconfig for mach-mxs).
      
      [1] http://marc.info/?l=linux-arm-kernel&m=134401593807820&w=2Signed-off-by: default avatarMarek Vasut <marex@denx.de>
      Cc: Russell King <linux@arm.linux.org.uk>
      Cc: Wolfgang Denk <wd@denx.de>
      Signed-off-by: default avatarShawn Guo <shawn.guo@linaro.org>
      Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      c75f1f09
    • Mel Gorman's avatar
      mm: hugetlbfs: close race during teardown of hugetlbfs shared page tables · 4c9682c5
      Mel Gorman authored
      commit d833352a upstream.
      
      If a process creates a large hugetlbfs mapping that is eligible for page
      table sharing and forks heavily with children some of whom fault and
      others which destroy the mapping then it is possible for page tables to
      get corrupted.  Some teardowns of the mapping encounter a "bad pmd" and
      output a message to the kernel log.  The final teardown will trigger a
      BUG_ON in mm/filemap.c.
      
      This was reproduced in 3.4 but is known to have existed for a long time
      and goes back at least as far as 2.6.37.  It was probably was introduced
      in 2.6.20 by [39dde65c: shared page table for hugetlb page].  The messages
      look like this;
      
      [  ..........] Lots of bad pmd messages followed by this
      [  127.164256] mm/memory.c:391: bad pmd ffff880412e04fe8(80000003de4000e7).
      [  127.164257] mm/memory.c:391: bad pmd ffff880412e04ff0(80000003de6000e7).
      [  127.164258] mm/memory.c:391: bad pmd ffff880412e04ff8(80000003de0000e7).
      [  127.186778] ------------[ cut here ]------------
      [  127.186781] kernel BUG at mm/filemap.c:134!
      [  127.186782] invalid opcode: 0000 [#1] SMP
      [  127.186783] CPU 7
      [  127.186784] Modules linked in: af_packet cpufreq_conservative cpufreq_userspace cpufreq_powersave acpi_cpufreq mperf ext3 jbd dm_mod coretemp crc32c_intel usb_storage ghash_clmulni_intel aesni_intel i2c_i801 r8169 mii uas sr_mod cdrom sg iTCO_wdt iTCO_vendor_support shpchp serio_raw cryptd aes_x86_64 e1000e pci_hotplug dcdbas aes_generic container microcode ext4 mbcache jbd2 crc16 sd_mod crc_t10dif i915 drm_kms_helper drm i2c_algo_bit ehci_hcd ahci libahci usbcore rtc_cmos usb_common button i2c_core intel_agp video intel_gtt fan processor thermal thermal_sys hwmon ata_generic pata_atiixp libata scsi_mod
      [  127.186801]
      [  127.186802] Pid: 9017, comm: hugetlbfs-test Not tainted 3.4.0-autobuild #53 Dell Inc. OptiPlex 990/06D7TR
      [  127.186804] RIP: 0010:[<ffffffff810ed6ce>]  [<ffffffff810ed6ce>] __delete_from_page_cache+0x15e/0x160
      [  127.186809] RSP: 0000:ffff8804144b5c08  EFLAGS: 00010002
      [  127.186810] RAX: 0000000000000001 RBX: ffffea000a5c9000 RCX: 00000000ffffffc0
      [  127.186811] RDX: 0000000000000000 RSI: 0000000000000009 RDI: ffff88042dfdad00
      [  127.186812] RBP: ffff8804144b5c18 R08: 0000000000000009 R09: 0000000000000003
      [  127.186813] R10: 0000000000000000 R11: 000000000000002d R12: ffff880412ff83d8
      [  127.186814] R13: ffff880412ff83d8 R14: 0000000000000000 R15: ffff880412ff83d8
      [  127.186815] FS:  00007fe18ed2c700(0000) GS:ffff88042dce0000(0000) knlGS:0000000000000000
      [  127.186816] CS:  0010 DS: 0000 ES: 0000 CR0: 000000008005003b
      [  127.186817] CR2: 00007fe340000503 CR3: 0000000417a14000 CR4: 00000000000407e0
      [  127.186818] DR0: 0000000000000000 DR1: 0000000000000000 DR2: 0000000000000000
      [  127.186819] DR3: 0000000000000000 DR6: 00000000ffff0ff0 DR7: 0000000000000400
      [  127.186820] Process hugetlbfs-test (pid: 9017, threadinfo ffff8804144b4000, task ffff880417f803c0)
      [  127.186821] Stack:
      [  127.186822]  ffffea000a5c9000 0000000000000000 ffff8804144b5c48 ffffffff810ed83b
      [  127.186824]  ffff8804144b5c48 000000000000138a 0000000000001387 ffff8804144b5c98
      [  127.186825]  ffff8804144b5d48 ffffffff811bc925 ffff8804144b5cb8 0000000000000000
      [  127.186827] Call Trace:
      [  127.186829]  [<ffffffff810ed83b>] delete_from_page_cache+0x3b/0x80
      [  127.186832]  [<ffffffff811bc925>] truncate_hugepages+0x115/0x220
      [  127.186834]  [<ffffffff811bca43>] hugetlbfs_evict_inode+0x13/0x30
      [  127.186837]  [<ffffffff811655c7>] evict+0xa7/0x1b0
      [  127.186839]  [<ffffffff811657a3>] iput_final+0xd3/0x1f0
      [  127.186840]  [<ffffffff811658f9>] iput+0x39/0x50
      [  127.186842]  [<ffffffff81162708>] d_kill+0xf8/0x130
      [  127.186843]  [<ffffffff81162812>] dput+0xd2/0x1a0
      [  127.186845]  [<ffffffff8114e2d0>] __fput+0x170/0x230
      [  127.186848]  [<ffffffff81236e0e>] ? rb_erase+0xce/0x150
      [  127.186849]  [<ffffffff8114e3ad>] fput+0x1d/0x30
      [  127.186851]  [<ffffffff81117db7>] remove_vma+0x37/0x80
      [  127.186853]  [<ffffffff81119182>] do_munmap+0x2d2/0x360
      [  127.186855]  [<ffffffff811cc639>] sys_shmdt+0xc9/0x170
      [  127.186857]  [<ffffffff81410a39>] system_call_fastpath+0x16/0x1b
      [  127.186858] Code: 0f 1f 44 00 00 48 8b 43 08 48 8b 00 48 8b 40 28 8b b0 40 03 00 00 85 f6 0f 88 df fe ff ff 48 89 df e8 e7 cb 05 00 e9 d2 fe ff ff <0f> 0b 55 83 e2 fd 48 89 e5 48 83 ec 30 48 89 5d d8 4c 89 65 e0
      [  127.186868] RIP  [<ffffffff810ed6ce>] __delete_from_page_cache+0x15e/0x160
      [  127.186870]  RSP <ffff8804144b5c08>
      [  127.186871] ---[ end trace 7cbac5d1db69f426 ]---
      
      The bug is a race and not always easy to reproduce.  To reproduce it I was
      doing the following on a single socket I7-based machine with 16G of RAM.
      
      $ hugeadm --pool-pages-max DEFAULT:13G
      $ echo $((18*1048576*1024)) > /proc/sys/kernel/shmmax
      $ echo $((18*1048576*1024)) > /proc/sys/kernel/shmall
      $ for i in `seq 1 9000`; do ./hugetlbfs-test; done
      
      On my particular machine, it usually triggers within 10 minutes but
      enabling debug options can change the timing such that it never hits.
      Once the bug is triggered, the machine is in trouble and needs to be
      rebooted.  The machine will respond but processes accessing proc like "ps
      aux" will hang due to the BUG_ON.  shutdown will also hang and needs a
      hard reset or a sysrq-b.
      
      The basic problem is a race between page table sharing and teardown.  For
      the most part page table sharing depends on i_mmap_mutex.  In some cases,
      it is also taking the mm->page_table_lock for the PTE updates but with
      shared page tables, it is the i_mmap_mutex that is more important.
      
      Unfortunately it appears to be also insufficient. Consider the following
      situation
      
      Process A					Process B
      ---------					---------
      hugetlb_fault					shmdt
        						LockWrite(mmap_sem)
          						  do_munmap
      						    unmap_region
      						      unmap_vmas
      						        unmap_single_vma
      						          unmap_hugepage_range
            						            Lock(i_mmap_mutex)
      							    Lock(mm->page_table_lock)
      							    huge_pmd_unshare/unmap tables <--- (1)
      							    Unlock(mm->page_table_lock)
            						            Unlock(i_mmap_mutex)
        huge_pte_alloc				      ...
          Lock(i_mmap_mutex)				      ...
          vma_prio_walk, find svma, spte		      ...
          Lock(mm->page_table_lock)			      ...
          share spte					      ...
          Unlock(mm->page_table_lock)			      ...
          Unlock(i_mmap_mutex)			      ...
        hugetlb_no_page									  <--- (2)
      						      free_pgtables
      						        unlink_file_vma
      							hugetlb_free_pgd_range
      						    remove_vma_list
      
      In this scenario, it is possible for Process A to share page tables with
      Process B that is trying to tear them down.  The i_mmap_mutex on its own
      does not prevent Process A walking Process B's page tables.  At (1) above,
      the page tables are not shared yet so it unmaps the PMDs.  Process A sets
      up page table sharing and at (2) faults a new entry.  Process B then trips
      up on it in free_pgtables.
      
      This patch fixes the problem by adding a new function
      __unmap_hugepage_range_final that is only called when the VMA is about to
      be destroyed.  This function clears VM_MAYSHARE during
      unmap_hugepage_range() under the i_mmap_mutex.  This makes the VMA
      ineligible for sharing and avoids the race.  Superficially this looks like
      it would then be vunerable to truncate and madvise issues but hugetlbfs
      has its own truncate handlers so does not use unmap_mapping_range() and
      does not support madvise(DONTNEED).
      
      This should be treated as a -stable candidate if it is merged.
      
      Test program is as follows. The test case was mostly written by Michal
      Hocko with a few minor changes to reproduce this bug.
      
      ==== CUT HERE ====
      
      static size_t huge_page_size = (2UL << 20);
      static size_t nr_huge_page_A = 512;
      static size_t nr_huge_page_B = 5632;
      
      unsigned int get_random(unsigned int max)
      {
      	struct timeval tv;
      
      	gettimeofday(&tv, NULL);
      	srandom(tv.tv_usec);
      	return random() % max;
      }
      
      static void play(void *addr, size_t size)
      {
      	unsigned char *start = addr,
      		      *end = start + size,
      		      *a;
      	start += get_random(size/2);
      
      	/* we could itterate on huge pages but let's give it more time. */
      	for (a = start; a < end; a += 4096)
      		*a = 0;
      }
      
      int main(int argc, char **argv)
      {
      	key_t key = IPC_PRIVATE;
      	size_t sizeA = nr_huge_page_A * huge_page_size;
      	size_t sizeB = nr_huge_page_B * huge_page_size;
      	int shmidA, shmidB;
      	void *addrA = NULL, *addrB = NULL;
      	int nr_children = 300, n = 0;
      
      	if ((shmidA = shmget(key, sizeA, IPC_CREAT|SHM_HUGETLB|0660)) == -1) {
      		perror("shmget:");
      		return 1;
      	}
      
      	if ((addrA = shmat(shmidA, addrA, SHM_R|SHM_W)) == (void *)-1UL) {
      		perror("shmat");
      		return 1;
      	}
      	if ((shmidB = shmget(key, sizeB, IPC_CREAT|SHM_HUGETLB|0660)) == -1) {
      		perror("shmget:");
      		return 1;
      	}
      
      	if ((addrB = shmat(shmidB, addrB, SHM_R|SHM_W)) == (void *)-1UL) {
      		perror("shmat");
      		return 1;
      	}
      
      fork_child:
      	switch(fork()) {
      		case 0:
      			switch (n%3) {
      			case 0:
      				play(addrA, sizeA);
      				break;
      			case 1:
      				play(addrB, sizeB);
      				break;
      			case 2:
      				break;
      			}
      			break;
      		case -1:
      			perror("fork:");
      			break;
      		default:
      			if (++n < nr_children)
      				goto fork_child;
      			play(addrA, sizeA);
      			break;
      	}
      	shmdt(addrA);
      	shmdt(addrB);
      	do {
      		wait(NULL);
      	} while (--n > 0);
      	shmctl(shmidA, IPC_RMID, NULL);
      	shmctl(shmidB, IPC_RMID, NULL);
      	return 0;
      }
      
      [akpm@linux-foundation.org: name the declaration's args, fix CONFIG_HUGETLBFS=n build]
      Signed-off-by: default avatarHugh Dickins <hughd@google.com>
      Reviewed-by: default avatarMichal Hocko <mhocko@suse.cz>
      Signed-off-by: default avatarMel Gorman <mgorman@suse.de>
      Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
      Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
      Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      
      4c9682c5
    • Borislav Petkov's avatar
      x86, microcode: Sanitize per-cpu microcode reloading interface · bb014c40
      Borislav Petkov authored
      commit c9fc3f77 upstream.
      
      Microcode reloading in a per-core manner is a very bad idea for both
      major x86 vendors. And the thing is, we have such interface with which
      we can end up with different microcode versions applied on different
      cores of an otherwise homogeneous wrt (family,model,stepping) system.
      
      So turn off the possibility of doing that per core and allow it only
      system-wide.
      
      This is a minimal fix which we'd like to see in stable too thus the
      more-or-less arbitrary decision to allow system-wide reloading only on
      the BSP:
      
      $ echo 1 > /sys/devices/system/cpu/cpu0/microcode/reload
      ...
      
      and disable the interface on the other cores:
      
      $ echo 1 > /sys/devices/system/cpu/cpu23/microcode/reload
      -bash: echo: write error: Invalid argument
      
      Also, allowing the reload only from one CPU (the BSP in
      that case) doesn't allow the reload procedure to degenerate
      into an O(n^2) deal when triggering reloads from all
      /sys/devices/system/cpu/cpuX/microcode/reload sysfs nodes
      simultaneously.
      
      A more generic fix will follow.
      Signed-off-by: default avatarBorislav Petkov <borislav.petkov@amd.com>
      Cc: Henrique de Moraes Holschuh <hmh@hmh.eng.br>
      Cc: Peter Zijlstra <peterz@infradead.org>
      Link: http://lkml.kernel.org/r/1340280437-7718-2-git-send-email-bp@amd64.orgSigned-off-by: default avatarH. Peter Anvin <hpa@zytor.com>
      Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      bb014c40
    • Shuah Khan's avatar
      x86, microcode: microcode_core.c simple_strtoul cleanup · d426c789
      Shuah Khan authored
      commit e826abd5 upstream.
      
      Change reload_for_cpu() in kernel/microcode_core.c to call kstrtoul()
      instead of calling obsoleted simple_strtoul().
      Signed-off-by: default avatarShuah Khan <shuahkhan@gmail.com>
      Reviewed-by: default avatarBorislav Petkov <bp@alien8.de>
      Link: http://lkml.kernel.org/r/1336324264.2897.9.camel@lorien2Signed-off-by: default avatarH. Peter Anvin <hpa@linux.intel.com>
      Cc: Henrique de Moraes Holschuh <hmh@hmh.eng.br>
      Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      d426c789
    • H. Peter Anvin's avatar
      random: mix in architectural randomness in extract_buf() · 9f608240
      H. Peter Anvin authored
      commit d2e7c96a upstream.
      
      Mix in any architectural randomness in extract_buf() instead of
      xfer_secondary_buf().  This allows us to mix in more architectural
      randomness, and it also makes xfer_secondary_buf() faster, moving a
      tiny bit of additional CPU overhead to process which is extracting the
      randomness.
      
      [ Commit description modified by tytso to remove an extended
        advertisement for the RDRAND instruction. ]
      Signed-off-by: default avatarH. Peter Anvin <hpa@linux.intel.com>
      Acked-by: default avatarIngo Molnar <mingo@kernel.org>
      Cc: DJ Johnston <dj.johnston@intel.com>
      Signed-off-by: default avatarTheodore Ts'o <tytso@mit.edu>
      Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      9f608240
    • Tony Luck's avatar
      dmi: Feed DMI table to /dev/random driver · 4f4cb6f7
      Tony Luck authored
      commit d114a333 upstream.
      
      Send the entire DMI (SMBIOS) table to the /dev/random driver to
      help seed its pools.
      Signed-off-by: default avatarTony Luck <tony.luck@intel.com>
      Signed-off-by: default avatarTheodore Ts'o <tytso@mit.edu>
      Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      4f4cb6f7
    • Tony Luck's avatar
      random: Add comment to random_initialize() · dbbdd2bb
      Tony Luck authored
      commit cbc96b75 upstream.
      
      Many platforms have per-machine instance data (serial numbers,
      asset tags, etc.) squirreled away in areas that are accessed
      during early system bringup. Mixing this data into the random
      pools has a very high value in providing better random data,
      so we should allow (and even encourage) architecture code to
      call add_device_randomness() from the setup_arch() paths.
      
      However, this limits our options for internal structure of
      the random driver since random_initialize() is not called
      until long after setup_arch().
      
      Add a big fat comment to rand_initialize() spelling out
      this requirement.
      Suggested-by: default avatarTheodore Ts'o <tytso@mit.edu>
      Signed-off-by: default avatarTony Luck <tony.luck@intel.com>
      Signed-off-by: default avatarTheodore Ts'o <tytso@mit.edu>
      Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      dbbdd2bb
    • Theodore Ts'o's avatar
      random: remove rand_initialize_irq() · b6b847a9
      Theodore Ts'o authored
      commit c5857ccf upstream.
      
      With the new interrupt sampling system, we are no longer using the
      timer_rand_state structure in the irq descriptor, so we can stop
      initializing it now.
      
      [ Merged in fixes from Sedat to find some last missing references to
        rand_initialize_irq() ]
      Signed-off-by: default avatar"Theodore Ts'o" <tytso@mit.edu>
      Signed-off-by: default avatarSedat Dilek <sedat.dilek@gmail.com>
      Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      b6b847a9
    • Mark Brown's avatar
      mfd: wm831x: Feed the device UUID into device_add_randomness() · f99ef862
      Mark Brown authored
      commit 27130f0c upstream.
      
      wm831x devices contain a unique ID value. Feed this into the newly added
      device_add_randomness() to add some per device seed data to the pool.
      Signed-off-by: default avatarMark Brown <broonie@opensource.wolfsonmicro.com>
      Signed-off-by: default avatarTheodore Ts'o <tytso@mit.edu>
      Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      f99ef862
    • Mark Brown's avatar
      rtc: wm831x: Feed the write counter into device_add_randomness() · 2fcadd93
      Mark Brown authored
      commit 9dccf55f upstream.
      
      The tamper evident features of the RTC include the "write counter" which
      is a pseudo-random number regenerated whenever we set the RTC. Since this
      value is unpredictable it should provide some useful seeding to the random
      number generator.
      
      Only do this on boot since the goal is to seed the pool rather than add
      useful entropy.
      Signed-off-by: default avatarMark Brown <broonie@opensource.wolfsonmicro.com>
      Signed-off-by: default avatarTheodore Ts'o <tytso@mit.edu>
      Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      2fcadd93
    • Theodore Ts'o's avatar
      MAINTAINERS: Theodore Ts'o is taking over the random driver · 07895209
      Theodore Ts'o authored
      commit 330e0a01 upstream.
      
      Matt Mackall stepped down as the /dev/random driver maintainer last
      year, so Theodore Ts'o is taking back the /dev/random driver.
      
      Cc: Matt Mackall <mpm@selenic.com>
      Signed-off-by: default avatar"Theodore Ts'o" <tytso@mit.edu>
      Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      07895209
    • Theodore Ts'o's avatar
    • Theodore Ts'o's avatar
      random: add new get_random_bytes_arch() function · efe6c422
      Theodore Ts'o authored
      commit c2557a30 upstream.
      
      Create a new function, get_random_bytes_arch() which will use the
      architecture-specific hardware random number generator if it is
      present.  Change get_random_bytes() to not use the HW RNG, even if it
      is avaiable.
      
      The reason for this is that the hw random number generator is fast (if
      it is present), but it requires that we trust the hardware
      manufacturer to have not put in a back door.  (For example, an
      increasing counter encrypted by an AES key known to the NSA.)
      
      It's unlikely that Intel (for example) was paid off by the US
      Government to do this, but it's impossible for them to prove otherwise
        --- especially since Bull Mountain is documented to use AES as a
      whitener.  Hence, the output of an evil, trojan-horse version of
      RDRAND is statistically indistinguishable from an RDRAND implemented
      to the specifications claimed by Intel.  Short of using a tunnelling
      electronic microscope to reverse engineer an Ivy Bridge chip and
      disassembling and analyzing the CPU microcode, there's no way for us
      to tell for sure.
      
      Since users of get_random_bytes() in the Linux kernel need to be able
      to support hardware systems where the HW RNG is not present, most
      time-sensitive users of this interface have already created their own
      cryptographic RNG interface which uses get_random_bytes() as a seed.
      So it's much better to use the HW RNG to improve the existing random
      number generator, by mixing in any entropy returned by the HW RNG into
      /dev/random's entropy pool, but to always _use_ /dev/random's entropy
      pool.
      
      This way we get almost of the benefits of the HW RNG without any
      potential liabilities.  The only benefits we forgo is the
      speed/performance enhancements --- and generic kernel code can't
      depend on depend on get_random_bytes() having the speed of a HW RNG
      anyway.
      
      For those places that really want access to the arch-specific HW RNG,
      if it is available, we provide get_random_bytes_arch().
      Signed-off-by: default avatar"Theodore Ts'o" <tytso@mit.edu>
      Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      efe6c422
    • Theodore Ts'o's avatar
      random: use the arch-specific rng in xfer_secondary_pool · b2b6f120
      Theodore Ts'o authored
      commit e6d4947b upstream.
      
      If the CPU supports a hardware random number generator, use it in
      xfer_secondary_pool(), where it will significantly improve things and
      where we can afford it.
      
      Also, remove the use of the arch-specific rng in
      add_timer_randomness(), since the call is significantly slower than
      get_cycles(), and we're much better off using it in
      xfer_secondary_pool() anyway.
      Signed-off-by: default avatar"Theodore Ts'o" <tytso@mit.edu>
      Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      b2b6f120
    • Theodore Ts'o's avatar
      net: feed /dev/random with the MAC address when registering a device · 118f98c7
      Theodore Ts'o authored
      commit 7bf23575 upstream.
      Signed-off-by: default avatar"Theodore Ts'o" <tytso@mit.edu>
      Cc: David Miller <davem@davemloft.net>
      Cc: Linus Torvalds <torvalds@linux-foundation.org>
      Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      118f98c7
    • Theodore Ts'o's avatar
      usb: feed USB device information to the /dev/random driver · 52d1114f
      Theodore Ts'o authored
      commit b04b3156 upstream.
      
      Send the USB device's serial, product, and manufacturer strings to the
      /dev/random driver to help seed its pools.
      
      Cc: Linus Torvalds <torvalds@linux-foundation.org>
      Acked-by: default avatarGreg KH <greg@kroah.com>
      Signed-off-by: default avatar"Theodore Ts'o" <tytso@mit.edu>
      Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      52d1114f
    • Linus Torvalds's avatar
      random: create add_device_randomness() interface · 3e035335
      Linus Torvalds authored
      commit a2080a67 upstream.
      
      Add a new interface, add_device_randomness() for adding data to the
      random pool that is likely to differ between two devices (or possibly
      even per boot).  This would be things like MAC addresses or serial
      numbers, or the read-out of the RTC. This does *not* add any actual
      entropy to the pool, but it initializes the pool to different values
      for devices that might otherwise be identical and have very little
      entropy available to them (particularly common in the embedded world).
      
      [ Modified by tytso to mix in a timestamp, since there may be some
        variability caused by the time needed to detect/configure the hardware
        in question. ]
      Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
      Signed-off-by: default avatar"Theodore Ts'o" <tytso@mit.edu>
      Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      3e035335
    • Theodore Ts'o's avatar
      random: use lockless techniques in the interrupt path · ebb6006e
      Theodore Ts'o authored
      commit 902c098a upstream.
      
      The real-time Linux folks don't like add_interrupt_randomness() taking
      a spinlock since it is called in the low-level interrupt routine.
      This also allows us to reduce the overhead in the fast path, for the
      random driver, which is the interrupt collection path.
      Signed-off-by: default avatar"Theodore Ts'o" <tytso@mit.edu>
      Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      ebb6006e
    • Theodore Ts'o's avatar
      random: make 'add_interrupt_randomness()' do something sane · aa88dea2
      Theodore Ts'o authored
      commit 775f4b29 upstream.
      
      We've been moving away from add_interrupt_randomness() for various
      reasons: it's too expensive to do on every interrupt, and flooding the
      CPU with interrupts could theoretically cause bogus floods of entropy
      from a somewhat externally controllable source.
      
      This solves both problems by limiting the actual randomness addition
      to just once a second or after 64 interrupts, whicever comes first.
      During that time, the interrupt cycle data is buffered up in a per-cpu
      pool.  Also, we make sure the the nonblocking pool used by urandom is
      initialized before we start feeding the normal input pool.  This
      assures that /dev/urandom is returning unpredictable data as soon as
      possible.
      
      (Based on an original patch by Linus, but significantly modified by
      tytso.)
      Tested-by: default avatarEric Wustrow <ewust@umich.edu>
      Reported-by: default avatarEric Wustrow <ewust@umich.edu>
      Reported-by: default avatarNadia Heninger <nadiah@cs.ucsd.edu>
      Reported-by: default avatarZakir Durumeric <zakir@umich.edu>
      Reported-by: default avatarJ. Alex Halderman <jhalderm@umich.edu>
      Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
      Signed-off-by: default avatar"Theodore Ts'o" <tytso@mit.edu>
      Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      aa88dea2
    • Mathieu Desnoyers's avatar
      drivers/char/random.c: fix boot id uniqueness race · f5a1367c
      Mathieu Desnoyers authored
      commit 44e4360f upstream.
      
      /proc/sys/kernel/random/boot_id can be read concurrently by userspace
      processes.  If two (or more) user-space processes concurrently read
      boot_id when sysctl_bootid is not yet assigned, a race can occur making
      boot_id differ between the reads.  Because the whole point of the boot id
      is to be unique across a kernel execution, fix this by protecting this
      operation with a spinlock.
      
      Given that this operation is not frequently used, hitting the spinlock
      on each call should not be an issue.
      Signed-off-by: default avatarMathieu Desnoyers <mathieu.desnoyers@efficios.com>
      Cc: "Theodore Ts'o" <tytso@mit.edu>
      Cc: Matt Mackall <mpm@selenic.com>
      Signed-off-by: default avatarEric Dumazet <eric.dumazet@gmail.com>
      Cc: Greg Kroah-Hartman <greg@kroah.com>
      Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
      Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
      Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      f5a1367c
    • H. Peter Anvin's avatar
      random: Adjust the number of loops when initializing · a5914eb0
      H. Peter Anvin authored
      commit 2dac8e54 upstream.
      
      When we are initializing using arch_get_random_long() we only need to
      loop enough times to touch all the bytes in the buffer; using
      poolwords for that does twice the number of operations necessary on a
      64-bit machine, since in the random number generator code "word" means
      32 bits.
      Signed-off-by: default avatarH. Peter Anvin <hpa@linux.intel.com>
      Cc: "Theodore Ts'o" <tytso@mit.edu>
      Link: http://lkml.kernel.org/r/1324589281-31931-1-git-send-email-tytso@mit.eduSigned-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      a5914eb0