Hi Peter, On 5/7/20 9:40 PM, Peter Xu wrote: > Hi, Eric, > > On Thu, May 07, 2020 at 04:31:58PM +0200, Eric Auger wrote: > > [...] > >> @@ -452,17 +520,33 @@ static void virtio_iommu_handle_command(VirtIODevice >> *vdev, VirtQueue *vq) >> case VIRTIO_IOMMU_T_UNMAP: >> tail.status = virtio_iommu_handle_unmap(s, iov, iov_cnt); >> break; >> + case VIRTIO_IOMMU_T_PROBE: >> + { >> + struct virtio_iommu_req_tail *ptail; >> + uint8_t *buf = g_malloc0(s->config.probe_size + sizeof(tail)); >> + >> + ptail = (struct virtio_iommu_req_tail *) >> + (buf + s->config.probe_size); >> + ptail->status = virtio_iommu_handle_probe(s, iov, iov_cnt, buf); >> + >> + sz = iov_from_buf(elem->in_sg, elem->in_num, 0, >> + buf, s->config.probe_size + sizeof(tail)); >> + g_free(buf); >> + assert(sz == s->config.probe_size + sizeof(tail)); >> + goto push; >> + } >> default: >> tail.status = VIRTIO_IOMMU_S_UNSUPP; >> } >> - qemu_mutex_unlock(&s->mutex); >> >> out: >> sz = iov_from_buf(elem->in_sg, elem->in_num, 0, >> &tail, sizeof(tail)); >> assert(sz == sizeof(tail)); >> >> - virtqueue_push(vq, elem, sizeof(tail)); >> +push: >> + qemu_mutex_unlock(&s->mutex); > > I think we can't move this unlock to here because otherwise "goto out" could > potentially try to unlock it without locked first. Thanks, You're right. I will revisit that.
Thanks! Eric > >> + virtqueue_push(vq, elem, sz); >> virtio_notify(vdev, vq); >> g_free(elem); >> } >