mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-05-06 11:38:05 +02:00
r600g: add bo busy backoff.
When we go to do a lot of bos in one draw like constant bufs we need to avoid bouncing off the busy ioctl, this mitigates by backing off on busy bos for a short amount of times.
This commit is contained in:
parent
49866c8f34
commit
05813ad5f4
2 changed files with 15 additions and 0 deletions
|
|
@ -66,6 +66,8 @@ struct radeon_bo {
|
|||
void *data;
|
||||
struct list_head fencedlist;
|
||||
boolean shared;
|
||||
int64_t last_busy;
|
||||
boolean set_busy;
|
||||
};
|
||||
|
||||
struct r600_bo {
|
||||
|
|
|
|||
|
|
@ -32,6 +32,7 @@
|
|||
#include "r600_priv.h"
|
||||
#include "xf86drm.h"
|
||||
#include "radeon_drm.h"
|
||||
#include "util/u_time.h"
|
||||
|
||||
static int radeon_bo_fixed_map(struct radeon *radeon, struct radeon_bo *bo)
|
||||
{
|
||||
|
|
@ -170,14 +171,23 @@ int radeon_bo_wait(struct radeon *radeon, struct radeon_bo *bo)
|
|||
return ret;
|
||||
}
|
||||
|
||||
#define BO_BUSY_BACKOFF 10000
|
||||
|
||||
int radeon_bo_busy(struct radeon *radeon, struct radeon_bo *bo, uint32_t *domain)
|
||||
{
|
||||
struct drm_radeon_gem_busy args;
|
||||
int ret;
|
||||
int64_t now;
|
||||
|
||||
now = os_time_get();
|
||||
if (LIST_IS_EMPTY(&bo->fencedlist) && !bo->shared)
|
||||
return 0;
|
||||
|
||||
if (bo->set_busy && (now - bo->last_busy < BO_BUSY_BACKOFF))
|
||||
return -EBUSY;
|
||||
|
||||
bo->set_busy = FALSE;
|
||||
|
||||
memset(&args, 0, sizeof(args));
|
||||
args.handle = bo->handle;
|
||||
args.domain = 0;
|
||||
|
|
@ -190,6 +200,9 @@ int radeon_bo_busy(struct radeon *radeon, struct radeon_bo *bo, uint32_t *domain
|
|||
LIST_FOR_EACH_ENTRY_SAFE(entry, tent, &bo->fencedlist, fencedlist) {
|
||||
LIST_DELINIT(&entry->fencedlist);
|
||||
}
|
||||
} else {
|
||||
bo->set_busy = TRUE;
|
||||
bo->last_busy = now;
|
||||
}
|
||||
*domain = args.domain;
|
||||
return ret;
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue