mirror of
https://gitlab.freedesktop.org/mesa/drm.git
synced 2026-05-07 15:49:02 +02:00
Fix for periodic lockup caused by buffer leakage to hardware.
This commit is contained in:
parent
312641cc7b
commit
bacf10aec1
2 changed files with 50 additions and 16 deletions
|
|
@ -501,8 +501,6 @@ static void i810EmitContextVerified( drm_device_t *dev,
|
|||
OUT_RING( tmp );
|
||||
j++;
|
||||
}
|
||||
else
|
||||
DRM_DEBUG("bad cmd %x\n", tmp);
|
||||
}
|
||||
|
||||
if (j & 1)
|
||||
|
|
@ -511,7 +509,6 @@ static void i810EmitContextVerified( drm_device_t *dev,
|
|||
ADVANCE_LP_RING();
|
||||
}
|
||||
|
||||
|
||||
static void i810EmitTexVerified( drm_device_t *dev,
|
||||
volatile unsigned int *code )
|
||||
{
|
||||
|
|
@ -536,8 +533,6 @@ static void i810EmitTexVerified( drm_device_t *dev,
|
|||
OUT_RING( tmp );
|
||||
j++;
|
||||
}
|
||||
else
|
||||
DRM_DEBUG("bad cmd %x\n", tmp);
|
||||
}
|
||||
|
||||
if (j & 1)
|
||||
|
|
@ -546,6 +541,7 @@ static void i810EmitTexVerified( drm_device_t *dev,
|
|||
ADVANCE_LP_RING();
|
||||
}
|
||||
|
||||
|
||||
/* Need to do some additional checking when setting the dest buffer.
|
||||
*/
|
||||
static void i810EmitDestVerified( drm_device_t *dev,
|
||||
|
|
@ -1039,8 +1035,9 @@ static int i810_flush_queue(drm_device_t *dev)
|
|||
{
|
||||
DECLARE_WAITQUEUE(entry, current);
|
||||
drm_i810_private_t *dev_priv = (drm_i810_private_t *)dev->dev_private;
|
||||
drm_device_dma_t *dma = dev->dma;
|
||||
unsigned long end;
|
||||
int ret = 0;
|
||||
int i, ret = 0;
|
||||
|
||||
if(dev_priv == NULL) {
|
||||
return 0;
|
||||
|
|
@ -1065,7 +1062,21 @@ static int i810_flush_queue(drm_device_t *dev)
|
|||
|
||||
current->state = TASK_RUNNING;
|
||||
remove_wait_queue(&dev_priv->flush_queue, &entry);
|
||||
|
||||
|
||||
|
||||
for (i = 0; i < dma->buf_count; i++) {
|
||||
drm_buf_t *buf = dma->buflist[ i ];
|
||||
drm_i810_buf_priv_t *buf_priv = buf->dev_private;
|
||||
|
||||
int used = cmpxchg(buf_priv->in_use, I810_BUF_HARDWARE,
|
||||
I810_BUF_FREE);
|
||||
|
||||
if (used == I810_BUF_HARDWARE)
|
||||
DRM_DEBUG("reclaimed from HARDWARE\n");
|
||||
if (used == I810_BUF_CLIENT)
|
||||
DRM_DEBUG("still on client HARDWARE\n");
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
|
@ -1086,7 +1097,13 @@ void i810_reclaim_buffers(drm_device_t *dev, pid_t pid)
|
|||
drm_i810_buf_priv_t *buf_priv = buf->dev_private;
|
||||
|
||||
if (buf->pid == pid && buf_priv) {
|
||||
*(buf_priv->in_use) = I810_BUF_FREE;
|
||||
int used = cmpxchg(buf_priv->in_use, I810_BUF_CLIENT,
|
||||
I810_BUF_FREE);
|
||||
|
||||
if (used == I810_BUF_CLIENT)
|
||||
DRM_DEBUG("reclaimed from client\n");
|
||||
|
||||
buf_priv->currently_mapped = I810_BUF_UNMAPPED;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -501,8 +501,6 @@ static void i810EmitContextVerified( drm_device_t *dev,
|
|||
OUT_RING( tmp );
|
||||
j++;
|
||||
}
|
||||
else
|
||||
DRM_DEBUG("bad cmd %x\n", tmp);
|
||||
}
|
||||
|
||||
if (j & 1)
|
||||
|
|
@ -511,7 +509,6 @@ static void i810EmitContextVerified( drm_device_t *dev,
|
|||
ADVANCE_LP_RING();
|
||||
}
|
||||
|
||||
|
||||
static void i810EmitTexVerified( drm_device_t *dev,
|
||||
volatile unsigned int *code )
|
||||
{
|
||||
|
|
@ -536,8 +533,6 @@ static void i810EmitTexVerified( drm_device_t *dev,
|
|||
OUT_RING( tmp );
|
||||
j++;
|
||||
}
|
||||
else
|
||||
DRM_DEBUG("bad cmd %x\n", tmp);
|
||||
}
|
||||
|
||||
if (j & 1)
|
||||
|
|
@ -546,6 +541,7 @@ static void i810EmitTexVerified( drm_device_t *dev,
|
|||
ADVANCE_LP_RING();
|
||||
}
|
||||
|
||||
|
||||
/* Need to do some additional checking when setting the dest buffer.
|
||||
*/
|
||||
static void i810EmitDestVerified( drm_device_t *dev,
|
||||
|
|
@ -1039,8 +1035,9 @@ static int i810_flush_queue(drm_device_t *dev)
|
|||
{
|
||||
DECLARE_WAITQUEUE(entry, current);
|
||||
drm_i810_private_t *dev_priv = (drm_i810_private_t *)dev->dev_private;
|
||||
drm_device_dma_t *dma = dev->dma;
|
||||
unsigned long end;
|
||||
int ret = 0;
|
||||
int i, ret = 0;
|
||||
|
||||
if(dev_priv == NULL) {
|
||||
return 0;
|
||||
|
|
@ -1065,7 +1062,21 @@ static int i810_flush_queue(drm_device_t *dev)
|
|||
|
||||
current->state = TASK_RUNNING;
|
||||
remove_wait_queue(&dev_priv->flush_queue, &entry);
|
||||
|
||||
|
||||
|
||||
for (i = 0; i < dma->buf_count; i++) {
|
||||
drm_buf_t *buf = dma->buflist[ i ];
|
||||
drm_i810_buf_priv_t *buf_priv = buf->dev_private;
|
||||
|
||||
int used = cmpxchg(buf_priv->in_use, I810_BUF_HARDWARE,
|
||||
I810_BUF_FREE);
|
||||
|
||||
if (used == I810_BUF_HARDWARE)
|
||||
DRM_DEBUG("reclaimed from HARDWARE\n");
|
||||
if (used == I810_BUF_CLIENT)
|
||||
DRM_DEBUG("still on client HARDWARE\n");
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
|
@ -1086,7 +1097,13 @@ void i810_reclaim_buffers(drm_device_t *dev, pid_t pid)
|
|||
drm_i810_buf_priv_t *buf_priv = buf->dev_private;
|
||||
|
||||
if (buf->pid == pid && buf_priv) {
|
||||
*(buf_priv->in_use) = I810_BUF_FREE;
|
||||
int used = cmpxchg(buf_priv->in_use, I810_BUF_CLIENT,
|
||||
I810_BUF_FREE);
|
||||
|
||||
if (used == I810_BUF_CLIENT)
|
||||
DRM_DEBUG("reclaimed from client\n");
|
||||
|
||||
buf_priv->currently_mapped = I810_BUF_UNMAPPED;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue