Skip to content

Commit 4f73a96

Browse files
thomashvmwairlied
authored andcommitted
vmwgfx: Make vmw_wait_seqno a bit more readable
Break out on-demand enabling and disabling of fence irqs to make the function more readable. Also make dev_priv->fence_queue_waiters an int instead of an atomic_t since we only manipulate it with dev_priv->hw_mutex held. Signed-off-by: Thomas Hellstrom <thellstrom@vmware.com> Reviewed-by: Jakob Bornecrantz <jakob@vmware.com> Signed-off-by: Dave Airlie <airlied@redhat.com>
1 parent 6bcd8d3 commit 4f73a96

File tree

3 files changed

+37
-24
lines changed

3 files changed

+37
-24
lines changed

drivers/gpu/drm/vmwgfx/vmwgfx_drv.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -291,7 +291,7 @@ static int vmw_driver_load(struct drm_device *dev, unsigned long chipset)
291291
mutex_init(&dev_priv->init_mutex);
292292
init_waitqueue_head(&dev_priv->fence_queue);
293293
init_waitqueue_head(&dev_priv->fifo_queue);
294-
atomic_set(&dev_priv->fence_queue_waiters, 0);
294+
dev_priv->fence_queue_waiters = 0;
295295
atomic_set(&dev_priv->fifo_queue_waiters, 0);
296296

297297
dev_priv->io_start = pci_resource_start(dev->pdev, 0);

drivers/gpu/drm/vmwgfx/vmwgfx_drv.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -241,7 +241,7 @@ struct vmw_private {
241241
atomic_t marker_seq;
242242
wait_queue_head_t fence_queue;
243243
wait_queue_head_t fifo_queue;
244-
atomic_t fence_queue_waiters;
244+
int fence_queue_waiters; /* Protected by hw_mutex */
245245
atomic_t fifo_queue_waiters;
246246
uint32_t last_read_seqno;
247247
spinlock_t irq_lock;

drivers/gpu/drm/vmwgfx/vmwgfx_irq.c

Lines changed: 35 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -175,12 +175,43 @@ int vmw_fallback_wait(struct vmw_private *dev_priv,
175175
return ret;
176176
}
177177

178+
static void vmw_seqno_waiter_add(struct vmw_private *dev_priv)
179+
{
180+
mutex_lock(&dev_priv->hw_mutex);
181+
if (dev_priv->fence_queue_waiters++ == 0) {
182+
unsigned long irq_flags;
183+
184+
spin_lock_irqsave(&dev_priv->irq_lock, irq_flags);
185+
outl(SVGA_IRQFLAG_ANY_FENCE,
186+
dev_priv->io_start + VMWGFX_IRQSTATUS_PORT);
187+
vmw_write(dev_priv, SVGA_REG_IRQMASK,
188+
vmw_read(dev_priv, SVGA_REG_IRQMASK) |
189+
SVGA_IRQFLAG_ANY_FENCE);
190+
spin_unlock_irqrestore(&dev_priv->irq_lock, irq_flags);
191+
}
192+
mutex_unlock(&dev_priv->hw_mutex);
193+
}
194+
195+
static void vmw_seqno_waiter_remove(struct vmw_private *dev_priv)
196+
{
197+
mutex_lock(&dev_priv->hw_mutex);
198+
if (--dev_priv->fence_queue_waiters == 0) {
199+
unsigned long irq_flags;
200+
201+
spin_lock_irqsave(&dev_priv->irq_lock, irq_flags);
202+
vmw_write(dev_priv, SVGA_REG_IRQMASK,
203+
vmw_read(dev_priv, SVGA_REG_IRQMASK) &
204+
~SVGA_IRQFLAG_ANY_FENCE);
205+
spin_unlock_irqrestore(&dev_priv->irq_lock, irq_flags);
206+
}
207+
mutex_unlock(&dev_priv->hw_mutex);
208+
}
209+
178210
int vmw_wait_seqno(struct vmw_private *dev_priv,
179211
bool lazy, uint32_t seqno,
180212
bool interruptible, unsigned long timeout)
181213
{
182214
long ret;
183-
unsigned long irq_flags;
184215
struct vmw_fifo_state *fifo = &dev_priv->fifo;
185216

186217
if (likely(dev_priv->last_read_seqno - seqno < VMW_FENCE_WRAP))
@@ -199,17 +230,7 @@ int vmw_wait_seqno(struct vmw_private *dev_priv,
199230
return vmw_fallback_wait(dev_priv, lazy, false, seqno,
200231
interruptible, timeout);
201232

202-
mutex_lock(&dev_priv->hw_mutex);
203-
if (atomic_add_return(1, &dev_priv->fence_queue_waiters) > 0) {
204-
spin_lock_irqsave(&dev_priv->irq_lock, irq_flags);
205-
outl(SVGA_IRQFLAG_ANY_FENCE,
206-
dev_priv->io_start + VMWGFX_IRQSTATUS_PORT);
207-
vmw_write(dev_priv, SVGA_REG_IRQMASK,
208-
vmw_read(dev_priv, SVGA_REG_IRQMASK) |
209-
SVGA_IRQFLAG_ANY_FENCE);
210-
spin_unlock_irqrestore(&dev_priv->irq_lock, irq_flags);
211-
}
212-
mutex_unlock(&dev_priv->hw_mutex);
233+
vmw_seqno_waiter_add(dev_priv);
213234

214235
if (interruptible)
215236
ret = wait_event_interruptible_timeout
@@ -222,21 +243,13 @@ int vmw_wait_seqno(struct vmw_private *dev_priv,
222243
vmw_seqno_passed(dev_priv, seqno),
223244
timeout);
224245

246+
vmw_seqno_waiter_remove(dev_priv);
247+
225248
if (unlikely(ret == 0))
226249
ret = -EBUSY;
227250
else if (likely(ret > 0))
228251
ret = 0;
229252

230-
mutex_lock(&dev_priv->hw_mutex);
231-
if (atomic_dec_and_test(&dev_priv->fence_queue_waiters)) {
232-
spin_lock_irqsave(&dev_priv->irq_lock, irq_flags);
233-
vmw_write(dev_priv, SVGA_REG_IRQMASK,
234-
vmw_read(dev_priv, SVGA_REG_IRQMASK) &
235-
~SVGA_IRQFLAG_ANY_FENCE);
236-
spin_unlock_irqrestore(&dev_priv->irq_lock, irq_flags);
237-
}
238-
mutex_unlock(&dev_priv->hw_mutex);
239-
240253
return ret;
241254
}
242255

0 commit comments

Comments
 (0)