drm/amdgpu: cleanup bo list bucket handling
Move that into the BO list. No functional change. Signed-off-by: Christian König <christian.koenig@amd.com> Reviewed-by: Alex Deucher <alexander.deucher@amd.com> Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
This commit is contained in:
parent
2a7d9bdabe
commit
636ce25c30
3 changed files with 39 additions and 50 deletions
|
@ -1097,6 +1097,8 @@ struct amdgpu_bo_list {
|
||||||
|
|
||||||
struct amdgpu_bo_list *
|
struct amdgpu_bo_list *
|
||||||
amdgpu_bo_list_get(struct amdgpu_fpriv *fpriv, int id);
|
amdgpu_bo_list_get(struct amdgpu_fpriv *fpriv, int id);
|
||||||
|
void amdgpu_bo_list_get_list(struct amdgpu_bo_list *list,
|
||||||
|
struct list_head *validated);
|
||||||
void amdgpu_bo_list_put(struct amdgpu_bo_list *list);
|
void amdgpu_bo_list_put(struct amdgpu_bo_list *list);
|
||||||
void amdgpu_bo_list_free(struct amdgpu_bo_list *list);
|
void amdgpu_bo_list_free(struct amdgpu_bo_list *list);
|
||||||
|
|
||||||
|
|
|
@ -32,6 +32,9 @@
|
||||||
#include "amdgpu.h"
|
#include "amdgpu.h"
|
||||||
#include "amdgpu_trace.h"
|
#include "amdgpu_trace.h"
|
||||||
|
|
||||||
|
#define AMDGPU_BO_LIST_MAX_PRIORITY 32u
|
||||||
|
#define AMDGPU_BO_LIST_NUM_BUCKETS (AMDGPU_BO_LIST_MAX_PRIORITY + 1)
|
||||||
|
|
||||||
static int amdgpu_bo_list_create(struct amdgpu_fpriv *fpriv,
|
static int amdgpu_bo_list_create(struct amdgpu_fpriv *fpriv,
|
||||||
struct amdgpu_bo_list **result,
|
struct amdgpu_bo_list **result,
|
||||||
int *id)
|
int *id)
|
||||||
|
@ -106,7 +109,8 @@ static int amdgpu_bo_list_set(struct amdgpu_device *adev,
|
||||||
|
|
||||||
entry->robj = amdgpu_bo_ref(gem_to_amdgpu_bo(gobj));
|
entry->robj = amdgpu_bo_ref(gem_to_amdgpu_bo(gobj));
|
||||||
drm_gem_object_unreference_unlocked(gobj);
|
drm_gem_object_unreference_unlocked(gobj);
|
||||||
entry->priority = info[i].bo_priority;
|
entry->priority = min(info[i].bo_priority,
|
||||||
|
AMDGPU_BO_LIST_MAX_PRIORITY);
|
||||||
entry->prefered_domains = entry->robj->initial_domain;
|
entry->prefered_domains = entry->robj->initial_domain;
|
||||||
entry->allowed_domains = entry->prefered_domains;
|
entry->allowed_domains = entry->prefered_domains;
|
||||||
if (entry->allowed_domains == AMDGPU_GEM_DOMAIN_VRAM)
|
if (entry->allowed_domains == AMDGPU_GEM_DOMAIN_VRAM)
|
||||||
|
@ -161,6 +165,36 @@ amdgpu_bo_list_get(struct amdgpu_fpriv *fpriv, int id)
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void amdgpu_bo_list_get_list(struct amdgpu_bo_list *list,
|
||||||
|
struct list_head *validated)
|
||||||
|
{
|
||||||
|
/* This is based on the bucket sort with O(n) time complexity.
|
||||||
|
* An item with priority "i" is added to bucket[i]. The lists are then
|
||||||
|
* concatenated in descending order.
|
||||||
|
*/
|
||||||
|
struct list_head bucket[AMDGPU_BO_LIST_NUM_BUCKETS];
|
||||||
|
unsigned i;
|
||||||
|
|
||||||
|
for (i = 0; i < AMDGPU_BO_LIST_NUM_BUCKETS; i++)
|
||||||
|
INIT_LIST_HEAD(&bucket[i]);
|
||||||
|
|
||||||
|
/* Since buffers which appear sooner in the relocation list are
|
||||||
|
* likely to be used more often than buffers which appear later
|
||||||
|
* in the list, the sort mustn't change the ordering of buffers
|
||||||
|
* with the same priority, i.e. it must be stable.
|
||||||
|
*/
|
||||||
|
for (i = 0; i < list->num_entries; i++) {
|
||||||
|
unsigned priority = list->array[i].priority;
|
||||||
|
|
||||||
|
list_add_tail(&list->array[i].tv.head,
|
||||||
|
&bucket[priority]);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Connect the sorted buckets in the output list. */
|
||||||
|
for (i = 0; i < AMDGPU_BO_LIST_NUM_BUCKETS; i++)
|
||||||
|
list_splice(&bucket[i], validated);
|
||||||
|
}
|
||||||
|
|
||||||
void amdgpu_bo_list_put(struct amdgpu_bo_list *list)
|
void amdgpu_bo_list_put(struct amdgpu_bo_list *list)
|
||||||
{
|
{
|
||||||
mutex_unlock(&list->lock);
|
mutex_unlock(&list->lock);
|
||||||
|
|
|
@ -30,47 +30,6 @@
|
||||||
#include "amdgpu.h"
|
#include "amdgpu.h"
|
||||||
#include "amdgpu_trace.h"
|
#include "amdgpu_trace.h"
|
||||||
|
|
||||||
#define AMDGPU_CS_MAX_PRIORITY 32u
|
|
||||||
#define AMDGPU_CS_NUM_BUCKETS (AMDGPU_CS_MAX_PRIORITY + 1)
|
|
||||||
|
|
||||||
/* This is based on the bucket sort with O(n) time complexity.
|
|
||||||
* An item with priority "i" is added to bucket[i]. The lists are then
|
|
||||||
* concatenated in descending order.
|
|
||||||
*/
|
|
||||||
struct amdgpu_cs_buckets {
|
|
||||||
struct list_head bucket[AMDGPU_CS_NUM_BUCKETS];
|
|
||||||
};
|
|
||||||
|
|
||||||
static void amdgpu_cs_buckets_init(struct amdgpu_cs_buckets *b)
|
|
||||||
{
|
|
||||||
unsigned i;
|
|
||||||
|
|
||||||
for (i = 0; i < AMDGPU_CS_NUM_BUCKETS; i++)
|
|
||||||
INIT_LIST_HEAD(&b->bucket[i]);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void amdgpu_cs_buckets_add(struct amdgpu_cs_buckets *b,
|
|
||||||
struct list_head *item, unsigned priority)
|
|
||||||
{
|
|
||||||
/* Since buffers which appear sooner in the relocation list are
|
|
||||||
* likely to be used more often than buffers which appear later
|
|
||||||
* in the list, the sort mustn't change the ordering of buffers
|
|
||||||
* with the same priority, i.e. it must be stable.
|
|
||||||
*/
|
|
||||||
list_add_tail(item, &b->bucket[min(priority, AMDGPU_CS_MAX_PRIORITY)]);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void amdgpu_cs_buckets_get_list(struct amdgpu_cs_buckets *b,
|
|
||||||
struct list_head *out_list)
|
|
||||||
{
|
|
||||||
unsigned i;
|
|
||||||
|
|
||||||
/* Connect the sorted buckets in the output list. */
|
|
||||||
for (i = 0; i < AMDGPU_CS_NUM_BUCKETS; i++) {
|
|
||||||
list_splice(&b->bucket[i], out_list);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
int amdgpu_cs_get_ring(struct amdgpu_device *adev, u32 ip_type,
|
int amdgpu_cs_get_ring(struct amdgpu_device *adev, u32 ip_type,
|
||||||
u32 ip_instance, u32 ring,
|
u32 ip_instance, u32 ring,
|
||||||
struct amdgpu_ring **out_ring)
|
struct amdgpu_ring **out_ring)
|
||||||
|
@ -382,22 +341,16 @@ static int amdgpu_cs_parser_bos(struct amdgpu_cs_parser *p,
|
||||||
union drm_amdgpu_cs *cs)
|
union drm_amdgpu_cs *cs)
|
||||||
{
|
{
|
||||||
struct amdgpu_fpriv *fpriv = p->filp->driver_priv;
|
struct amdgpu_fpriv *fpriv = p->filp->driver_priv;
|
||||||
struct amdgpu_cs_buckets buckets;
|
|
||||||
struct list_head duplicates;
|
struct list_head duplicates;
|
||||||
bool need_mmap_lock = false;
|
bool need_mmap_lock = false;
|
||||||
int i, r;
|
int r;
|
||||||
|
|
||||||
INIT_LIST_HEAD(&p->validated);
|
INIT_LIST_HEAD(&p->validated);
|
||||||
|
|
||||||
p->bo_list = amdgpu_bo_list_get(fpriv, cs->in.bo_list_handle);
|
p->bo_list = amdgpu_bo_list_get(fpriv, cs->in.bo_list_handle);
|
||||||
if (p->bo_list) {
|
if (p->bo_list) {
|
||||||
need_mmap_lock = p->bo_list->has_userptr;
|
need_mmap_lock = p->bo_list->has_userptr;
|
||||||
amdgpu_cs_buckets_init(&buckets);
|
amdgpu_bo_list_get_list(p->bo_list, &p->validated);
|
||||||
for (i = 0; i < p->bo_list->num_entries; i++)
|
|
||||||
amdgpu_cs_buckets_add(&buckets, &p->bo_list->array[i].tv.head,
|
|
||||||
p->bo_list->array[i].priority);
|
|
||||||
|
|
||||||
amdgpu_cs_buckets_get_list(&buckets, &p->validated);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
INIT_LIST_HEAD(&duplicates);
|
INIT_LIST_HEAD(&duplicates);
|
||||||
|
|
Loading…
Reference in a new issue