Commit e55f2b64 authored by Christian König's avatar Christian König Committed by Alex Deucher

drm/amdgpu: move the VRAM lost counter per context

Instead of per device track the VRAM lost per context and return ECANCELED
instead of ENODEV.
Signed-off-by: default avatarChristian König <christian.koenig@amd.com>
Reviewed-by: default avatarNicolai Hähnle <nicolai.haehnle@amd.com>
Signed-off-by: default avatarAlex Deucher <alexander.deucher@amd.com>
parent 14e47f93
...@@ -732,10 +732,11 @@ struct amdgpu_ctx { ...@@ -732,10 +732,11 @@ struct amdgpu_ctx {
struct amdgpu_device *adev; struct amdgpu_device *adev;
struct amdgpu_queue_mgr queue_mgr; struct amdgpu_queue_mgr queue_mgr;
unsigned reset_counter; unsigned reset_counter;
uint32_t vram_lost_counter;
spinlock_t ring_lock; spinlock_t ring_lock;
struct dma_fence **fences; struct dma_fence **fences;
struct amdgpu_ctx_ring rings[AMDGPU_MAX_RINGS]; struct amdgpu_ctx_ring rings[AMDGPU_MAX_RINGS];
bool preamble_presented; bool preamble_presented;
enum amd_sched_priority init_priority; enum amd_sched_priority init_priority;
enum amd_sched_priority override_priority; enum amd_sched_priority override_priority;
struct mutex lock; struct mutex lock;
...@@ -778,7 +779,6 @@ struct amdgpu_fpriv { ...@@ -778,7 +779,6 @@ struct amdgpu_fpriv {
struct mutex bo_list_lock; struct mutex bo_list_lock;
struct idr bo_list_handles; struct idr bo_list_handles;
struct amdgpu_ctx_mgr ctx_mgr; struct amdgpu_ctx_mgr ctx_mgr;
u32 vram_lost_counter;
}; };
/* /*
...@@ -1860,8 +1860,6 @@ static inline bool amdgpu_has_atpx(void) { return false; } ...@@ -1860,8 +1860,6 @@ static inline bool amdgpu_has_atpx(void) { return false; }
extern const struct drm_ioctl_desc amdgpu_ioctls_kms[]; extern const struct drm_ioctl_desc amdgpu_ioctls_kms[];
extern const int amdgpu_max_kms_ioctl; extern const int amdgpu_max_kms_ioctl;
bool amdgpu_kms_vram_lost(struct amdgpu_device *adev,
struct amdgpu_fpriv *fpriv);
int amdgpu_driver_load_kms(struct drm_device *dev, unsigned long flags); int amdgpu_driver_load_kms(struct drm_device *dev, unsigned long flags);
void amdgpu_driver_unload_kms(struct drm_device *dev); void amdgpu_driver_unload_kms(struct drm_device *dev);
void amdgpu_driver_lastclose_kms(struct drm_device *dev); void amdgpu_driver_lastclose_kms(struct drm_device *dev);
......
...@@ -172,7 +172,11 @@ static int amdgpu_cs_parser_init(struct amdgpu_cs_parser *p, void *data) ...@@ -172,7 +172,11 @@ static int amdgpu_cs_parser_init(struct amdgpu_cs_parser *p, void *data)
if (ret) if (ret)
goto free_all_kdata; goto free_all_kdata;
p->job->vram_lost_counter = fpriv->vram_lost_counter; p->job->vram_lost_counter = atomic_read(&p->adev->vram_lost_counter);
if (p->ctx->vram_lost_counter != p->job->vram_lost_counter) {
ret = -ECANCELED;
goto free_all_kdata;
}
if (p->uf_entry.robj) if (p->uf_entry.robj)
p->job->uf_addr = uf_offset; p->job->uf_addr = uf_offset;
...@@ -1205,7 +1209,6 @@ static int amdgpu_cs_submit(struct amdgpu_cs_parser *p, ...@@ -1205,7 +1209,6 @@ static int amdgpu_cs_submit(struct amdgpu_cs_parser *p,
int amdgpu_cs_ioctl(struct drm_device *dev, void *data, struct drm_file *filp) int amdgpu_cs_ioctl(struct drm_device *dev, void *data, struct drm_file *filp)
{ {
struct amdgpu_device *adev = dev->dev_private; struct amdgpu_device *adev = dev->dev_private;
struct amdgpu_fpriv *fpriv = filp->driver_priv;
union drm_amdgpu_cs *cs = data; union drm_amdgpu_cs *cs = data;
struct amdgpu_cs_parser parser = {}; struct amdgpu_cs_parser parser = {};
bool reserved_buffers = false; bool reserved_buffers = false;
...@@ -1213,8 +1216,6 @@ int amdgpu_cs_ioctl(struct drm_device *dev, void *data, struct drm_file *filp) ...@@ -1213,8 +1216,6 @@ int amdgpu_cs_ioctl(struct drm_device *dev, void *data, struct drm_file *filp)
if (!adev->accel_working) if (!adev->accel_working)
return -EBUSY; return -EBUSY;
if (amdgpu_kms_vram_lost(adev, fpriv))
return -ENODEV;
parser.adev = adev; parser.adev = adev;
parser.filp = filp; parser.filp = filp;
......
...@@ -75,6 +75,7 @@ static int amdgpu_ctx_init(struct amdgpu_device *adev, ...@@ -75,6 +75,7 @@ static int amdgpu_ctx_init(struct amdgpu_device *adev,
} }
ctx->reset_counter = atomic_read(&adev->gpu_reset_counter); ctx->reset_counter = atomic_read(&adev->gpu_reset_counter);
ctx->vram_lost_counter = atomic_read(&adev->vram_lost_counter);
ctx->init_priority = priority; ctx->init_priority = priority;
ctx->override_priority = AMD_SCHED_PRIORITY_UNSET; ctx->override_priority = AMD_SCHED_PRIORITY_UNSET;
......
...@@ -789,21 +789,6 @@ void amdgpu_driver_lastclose_kms(struct drm_device *dev) ...@@ -789,21 +789,6 @@ void amdgpu_driver_lastclose_kms(struct drm_device *dev)
vga_switcheroo_process_delayed_switch(); vga_switcheroo_process_delayed_switch();
} }
/**
* amdgpu_kms_vram_lost - check if VRAM was lost for this client
*
* @adev: amdgpu device
* @fpriv: client private
*
* Check if all CS is blocked for the client because of lost VRAM
*/
bool amdgpu_kms_vram_lost(struct amdgpu_device *adev,
struct amdgpu_fpriv *fpriv)
{
return fpriv->vram_lost_counter !=
atomic_read(&adev->vram_lost_counter);
}
/** /**
* amdgpu_driver_open_kms - drm callback for open * amdgpu_driver_open_kms - drm callback for open
* *
...@@ -860,7 +845,6 @@ int amdgpu_driver_open_kms(struct drm_device *dev, struct drm_file *file_priv) ...@@ -860,7 +845,6 @@ int amdgpu_driver_open_kms(struct drm_device *dev, struct drm_file *file_priv)
amdgpu_ctx_mgr_init(&fpriv->ctx_mgr); amdgpu_ctx_mgr_init(&fpriv->ctx_mgr);
fpriv->vram_lost_counter = atomic_read(&adev->vram_lost_counter);
file_priv->driver_priv = fpriv; file_priv->driver_priv = fpriv;
out_suspend: out_suspend:
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment