* amdkfd - misc fixes + get_local_mem_info() port [V.2]
@ 2016-09-10 1:31 Edward O'Callaghan
[not found] ` <1473471099-16914-1-git-send-email-funfunctor-dczkZgxz+BNUPWh3PAxdjQ@public.gmane.org>
0 siblings, 1 reply; 17+ messages in thread
From: Edward O'Callaghan @ 2016-09-10 1:31 UTC (permalink / raw)
To: amd-gfx-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW
The following series applies on top of either master or the drm-next-4.9
branch. Apart from the couple of misc fixes here we port out the
'get_local_mem_info()' helper out of the ROCm kernel patch mountain
and hook that up so to be mainlined.
Please review,
Edward O'Callaghan (7):
[PATCH 1/7] amdkfd: Tidy up kfd_generate_gpu_id() uint64_t bitshift
[PATCH 2/7] radeonkfd/amdkfd: Implement get_local_mem_info()
[PATCH 3/7] amdkfd: Add some missing memset zero'ing in queue init
[PATCH 4/7] drm/amdkfd: Make kfd_lookup_process_by_pasid() well
[PATCH 5/7] drm/amdkfd: Remove duplicate pqm_uninit()
[PATCH 6/7] drm/amdkfd: Reuse function to find a process through
[PATCH 7/7] drm/amdkfd: Fix possible infinite loop
_______________________________________________
amd-gfx mailing list
amd-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/amd-gfx
^ permalink raw reply [flat|nested] 17+ messages in thread
* [PATCH 1/7] amdkfd: Tidy up kfd_generate_gpu_id() uint64_t bitshift unpack
[not found] ` <1473471099-16914-1-git-send-email-funfunctor-dczkZgxz+BNUPWh3PAxdjQ@public.gmane.org>
@ 2016-09-10 1:31 ` Edward O'Callaghan
[not found] ` <1473471099-16914-2-git-send-email-funfunctor-dczkZgxz+BNUPWh3PAxdjQ@public.gmane.org>
2016-09-10 1:31 ` [PATCH 2/7] radeonkfd/amdkfd: Implement get_local_mem_info() Edward O'Callaghan
` (5 subsequent siblings)
6 siblings, 1 reply; 17+ messages in thread
From: Edward O'Callaghan @ 2016-09-10 1:31 UTC (permalink / raw)
To: amd-gfx-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW
Dereference the one time and unpack the lower and upper 32bit
portions with the proper kernel helper macros.
Signed-off-by: Edward O'Callaghan <funfunctor@folklore1984.net>
Reviewed-by: Oded Gabbay <oded.gabbay@gmail.com>
---
drivers/gpu/drm/amd/amdkfd/kfd_topology.c | 8 +++++---
1 file changed, 5 insertions(+), 3 deletions(-)
diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_topology.c b/drivers/gpu/drm/amd/amdkfd/kfd_topology.c
index 884c96f..1e50647 100644
--- a/drivers/gpu/drm/amd/amdkfd/kfd_topology.c
+++ b/drivers/gpu/drm/amd/amdkfd/kfd_topology.c
@@ -1090,19 +1090,21 @@ static uint32_t kfd_generate_gpu_id(struct kfd_dev *gpu)
{
uint32_t hashout;
uint32_t buf[7];
+ uint64_t local_mem_size;
int i;
if (!gpu)
return 0;
+ local_mem_size = gpu->kfd2kgd->get_vmem_size(gpu->kgd);
+
buf[0] = gpu->pdev->devfn;
buf[1] = gpu->pdev->subsystem_vendor;
buf[2] = gpu->pdev->subsystem_device;
buf[3] = gpu->pdev->device;
buf[4] = gpu->pdev->bus->number;
- buf[5] = (uint32_t)(gpu->kfd2kgd->get_vmem_size(gpu->kgd)
- & 0xffffffff);
- buf[6] = (uint32_t)(gpu->kfd2kgd->get_vmem_size(gpu->kgd) >> 32);
+ buf[5] = lower_32_bits(local_mem_size);
+ buf[6] = upper_32_bits(local_mem_size);
for (i = 0, hashout = 0; i < 7; i++)
hashout ^= hash_32(buf[i], KFD_GPU_ID_HASH_WIDTH);
--
2.7.4
_______________________________________________
amd-gfx mailing list
amd-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/amd-gfx
^ permalink raw reply related [flat|nested] 17+ messages in thread
* [PATCH 2/7] radeonkfd/amdkfd: Implement get_local_mem_info()
[not found] ` <1473471099-16914-1-git-send-email-funfunctor-dczkZgxz+BNUPWh3PAxdjQ@public.gmane.org>
2016-09-10 1:31 ` [PATCH 1/7] amdkfd: Tidy up kfd_generate_gpu_id() uint64_t bitshift unpack Edward O'Callaghan
@ 2016-09-10 1:31 ` Edward O'Callaghan
[not found] ` <1473471099-16914-3-git-send-email-funfunctor-dczkZgxz+BNUPWh3PAxdjQ@public.gmane.org>
2016-09-10 1:31 ` [PATCH 3/7] amdkfd: Add some missing memset zero'ing in queue init func Edward O'Callaghan
` (4 subsequent siblings)
6 siblings, 1 reply; 17+ messages in thread
From: Edward O'Callaghan @ 2016-09-10 1:31 UTC (permalink / raw)
To: amd-gfx-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW
Signed-off-by: Edward O'Callaghan <funfunctor@folklore1984.net>
---
drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.c | 32 ++++++++++++++++++++---
drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.h | 3 ++-
drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v7.c | 2 +-
drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v8.c | 2 +-
drivers/gpu/drm/amd/amdkfd/kfd_topology.c | 6 ++++-
drivers/gpu/drm/amd/include/kgd_kfd_interface.h | 13 +++++++--
drivers/gpu/drm/radeon/radeon_kfd.c | 22 +++++++++++++---
7 files changed, 66 insertions(+), 14 deletions(-)
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.c
index d080d08..63a2e84 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.c
@@ -226,14 +226,38 @@ void free_gtt_mem(struct kgd_dev *kgd, void *mem_obj)
kfree(mem);
}
-uint64_t get_vmem_size(struct kgd_dev *kgd)
+void get_local_mem_info(struct kgd_dev *kgd,
+ struct kfd_local_mem_info *mem_info)
{
- struct amdgpu_device *rdev =
- (struct amdgpu_device *)kgd;
+ struct amdgpu_device *rdev = (struct amdgpu_device *)kgd;
+ uint64_t address_mask;
+ resource_size_t aper_limit;
BUG_ON(kgd == NULL);
- return rdev->mc.real_vram_size;
+ memset(mem_info, 0, sizeof(*mem_info));
+
+ address_mask = ~((1UL << 40) - 1);
+ aper_limit = rdev->mc.aper_base + rdev->mc.aper_size;
+
+ if (!(rdev->mc.aper_base & address_mask ||
+ aper_limit & address_mask)) {
+ mem_info->local_mem_size_public = rdev->mc.visible_vram_size;
+ mem_info->local_mem_size_private = rdev->mc.real_vram_size -
+ rdev->mc.visible_vram_size;
+ } else {
+ mem_info->local_mem_size_public = 0;
+ mem_info->local_mem_size_private = rdev->mc.real_vram_size;
+ }
+ mem_info->vram_width = rdev->mc.vram_width;
+
+ if (amdgpu_powerplay || rdev->pm.funcs->get_mclk)
+ mem_info->mem_clk_max = amdgpu_dpm_get_mclk(rdev, false) / 100;
+
+ pr_debug("amdgpu: address base: 0x%llx limit 0x%llx public 0x%llx private 0x%llx\n",
+ rdev->mc.aper_base, aper_limit,
+ mem_info->local_mem_size_public,
+ mem_info->local_mem_size_private);
}
uint64_t get_gpu_clock_counter(struct kgd_dev *kgd)
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.h
index de530f68d..31da026 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.h
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.h
@@ -57,7 +57,8 @@ int alloc_gtt_mem(struct kgd_dev *kgd, size_t size,
void **mem_obj, uint64_t *gpu_addr,
void **cpu_ptr);
void free_gtt_mem(struct kgd_dev *kgd, void *mem_obj);
-uint64_t get_vmem_size(struct kgd_dev *kgd);
+void get_local_mem_info(struct kgd_dev *kgd,
+ struct kfd_local_mem_info *mem_info);
uint64_t get_gpu_clock_counter(struct kgd_dev *kgd);
uint32_t get_max_engine_clock_in_mhz(struct kgd_dev *kgd);
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v7.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v7.c
index 362bedc..dc69cf7 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v7.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v7.c
@@ -131,7 +131,7 @@ static uint16_t get_fw_version(struct kgd_dev *kgd, enum kgd_engine_type type);
static const struct kfd2kgd_calls kfd2kgd = {
.init_gtt_mem_allocation = alloc_gtt_mem,
.free_gtt_mem = free_gtt_mem,
- .get_vmem_size = get_vmem_size,
+ .get_local_mem_info = get_local_mem_info,
.get_gpu_clock_counter = get_gpu_clock_counter,
.get_max_engine_clock_in_mhz = get_max_engine_clock_in_mhz,
.program_sh_mem_settings = kgd_program_sh_mem_settings,
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v8.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v8.c
index 04b744d..342a037 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v8.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v8.c
@@ -90,7 +90,7 @@ static uint16_t get_fw_version(struct kgd_dev *kgd, enum kgd_engine_type type);
static const struct kfd2kgd_calls kfd2kgd = {
.init_gtt_mem_allocation = alloc_gtt_mem,
.free_gtt_mem = free_gtt_mem,
- .get_vmem_size = get_vmem_size,
+ .get_local_mem_info = get_local_mem_info,
.get_gpu_clock_counter = get_gpu_clock_counter,
.get_max_engine_clock_in_mhz = get_max_engine_clock_in_mhz,
.program_sh_mem_settings = kgd_program_sh_mem_settings,
diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_topology.c b/drivers/gpu/drm/amd/amdkfd/kfd_topology.c
index 1e50647..6ea7bd8 100644
--- a/drivers/gpu/drm/amd/amdkfd/kfd_topology.c
+++ b/drivers/gpu/drm/amd/amdkfd/kfd_topology.c
@@ -1088,6 +1088,7 @@ static void kfd_debug_print_topology(void)
static uint32_t kfd_generate_gpu_id(struct kfd_dev *gpu)
{
+ struct kfd_local_mem_info local_mem_info;
uint32_t hashout;
uint32_t buf[7];
uint64_t local_mem_size;
@@ -1096,7 +1097,10 @@ static uint32_t kfd_generate_gpu_id(struct kfd_dev *gpu)
if (!gpu)
return 0;
- local_mem_size = gpu->kfd2kgd->get_vmem_size(gpu->kgd);
+ gpu->kfd2kgd->get_local_mem_info(gpu->kgd, &local_mem_info);
+
+ local_mem_size = local_mem_info.local_mem_size_private +
+ local_mem_info.local_mem_size_public;
buf[0] = gpu->pdev->devfn;
buf[1] = gpu->pdev->subsystem_vendor;
diff --git a/drivers/gpu/drm/amd/include/kgd_kfd_interface.h b/drivers/gpu/drm/amd/include/kgd_kfd_interface.h
index a09d9f3..14ec3e4 100644
--- a/drivers/gpu/drm/amd/include/kgd_kfd_interface.h
+++ b/drivers/gpu/drm/amd/include/kgd_kfd_interface.h
@@ -39,6 +39,14 @@ struct kgd_dev;
struct kgd_mem;
+/* For getting GPU local memory information from KGD */
+struct kfd_local_mem_info {
+ uint64_t local_mem_size_private;
+ uint64_t local_mem_size_public;
+ uint32_t vram_width;
+ uint32_t mem_clk_max;
+};
+
enum kgd_memory_pool {
KGD_POOL_SYSTEM_CACHEABLE = 1,
KGD_POOL_SYSTEM_WRITECOMBINE = 2,
@@ -85,7 +93,7 @@ struct kgd2kfd_shared_resources {
*
* @free_gtt_mem: Frees a buffer that was allocated on the gart aperture
*
- * @get_vmem_size: Retrieves (physical) size of VRAM
+ * @get_local_mem_info: Retrieves information about GPU local memory
*
* @get_gpu_clock_counter: Retrieves GPU clock counter
*
@@ -129,7 +137,8 @@ struct kfd2kgd_calls {
void (*free_gtt_mem)(struct kgd_dev *kgd, void *mem_obj);
- uint64_t (*get_vmem_size)(struct kgd_dev *kgd);
+ void(*get_local_mem_info)(struct kgd_dev *kgd,
+ struct kfd_local_mem_info *mem_info);
uint64_t (*get_gpu_clock_counter)(struct kgd_dev *kgd);
uint32_t (*get_max_engine_clock_in_mhz)(struct kgd_dev *kgd);
diff --git a/drivers/gpu/drm/radeon/radeon_kfd.c b/drivers/gpu/drm/radeon/radeon_kfd.c
index 87a9ebb..d3249db 100644
--- a/drivers/gpu/drm/radeon/radeon_kfd.c
+++ b/drivers/gpu/drm/radeon/radeon_kfd.c
@@ -54,7 +54,8 @@ static int alloc_gtt_mem(struct kgd_dev *kgd, size_t size,
static void free_gtt_mem(struct kgd_dev *kgd, void *mem_obj);
-static uint64_t get_vmem_size(struct kgd_dev *kgd);
+static void get_local_mem_info(struct kgd_dev *kgd,
+ struct kfd_local_mem_info *mem_info);
static uint64_t get_gpu_clock_counter(struct kgd_dev *kgd);
static uint32_t get_max_engine_clock_in_mhz(struct kgd_dev *kgd);
@@ -107,7 +108,7 @@ static void write_vmid_invalidate_request(struct kgd_dev *kgd, uint8_t vmid);
static const struct kfd2kgd_calls kfd2kgd = {
.init_gtt_mem_allocation = alloc_gtt_mem,
.free_gtt_mem = free_gtt_mem,
- .get_vmem_size = get_vmem_size,
+ .get_local_mem_info = get_local_mem_info,
.get_gpu_clock_counter = get_gpu_clock_counter,
.get_max_engine_clock_in_mhz = get_max_engine_clock_in_mhz,
.program_sh_mem_settings = kgd_program_sh_mem_settings,
@@ -301,13 +302,26 @@ static void free_gtt_mem(struct kgd_dev *kgd, void *mem_obj)
kfree(mem);
}
-static uint64_t get_vmem_size(struct kgd_dev *kgd)
+static void get_local_mem_info(struct kgd_dev *kgd,
+ struct kfd_local_mem_info *mem_info)
{
struct radeon_device *rdev = (struct radeon_device *)kgd;
BUG_ON(kgd == NULL);
- return rdev->mc.real_vram_size;
+ memset(mem_info, 0, sizeof(*mem_info));
+
+ mem_info->local_mem_size_public = rdev->mc.visible_vram_size;
+ mem_info->local_mem_size_private = rdev->mc.real_vram_size -
+ rdev->mc.visible_vram_size;
+
+ mem_info->vram_width = rdev->mc.vram_width;
+ mem_info->mem_clk_max = radeon_dpm_get_mclk(rdev, false);
+
+ pr_debug("radeon: address base: 0x%llx public 0x%llx private 0x%llx\n",
+ rdev->mc.aper_base,
+ mem_info->local_mem_size_public,
+ mem_info->local_mem_size_private);
}
static uint64_t get_gpu_clock_counter(struct kgd_dev *kgd)
--
2.7.4
_______________________________________________
amd-gfx mailing list
amd-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/amd-gfx
^ permalink raw reply related [flat|nested] 17+ messages in thread
* [PATCH 3/7] amdkfd: Add some missing memset zero'ing in queue init func
[not found] ` <1473471099-16914-1-git-send-email-funfunctor-dczkZgxz+BNUPWh3PAxdjQ@public.gmane.org>
2016-09-10 1:31 ` [PATCH 1/7] amdkfd: Tidy up kfd_generate_gpu_id() uint64_t bitshift unpack Edward O'Callaghan
2016-09-10 1:31 ` [PATCH 2/7] radeonkfd/amdkfd: Implement get_local_mem_info() Edward O'Callaghan
@ 2016-09-10 1:31 ` Edward O'Callaghan
[not found] ` <1473471099-16914-4-git-send-email-funfunctor-dczkZgxz+BNUPWh3PAxdjQ@public.gmane.org>
2016-09-10 1:31 ` [PATCH 4/7] drm/amdkfd: Make kfd_lookup_process_by_pasid() well defined Edward O'Callaghan
` (3 subsequent siblings)
6 siblings, 1 reply; 17+ messages in thread
From: Edward O'Callaghan @ 2016-09-10 1:31 UTC (permalink / raw)
To: amd-gfx-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW
Signed-off-by: Edward O'Callaghan <funfunctor@folklore1984.net>
Reviewed-by: Oded Gabbay <oded.gabbay@gmail.com>
---
drivers/gpu/drm/amd/amdkfd/kfd_kernel_queue.c | 3 +++
1 file changed, 3 insertions(+)
diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_kernel_queue.c b/drivers/gpu/drm/amd/amdkfd/kfd_kernel_queue.c
index 9beae87..291c69d 100644
--- a/drivers/gpu/drm/amd/amdkfd/kfd_kernel_queue.c
+++ b/drivers/gpu/drm/amd/amdkfd/kfd_kernel_queue.c
@@ -47,6 +47,9 @@ static bool initialize(struct kernel_queue *kq, struct kfd_dev *dev,
pr_debug("amdkfd: In func %s initializing queue type %d size %d\n",
__func__, KFD_QUEUE_TYPE_HIQ, queue_size);
+ memset(&prop, 0, sizeof(prop));
+ memset(&nop, 0, sizeof(nop));
+
nop.opcode = IT_NOP;
nop.type = PM4_TYPE_3;
nop.u32all |= PM4_COUNT_ZERO;
--
2.7.4
_______________________________________________
amd-gfx mailing list
amd-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/amd-gfx
^ permalink raw reply related [flat|nested] 17+ messages in thread
* [PATCH 4/7] drm/amdkfd: Make kfd_lookup_process_by_pasid() well defined
[not found] ` <1473471099-16914-1-git-send-email-funfunctor-dczkZgxz+BNUPWh3PAxdjQ@public.gmane.org>
` (2 preceding siblings ...)
2016-09-10 1:31 ` [PATCH 3/7] amdkfd: Add some missing memset zero'ing in queue init func Edward O'Callaghan
@ 2016-09-10 1:31 ` Edward O'Callaghan
[not found] ` <1473471099-16914-5-git-send-email-funfunctor-dczkZgxz+BNUPWh3PAxdjQ@public.gmane.org>
2016-09-10 1:31 ` [PATCH 5/7] drm/amdkfd: Remove duplicate pqm_uninit() Edward O'Callaghan
` (2 subsequent siblings)
6 siblings, 1 reply; 17+ messages in thread
From: Edward O'Callaghan @ 2016-09-10 1:31 UTC (permalink / raw)
To: amd-gfx-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW
Ensure we return a NULL on the fail branch so that the call
site may BUG_ON() it.
Signed-off-by: Edward O'Callaghan <funfunctor@folklore1984.net>
---
drivers/gpu/drm/amd/amdkfd/kfd_process.c | 5 +++--
1 file changed, 3 insertions(+), 2 deletions(-)
diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_process.c b/drivers/gpu/drm/amd/amdkfd/kfd_process.c
index 4f3849a..8d78052 100644
--- a/drivers/gpu/drm/amd/amdkfd/kfd_process.c
+++ b/drivers/gpu/drm/amd/amdkfd/kfd_process.c
@@ -481,13 +481,14 @@ bool kfd_has_process_device_data(struct kfd_process *p)
/* This returns with process->mutex locked. */
struct kfd_process *kfd_lookup_process_by_pasid(unsigned int pasid)
{
- struct kfd_process *p;
+ struct kfd_process *p, *ret_p = NULL;
unsigned int temp;
int idx = srcu_read_lock(&kfd_processes_srcu);
hash_for_each_rcu(kfd_processes_table, temp, p, kfd_processes) {
if (p->pasid == pasid) {
+ ret_p = p;
mutex_lock(&p->mutex);
break;
}
@@ -495,5 +496,5 @@ struct kfd_process *kfd_lookup_process_by_pasid(unsigned int pasid)
srcu_read_unlock(&kfd_processes_srcu, idx);
- return p;
+ return ret_p;
}
--
2.7.4
_______________________________________________
amd-gfx mailing list
amd-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/amd-gfx
^ permalink raw reply related [flat|nested] 17+ messages in thread
* [PATCH 5/7] drm/amdkfd: Remove duplicate pqm_uninit()
[not found] ` <1473471099-16914-1-git-send-email-funfunctor-dczkZgxz+BNUPWh3PAxdjQ@public.gmane.org>
` (3 preceding siblings ...)
2016-09-10 1:31 ` [PATCH 4/7] drm/amdkfd: Make kfd_lookup_process_by_pasid() well defined Edward O'Callaghan
@ 2016-09-10 1:31 ` Edward O'Callaghan
[not found] ` <1473471099-16914-6-git-send-email-funfunctor-dczkZgxz+BNUPWh3PAxdjQ@public.gmane.org>
2016-09-10 1:31 ` [PATCH 6/7] drm/amdkfd: Reuse function to find a process through pasid Edward O'Callaghan
2016-09-10 1:31 ` [PATCH 7/7] drm/amdkfd: Fix possible infinite loop Edward O'Callaghan
6 siblings, 1 reply; 17+ messages in thread
From: Edward O'Callaghan @ 2016-09-10 1:31 UTC (permalink / raw)
To: amd-gfx-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW
pqm_uninit() will be called in kfd_process_notifier_release(), which
is when the process exits. Calling it in kfd_unbind_process_from_device()
is duplicate and in fact incorrect, because pqm should not be
uninitalized as long as the process still exists.
Original author: Yong Zhao <yong.zhao@amd.com>
Hand ported for mainline.
Signed-off-by: Edward O'Callaghan <funfunctor@folklore1984.net>
---
drivers/gpu/drm/amd/amdkfd/kfd_process.c | 2 --
1 file changed, 2 deletions(-)
diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_process.c b/drivers/gpu/drm/amd/amdkfd/kfd_process.c
index 8d78052..ef2266a 100644
--- a/drivers/gpu/drm/amd/amdkfd/kfd_process.c
+++ b/drivers/gpu/drm/amd/amdkfd/kfd_process.c
@@ -427,8 +427,6 @@ void kfd_unbind_process_from_device(struct kfd_dev *dev, unsigned int pasid)
if ((dev->dbgmgr) && (dev->dbgmgr->pasid == p->pasid))
kfd_dbgmgr_destroy(dev->dbgmgr);
- pqm_uninit(&p->pqm);
-
pdd = kfd_get_process_device_data(dev, p);
if (!pdd) {
--
2.7.4
_______________________________________________
amd-gfx mailing list
amd-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/amd-gfx
^ permalink raw reply related [flat|nested] 17+ messages in thread
* [PATCH 6/7] drm/amdkfd: Reuse function to find a process through pasid
[not found] ` <1473471099-16914-1-git-send-email-funfunctor-dczkZgxz+BNUPWh3PAxdjQ@public.gmane.org>
` (4 preceding siblings ...)
2016-09-10 1:31 ` [PATCH 5/7] drm/amdkfd: Remove duplicate pqm_uninit() Edward O'Callaghan
@ 2016-09-10 1:31 ` Edward O'Callaghan
[not found] ` <1473471099-16914-7-git-send-email-funfunctor-dczkZgxz+BNUPWh3PAxdjQ@public.gmane.org>
2016-09-10 1:31 ` [PATCH 7/7] drm/amdkfd: Fix possible infinite loop Edward O'Callaghan
6 siblings, 1 reply; 17+ messages in thread
From: Edward O'Callaghan @ 2016-09-10 1:31 UTC (permalink / raw)
To: amd-gfx-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW
The kfd_lookup_process_by_pasid() is just for that purpose,
so use it instead of repeating the code.
Signed-off-by: Edward O'Callaghan <funfunctor@folklore1984.net>
---
drivers/gpu/drm/amd/amdkfd/kfd_process.c | 58 +++++++++++++-------------------
1 file changed, 23 insertions(+), 35 deletions(-)
diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_process.c b/drivers/gpu/drm/amd/amdkfd/kfd_process.c
index ef2266a..a94dddc 100644
--- a/drivers/gpu/drm/amd/amdkfd/kfd_process.c
+++ b/drivers/gpu/drm/amd/amdkfd/kfd_process.c
@@ -404,56 +404,44 @@ void kfd_unbind_process_from_device(struct kfd_dev *dev, unsigned int pasid)
{
struct kfd_process *p;
struct kfd_process_device *pdd;
- int idx, i;
BUG_ON(dev == NULL);
- idx = srcu_read_lock(&kfd_processes_srcu);
-
/*
* Look for the process that matches the pasid. If there is no such
* process, we either released it in amdkfd's own notifier, or there
* is a bug. Unfortunately, there is no way to tell...
*/
- hash_for_each_rcu(kfd_processes_table, i, p, kfd_processes)
- if (p->pasid == pasid) {
+ p = kfd_lookup_process_by_pasid(pasid);
+ BUG_ON(!p);
- srcu_read_unlock(&kfd_processes_srcu, idx);
+ pr_debug("Unbinding process %d from IOMMU\n", pasid);
- pr_debug("Unbinding process %d from IOMMU\n", pasid);
-
- mutex_lock(&p->mutex);
+ if ((dev->dbgmgr) && (dev->dbgmgr->pasid == p->pasid))
+ kfd_dbgmgr_destroy(dev->dbgmgr);
- if ((dev->dbgmgr) && (dev->dbgmgr->pasid == p->pasid))
- kfd_dbgmgr_destroy(dev->dbgmgr);
-
- pdd = kfd_get_process_device_data(dev, p);
-
- if (!pdd) {
- mutex_unlock(&p->mutex);
- return;
- }
-
- if (pdd->reset_wavefronts) {
- dbgdev_wave_reset_wavefronts(pdd->dev, p);
- pdd->reset_wavefronts = false;
- }
+ pdd = kfd_get_process_device_data(dev, p);
- /*
- * Just mark pdd as unbound, because we still need it
- * to call amd_iommu_unbind_pasid() in when the
- * process exits.
- * We don't call amd_iommu_unbind_pasid() here
- * because the IOMMU called us.
- */
- pdd->bound = false;
+ if (!pdd) {
+ mutex_unlock(&p->mutex);
+ return;
+ }
- mutex_unlock(&p->mutex);
+ if (pdd->reset_wavefronts) {
+ dbgdev_wave_reset_wavefronts(pdd->dev, p);
+ pdd->reset_wavefronts = false;
+ }
- return;
- }
+ /*
+ * Just mark pdd as unbound, because we still need it
+ * to call amd_iommu_unbind_pasid() in when the
+ * process exits.
+ * We don't call amd_iommu_unbind_pasid() here
+ * because the IOMMU called us.
+ */
+ pdd->bound = false;
- srcu_read_unlock(&kfd_processes_srcu, idx);
+ mutex_unlock(&p->mutex);
}
struct kfd_process_device *kfd_get_first_process_device_data(struct kfd_process *p)
--
2.7.4
_______________________________________________
amd-gfx mailing list
amd-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/amd-gfx
^ permalink raw reply related [flat|nested] 17+ messages in thread
* [PATCH 7/7] drm/amdkfd: Fix possible infinite loop
[not found] ` <1473471099-16914-1-git-send-email-funfunctor-dczkZgxz+BNUPWh3PAxdjQ@public.gmane.org>
` (5 preceding siblings ...)
2016-09-10 1:31 ` [PATCH 6/7] drm/amdkfd: Reuse function to find a process through pasid Edward O'Callaghan
@ 2016-09-10 1:31 ` Edward O'Callaghan
[not found] ` <1473471099-16914-8-git-send-email-funfunctor-dczkZgxz+BNUPWh3PAxdjQ@public.gmane.org>
6 siblings, 1 reply; 17+ messages in thread
From: Edward O'Callaghan @ 2016-09-10 1:31 UTC (permalink / raw)
To: amd-gfx-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW
When the loop predicating timeout parameter passed happens to
not be a multiple of 20 the unsigned integer will overflow and
the loop will become unbounded.
Signed-off-by: Edward O'Callaghan <funfunctor@folklore1984.net>
---
drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v7.c | 17 +++++++++--------
drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v8.c | 17 +++++++++--------
2 files changed, 18 insertions(+), 16 deletions(-)
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v7.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v7.c
index dc69cf7..b0485b4 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v7.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v7.c
@@ -103,11 +103,11 @@ static bool kgd_hqd_is_occupied(struct kgd_dev *kgd, uint64_t queue_address,
uint32_t pipe_id, uint32_t queue_id);
static int kgd_hqd_destroy(struct kgd_dev *kgd, uint32_t reset_type,
- unsigned int timeout, uint32_t pipe_id,
+ unsigned int utimeout, uint32_t pipe_id,
uint32_t queue_id);
static bool kgd_hqd_sdma_is_occupied(struct kgd_dev *kgd, void *mqd);
static int kgd_hqd_sdma_destroy(struct kgd_dev *kgd, void *mqd,
- unsigned int timeout);
+ unsigned int utimeout);
static int kgd_address_watch_disable(struct kgd_dev *kgd);
static int kgd_address_watch_execute(struct kgd_dev *kgd,
unsigned int watch_point_id,
@@ -437,11 +437,12 @@ static bool kgd_hqd_sdma_is_occupied(struct kgd_dev *kgd, void *mqd)
}
static int kgd_hqd_destroy(struct kgd_dev *kgd, uint32_t reset_type,
- unsigned int timeout, uint32_t pipe_id,
+ unsigned int utimeout, uint32_t pipe_id,
uint32_t queue_id)
{
struct amdgpu_device *adev = get_amdgpu_device(kgd);
uint32_t temp;
+ int timeout = utimeout;
acquire_queue(kgd, pipe_id, queue_id);
WREG32(mmCP_HQD_PQ_DOORBELL_CONTROL, 0);
@@ -452,9 +453,8 @@ static int kgd_hqd_destroy(struct kgd_dev *kgd, uint32_t reset_type,
temp = RREG32(mmCP_HQD_ACTIVE);
if (temp & CP_HQD_ACTIVE__ACTIVE_MASK)
break;
- if (timeout == 0) {
- pr_err("kfd: cp queue preemption time out (%dms)\n",
- temp);
+ if (timeout <= 0) {
+ pr_err("kfd: cp queue preemption time out.\n");
release_queue(kgd);
return -ETIME;
}
@@ -467,12 +467,13 @@ static int kgd_hqd_destroy(struct kgd_dev *kgd, uint32_t reset_type,
}
static int kgd_hqd_sdma_destroy(struct kgd_dev *kgd, void *mqd,
- unsigned int timeout)
+ unsigned int utimeout)
{
struct amdgpu_device *adev = get_amdgpu_device(kgd);
struct cik_sdma_rlc_registers *m;
uint32_t sdma_base_addr;
uint32_t temp;
+ int timeout = utimeout;
m = get_sdma_mqd(mqd);
sdma_base_addr = get_sdma_base_addr(m);
@@ -485,7 +486,7 @@ static int kgd_hqd_sdma_destroy(struct kgd_dev *kgd, void *mqd,
temp = RREG32(sdma_base_addr + mmSDMA0_RLC0_CONTEXT_STATUS);
if (temp & SDMA0_STATUS_REG__RB_CMD_IDLE__SHIFT)
break;
- if (timeout == 0)
+ if (timeout <= 0)
return -ETIME;
msleep(20);
timeout -= 20;
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v8.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v8.c
index 342a037..a5c027d 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v8.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v8.c
@@ -62,10 +62,10 @@ static bool kgd_hqd_is_occupied(struct kgd_dev *kgd, uint64_t queue_address,
uint32_t pipe_id, uint32_t queue_id);
static bool kgd_hqd_sdma_is_occupied(struct kgd_dev *kgd, void *mqd);
static int kgd_hqd_destroy(struct kgd_dev *kgd, uint32_t reset_type,
- unsigned int timeout, uint32_t pipe_id,
+ unsigned int utimeout, uint32_t pipe_id,
uint32_t queue_id);
static int kgd_hqd_sdma_destroy(struct kgd_dev *kgd, void *mqd,
- unsigned int timeout);
+ unsigned int utimeout);
static void write_vmid_invalidate_request(struct kgd_dev *kgd, uint8_t vmid);
static int kgd_address_watch_disable(struct kgd_dev *kgd);
static int kgd_address_watch_execute(struct kgd_dev *kgd,
@@ -349,11 +349,12 @@ static bool kgd_hqd_sdma_is_occupied(struct kgd_dev *kgd, void *mqd)
}
static int kgd_hqd_destroy(struct kgd_dev *kgd, uint32_t reset_type,
- unsigned int timeout, uint32_t pipe_id,
+ unsigned int utimeout, uint32_t pipe_id,
uint32_t queue_id)
{
struct amdgpu_device *adev = get_amdgpu_device(kgd);
uint32_t temp;
+ int timeout = utimeout;
acquire_queue(kgd, pipe_id, queue_id);
@@ -363,9 +364,8 @@ static int kgd_hqd_destroy(struct kgd_dev *kgd, uint32_t reset_type,
temp = RREG32(mmCP_HQD_ACTIVE);
if (temp & CP_HQD_ACTIVE__ACTIVE_MASK)
break;
- if (timeout == 0) {
- pr_err("kfd: cp queue preemption time out (%dms)\n",
- temp);
+ if (timeout <= 0) {
+ pr_err("kfd: cp queue preemption time out.\n");
release_queue(kgd);
return -ETIME;
}
@@ -378,12 +378,13 @@ static int kgd_hqd_destroy(struct kgd_dev *kgd, uint32_t reset_type,
}
static int kgd_hqd_sdma_destroy(struct kgd_dev *kgd, void *mqd,
- unsigned int timeout)
+ unsigned int utimeout)
{
struct amdgpu_device *adev = get_amdgpu_device(kgd);
struct cik_sdma_rlc_registers *m;
uint32_t sdma_base_addr;
uint32_t temp;
+ int timeout = utimeout;
m = get_sdma_mqd(mqd);
sdma_base_addr = get_sdma_base_addr(m);
@@ -396,7 +397,7 @@ static int kgd_hqd_sdma_destroy(struct kgd_dev *kgd, void *mqd,
temp = RREG32(sdma_base_addr + mmSDMA0_RLC0_CONTEXT_STATUS);
if (temp & SDMA0_STATUS_REG__RB_CMD_IDLE__SHIFT)
break;
- if (timeout == 0)
+ if (timeout <= 0)
return -ETIME;
msleep(20);
timeout -= 20;
--
2.7.4
_______________________________________________
amd-gfx mailing list
amd-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/amd-gfx
^ permalink raw reply related [flat|nested] 17+ messages in thread
* Re: [PATCH 1/7] amdkfd: Tidy up kfd_generate_gpu_id() uint64_t bitshift unpack
[not found] ` <1473471099-16914-2-git-send-email-funfunctor-dczkZgxz+BNUPWh3PAxdjQ@public.gmane.org>
@ 2016-09-10 15:50 ` Oded Gabbay
0 siblings, 0 replies; 17+ messages in thread
From: Oded Gabbay @ 2016-09-10 15:50 UTC (permalink / raw)
To: Edward O'Callaghan; +Cc: amd-gfx-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW
On Sat, Sep 10, 2016 at 4:31 AM, Edward O'Callaghan
<funfunctor@folklore1984.net> wrote:
> Dereference the one time and unpack the lower and upper 32bit
> portions with the proper kernel helper macros.
>
> Signed-off-by: Edward O'Callaghan <funfunctor@folklore1984.net>
> Reviewed-by: Oded Gabbay <oded.gabbay@gmail.com>
> ---
> drivers/gpu/drm/amd/amdkfd/kfd_topology.c | 8 +++++---
> 1 file changed, 5 insertions(+), 3 deletions(-)
>
> diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_topology.c b/drivers/gpu/drm/amd/amdkfd/kfd_topology.c
> index 884c96f..1e50647 100644
> --- a/drivers/gpu/drm/amd/amdkfd/kfd_topology.c
> +++ b/drivers/gpu/drm/amd/amdkfd/kfd_topology.c
> @@ -1090,19 +1090,21 @@ static uint32_t kfd_generate_gpu_id(struct kfd_dev *gpu)
> {
> uint32_t hashout;
> uint32_t buf[7];
> + uint64_t local_mem_size;
> int i;
>
> if (!gpu)
> return 0;
>
> + local_mem_size = gpu->kfd2kgd->get_vmem_size(gpu->kgd);
> +
> buf[0] = gpu->pdev->devfn;
> buf[1] = gpu->pdev->subsystem_vendor;
> buf[2] = gpu->pdev->subsystem_device;
> buf[3] = gpu->pdev->device;
> buf[4] = gpu->pdev->bus->number;
> - buf[5] = (uint32_t)(gpu->kfd2kgd->get_vmem_size(gpu->kgd)
> - & 0xffffffff);
> - buf[6] = (uint32_t)(gpu->kfd2kgd->get_vmem_size(gpu->kgd) >> 32);
> + buf[5] = lower_32_bits(local_mem_size);
> + buf[6] = upper_32_bits(local_mem_size);
>
> for (i = 0, hashout = 0; i < 7; i++)
> hashout ^= hash_32(buf[i], KFD_GPU_ID_HASH_WIDTH);
> --
> 2.7.4
>
> _______________________________________________
> amd-gfx mailing list
> amd-gfx@lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/amd-gfx
Please change title of patch to "drm/amdkfd: ...."
Oded
_______________________________________________
amd-gfx mailing list
amd-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/amd-gfx
^ permalink raw reply [flat|nested] 17+ messages in thread
* Re: [PATCH 3/7] amdkfd: Add some missing memset zero'ing in queue init func
[not found] ` <1473471099-16914-4-git-send-email-funfunctor-dczkZgxz+BNUPWh3PAxdjQ@public.gmane.org>
@ 2016-09-10 15:50 ` Oded Gabbay
0 siblings, 0 replies; 17+ messages in thread
From: Oded Gabbay @ 2016-09-10 15:50 UTC (permalink / raw)
To: Edward O'Callaghan; +Cc: amd-gfx-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW
On Sat, Sep 10, 2016 at 4:31 AM, Edward O'Callaghan
<funfunctor@folklore1984.net> wrote:
> Signed-off-by: Edward O'Callaghan <funfunctor@folklore1984.net>
> Reviewed-by: Oded Gabbay <oded.gabbay@gmail.com>
> ---
> drivers/gpu/drm/amd/amdkfd/kfd_kernel_queue.c | 3 +++
> 1 file changed, 3 insertions(+)
>
> diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_kernel_queue.c b/drivers/gpu/drm/amd/amdkfd/kfd_kernel_queue.c
> index 9beae87..291c69d 100644
> --- a/drivers/gpu/drm/amd/amdkfd/kfd_kernel_queue.c
> +++ b/drivers/gpu/drm/amd/amdkfd/kfd_kernel_queue.c
> @@ -47,6 +47,9 @@ static bool initialize(struct kernel_queue *kq, struct kfd_dev *dev,
> pr_debug("amdkfd: In func %s initializing queue type %d size %d\n",
> __func__, KFD_QUEUE_TYPE_HIQ, queue_size);
>
> + memset(&prop, 0, sizeof(prop));
> + memset(&nop, 0, sizeof(nop));
> +
> nop.opcode = IT_NOP;
> nop.type = PM4_TYPE_3;
> nop.u32all |= PM4_COUNT_ZERO;
> --
> 2.7.4
>
> _______________________________________________
> amd-gfx mailing list
> amd-gfx@lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/amd-gfx
Please change title of patch to "drm/amdkfd: ..."
Thanks,
Oded
_______________________________________________
amd-gfx mailing list
amd-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/amd-gfx
^ permalink raw reply [flat|nested] 17+ messages in thread
* Re: [PATCH 4/7] drm/amdkfd: Make kfd_lookup_process_by_pasid() well defined
[not found] ` <1473471099-16914-5-git-send-email-funfunctor-dczkZgxz+BNUPWh3PAxdjQ@public.gmane.org>
@ 2016-09-10 15:55 ` Oded Gabbay
[not found] ` <CAFCwf133N=8Eq1QJG-tO8WTFE2=7zKLJHV9GzHu-NWpKwTdQVQ-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org>
0 siblings, 1 reply; 17+ messages in thread
From: Oded Gabbay @ 2016-09-10 15:55 UTC (permalink / raw)
To: Edward O'Callaghan; +Cc: amd-gfx-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW
On Sat, Sep 10, 2016 at 4:31 AM, Edward O'Callaghan
<funfunctor@folklore1984.net> wrote:
> Ensure we return a NULL on the fail branch so that the call
> site may BUG_ON() it.
>
> Signed-off-by: Edward O'Callaghan <funfunctor@folklore1984.net>
> ---
> drivers/gpu/drm/amd/amdkfd/kfd_process.c | 5 +++--
> 1 file changed, 3 insertions(+), 2 deletions(-)
>
> diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_process.c b/drivers/gpu/drm/amd/amdkfd/kfd_process.c
> index 4f3849a..8d78052 100644
> --- a/drivers/gpu/drm/amd/amdkfd/kfd_process.c
> +++ b/drivers/gpu/drm/amd/amdkfd/kfd_process.c
> @@ -481,13 +481,14 @@ bool kfd_has_process_device_data(struct kfd_process *p)
> /* This returns with process->mutex locked. */
> struct kfd_process *kfd_lookup_process_by_pasid(unsigned int pasid)
> {
> - struct kfd_process *p;
> + struct kfd_process *p, *ret_p = NULL;
> unsigned int temp;
>
> int idx = srcu_read_lock(&kfd_processes_srcu);
>
> hash_for_each_rcu(kfd_processes_table, temp, p, kfd_processes) {
> if (p->pasid == pasid) {
> + ret_p = p;
> mutex_lock(&p->mutex);
> break;
> }
> @@ -495,5 +496,5 @@ struct kfd_process *kfd_lookup_process_by_pasid(unsigned int pasid)
>
> srcu_read_unlock(&kfd_processes_srcu, idx);
>
> - return p;
> + return ret_p;
> }
> --
> 2.7.4
>
> _______________________________________________
> amd-gfx mailing list
> amd-gfx@lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/amd-gfx
This patch is not needed. p will always be a valid pointer on return or NULL.
Unless we hit the "p->pasid == pasid" condition, in which case p is
valid, p will always be NULL when finishing the hash_for_each_rcu
macro.
Oded
_______________________________________________
amd-gfx mailing list
amd-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/amd-gfx
^ permalink raw reply [flat|nested] 17+ messages in thread
* Re: [PATCH 5/7] drm/amdkfd: Remove duplicate pqm_uninit()
[not found] ` <1473471099-16914-6-git-send-email-funfunctor-dczkZgxz+BNUPWh3PAxdjQ@public.gmane.org>
@ 2016-09-10 16:06 ` Oded Gabbay
[not found] ` <CAFCwf12W+To7TLzmFi9RAcsvu3ytaGwn8eZtbkvtU5jVS6LwCg-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org>
0 siblings, 1 reply; 17+ messages in thread
From: Oded Gabbay @ 2016-09-10 16:06 UTC (permalink / raw)
To: Edward O'Callaghan; +Cc: amd-gfx-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW
On Sat, Sep 10, 2016 at 4:31 AM, Edward O'Callaghan
<funfunctor@folklore1984.net> wrote:
> pqm_uninit() will be called in kfd_process_notifier_release(), which
> is when the process exits. Calling it in kfd_unbind_process_from_device()
> is duplicate and in fact incorrect, because pqm should not be
> uninitalized as long as the process still exists.
Hmm, I don't agree with this patch and the above explanation.
kfd_unbind_process_from_device is called from the IOMMUv2 driver, when
its callback from the mm subsystem is called (mn_release). That
callback is called when the process _is_ shutting down. The IOMMUv2
driver then unmaps all its mappings, and if we won't destroy our
queues before that happens (as pqm_uninit does), and we have a pending
operation on the queue which would get submitted before
kfd_process_notifier_release() is called, then I believe we may get an
IOMMU fault.
Oded
>
> Original author: Yong Zhao <yong.zhao@amd.com>
> Hand ported for mainline.
>
> Signed-off-by: Edward O'Callaghan <funfunctor@folklore1984.net>
> ---
> drivers/gpu/drm/amd/amdkfd/kfd_process.c | 2 --
> 1 file changed, 2 deletions(-)
>
> diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_process.c b/drivers/gpu/drm/amd/amdkfd/kfd_process.c
> index 8d78052..ef2266a 100644
> --- a/drivers/gpu/drm/amd/amdkfd/kfd_process.c
> +++ b/drivers/gpu/drm/amd/amdkfd/kfd_process.c
> @@ -427,8 +427,6 @@ void kfd_unbind_process_from_device(struct kfd_dev *dev, unsigned int pasid)
> if ((dev->dbgmgr) && (dev->dbgmgr->pasid == p->pasid))
> kfd_dbgmgr_destroy(dev->dbgmgr);
>
> - pqm_uninit(&p->pqm);
> -
> pdd = kfd_get_process_device_data(dev, p);
>
> if (!pdd) {
> --
> 2.7.4
>
> _______________________________________________
> amd-gfx mailing list
> amd-gfx@lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/amd-gfx
_______________________________________________
amd-gfx mailing list
amd-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/amd-gfx
^ permalink raw reply [flat|nested] 17+ messages in thread
* Re: [PATCH 4/7] drm/amdkfd: Make kfd_lookup_process_by_pasid() well defined
[not found] ` <CAFCwf133N=8Eq1QJG-tO8WTFE2=7zKLJHV9GzHu-NWpKwTdQVQ-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org>
@ 2016-09-11 5:46 ` Edward O'Callaghan
0 siblings, 0 replies; 17+ messages in thread
From: Edward O'Callaghan @ 2016-09-11 5:46 UTC (permalink / raw)
To: Oded Gabbay; +Cc: amd-gfx-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW
[-- Attachment #1.1.1: Type: text/plain, Size: 2338 bytes --]
On 09/11/2016 01:55 AM, Oded Gabbay wrote:
> On Sat, Sep 10, 2016 at 4:31 AM, Edward O'Callaghan
> <funfunctor-dczkZgxz+BNUPWh3PAxdjQ@public.gmane.org> wrote:
>> Ensure we return a NULL on the fail branch so that the call
>> site may BUG_ON() it.
>>
>> Signed-off-by: Edward O'Callaghan <funfunctor-dczkZgxz+BNUPWh3PAxdjQ@public.gmane.org>
>> ---
>> drivers/gpu/drm/amd/amdkfd/kfd_process.c | 5 +++--
>> 1 file changed, 3 insertions(+), 2 deletions(-)
>>
>> diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_process.c b/drivers/gpu/drm/amd/amdkfd/kfd_process.c
>> index 4f3849a..8d78052 100644
>> --- a/drivers/gpu/drm/amd/amdkfd/kfd_process.c
>> +++ b/drivers/gpu/drm/amd/amdkfd/kfd_process.c
>> @@ -481,13 +481,14 @@ bool kfd_has_process_device_data(struct kfd_process *p)
>> /* This returns with process->mutex locked. */
>> struct kfd_process *kfd_lookup_process_by_pasid(unsigned int pasid)
>> {
>> - struct kfd_process *p;
>> + struct kfd_process *p, *ret_p = NULL;
>> unsigned int temp;
>>
>> int idx = srcu_read_lock(&kfd_processes_srcu);
>>
>> hash_for_each_rcu(kfd_processes_table, temp, p, kfd_processes) {
>> if (p->pasid == pasid) {
>> + ret_p = p;
>> mutex_lock(&p->mutex);
>> break;
>> }
>> @@ -495,5 +496,5 @@ struct kfd_process *kfd_lookup_process_by_pasid(unsigned int pasid)
>>
>> srcu_read_unlock(&kfd_processes_srcu, idx);
>>
>> - return p;
>> + return ret_p;
>> }
>> --
>> 2.7.4
>>
>> _______________________________________________
>> amd-gfx mailing list
>> amd-gfx-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW@public.gmane.org
>> https://lists.freedesktop.org/mailman/listinfo/amd-gfx
>
> This patch is not needed. p will always be a valid pointer on return or NULL.
> Unless we hit the "p->pasid == pasid" condition, in which case p is
> valid, p will always be NULL when finishing the hash_for_each_rcu
> macro.
Ah you are correct, I didn't notice it was initialized inside the macro.
>
> Oded
> _______________________________________________
> amd-gfx mailing list
> amd-gfx-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW@public.gmane.org
> https://lists.freedesktop.org/mailman/listinfo/amd-gfx
>
[-- Attachment #1.2: OpenPGP digital signature --]
[-- Type: application/pgp-signature, Size: 819 bytes --]
[-- Attachment #2: Type: text/plain, Size: 154 bytes --]
_______________________________________________
amd-gfx mailing list
amd-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/amd-gfx
^ permalink raw reply [flat|nested] 17+ messages in thread
* Re: [PATCH 6/7] drm/amdkfd: Reuse function to find a process through pasid
[not found] ` <1473471099-16914-7-git-send-email-funfunctor-dczkZgxz+BNUPWh3PAxdjQ@public.gmane.org>
@ 2016-09-11 9:56 ` Oded Gabbay
0 siblings, 0 replies; 17+ messages in thread
From: Oded Gabbay @ 2016-09-11 9:56 UTC (permalink / raw)
To: Edward O'Callaghan; +Cc: amd-gfx-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW
On Sat, Sep 10, 2016 at 4:31 AM, Edward O'Callaghan
<funfunctor@folklore1984.net> wrote:
> The kfd_lookup_process_by_pasid() is just for that purpose,
> so use it instead of repeating the code.
>
> Signed-off-by: Edward O'Callaghan <funfunctor@folklore1984.net>
> ---
> drivers/gpu/drm/amd/amdkfd/kfd_process.c | 58 +++++++++++++-------------------
> 1 file changed, 23 insertions(+), 35 deletions(-)
>
> diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_process.c b/drivers/gpu/drm/amd/amdkfd/kfd_process.c
> index ef2266a..a94dddc 100644
> --- a/drivers/gpu/drm/amd/amdkfd/kfd_process.c
> +++ b/drivers/gpu/drm/amd/amdkfd/kfd_process.c
> @@ -404,56 +404,44 @@ void kfd_unbind_process_from_device(struct kfd_dev *dev, unsigned int pasid)
> {
> struct kfd_process *p;
> struct kfd_process_device *pdd;
> - int idx, i;
>
> BUG_ON(dev == NULL);
>
> - idx = srcu_read_lock(&kfd_processes_srcu);
> -
> /*
> * Look for the process that matches the pasid. If there is no such
> * process, we either released it in amdkfd's own notifier, or there
> * is a bug. Unfortunately, there is no way to tell...
> */
> - hash_for_each_rcu(kfd_processes_table, i, p, kfd_processes)
> - if (p->pasid == pasid) {
> + p = kfd_lookup_process_by_pasid(pasid);
> + BUG_ON(!p);
Don't BUG_ON here. Look at the comment above, there is a valid
scenario where p might be NULL. If p is NULL, just exit the function.
>
> - srcu_read_unlock(&kfd_processes_srcu, idx);
> + pr_debug("Unbinding process %d from IOMMU\n", pasid);
>
> - pr_debug("Unbinding process %d from IOMMU\n", pasid);
> -
> - mutex_lock(&p->mutex);
> + if ((dev->dbgmgr) && (dev->dbgmgr->pasid == p->pasid))
> + kfd_dbgmgr_destroy(dev->dbgmgr);
>
> - if ((dev->dbgmgr) && (dev->dbgmgr->pasid == p->pasid))
> - kfd_dbgmgr_destroy(dev->dbgmgr);
> -
> - pdd = kfd_get_process_device_data(dev, p);
> -
> - if (!pdd) {
> - mutex_unlock(&p->mutex);
> - return;
> - }
> -
> - if (pdd->reset_wavefronts) {
> - dbgdev_wave_reset_wavefronts(pdd->dev, p);
> - pdd->reset_wavefronts = false;
> - }
> + pdd = kfd_get_process_device_data(dev, p);
>
> - /*
> - * Just mark pdd as unbound, because we still need it
> - * to call amd_iommu_unbind_pasid() in when the
> - * process exits.
> - * We don't call amd_iommu_unbind_pasid() here
> - * because the IOMMU called us.
> - */
> - pdd->bound = false;
> + if (!pdd) {
> + mutex_unlock(&p->mutex);
> + return;
> + }
>
> - mutex_unlock(&p->mutex);
> + if (pdd->reset_wavefronts) {
> + dbgdev_wave_reset_wavefronts(pdd->dev, p);
> + pdd->reset_wavefronts = false;
> + }
>
> - return;
> - }
> + /*
> + * Just mark pdd as unbound, because we still need it
> + * to call amd_iommu_unbind_pasid() in when the
> + * process exits.
> + * We don't call amd_iommu_unbind_pasid() here
> + * because the IOMMU called us.
> + */
> + pdd->bound = false;
>
> - srcu_read_unlock(&kfd_processes_srcu, idx);
> + mutex_unlock(&p->mutex);
> }
>
> struct kfd_process_device *kfd_get_first_process_device_data(struct kfd_process *p)
> --
> 2.7.4
>
> _______________________________________________
> amd-gfx mailing list
> amd-gfx@lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/amd-gfx
Assuming the above comment is fixed, this patch is:
Reviewed-by: Oded Gabbay <oded.gabbay@gmail.com>
_______________________________________________
amd-gfx mailing list
amd-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/amd-gfx
^ permalink raw reply [flat|nested] 17+ messages in thread
* Re: [PATCH 7/7] drm/amdkfd: Fix possible infinite loop
[not found] ` <1473471099-16914-8-git-send-email-funfunctor-dczkZgxz+BNUPWh3PAxdjQ@public.gmane.org>
@ 2016-09-11 10:03 ` Oded Gabbay
0 siblings, 0 replies; 17+ messages in thread
From: Oded Gabbay @ 2016-09-11 10:03 UTC (permalink / raw)
To: Edward O'Callaghan; +Cc: amd-gfx-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW
On Sat, Sep 10, 2016 at 4:31 AM, Edward O'Callaghan
<funfunctor@folklore1984.net> wrote:
> When the loop predicating timeout parameter passed happens to
> not be a multiple of 20 the unsigned integer will overflow and
> the loop will become unbounded.
>
> Signed-off-by: Edward O'Callaghan <funfunctor@folklore1984.net>
> ---
> drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v7.c | 17 +++++++++--------
> drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v8.c | 17 +++++++++--------
> 2 files changed, 18 insertions(+), 16 deletions(-)
>
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v7.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v7.c
> index dc69cf7..b0485b4 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v7.c
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v7.c
> @@ -103,11 +103,11 @@ static bool kgd_hqd_is_occupied(struct kgd_dev *kgd, uint64_t queue_address,
> uint32_t pipe_id, uint32_t queue_id);
>
> static int kgd_hqd_destroy(struct kgd_dev *kgd, uint32_t reset_type,
> - unsigned int timeout, uint32_t pipe_id,
> + unsigned int utimeout, uint32_t pipe_id,
> uint32_t queue_id);
> static bool kgd_hqd_sdma_is_occupied(struct kgd_dev *kgd, void *mqd);
> static int kgd_hqd_sdma_destroy(struct kgd_dev *kgd, void *mqd,
> - unsigned int timeout);
> + unsigned int utimeout);
> static int kgd_address_watch_disable(struct kgd_dev *kgd);
> static int kgd_address_watch_execute(struct kgd_dev *kgd,
> unsigned int watch_point_id,
> @@ -437,11 +437,12 @@ static bool kgd_hqd_sdma_is_occupied(struct kgd_dev *kgd, void *mqd)
> }
>
> static int kgd_hqd_destroy(struct kgd_dev *kgd, uint32_t reset_type,
> - unsigned int timeout, uint32_t pipe_id,
> + unsigned int utimeout, uint32_t pipe_id,
> uint32_t queue_id)
> {
> struct amdgpu_device *adev = get_amdgpu_device(kgd);
> uint32_t temp;
> + int timeout = utimeout;
>
> acquire_queue(kgd, pipe_id, queue_id);
> WREG32(mmCP_HQD_PQ_DOORBELL_CONTROL, 0);
> @@ -452,9 +453,8 @@ static int kgd_hqd_destroy(struct kgd_dev *kgd, uint32_t reset_type,
> temp = RREG32(mmCP_HQD_ACTIVE);
> if (temp & CP_HQD_ACTIVE__ACTIVE_MASK)
> break;
> - if (timeout == 0) {
> - pr_err("kfd: cp queue preemption time out (%dms)\n",
> - temp);
> + if (timeout <= 0) {
> + pr_err("kfd: cp queue preemption time out.\n");
> release_queue(kgd);
> return -ETIME;
> }
> @@ -467,12 +467,13 @@ static int kgd_hqd_destroy(struct kgd_dev *kgd, uint32_t reset_type,
> }
>
> static int kgd_hqd_sdma_destroy(struct kgd_dev *kgd, void *mqd,
> - unsigned int timeout)
> + unsigned int utimeout)
> {
> struct amdgpu_device *adev = get_amdgpu_device(kgd);
> struct cik_sdma_rlc_registers *m;
> uint32_t sdma_base_addr;
> uint32_t temp;
> + int timeout = utimeout;
>
> m = get_sdma_mqd(mqd);
> sdma_base_addr = get_sdma_base_addr(m);
> @@ -485,7 +486,7 @@ static int kgd_hqd_sdma_destroy(struct kgd_dev *kgd, void *mqd,
> temp = RREG32(sdma_base_addr + mmSDMA0_RLC0_CONTEXT_STATUS);
> if (temp & SDMA0_STATUS_REG__RB_CMD_IDLE__SHIFT)
> break;
> - if (timeout == 0)
> + if (timeout <= 0)
> return -ETIME;
> msleep(20);
> timeout -= 20;
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v8.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v8.c
> index 342a037..a5c027d 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v8.c
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v8.c
> @@ -62,10 +62,10 @@ static bool kgd_hqd_is_occupied(struct kgd_dev *kgd, uint64_t queue_address,
> uint32_t pipe_id, uint32_t queue_id);
> static bool kgd_hqd_sdma_is_occupied(struct kgd_dev *kgd, void *mqd);
> static int kgd_hqd_destroy(struct kgd_dev *kgd, uint32_t reset_type,
> - unsigned int timeout, uint32_t pipe_id,
> + unsigned int utimeout, uint32_t pipe_id,
> uint32_t queue_id);
> static int kgd_hqd_sdma_destroy(struct kgd_dev *kgd, void *mqd,
> - unsigned int timeout);
> + unsigned int utimeout);
> static void write_vmid_invalidate_request(struct kgd_dev *kgd, uint8_t vmid);
> static int kgd_address_watch_disable(struct kgd_dev *kgd);
> static int kgd_address_watch_execute(struct kgd_dev *kgd,
> @@ -349,11 +349,12 @@ static bool kgd_hqd_sdma_is_occupied(struct kgd_dev *kgd, void *mqd)
> }
>
> static int kgd_hqd_destroy(struct kgd_dev *kgd, uint32_t reset_type,
> - unsigned int timeout, uint32_t pipe_id,
> + unsigned int utimeout, uint32_t pipe_id,
> uint32_t queue_id)
> {
> struct amdgpu_device *adev = get_amdgpu_device(kgd);
> uint32_t temp;
> + int timeout = utimeout;
>
> acquire_queue(kgd, pipe_id, queue_id);
>
> @@ -363,9 +364,8 @@ static int kgd_hqd_destroy(struct kgd_dev *kgd, uint32_t reset_type,
> temp = RREG32(mmCP_HQD_ACTIVE);
> if (temp & CP_HQD_ACTIVE__ACTIVE_MASK)
> break;
> - if (timeout == 0) {
> - pr_err("kfd: cp queue preemption time out (%dms)\n",
> - temp);
> + if (timeout <= 0) {
> + pr_err("kfd: cp queue preemption time out.\n");
> release_queue(kgd);
> return -ETIME;
> }
> @@ -378,12 +378,13 @@ static int kgd_hqd_destroy(struct kgd_dev *kgd, uint32_t reset_type,
> }
>
> static int kgd_hqd_sdma_destroy(struct kgd_dev *kgd, void *mqd,
> - unsigned int timeout)
> + unsigned int utimeout)
> {
> struct amdgpu_device *adev = get_amdgpu_device(kgd);
> struct cik_sdma_rlc_registers *m;
> uint32_t sdma_base_addr;
> uint32_t temp;
> + int timeout = utimeout;
>
> m = get_sdma_mqd(mqd);
> sdma_base_addr = get_sdma_base_addr(m);
> @@ -396,7 +397,7 @@ static int kgd_hqd_sdma_destroy(struct kgd_dev *kgd, void *mqd,
> temp = RREG32(sdma_base_addr + mmSDMA0_RLC0_CONTEXT_STATUS);
> if (temp & SDMA0_STATUS_REG__RB_CMD_IDLE__SHIFT)
> break;
> - if (timeout == 0)
> + if (timeout <= 0)
> return -ETIME;
> msleep(20);
> timeout -= 20;
> --
> 2.7.4
>
> _______________________________________________
> amd-gfx mailing list
> amd-gfx@lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/amd-gfx
Nice.
This patch is:
Reviewed-by: Oded Gabbay <oded.gabbay@gmail.com>
_______________________________________________
amd-gfx mailing list
amd-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/amd-gfx
^ permalink raw reply [flat|nested] 17+ messages in thread
* Re: [PATCH 2/7] radeonkfd/amdkfd: Implement get_local_mem_info()
[not found] ` <1473471099-16914-3-git-send-email-funfunctor-dczkZgxz+BNUPWh3PAxdjQ@public.gmane.org>
@ 2016-09-11 10:40 ` Oded Gabbay
0 siblings, 0 replies; 17+ messages in thread
From: Oded Gabbay @ 2016-09-11 10:40 UTC (permalink / raw)
To: Edward O'Callaghan; +Cc: amd-gfx-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW
On Sat, Sep 10, 2016 at 4:31 AM, Edward O'Callaghan
<funfunctor@folklore1984.net> wrote:
> Signed-off-by: Edward O'Callaghan <funfunctor@folklore1984.net>
Please give a little explanation why this new function is needed.
In addition, I don't think "radeonkfd/amdkfd: .." is good as we never
used this kind of title before.
Let's just use "drm/amdkfd: ..." as this change only relevant for
amdkfd, even if it changes radeon and amdgpu files.
> ---
> drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.c | 32 ++++++++++++++++++++---
> drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.h | 3 ++-
> drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v7.c | 2 +-
> drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v8.c | 2 +-
> drivers/gpu/drm/amd/amdkfd/kfd_topology.c | 6 ++++-
> drivers/gpu/drm/amd/include/kgd_kfd_interface.h | 13 +++++++--
> drivers/gpu/drm/radeon/radeon_kfd.c | 22 +++++++++++++---
> 7 files changed, 66 insertions(+), 14 deletions(-)
>
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.c
> index d080d08..63a2e84 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.c
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.c
> @@ -226,14 +226,38 @@ void free_gtt_mem(struct kgd_dev *kgd, void *mem_obj)
> kfree(mem);
> }
>
> -uint64_t get_vmem_size(struct kgd_dev *kgd)
> +void get_local_mem_info(struct kgd_dev *kgd,
> + struct kfd_local_mem_info *mem_info)
> {
Maybe check with BUG_ON that mem_info is not NULL ?
> - struct amdgpu_device *rdev =
> - (struct amdgpu_device *)kgd;
> + struct amdgpu_device *rdev = (struct amdgpu_device *)kgd;
I think the amdgpu coding convention is to use adev (rdev is used in
radeon). Maybe another patch to replace all rdev with adev in this
file ?
> + uint64_t address_mask;
> + resource_size_t aper_limit;
>
> BUG_ON(kgd == NULL);
>
> - return rdev->mc.real_vram_size;
> + memset(mem_info, 0, sizeof(*mem_info));
> +
> + address_mask = ~((1UL << 40) - 1);
> + aper_limit = rdev->mc.aper_base + rdev->mc.aper_size;
> +
> + if (!(rdev->mc.aper_base & address_mask ||
> + aper_limit & address_mask)) {
Could you please add a comment explaining this if statement ? I don't
understand exactly what you meant here.
> + mem_info->local_mem_size_public = rdev->mc.visible_vram_size;
> + mem_info->local_mem_size_private = rdev->mc.real_vram_size -
> + rdev->mc.visible_vram_size;
> + } else {
> + mem_info->local_mem_size_public = 0;
> + mem_info->local_mem_size_private = rdev->mc.real_vram_size;
> + }
> + mem_info->vram_width = rdev->mc.vram_width;
> +
> + if (amdgpu_powerplay || rdev->pm.funcs->get_mclk)
I think its better to use "adev->pp_enabled" instead of directly
checking amdgpu_powerplay. e.g. See what's done inside
amdgpu_dpm_get_mclk
> + mem_info->mem_clk_max = amdgpu_dpm_get_mclk(rdev, false) / 100;
Why divide it by 100 ? In the radeon_kfd.c version you didn't do it.
> +
> + pr_debug("amdgpu: address base: 0x%llx limit 0x%llx public 0x%llx private 0x%llx\n",
> + rdev->mc.aper_base, aper_limit,
> + mem_info->local_mem_size_public,
> + mem_info->local_mem_size_private);
> }
>
> uint64_t get_gpu_clock_counter(struct kgd_dev *kgd)
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.h
> index de530f68d..31da026 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.h
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.h
> @@ -57,7 +57,8 @@ int alloc_gtt_mem(struct kgd_dev *kgd, size_t size,
> void **mem_obj, uint64_t *gpu_addr,
> void **cpu_ptr);
> void free_gtt_mem(struct kgd_dev *kgd, void *mem_obj);
> -uint64_t get_vmem_size(struct kgd_dev *kgd);
> +void get_local_mem_info(struct kgd_dev *kgd,
> + struct kfd_local_mem_info *mem_info);
> uint64_t get_gpu_clock_counter(struct kgd_dev *kgd);
>
> uint32_t get_max_engine_clock_in_mhz(struct kgd_dev *kgd);
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v7.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v7.c
> index 362bedc..dc69cf7 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v7.c
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v7.c
> @@ -131,7 +131,7 @@ static uint16_t get_fw_version(struct kgd_dev *kgd, enum kgd_engine_type type);
> static const struct kfd2kgd_calls kfd2kgd = {
> .init_gtt_mem_allocation = alloc_gtt_mem,
> .free_gtt_mem = free_gtt_mem,
> - .get_vmem_size = get_vmem_size,
> + .get_local_mem_info = get_local_mem_info,
> .get_gpu_clock_counter = get_gpu_clock_counter,
> .get_max_engine_clock_in_mhz = get_max_engine_clock_in_mhz,
> .program_sh_mem_settings = kgd_program_sh_mem_settings,
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v8.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v8.c
> index 04b744d..342a037 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v8.c
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v8.c
> @@ -90,7 +90,7 @@ static uint16_t get_fw_version(struct kgd_dev *kgd, enum kgd_engine_type type);
> static const struct kfd2kgd_calls kfd2kgd = {
> .init_gtt_mem_allocation = alloc_gtt_mem,
> .free_gtt_mem = free_gtt_mem,
> - .get_vmem_size = get_vmem_size,
> + .get_local_mem_info = get_local_mem_info,
> .get_gpu_clock_counter = get_gpu_clock_counter,
> .get_max_engine_clock_in_mhz = get_max_engine_clock_in_mhz,
> .program_sh_mem_settings = kgd_program_sh_mem_settings,
> diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_topology.c b/drivers/gpu/drm/amd/amdkfd/kfd_topology.c
> index 1e50647..6ea7bd8 100644
> --- a/drivers/gpu/drm/amd/amdkfd/kfd_topology.c
> +++ b/drivers/gpu/drm/amd/amdkfd/kfd_topology.c
> @@ -1088,6 +1088,7 @@ static void kfd_debug_print_topology(void)
>
> static uint32_t kfd_generate_gpu_id(struct kfd_dev *gpu)
> {
> + struct kfd_local_mem_info local_mem_info;
> uint32_t hashout;
> uint32_t buf[7];
> uint64_t local_mem_size;
> @@ -1096,7 +1097,10 @@ static uint32_t kfd_generate_gpu_id(struct kfd_dev *gpu)
> if (!gpu)
> return 0;
>
> - local_mem_size = gpu->kfd2kgd->get_vmem_size(gpu->kgd);
> + gpu->kfd2kgd->get_local_mem_info(gpu->kgd, &local_mem_info);
> +
> + local_mem_size = local_mem_info.local_mem_size_private +
> + local_mem_info.local_mem_size_public;
What about the rest of the local_mem_info data ? Don't we should save
it somewhere ?
>
> buf[0] = gpu->pdev->devfn;
> buf[1] = gpu->pdev->subsystem_vendor;
> diff --git a/drivers/gpu/drm/amd/include/kgd_kfd_interface.h b/drivers/gpu/drm/amd/include/kgd_kfd_interface.h
> index a09d9f3..14ec3e4 100644
> --- a/drivers/gpu/drm/amd/include/kgd_kfd_interface.h
> +++ b/drivers/gpu/drm/amd/include/kgd_kfd_interface.h
> @@ -39,6 +39,14 @@ struct kgd_dev;
>
> struct kgd_mem;
>
> +/* For getting GPU local memory information from KGD */
> +struct kfd_local_mem_info {
> + uint64_t local_mem_size_private;
> + uint64_t local_mem_size_public;
> + uint32_t vram_width;
> + uint32_t mem_clk_max;
> +};
> +
> enum kgd_memory_pool {
> KGD_POOL_SYSTEM_CACHEABLE = 1,
> KGD_POOL_SYSTEM_WRITECOMBINE = 2,
> @@ -85,7 +93,7 @@ struct kgd2kfd_shared_resources {
> *
> * @free_gtt_mem: Frees a buffer that was allocated on the gart aperture
> *
> - * @get_vmem_size: Retrieves (physical) size of VRAM
> + * @get_local_mem_info: Retrieves information about GPU local memory
> *
> * @get_gpu_clock_counter: Retrieves GPU clock counter
> *
> @@ -129,7 +137,8 @@ struct kfd2kgd_calls {
>
> void (*free_gtt_mem)(struct kgd_dev *kgd, void *mem_obj);
>
> - uint64_t (*get_vmem_size)(struct kgd_dev *kgd);
> + void(*get_local_mem_info)(struct kgd_dev *kgd,
> + struct kfd_local_mem_info *mem_info);
> uint64_t (*get_gpu_clock_counter)(struct kgd_dev *kgd);
>
> uint32_t (*get_max_engine_clock_in_mhz)(struct kgd_dev *kgd);
> diff --git a/drivers/gpu/drm/radeon/radeon_kfd.c b/drivers/gpu/drm/radeon/radeon_kfd.c
> index 87a9ebb..d3249db 100644
> --- a/drivers/gpu/drm/radeon/radeon_kfd.c
> +++ b/drivers/gpu/drm/radeon/radeon_kfd.c
> @@ -54,7 +54,8 @@ static int alloc_gtt_mem(struct kgd_dev *kgd, size_t size,
>
> static void free_gtt_mem(struct kgd_dev *kgd, void *mem_obj);
>
> -static uint64_t get_vmem_size(struct kgd_dev *kgd);
> +static void get_local_mem_info(struct kgd_dev *kgd,
> + struct kfd_local_mem_info *mem_info);
> static uint64_t get_gpu_clock_counter(struct kgd_dev *kgd);
>
> static uint32_t get_max_engine_clock_in_mhz(struct kgd_dev *kgd);
> @@ -107,7 +108,7 @@ static void write_vmid_invalidate_request(struct kgd_dev *kgd, uint8_t vmid);
> static const struct kfd2kgd_calls kfd2kgd = {
> .init_gtt_mem_allocation = alloc_gtt_mem,
> .free_gtt_mem = free_gtt_mem,
> - .get_vmem_size = get_vmem_size,
> + .get_local_mem_info = get_local_mem_info,
> .get_gpu_clock_counter = get_gpu_clock_counter,
> .get_max_engine_clock_in_mhz = get_max_engine_clock_in_mhz,
> .program_sh_mem_settings = kgd_program_sh_mem_settings,
> @@ -301,13 +302,26 @@ static void free_gtt_mem(struct kgd_dev *kgd, void *mem_obj)
> kfree(mem);
> }
>
> -static uint64_t get_vmem_size(struct kgd_dev *kgd)
> +static void get_local_mem_info(struct kgd_dev *kgd,
> + struct kfd_local_mem_info *mem_info)
> {
> struct radeon_device *rdev = (struct radeon_device *)kgd;
>
> BUG_ON(kgd == NULL);
>
> - return rdev->mc.real_vram_size;
> + memset(mem_info, 0, sizeof(*mem_info));
> +
> + mem_info->local_mem_size_public = rdev->mc.visible_vram_size;
> + mem_info->local_mem_size_private = rdev->mc.real_vram_size -
> + rdev->mc.visible_vram_size;
> +
> + mem_info->vram_width = rdev->mc.vram_width;
> + mem_info->mem_clk_max = radeon_dpm_get_mclk(rdev, false);
> +
> + pr_debug("radeon: address base: 0x%llx public 0x%llx private 0x%llx\n",
> + rdev->mc.aper_base,
> + mem_info->local_mem_size_public,
> + mem_info->local_mem_size_private);
> }
>
> static uint64_t get_gpu_clock_counter(struct kgd_dev *kgd)
> --
> 2.7.4
>
> _______________________________________________
> amd-gfx mailing list
> amd-gfx@lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/amd-gfx
_______________________________________________
amd-gfx mailing list
amd-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/amd-gfx
^ permalink raw reply [flat|nested] 17+ messages in thread
* Re: [PATCH 5/7] drm/amdkfd: Remove duplicate pqm_uninit()
[not found] ` <CAFCwf12W+To7TLzmFi9RAcsvu3ytaGwn8eZtbkvtU5jVS6LwCg-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org>
@ 2016-09-12 21:03 ` Felix Kuehling
0 siblings, 0 replies; 17+ messages in thread
From: Felix Kuehling @ 2016-09-12 21:03 UTC (permalink / raw)
To: amd-gfx-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW, Yong Zhao
Yong is currently working on a follow-up fix to handle process shutdown
on APUs as well as S3 suspend correctly.
Regards,
Felix
On 16-09-10 12:06 PM, Oded Gabbay wrote:
> On Sat, Sep 10, 2016 at 4:31 AM, Edward O'Callaghan
> <funfunctor@folklore1984.net> wrote:
>> pqm_uninit() will be called in kfd_process_notifier_release(), which
>> is when the process exits. Calling it in kfd_unbind_process_from_device()
>> is duplicate and in fact incorrect, because pqm should not be
>> uninitalized as long as the process still exists.
> Hmm, I don't agree with this patch and the above explanation.
>
> kfd_unbind_process_from_device is called from the IOMMUv2 driver, when
> its callback from the mm subsystem is called (mn_release). That
> callback is called when the process _is_ shutting down. The IOMMUv2
> driver then unmaps all its mappings, and if we won't destroy our
> queues before that happens (as pqm_uninit does), and we have a pending
> operation on the queue which would get submitted before
> kfd_process_notifier_release() is called, then I believe we may get an
> IOMMU fault.
>
> Oded
>
>> Original author: Yong Zhao <yong.zhao@amd.com>
>> Hand ported for mainline.
>>
>> Signed-off-by: Edward O'Callaghan <funfunctor@folklore1984.net>
>> ---
>> drivers/gpu/drm/amd/amdkfd/kfd_process.c | 2 --
>> 1 file changed, 2 deletions(-)
>>
>> diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_process.c b/drivers/gpu/drm/amd/amdkfd/kfd_process.c
>> index 8d78052..ef2266a 100644
>> --- a/drivers/gpu/drm/amd/amdkfd/kfd_process.c
>> +++ b/drivers/gpu/drm/amd/amdkfd/kfd_process.c
>> @@ -427,8 +427,6 @@ void kfd_unbind_process_from_device(struct kfd_dev *dev, unsigned int pasid)
>> if ((dev->dbgmgr) && (dev->dbgmgr->pasid == p->pasid))
>> kfd_dbgmgr_destroy(dev->dbgmgr);
>>
>> - pqm_uninit(&p->pqm);
>> -
>> pdd = kfd_get_process_device_data(dev, p);
>>
>> if (!pdd) {
>> --
>> 2.7.4
>>
>> _______________________________________________
>> amd-gfx mailing list
>> amd-gfx@lists.freedesktop.org
>> https://lists.freedesktop.org/mailman/listinfo/amd-gfx
> _______________________________________________
> amd-gfx mailing list
> amd-gfx@lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/amd-gfx
_______________________________________________
amd-gfx mailing list
amd-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/amd-gfx
^ permalink raw reply [flat|nested] 17+ messages in thread
end of thread, other threads:[~2016-09-12 21:03 UTC | newest]
Thread overview: 17+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2016-09-10 1:31 amdkfd - misc fixes + get_local_mem_info() port [V.2] Edward O'Callaghan
[not found] ` <1473471099-16914-1-git-send-email-funfunctor-dczkZgxz+BNUPWh3PAxdjQ@public.gmane.org>
2016-09-10 1:31 ` [PATCH 1/7] amdkfd: Tidy up kfd_generate_gpu_id() uint64_t bitshift unpack Edward O'Callaghan
[not found] ` <1473471099-16914-2-git-send-email-funfunctor-dczkZgxz+BNUPWh3PAxdjQ@public.gmane.org>
2016-09-10 15:50 ` Oded Gabbay
2016-09-10 1:31 ` [PATCH 2/7] radeonkfd/amdkfd: Implement get_local_mem_info() Edward O'Callaghan
[not found] ` <1473471099-16914-3-git-send-email-funfunctor-dczkZgxz+BNUPWh3PAxdjQ@public.gmane.org>
2016-09-11 10:40 ` Oded Gabbay
2016-09-10 1:31 ` [PATCH 3/7] amdkfd: Add some missing memset zero'ing in queue init func Edward O'Callaghan
[not found] ` <1473471099-16914-4-git-send-email-funfunctor-dczkZgxz+BNUPWh3PAxdjQ@public.gmane.org>
2016-09-10 15:50 ` Oded Gabbay
2016-09-10 1:31 ` [PATCH 4/7] drm/amdkfd: Make kfd_lookup_process_by_pasid() well defined Edward O'Callaghan
[not found] ` <1473471099-16914-5-git-send-email-funfunctor-dczkZgxz+BNUPWh3PAxdjQ@public.gmane.org>
2016-09-10 15:55 ` Oded Gabbay
[not found] ` <CAFCwf133N=8Eq1QJG-tO8WTFE2=7zKLJHV9GzHu-NWpKwTdQVQ-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org>
2016-09-11 5:46 ` Edward O'Callaghan
2016-09-10 1:31 ` [PATCH 5/7] drm/amdkfd: Remove duplicate pqm_uninit() Edward O'Callaghan
[not found] ` <1473471099-16914-6-git-send-email-funfunctor-dczkZgxz+BNUPWh3PAxdjQ@public.gmane.org>
2016-09-10 16:06 ` Oded Gabbay
[not found] ` <CAFCwf12W+To7TLzmFi9RAcsvu3ytaGwn8eZtbkvtU5jVS6LwCg-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org>
2016-09-12 21:03 ` Felix Kuehling
2016-09-10 1:31 ` [PATCH 6/7] drm/amdkfd: Reuse function to find a process through pasid Edward O'Callaghan
[not found] ` <1473471099-16914-7-git-send-email-funfunctor-dczkZgxz+BNUPWh3PAxdjQ@public.gmane.org>
2016-09-11 9:56 ` Oded Gabbay
2016-09-10 1:31 ` [PATCH 7/7] drm/amdkfd: Fix possible infinite loop Edward O'Callaghan
[not found] ` <1473471099-16914-8-git-send-email-funfunctor-dczkZgxz+BNUPWh3PAxdjQ@public.gmane.org>
2016-09-11 10:03 ` Oded Gabbay
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.