1. 17 2月, 2012 4 次提交
    • L
      i387: do not preload FPU state at task switch time · b3b0870e
      Linus Torvalds 提交于
      Yes, taking the trap to re-load the FPU/MMX state is expensive, but so
      is spending several days looking for a bug in the state save/restore
      code.  And the preload code has some rather subtle interactions with
      both paravirtualization support and segment state restore, so it's not
      nearly as simple as it should be.
      
      Also, now that we no longer necessarily depend on a single bit (ie
      TS_USEDFPU) for keeping track of the state of the FPU, we migth be able
      to do better.  If we are really switching between two processes that
      keep touching the FP state, save/restore is inevitable, but in the case
      of having one process that does most of the FPU usage, we may actually
      be able to do much better than the preloading.
      
      In particular, we may be able to keep track of which CPU the process ran
      on last, and also per CPU keep track of which process' FP state that CPU
      has.  For modern CPU's that don't destroy the FPU contents on save time,
      that would allow us to do a lazy restore by just re-enabling the
      existing FPU state - with no restore cost at all!
      Signed-off-by: NLinus Torvalds <torvalds@linux-foundation.org>
      b3b0870e
    • L
      i387: don't ever touch TS_USEDFPU directly, use helper functions · 6d59d7a9
      Linus Torvalds 提交于
      This creates three helper functions that do the TS_USEDFPU accesses, and
      makes everybody that used to do it by hand use those helpers instead.
      
      In addition, there's a couple of helper functions for the "change both
      CR0.TS and TS_USEDFPU at the same time" case, and the places that do
      that together have been changed to use those.  That means that we have
      fewer random places that open-code this situation.
      
      The intent is partly to clarify the code without actually changing any
      semantics yet (since we clearly still have some hard to reproduce bug in
      this area), but also to make it much easier to use another approach
      entirely to caching the CR0.TS bit for software accesses.
      
      Right now we use a bit in the thread-info 'status' variable (this patch
      does not change that), but we might want to make it a full field of its
      own or even make it a per-cpu variable.
      Signed-off-by: NLinus Torvalds <torvalds@linux-foundation.org>
      6d59d7a9
    • L
      i387: move TS_USEDFPU clearing out of __save_init_fpu and into callers · b6c66418
      Linus Torvalds 提交于
      Touching TS_USEDFPU without touching CR0.TS is confusing, so don't do
      it.  By moving it into the callers, we always do the TS_USEDFPU next to
      the CR0.TS accesses in the source code, and it's much easier to see how
      the two go hand in hand.
      Signed-off-by: NLinus Torvalds <torvalds@linux-foundation.org>
      b6c66418
    • L
      i387: fix x86-64 preemption-unsafe user stack save/restore · 15d8791c
      Linus Torvalds 提交于
      Commit 5b1cbac3 ("i387: make irq_fpu_usable() tests more robust")
      added a sanity check to the #NM handler to verify that we never cause
      the "Device Not Available" exception in kernel mode.
      
      However, that check actually pinpointed a (fundamental) race where we do
      cause that exception as part of the signal stack FPU state save/restore
      code.
      
      Because we use the floating point instructions themselves to save and
      restore state directly from user mode, we cannot do that atomically with
      testing the TS_USEDFPU bit: the user mode access itself may cause a page
      fault, which causes a task switch, which saves and restores the FP/MMX
      state from the kernel buffers.
      
      This kind of "recursive" FP state save is fine per se, but it means that
      when the signal stack save/restore gets restarted, it will now take the
      '#NM' exception we originally tried to avoid.  With preemption this can
      happen even without the page fault - but because of the user access, we
      cannot just disable preemption around the save/restore instruction.
      
      There are various ways to solve this, including using the
      "enable/disable_page_fault()" helpers to not allow page faults at all
      during the sequence, and fall back to copying things by hand without the
      use of the native FP state save/restore instructions.
      
      However, the simplest thing to do is to just allow the #NM from kernel
      space, but fix the race in setting and clearing CR0.TS that this all
      exposed: the TS bit changes and the TS_USEDFPU bit absolutely have to be
      atomic wrt scheduling, so while the actual state save/restore can be
      interrupted and restarted, the act of actually clearing/setting CR0.TS
      and the TS_USEDFPU bit together must not.
      
      Instead of just adding random "preempt_disable/enable()" calls to what
      is already excessively ugly code, this introduces some helper functions
      that mostly mirror the "kernel_fpu_begin/end()" functionality, just for
      the user state instead.
      
      Those helper functions should probably eventually replace the other
      ad-hoc CR0.TS and TS_USEDFPU tests too, but I'll need to think about it
      some more: the task switching functionality in particular needs to
      expose the difference between the 'prev' and 'next' threads, while the
      new helper functions intentionally were written to only work with
      'current'.
      Signed-off-by: NLinus Torvalds <torvalds@linux-foundation.org>
      15d8791c
  2. 16 2月, 2012 1 次提交
    • L
      i387: fix sense of sanity check · c38e2345
      Linus Torvalds 提交于
      The check for save_init_fpu() (introduced in commit 5b1cbac3: "i387:
      make irq_fpu_usable() tests more robust") was the wrong way around, but
      I hadn't noticed, because my "tests" were bogus: the FPU exceptions are
      disabled by default, so even doing a divide by zero never actually
      triggers this code at all unless you do extra work to enable them.
      
      So if anybody did enable them, they'd get one spurious warning.
      Signed-off-by: NLinus Torvalds <torvalds@linux-foundation.org>
      c38e2345
  3. 15 2月, 2012 5 次提交
    • L
      Merge tag 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/broonie/regulator · 7ada1dd6
      Linus Torvalds 提交于
      One small bug fix from Axel plus a fix for a build failure in unrealistic
      but commonly built configs which for some reason manage to survive for
      an awfully long time in -next without any reports.
      
      * tag 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/broonie/regulator:
        regulator: Fix getting voltage in max8649_enable_time()
        regulator: Fix mc13xxx regulator modular build (again)
      7ada1dd6
    • L
      Merge branch 'merge' of git://git.kernel.org/pub/scm/linux/kernel/git/benh/powerpc · ebf4bcbd
      Linus Torvalds 提交于
      Quoth BenH:
       "Here are a few powerpc fixes for 3.3, all pretty trivial.  I also
        added the patch to define GET_IP/SET_IP so we can use some more
        asm-generic goodness."
      
      * 'merge' of git://git.kernel.org/pub/scm/linux/kernel/git/benh/powerpc:
        powerpc/pseries/eeh: Fix crash when error happens during device probe
        powerpc/pseries: Fix partition migration hang in stop_topology_update
        powerpc/powernv: Disable interrupts while taking phb->lock
        powerpc: Fix WARN_ON in decrementer_check_overflow
        powerpc/wsp: Fix IRQ affinity setting
        powerpc: Implement GET_IP/SET_IP
        powerpc/wsp: Permanently enable PCI class code workaround
      ebf4bcbd
    • L
      Merge tag 'mmc-fixes-for-3.3-rc4' of git://git.kernel.org/pub/scm/linux/kernel/git/cjb/mmc · 8b36ac50
      Linus Torvalds 提交于
      MMC fixes for 3.3-rc4:
       * The most visible fix here is against a regression introduced in 3.3-rc1
         that ran cards in Ultra High Speed mode even when they failed to initialize
         in that mode, leading to lower-speed cards failing to mount.
       * A lockdep warning introduced in 3.3-rc1 is fixed.
       * Various other small driver fixes, most notably for a NULL dereference
         when using highmem with dw_mmc.
      
      * tag 'mmc-fixes-for-3.3-rc4' of git://git.kernel.org/pub/scm/linux/kernel/git/cjb/mmc:
        mmc: dw_mmc: Fix PIO mode with support of highmem
        mmc: atmel-mci: save and restore sdioirq when soft reset is performed
        mmc: block: Init ro_lock sysfs attr to fix lockdep warnings
        mmc: sh_mmcif: fix late delayed work initialisation
        mmc: tmio_mmc: fix card eject during IO with DMA
        mmc: core: Fix comparison issue in mmc_compare_ext_csds
        mmc: core: Fix PowerOff Notify suspend/resume
        mmc: sdhci-pci: set Medfield SDIO as non-removable
        mmc: core: add the capability for broken voltage
        mmc: core: Fix low speed mmc card detection failure
        mmc: esdhc: set the timeout to the max value
        mmc: esdhc: add PIO mode support
        mmc: core: Ensure clocks are always enabled before host interaction
        mmc: of_mmc_spi: fix little endian support
        mmc: core: UHS sdio card that fails should not exceed 50MHz
        mmc: esdhc: fix errors when booting kernel on Freescale eSDHC version 2.3
      8b36ac50
    • L
      Merge tag 'stable/for-linus-fixes-3.3-rc3' of... · 694ce18e
      Linus Torvalds 提交于
      Merge tag 'stable/for-linus-fixes-3.3-rc3' of git://git.kernel.org/pub/scm/linux/kernel/git/konrad/xen
      
      Two fixes for VCPU offlining; One to fix the string format exposed
      by the xen-pci[front|back] to conform to the one used in majority of
      PCI drivers; Two fixes to make the code more resilient to invalid
      configurations.
      Signed-off-by: NKonrad Rzeszutek Wilk <konrad.wilk@oracle.com>
      
      * tag 'stable/for-linus-fixes-3.3-rc3' of git://git.kernel.org/pub/scm/linux/kernel/git/konrad/xen:
        xenbus_dev: add missing error check to watch handling
        xen/pci[front|back]: Use %d instead of %1x for displaying PCI devfn.
        xen pvhvm: do not remap pirqs onto evtchns if !xen_have_vector_callback
        xen/smp: Fix CPU online/offline bug triggering a BUG: scheduling while atomic.
        xen/bootup: During bootup suppress XENBUS: Unable to read cpu state
      694ce18e
    • L
      Merge tag 'sound-fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/tiwai/sound · 13d26193
      Linus Torvalds 提交于
      sound fixes for 3.3-rc4
      
      Basically all small fixes suited as rc4: a few HD-audio regression fixes,
      a stable fix for an old Dell laptop with intel8x0, and a simple fix for
      ASoC fsi.
      
      * tag 'sound-fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/tiwai/sound:
        ALSA: intel8x0: Fix default inaudible sound on Gateway M520
        ALSA: hda - Fix silent speaker output on Acer Aspire 6935
        ALSA: hda - Fix initialization of secondary capture source on VT1705
        ASoC: fsi: fixup fsi_pointer() calculation method
        ALSA: hda - Fix mute-LED VREF value for new HP laptops
      13d26193
  4. 14 2月, 2012 30 次提交