mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/herbert/cryptodev-2.6.git
synced 2026-05-02 18:17:50 -04:00
drm/amdkfd: Output migrate end event if migrate failed
If page migration failed, also output migrate end event to match with migrate start event, with failure error_code added to the end of the migrate message macro. This will not break uAPI because application uses old message macro sscanf drop and ignore the error_code. Output GPU page fault restore end event if migration failed. Signed-off-by: Philip Yang <Philip.Yang@amd.com> Reviewed-by: James Zhu <James.Zhu@amd.com> Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
This commit is contained in:
committed by
Alex Deucher
parent
8fc279e5e3
commit
dad6c45cbd
@@ -445,14 +445,13 @@ svm_migrate_vma_to_vram(struct kfd_node *node, struct svm_range *prange,
|
|||||||
pr_debug("successful/cpages/npages 0x%lx/0x%lx/0x%lx\n",
|
pr_debug("successful/cpages/npages 0x%lx/0x%lx/0x%lx\n",
|
||||||
mpages, cpages, migrate.npages);
|
mpages, cpages, migrate.npages);
|
||||||
|
|
||||||
kfd_smi_event_migration_end(node, p->lead_thread->pid,
|
|
||||||
start >> PAGE_SHIFT, end >> PAGE_SHIFT,
|
|
||||||
0, node->id, trigger);
|
|
||||||
|
|
||||||
svm_range_dma_unmap_dev(adev->dev, scratch, 0, npages);
|
svm_range_dma_unmap_dev(adev->dev, scratch, 0, npages);
|
||||||
|
|
||||||
out_free:
|
out_free:
|
||||||
kvfree(buf);
|
kvfree(buf);
|
||||||
|
kfd_smi_event_migration_end(node, p->lead_thread->pid,
|
||||||
|
start >> PAGE_SHIFT, end >> PAGE_SHIFT,
|
||||||
|
0, node->id, trigger, r);
|
||||||
out:
|
out:
|
||||||
if (!r && mpages) {
|
if (!r && mpages) {
|
||||||
pdd = svm_range_get_pdd_by_node(prange, node);
|
pdd = svm_range_get_pdd_by_node(prange, node);
|
||||||
@@ -751,14 +750,13 @@ svm_migrate_vma_to_ram(struct kfd_node *node, struct svm_range *prange,
|
|||||||
svm_migrate_copy_done(adev, mfence);
|
svm_migrate_copy_done(adev, mfence);
|
||||||
migrate_vma_finalize(&migrate);
|
migrate_vma_finalize(&migrate);
|
||||||
|
|
||||||
kfd_smi_event_migration_end(node, p->lead_thread->pid,
|
|
||||||
start >> PAGE_SHIFT, end >> PAGE_SHIFT,
|
|
||||||
node->id, 0, trigger);
|
|
||||||
|
|
||||||
svm_range_dma_unmap_dev(adev->dev, scratch, 0, npages);
|
svm_range_dma_unmap_dev(adev->dev, scratch, 0, npages);
|
||||||
|
|
||||||
out_free:
|
out_free:
|
||||||
kvfree(buf);
|
kvfree(buf);
|
||||||
|
kfd_smi_event_migration_end(node, p->lead_thread->pid,
|
||||||
|
start >> PAGE_SHIFT, end >> PAGE_SHIFT,
|
||||||
|
node->id, 0, trigger, r);
|
||||||
out:
|
out:
|
||||||
if (!r && cpages) {
|
if (!r && cpages) {
|
||||||
mpages = cpages - upages;
|
mpages = cpages - upages;
|
||||||
|
|||||||
@@ -292,12 +292,13 @@ void kfd_smi_event_migration_start(struct kfd_node *node, pid_t pid,
|
|||||||
|
|
||||||
void kfd_smi_event_migration_end(struct kfd_node *node, pid_t pid,
|
void kfd_smi_event_migration_end(struct kfd_node *node, pid_t pid,
|
||||||
unsigned long start, unsigned long end,
|
unsigned long start, unsigned long end,
|
||||||
uint32_t from, uint32_t to, uint32_t trigger)
|
uint32_t from, uint32_t to, uint32_t trigger,
|
||||||
|
int error_code)
|
||||||
{
|
{
|
||||||
kfd_smi_event_add(pid, node, KFD_SMI_EVENT_MIGRATE_END,
|
kfd_smi_event_add(pid, node, KFD_SMI_EVENT_MIGRATE_END,
|
||||||
KFD_EVENT_FMT_MIGRATE_END(
|
KFD_EVENT_FMT_MIGRATE_END(
|
||||||
ktime_get_boottime_ns(), pid, start, end - start,
|
ktime_get_boottime_ns(), pid, start, end - start,
|
||||||
from, to, trigger));
|
from, to, trigger, error_code));
|
||||||
}
|
}
|
||||||
|
|
||||||
void kfd_smi_event_queue_eviction(struct kfd_node *node, pid_t pid,
|
void kfd_smi_event_queue_eviction(struct kfd_node *node, pid_t pid,
|
||||||
|
|||||||
@@ -44,7 +44,8 @@ void kfd_smi_event_migration_start(struct kfd_node *node, pid_t pid,
|
|||||||
uint32_t trigger);
|
uint32_t trigger);
|
||||||
void kfd_smi_event_migration_end(struct kfd_node *node, pid_t pid,
|
void kfd_smi_event_migration_end(struct kfd_node *node, pid_t pid,
|
||||||
unsigned long start, unsigned long end,
|
unsigned long start, unsigned long end,
|
||||||
uint32_t from, uint32_t to, uint32_t trigger);
|
uint32_t from, uint32_t to, uint32_t trigger,
|
||||||
|
int error_code);
|
||||||
void kfd_smi_event_queue_eviction(struct kfd_node *node, pid_t pid,
|
void kfd_smi_event_queue_eviction(struct kfd_node *node, pid_t pid,
|
||||||
uint32_t trigger);
|
uint32_t trigger);
|
||||||
void kfd_smi_event_queue_restore(struct kfd_node *node, pid_t pid);
|
void kfd_smi_event_queue_restore(struct kfd_node *node, pid_t pid);
|
||||||
|
|||||||
@@ -3085,8 +3085,6 @@ retry_write_locked:
|
|||||||
start = max_t(unsigned long, ALIGN_DOWN(addr, size), prange->start);
|
start = max_t(unsigned long, ALIGN_DOWN(addr, size), prange->start);
|
||||||
last = min_t(unsigned long, ALIGN(addr + 1, size) - 1, prange->last);
|
last = min_t(unsigned long, ALIGN(addr + 1, size) - 1, prange->last);
|
||||||
if (prange->actual_loc != 0 || best_loc != 0) {
|
if (prange->actual_loc != 0 || best_loc != 0) {
|
||||||
migration = true;
|
|
||||||
|
|
||||||
if (best_loc) {
|
if (best_loc) {
|
||||||
r = svm_migrate_to_vram(prange, best_loc, start, last,
|
r = svm_migrate_to_vram(prange, best_loc, start, last,
|
||||||
mm, KFD_MIGRATE_TRIGGER_PAGEFAULT_GPU);
|
mm, KFD_MIGRATE_TRIGGER_PAGEFAULT_GPU);
|
||||||
@@ -3109,7 +3107,9 @@ retry_write_locked:
|
|||||||
if (r) {
|
if (r) {
|
||||||
pr_debug("failed %d to migrate svms %p [0x%lx 0x%lx]\n",
|
pr_debug("failed %d to migrate svms %p [0x%lx 0x%lx]\n",
|
||||||
r, svms, start, last);
|
r, svms, start, last);
|
||||||
goto out_unlock_range;
|
goto out_migrate_fail;
|
||||||
|
} else {
|
||||||
|
migration = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -3119,6 +3119,7 @@ retry_write_locked:
|
|||||||
pr_debug("failed %d to map svms 0x%p [0x%lx 0x%lx] to gpus\n",
|
pr_debug("failed %d to map svms 0x%p [0x%lx 0x%lx] to gpus\n",
|
||||||
r, svms, start, last);
|
r, svms, start, last);
|
||||||
|
|
||||||
|
out_migrate_fail:
|
||||||
kfd_smi_event_page_fault_end(node, p->lead_thread->pid, addr,
|
kfd_smi_event_page_fault_end(node, p->lead_thread->pid, addr,
|
||||||
migration);
|
migration);
|
||||||
|
|
||||||
|
|||||||
@@ -609,6 +609,7 @@ struct kfd_ioctl_smi_events_args {
|
|||||||
* migrate_update: GPU page fault is recovered by 'M' for migrate, 'U' for update
|
* migrate_update: GPU page fault is recovered by 'M' for migrate, 'U' for update
|
||||||
* rw: 'W' for write page fault, 'R' for read page fault
|
* rw: 'W' for write page fault, 'R' for read page fault
|
||||||
* rescheduled: 'R' if the queue restore failed and rescheduled to try again
|
* rescheduled: 'R' if the queue restore failed and rescheduled to try again
|
||||||
|
* error_code: migrate failure error code, 0 if no error
|
||||||
*/
|
*/
|
||||||
#define KFD_EVENT_FMT_UPDATE_GPU_RESET(reset_seq_num, reset_cause)\
|
#define KFD_EVENT_FMT_UPDATE_GPU_RESET(reset_seq_num, reset_cause)\
|
||||||
"%x %s\n", (reset_seq_num), (reset_cause)
|
"%x %s\n", (reset_seq_num), (reset_cause)
|
||||||
@@ -630,9 +631,9 @@ struct kfd_ioctl_smi_events_args {
|
|||||||
"%lld -%d @%lx(%lx) %x->%x %x:%x %d\n", (ns), (pid), (start), (size),\
|
"%lld -%d @%lx(%lx) %x->%x %x:%x %d\n", (ns), (pid), (start), (size),\
|
||||||
(from), (to), (prefetch_loc), (preferred_loc), (migrate_trigger)
|
(from), (to), (prefetch_loc), (preferred_loc), (migrate_trigger)
|
||||||
|
|
||||||
#define KFD_EVENT_FMT_MIGRATE_END(ns, pid, start, size, from, to, migrate_trigger)\
|
#define KFD_EVENT_FMT_MIGRATE_END(ns, pid, start, size, from, to, migrate_trigger, error_code) \
|
||||||
"%lld -%d @%lx(%lx) %x->%x %d\n", (ns), (pid), (start), (size),\
|
"%lld -%d @%lx(%lx) %x->%x %d %d\n", (ns), (pid), (start), (size),\
|
||||||
(from), (to), (migrate_trigger)
|
(from), (to), (migrate_trigger), (error_code)
|
||||||
|
|
||||||
#define KFD_EVENT_FMT_QUEUE_EVICTION(ns, pid, node, evict_trigger)\
|
#define KFD_EVENT_FMT_QUEUE_EVICTION(ns, pid, node, evict_trigger)\
|
||||||
"%lld -%d %x %d\n", (ns), (pid), (node), (evict_trigger)
|
"%lld -%d %x %d\n", (ns), (pid), (node), (evict_trigger)
|
||||||
|
|||||||
Reference in New Issue
Block a user