Messages in this thread | | | Subject | Re: [RFC 1/5] drm/virtio: add virtio_gpu_alloc_fence() | From | Gerd Hoffmann <> | Date | Tue, 13 Dec 2016 07:47:25 +0100 |
| |
Hi,
> +struct virtio_gpu_fence *virtio_gpu_fence_alloc(struct virtio_gpu_device *vgdev) > +{ > + struct virtio_gpu_fence_driver *drv = &vgdev->fence_drv; > + struct virtio_gpu_fence *fence; > + unsigned long irq_flags; > + > + fence = kmalloc(sizeof(struct virtio_gpu_fence), GFP_ATOMIC); > + if (!fence) > + return NULL; > +
> + spin_lock_irqsave(&drv->lock, irq_flags); > + fence->drv = drv; > + fence->seq = ++drv->sync_seq; > + dma_fence_init(&fence->f, &virtio_fence_ops, &drv->lock, > + drv->context, fence->seq); > + spin_unlock_irqrestore(&drv->lock, irq_flags);
seq assignment ...
> + > + return fence; > +} > + > int virtio_gpu_fence_emit(struct virtio_gpu_device *vgdev, > struct virtio_gpu_ctrl_hdr *cmd_hdr, > - struct virtio_gpu_fence **fence) > + struct virtio_gpu_fence *fence) > { > struct virtio_gpu_fence_driver *drv = &vgdev->fence_drv; > unsigned long irq_flags; > > - *fence = kmalloc(sizeof(struct virtio_gpu_fence), GFP_ATOMIC); > - if ((*fence) == NULL) > - return -ENOMEM; > - > spin_lock_irqsave(&drv->lock, irq_flags); > - (*fence)->drv = drv; > - (*fence)->seq = ++drv->sync_seq; > - dma_fence_init(&(*fence)->f, &virtio_fence_ops, &drv->lock, > - drv->context, (*fence)->seq);
... must stay here. Otherwise requests can be submitted to the virt queue with fence sequence numbers out of order.
cheers, Gerd
| |