static int __vb2_get_done_vb(struct vb2_queue *q, struct vb2_buffer **vb, int nonblocking) { unsigned long flags; int ret; ret = __vb2_wait_for_done_vb(q, nonblocking); if (ret) return ret; spin_lock_irqsave(&q->done_lock, flags); *vb = list_first_entry(&q->done_list, struct vb2_buffer, done_entry); list_del(&(*vb)->done_entry); spin_unlock_irqrestore(&q->done_lock, flags); return 0; }
/** * __vb2_get_done_vb() - get a buffer ready for dequeuing * * Will sleep if required for nonblocking == false. */ static int __vb2_get_done_vb(struct vb2_queue *q, struct vb2_buffer **vb, int nonblocking) { unsigned long flags; int ret; /* * Wait for at least one buffer to become available on the done_list. */ ret = __vb2_wait_for_done_vb(q, nonblocking); if (ret) return ret; /* * Driver's lock has been held since we last verified that done_list * is not empty, so no need for another list_empty(done_list) check. */ spin_lock_irqsave(&q->done_lock, flags); *vb = list_first_entry(&q->done_list, struct vb2_buffer, done_entry); list_del(&(*vb)->done_entry); spin_unlock_irqrestore(&q->done_lock, flags); return 0; }