Commit 62914a99 authored by Jason Gunthorpe's avatar Jason Gunthorpe

drm/amdgpu: Use mmu_interval_insert instead of hmm_mirror

Remove the interval tree in the driver and rely on the tree maintained by
the mmu_notifier for delivering mmu_notifier invalidation callbacks.

For some reason amdgpu has a very complicated arrangement where it tries
to prevent duplicate entries in the interval_tree, this is not necessary,
each amdgpu_bo can be its own stand alone entry. interval_tree already
allows duplicates and overlaps in the tree.

Also, there is no need to remove entries upon a release callback, the
mmu_interval API safely allows objects to remain registered beyond the
lifetime of the mm. The driver only has to stop touching the pages during
release.

Link: https://lore.kernel.org/r/20191112202231.3856-12-jgg@ziepe.caReviewed-by: default avatarPhilip Yang <Philip.Yang@amd.com>
Tested-by: default avatarPhilip Yang <Philip.Yang@amd.com>
Signed-off-by: default avatarJason Gunthorpe <jgg@mellanox.com>
parent a9ae8731
...@@ -1006,6 +1006,8 @@ struct amdgpu_device { ...@@ -1006,6 +1006,8 @@ struct amdgpu_device {
struct mutex lock_reset; struct mutex lock_reset;
struct amdgpu_doorbell_index doorbell_index; struct amdgpu_doorbell_index doorbell_index;
struct mutex notifier_lock;
int asic_reset_res; int asic_reset_res;
struct work_struct xgmi_reset_work; struct work_struct xgmi_reset_work;
......
...@@ -481,8 +481,7 @@ static void remove_kgd_mem_from_kfd_bo_list(struct kgd_mem *mem, ...@@ -481,8 +481,7 @@ static void remove_kgd_mem_from_kfd_bo_list(struct kgd_mem *mem,
* *
* Returns 0 for success, negative errno for errors. * Returns 0 for success, negative errno for errors.
*/ */
static int init_user_pages(struct kgd_mem *mem, struct mm_struct *mm, static int init_user_pages(struct kgd_mem *mem, uint64_t user_addr)
uint64_t user_addr)
{ {
struct amdkfd_process_info *process_info = mem->process_info; struct amdkfd_process_info *process_info = mem->process_info;
struct amdgpu_bo *bo = mem->bo; struct amdgpu_bo *bo = mem->bo;
...@@ -1195,7 +1194,7 @@ int amdgpu_amdkfd_gpuvm_alloc_memory_of_gpu( ...@@ -1195,7 +1194,7 @@ int amdgpu_amdkfd_gpuvm_alloc_memory_of_gpu(
add_kgd_mem_to_kfd_bo_list(*mem, avm->process_info, user_addr); add_kgd_mem_to_kfd_bo_list(*mem, avm->process_info, user_addr);
if (user_addr) { if (user_addr) {
ret = init_user_pages(*mem, current->mm, user_addr); ret = init_user_pages(*mem, user_addr);
if (ret) if (ret)
goto allocate_init_user_pages_failed; goto allocate_init_user_pages_failed;
} }
......
...@@ -2633,6 +2633,7 @@ int amdgpu_device_init(struct amdgpu_device *adev, ...@@ -2633,6 +2633,7 @@ int amdgpu_device_init(struct amdgpu_device *adev,
mutex_init(&adev->virt.vf_errors.lock); mutex_init(&adev->virt.vf_errors.lock);
hash_init(adev->mn_hash); hash_init(adev->mn_hash);
mutex_init(&adev->lock_reset); mutex_init(&adev->lock_reset);
mutex_init(&adev->notifier_lock);
mutex_init(&adev->virt.dpm_mutex); mutex_init(&adev->virt.dpm_mutex);
mutex_init(&adev->psp.mutex); mutex_init(&adev->psp.mutex);
......
This diff is collapsed.
...@@ -39,12 +39,10 @@ enum amdgpu_mn_type { ...@@ -39,12 +39,10 @@ enum amdgpu_mn_type {
* struct amdgpu_mn * struct amdgpu_mn
* *
* @adev: amdgpu device pointer * @adev: amdgpu device pointer
* @mm: process address space
* @type: type of MMU notifier * @type: type of MMU notifier
* @work: destruction work item * @work: destruction work item
* @node: hash table node to find structure by adev and mn * @node: hash table node to find structure by adev and mn
* @lock: rw semaphore protecting the notifier nodes * @lock: rw semaphore protecting the notifier nodes
* @objects: interval tree containing amdgpu_mn_nodes
* @mirror: HMM mirror function support * @mirror: HMM mirror function support
* *
* Data for each amdgpu device and process address space. * Data for each amdgpu device and process address space.
...@@ -52,7 +50,6 @@ enum amdgpu_mn_type { ...@@ -52,7 +50,6 @@ enum amdgpu_mn_type {
struct amdgpu_mn { struct amdgpu_mn {
/* constant after initialisation */ /* constant after initialisation */
struct amdgpu_device *adev; struct amdgpu_device *adev;
struct mm_struct *mm;
enum amdgpu_mn_type type; enum amdgpu_mn_type type;
/* only used on destruction */ /* only used on destruction */
...@@ -63,7 +60,6 @@ struct amdgpu_mn { ...@@ -63,7 +60,6 @@ struct amdgpu_mn {
/* objects protected by lock */ /* objects protected by lock */
struct rw_semaphore lock; struct rw_semaphore lock;
struct rb_root_cached objects;
#ifdef CONFIG_HMM_MIRROR #ifdef CONFIG_HMM_MIRROR
/* HMM mirror */ /* HMM mirror */
......
...@@ -30,6 +30,9 @@ ...@@ -30,6 +30,9 @@
#include <drm/amdgpu_drm.h> #include <drm/amdgpu_drm.h>
#include "amdgpu.h" #include "amdgpu.h"
#ifdef CONFIG_MMU_NOTIFIER
#include <linux/mmu_notifier.h>
#endif
#define AMDGPU_BO_INVALID_OFFSET LONG_MAX #define AMDGPU_BO_INVALID_OFFSET LONG_MAX
#define AMDGPU_BO_MAX_PLACEMENTS 3 #define AMDGPU_BO_MAX_PLACEMENTS 3
...@@ -100,10 +103,12 @@ struct amdgpu_bo { ...@@ -100,10 +103,12 @@ struct amdgpu_bo {
struct ttm_bo_kmap_obj dma_buf_vmap; struct ttm_bo_kmap_obj dma_buf_vmap;
struct amdgpu_mn *mn; struct amdgpu_mn *mn;
union {
struct list_head mn_list; #ifdef CONFIG_MMU_NOTIFIER
struct mmu_interval_notifier notifier;
#endif
struct list_head shadow_list; struct list_head shadow_list;
};
struct kgd_mem *kfd_bo; struct kgd_mem *kfd_bo;
}; };
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment