1. 28 Jan, 2014 1 commit
  2. 11 Feb, 2014 1 commit
  3. 16 Jan, 2014 1 commit
  4. 10 Nov, 2014 1 commit
    • Oded Gabbay's avatar
      iommu/amd: fix accounting of device_state · a015c1e9
      Oded Gabbay authored
      This patch fixes a bug in the accounting of the device_state.
      In the current code, the device_state was put (decremented) too many times,
      which sometimes lead to the driver getting stuck permanently in
      put_device_state_wait(). That happen because the device_state->count would go
      below zero, which is never supposed to happen.
      
      The root cause is that the device_state was decremented in put_pasid_state()
      and put_pasid_state_wait() but also in all the functions that call those
      functions. Therefore, the device_state was decremented twice in each of these
      code paths.
      
      The fix is to decouple the device_state accounting from the pasid_state
      accounting - remove the call to put_device_state() from the
      put_pasid_state() and the put_pasid_state_wait())
      Signed-off-by: default avatarOded Gabbay <oded.gabbay@amd.com>
      a015c1e9
  5. 13 Nov, 2014 4 commits
    • Joerg Roedel's avatar
      iommu/amd: use new invalidate_range mmu-notifier · e7cc3dd4
      Joerg Roedel authored
      Make use of the new invalidate_range mmu_notifier call-back and remove the
      old logic of assigning an empty page-table between invalidate_range_start
      and invalidate_range_end.
      Signed-off-by: default avatarJoerg Roedel <jroedel@suse.de>
      Tested-by: default avatarOded Gabbay <oded.gabbay@amd.com>
      Reviewed-by: default avatarAndrea Arcangeli <aarcange@redhat.com>
      Reviewed-by: default avatarJérôme Glisse <jglisse@redhat.com>
      Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>
      Cc: Rik van Riel <riel@redhat.com>
      Cc: Hugh Dickins <hughd@google.com>
      Cc: Mel Gorman <mgorman@suse.de>
      Cc: Johannes Weiner <jweiner@redhat.com>
      Cc: Jay Cornwall <Jay.Cornwall@amd.com>
      Cc: Suravee Suthikulpanit <Suravee.Suthikulpanit@amd.com>
      Cc: Jesse Barnes <jbarnes@virtuousgeek.org>
      Cc: David Woodhouse <dwmw2@infradead.org>
      Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
      Signed-off-by: default avatarOded Gabbay <oded.gabbay@amd.com>
      e7cc3dd4
    • Joerg Roedel's avatar
      mmu_notifier: add the callback for mmu_notifier_invalidate_range() · 0f0a327f
      Joerg Roedel authored
      Now that the mmu_notifier_invalidate_range() calls are in place, add the
      callback to allow subsystems to register against it.
      Signed-off-by: default avatarJoerg Roedel <jroedel@suse.de>
      Reviewed-by: default avatarAndrea Arcangeli <aarcange@redhat.com>
      Reviewed-by: default avatarJérôme Glisse <jglisse@redhat.com>
      Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>
      Cc: Rik van Riel <riel@redhat.com>
      Cc: Hugh Dickins <hughd@google.com>
      Cc: Mel Gorman <mgorman@suse.de>
      Cc: Johannes Weiner <jweiner@redhat.com>
      Cc: Jay Cornwall <Jay.Cornwall@amd.com>
      Cc: Oded Gabbay <Oded.Gabbay@amd.com>
      Cc: Suravee Suthikulpanit <Suravee.Suthikulpanit@amd.com>
      Cc: Jesse Barnes <jbarnes@virtuousgeek.org>
      Cc: David Woodhouse <dwmw2@infradead.org>
      Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
      Signed-off-by: default avatarOded Gabbay <oded.gabbay@amd.com>
      0f0a327f
    • Joerg Roedel's avatar
      mmu_notifier: call mmu_notifier_invalidate_range() from VMM · 34ee645e
      Joerg Roedel authored
      Add calls to the new mmu_notifier_invalidate_range() function to all
      places in the VMM that need it.
      Signed-off-by: default avatarJoerg Roedel <jroedel@suse.de>
      Reviewed-by: default avatarAndrea Arcangeli <aarcange@redhat.com>
      Reviewed-by: default avatarJérôme Glisse <jglisse@redhat.com>
      Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>
      Cc: Rik van Riel <riel@redhat.com>
      Cc: Hugh Dickins <hughd@google.com>
      Cc: Mel Gorman <mgorman@suse.de>
      Cc: Johannes Weiner <jweiner@redhat.com>
      Cc: Jay Cornwall <Jay.Cornwall@amd.com>
      Cc: Oded Gabbay <Oded.Gabbay@amd.com>
      Cc: Suravee Suthikulpanit <Suravee.Suthikulpanit@amd.com>
      Cc: Jesse Barnes <jbarnes@virtuousgeek.org>
      Cc: David Woodhouse <dwmw2@infradead.org>
      Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
      Signed-off-by: default avatarOded Gabbay <oded.gabbay@amd.com>
      34ee645e
    • Joerg Roedel's avatar
      mmu_notifier: add mmu_notifier_invalidate_range() · 1897bdc4
      Joerg Roedel authored
      This notifier closes an important gap in the current mmu_notifier
      implementation, the existing callbacks are called too early or too late to
      reliably manage a non-CPU TLB.  Specifically, invalidate_range_start() is
      called when all pages are still mapped and invalidate_range_end() when all
      pages are unmapped and potentially freed.
      
      This is fine when the users of the mmu_notifiers manage their own SoftTLB,
      like KVM does.  When the TLB is managed in software it is easy to wipe out
      entries for a given range and prevent new entries to be established until
      invalidate_range_end is called.
      
      But when the user of mmu_notifiers has to manage a hardware TLB it can
      still wipe out TLB entries in invalidate_range_start, but it can't make
      sure that no new TLB entries in the given range are established between
      invalidate_range_start and invalidate_range_end.
      
      To avoid silent data corruption the entries in the non-CPU TLB need to be
      flushed when the pages are unmapped (at this point in time no _new_ TLB
      entries can be established in the non-CPU TLB) but not yet freed (as the
      non-CPU TLB may still have _existing_ entries pointing to the pages about
      to be freed).
      
      To fix this problem we need to catch the moment when the Linux VMM flushes
      remote TLBs (as a non-CPU TLB is not very CPU TLB), as this is the point
      in time when the pages are unmapped but _not_ yet freed.
      
      The mmu_notifier_invalidate_range() function aims to catch that moment.
      
      IOMMU code will be one user of the notifier-callback.  Currently this is
      only the AMD IOMMUv2 driver, but its code is about to be more generalized
      and converted to a generic IOMMU-API extension to fit the needs of similar
      functionality in other IOMMUs as well.
      
      The current attempt in the AMD IOMMUv2 driver to work around the
      invalidate_range_start/end() shortcoming is to assign an empty page table
      to the non-CPU TLB between any invalidata_range_start/end calls.  With the
      empty page-table assigned, every page-table walk to re-fill the non-CPU
      TLB will cause a page-fault reported to the IOMMU driver via an interrupt,
      possibly causing interrupt storms.
      
      The page-fault handler in the AMD IOMMUv2 driver doesn't handle the fault
      if an invalidate_range_start/end pair is active, it just reports back
      SUCCESS to the device and let it refault the page.  But existing hardware
      (newer Radeon GPUs) that makes use of this feature don't re-fault
      indefinitly, after a certain number of faults for the same address the
      device enters a failure state and needs to be resetted.
      
      To avoid the GPUs entering a failure state we need to get rid of the
      empty-page-table workaround and use the mmu_notifier_invalidate_range()
      function introduced with this patch.
      Signed-off-by: default avatarJoerg Roedel <jroedel@suse.de>
      Reviewed-by: default avatarAndrea Arcangeli <aarcange@redhat.com>
      Reviewed-by: default avatarJérôme Glisse <jglisse@redhat.com>
      Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>
      Cc: Rik van Riel <riel@redhat.com>
      Cc: Hugh Dickins <hughd@google.com>
      Cc: Mel Gorman <mgorman@suse.de>
      Cc: Johannes Weiner <jweiner@redhat.com>
      Cc: Jay Cornwall <Jay.Cornwall@amd.com>
      Cc: Oded Gabbay <Oded.Gabbay@amd.com>
      Cc: Suravee Suthikulpanit <Suravee.Suthikulpanit@amd.com>
      Cc: Jesse Barnes <jbarnes@virtuousgeek.org>
      Cc: David Woodhouse <dwmw2@infradead.org>
      Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
      Signed-off-by: default avatarOded Gabbay <oded.gabbay@amd.com>
      1897bdc4
  6. 12 Nov, 2014 31 commits
  7. 10 Nov, 2014 1 commit