diff options
Diffstat (limited to 'meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/1916-drm-amdgpu-map-compute-rings-by-least-recently-used-.patch')
-rw-r--r-- | meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/1916-drm-amdgpu-map-compute-rings-by-least-recently-used-.patch | 125 |
1 files changed, 125 insertions, 0 deletions
diff --git a/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/1916-drm-amdgpu-map-compute-rings-by-least-recently-used-.patch b/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/1916-drm-amdgpu-map-compute-rings-by-least-recently-used-.patch new file mode 100644 index 00000000..6a494e87 --- /dev/null +++ b/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/1916-drm-amdgpu-map-compute-rings-by-least-recently-used-.patch @@ -0,0 +1,125 @@ +From 97db3119ad2e4a4e38cbd9374989ccf224974022 Mon Sep 17 00:00:00 2001 +From: Andres Rodriguez <andresx7@gmail.com> +Date: Tue, 26 Sep 2017 17:43:14 -0400 +Subject: [PATCH 1916/4131] drm/amdgpu: map compute rings by least recently + used pipe + +This patch provides a guarantee that the first n queues allocated by +an application will be on different pipes. Where n is the number of +pipes available from the hardware. + +This helps avoid ring aliasing which can result in work executing in +time-sliced mode instead of truly parallel mode. + +Reviewed-by: Alex Deucher <alexander.deucher@amd.com> +Signed-off-by: Andres Rodriguez <andresx7@gmail.com> +Signed-off-by: Alex Deucher <alexander.deucher@amd.com> +--- + drivers/gpu/drm/amd/amdgpu/amdgpu_queue_mgr.c | 8 +++++--- + drivers/gpu/drm/amd/amdgpu/amdgpu_ring.c | 25 ++++++++++++++++++++----- + drivers/gpu/drm/amd/amdgpu/amdgpu_ring.h | 5 +++-- + 3 files changed, 28 insertions(+), 10 deletions(-) + +diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_queue_mgr.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_queue_mgr.c +index befc09b..190e28c 100644 +--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_queue_mgr.c ++++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_queue_mgr.c +@@ -121,7 +121,7 @@ static enum amdgpu_ring_type amdgpu_hw_ip_to_ring_type(int hw_ip) + + static int amdgpu_lru_map(struct amdgpu_device *adev, + struct amdgpu_queue_mapper *mapper, +- int user_ring, ++ int user_ring, bool lru_pipe_order, + struct amdgpu_ring **out_ring) + { + int r, i, j; +@@ -139,7 +139,7 @@ static int amdgpu_lru_map(struct amdgpu_device *adev, + } + + r = amdgpu_ring_lru_get(adev, ring_type, ring_blacklist, +- j, out_ring); ++ j, lru_pipe_order, out_ring); + if (r) + return r; + +@@ -284,8 +284,10 @@ int amdgpu_queue_mgr_map(struct amdgpu_device *adev, + r = amdgpu_identity_map(adev, mapper, ring, out_ring); + break; + case AMDGPU_HW_IP_DMA: ++ r = amdgpu_lru_map(adev, mapper, ring, false, out_ring); ++ break; + case AMDGPU_HW_IP_COMPUTE: +- r = amdgpu_lru_map(adev, mapper, ring, out_ring); ++ r = amdgpu_lru_map(adev, mapper, ring, true, out_ring); + break; + default: + *out_ring = NULL; +diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ring.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_ring.c +index 5ce6528..019932a 100644 +--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ring.c ++++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ring.c +@@ -315,14 +315,16 @@ static bool amdgpu_ring_is_blacklisted(struct amdgpu_ring *ring, + * @type: amdgpu_ring_type enum + * @blacklist: blacklisted ring ids array + * @num_blacklist: number of entries in @blacklist ++ * @lru_pipe_order: find a ring from the least recently used pipe + * @ring: output ring + * + * Retrieve the amdgpu_ring structure for the least recently used ring of + * a specific IP block (all asics). + * Returns 0 on success, error on failure. + */ +-int amdgpu_ring_lru_get(struct amdgpu_device *adev, int type, int *blacklist, +- int num_blacklist, struct amdgpu_ring **ring) ++int amdgpu_ring_lru_get(struct amdgpu_device *adev, int type, ++ int *blacklist, int num_blacklist, ++ bool lru_pipe_order, struct amdgpu_ring **ring) + { + struct amdgpu_ring *entry; + +@@ -337,10 +339,23 @@ int amdgpu_ring_lru_get(struct amdgpu_device *adev, int type, int *blacklist, + if (amdgpu_ring_is_blacklisted(entry, blacklist, num_blacklist)) + continue; + +- *ring = entry; +- amdgpu_ring_lru_touch_locked(adev, *ring); +- break; ++ if (!*ring) { ++ *ring = entry; ++ ++ /* We are done for ring LRU */ ++ if (!lru_pipe_order) ++ break; ++ } ++ ++ /* Move all rings on the same pipe to the end of the list */ ++ if (entry->pipe == (*ring)->pipe) ++ amdgpu_ring_lru_touch_locked(adev, entry); + } ++ ++ /* Move the ring we found to the end of the list */ ++ if (*ring) ++ amdgpu_ring_lru_touch_locked(adev, *ring); ++ + spin_unlock(&adev->ring_lru_list_lock); + + if (!*ring) { +diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ring.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_ring.h +index af8e544..1a05a4b 100755 +--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ring.h ++++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ring.h +@@ -202,8 +202,9 @@ int amdgpu_ring_init(struct amdgpu_device *adev, struct amdgpu_ring *ring, + unsigned ring_size, struct amdgpu_irq_src *irq_src, + unsigned irq_type); + void amdgpu_ring_fini(struct amdgpu_ring *ring); +-int amdgpu_ring_lru_get(struct amdgpu_device *adev, int type, int *blacklist, +- int num_blacklist, struct amdgpu_ring **ring); ++int amdgpu_ring_lru_get(struct amdgpu_device *adev, int type, ++ int *blacklist, int num_blacklist, ++ bool lru_pipe_order, struct amdgpu_ring **ring); + void amdgpu_ring_lru_touch(struct amdgpu_device *adev, struct amdgpu_ring *ring); + static inline void amdgpu_ring_clear_ring(struct amdgpu_ring *ring) + { +-- +2.7.4 + |