1. 18 11月, 2012 1 次提交
  2. 15 11月, 2012 2 次提交
    • F
      irq_work: Fix racy check on work pending flag · e0bbe2d8
      Frederic Weisbecker 提交于
      Work claiming wants to be SMP-safe.
      
      And by the time we try to claim a work, if it is already executing
      concurrently on another CPU, we want to succeed the claiming and queue
      the work again because the other CPU may have missed the data we wanted
      to handle in our work if it's about to complete there.
      
      This scenario is summarized below:
      
              CPU 1                                   CPU 2
              -----                                   -----
              (flags = 0)
              cmpxchg(flags, 0, IRQ_WORK_FLAGS)
              (flags = 3)
              [...]
              xchg(flags, IRQ_WORK_BUSY)
              (flags = 2)
              func()
                                                      if (flags & IRQ_WORK_PENDING)
                                                              (not true)
                                                      cmpxchg(flags, flags, IRQ_WORK_FLAGS)
                                                      (flags = 3)
                                                      [...]
              cmpxchg(flags, IRQ_WORK_BUSY, 0);
              (fail, pending on CPU 2)
      
      This state machine is synchronized using [cmp]xchg() on the flags.
      As such, the early IRQ_WORK_PENDING check in CPU 2 above is racy.
      By the time we check it, we may be dealing with a stale value because
      we aren't using an atomic accessor. As a result, CPU 2 may "see"
      that the work is still pending on another CPU while it may be
      actually completing the work function exection already, leaving
      our data unprocessed.
      
      To fix this, we start by speculating about the value we wish to be
      in the work->flags but we only make any conclusion after the value
      returned by the cmpxchg() call that either claims the work or let
      the current owner handle the pending work for us.
      Changelog-heavily-inspired-by: NSteven Rostedt <rostedt@goodmis.org>
      Signed-off-by: NFrederic Weisbecker <fweisbec@gmail.com>
      Acked-by: NSteven Rostedt <rostedt@goodmis.org>
      Cc: Peter Zijlstra <peterz@infradead.org>
      Cc: Ingo Molnar <mingo@kernel.org>
      Cc: Thomas Gleixner <tglx@linutronix.de>
      Cc: Andrew Morton <akpm@linux-foundation.org>
      Cc: Paul Gortmaker <paul.gortmaker@windriver.com>
      Cc: Anish Kumar <anish198519851985@gmail.com>
      e0bbe2d8
    • F
      irq_work: Fix racy IRQ_WORK_BUSY flag setting · c8446b75
      Frederic Weisbecker 提交于
      The IRQ_WORK_BUSY flag is set right before we execute the
      work. Once this flag value is set, the work enters a
      claimable state again.
      
      So if we have specific data to compute in our work, we ensure it's
      either handled by another CPU or locally by enqueuing the work again.
      This state machine is guanranteed by atomic operations on the flags.
      
      So when we set IRQ_WORK_BUSY without using an xchg-like operation,
      we break this guarantee as in the following summarized scenario:
      
              CPU 1                                   CPU 2
              -----                                   -----
                                                      (flags = 0)
                                                      old_flags = flags;
              (flags = 0)
              cmpxchg(flags, old_flags,
                      old_flags | IRQ_WORK_FLAGS)
              (flags = 3)
              [...]
              flags = IRQ_WORK_BUSY
              (flags = 2)
              func()
                                                      (sees flags = 3)
                                                      cmpxchg(flags, old_flags,
                                                              old_flags | IRQ_WORK_FLAGS)
                                                      (give up)
      
              cmpxchg(flags, 2, 0);
              (flags = 0)
      
      CPU 1 claims a work and executes it, so it sets IRQ_WORK_BUSY and
      the work is again in a claimable state. Now CPU 2 has new data to process
      and try to claim that work but it may see a stale value of the flags
      and think the work is still pending somewhere that will handle our data.
      This is because CPU 1 doesn't set IRQ_WORK_BUSY atomically.
      
      As a result, the data expected to be handle by CPU 2 won't get handled.
      
      To fix this, use xchg() to set IRQ_WORK_BUSY, this way we ensure the CPU 2
      will see the correct value with cmpxchg() using the expected ordering.
      Changelog-heavily-inspired-by: NSteven Rostedt <rostedt@goodmis.org>
      Signed-off-by: NFrederic Weisbecker <fweisbec@gmail.com>
      Acked-by: NSteven Rostedt <rostedt@goodmis.org>
      Cc: Peter Zijlstra <peterz@infradead.org>
      Cc: Ingo Molnar <mingo@kernel.org>
      Cc: Thomas Gleixner <tglx@linutronix.de>
      Cc: Andrew Morton <akpm@linux-foundation.org>
      Cc: Paul Gortmaker <paul.gortmaker@windriver.com>
      Cc: Anish Kumar <anish198519851985@gmail.com>
      c8446b75
  3. 05 11月, 2012 1 次提交
  4. 04 11月, 2012 4 次提交
    • L
      Merge tag 'nfs-for-3.7-4' of git://git.linux-nfs.org/projects/trondmy/linux-nfs · d4164973
      Linus Torvalds 提交于
      Pull NFS client bugfixes from Trond Myklebust:
      
       - Fix a bunch of deadlock situations:
         * State recovery can deadlock if we fail to release sequence ids
           before scheduling the recovery thread.
         * Calling deactivate_super() from an RPC workqueue thread can
           deadlock because of the call to rpc_shutdown_client.
      
       - Display the device name correctly in /proc/*/mounts
      
       - Fix a number of incorrect error return values:
         * When NFSv3 mounts fail due to a timeout.
         * On NFSv4.1 backchannel setup failure
         * On NFSv4 open access checks
      
       - pnfs_find_alloc_layout() must check the layout pointer for NULL
      
       - Fix a regression in the legacy DNS resolved
      
      * tag 'nfs-for-3.7-4' of git://git.linux-nfs.org/projects/trondmy/linux-nfs:
        NFS4: nfs4_opendata_access should return errno
        NFSv4: Initialise the NFSv4.1 slot table highest_used_slotid correctly
        SUNRPC: return proper errno from backchannel_rqst
        NFS: add nfs_sb_deactive_async to avoid deadlock
        nfs: Show original device name verbatim in /proc/*/mount{s,info}
        nfsv3: Make v3 mounts fail with ETIMEDOUTs instead EIO on mountd timeouts
        nfs: Check whether a layout pointer is NULL before free it
        NFS: fix bug in legacy DNS resolver.
        NFSv4: nfs4_locku_done must release the sequence id
        NFSv4.1: We must release the sequence id when we fail to get a session slot
        NFS: Wait for session recovery to finish before returning
      d4164973
    • L
      Merge branch 'release' of git://git.kernel.org/pub/scm/linux/kernel/git/rzhang/linux · 225ff868
      Linus Torvalds 提交于
      Pull thermal management & ACPI update from Zhang Rui,
      
      Ho humm.  Normally these things go through Len.  But it's just three
      small fixes, I guess I can pull directly too.
      
      * 'release' of git://git.kernel.org/pub/scm/linux/kernel/git/rzhang/linux:
        exynos4_tmu_driver_ids should be exynos_tmu_driver_ids.
        ACPI video: Ignore errors after _DOD evaluation.
        thermal: solve compilation errors in rcar_thermal
      225ff868
    • L
      Merge branch 'i2c-embedded/for-current' of git://git.pengutronix.de/git/wsa/linux · 209c510e
      Linus Torvalds 提交于
      Pull i2c embedded fixes from Wolfram Sang:
       "Two patches are usual stuff.
      
        The bigger patch is needed to correct a wrong decision made in this
        merge window.  We hoped to get the PIOQUEUE mode in the mxs driver
        working with DMA, but it turned out to be too broken (leading to data
        loss), so we now think it is best to remove it entirely and work only
        with DMA now.  The patch should be in 3.7.  IMO, so users never get
        the chance to use both modes in parallel."
      
      * 'i2c-embedded/for-current' of git://git.pengutronix.de/git/wsa/linux:
        i2c: tegra: set irq name as device name
        i2c-nomadik: Fixup clock handling
        i2c: mxs: remove broken PIOQUEUE support
      209c510e
    • L
      Merge branch 'drm-fixes' of git://people.freedesktop.org/~airlied/linux · 53f9313f
      Linus Torvalds 提交于
      Pull drm fixes from Dave Airlie:
       "Scattered selection of fixes:
      
         - radeon: load detect fixes from SuSE/AMD
         - intel: misc i830, sdvo regression, vesafb kickoff ums fix
         - exynos: maintainers entry update + fixes
         - udl: fix stride scanout issue
      
        it's slightly bigger than I'd probably like, but nothing looked
        dangerous enough to hold off on."
      
      * 'drm-fixes' of git://people.freedesktop.org/~airlied/linux:
        drm/udl: fix stride issues scanning out stride != width*bpp
        drm/radeon: add load detection support for ext DAC on R200 (v2)
        DRM/radeon: For single CRTC GPUs move handling of CRTC_CRT_ON to crtc_dpms().
        DRM/Radeon: Fix TV DAC Load Detection for single CRTC chips.
        DRM/Radeon: Clean up code in TV DAC load detection.
        drm/radeon: fix ATPX function documentation
        drivers/gpu/drm/radeon/evergreen_cs.c: Remove unnecessary semicolon
        DRM/Radeon: On DVI-I use Load Detection when EDID is bogus.
        DRM/Radeon: Fix primary DAC Load Detection for RV100 chips.
        DRM/Radeon: Fix Load Detection on legacy primary DAC.
        drm: exynos: removed warning due to missing typecast for mixer driver data
        drm/exynos: add support for ARCH_MULTIPLATFORM
        MAINTAINERS: Add git repository for Exynos DRM
        drm/exynos: fix display on issue
        drm/i915: Only kick out vesafb if we takeover the fbcon with KMS
        drm/i915: be less verbose about inability to provide vendor backlight
        drm/i915: clear the entire sdvo infoframe buffer
        drm/i915: VGA needs to be on pipe A on i830M
        drm/i915: fix overlay on i830M
      53f9313f
  5. 03 11月, 2012 21 次提交
  6. 02 11月, 2012 11 次提交