mirror of
https://github.com/qemu/qemu.git
synced 2024-11-26 04:13:39 +08:00
block/nvme: don't touch the completion entries
Completion entries are meant to be only read by the host and written by the device. The driver is supposed to scan the completions from the last point where it left, and until it sees a completion with non flipped phase bit. Signed-off-by: Maxim Levitsky <mlevitsk@redhat.com> Reviewed-by: Max Reitz <mreitz@redhat.com> Message-id: 20190716163020.13383-4-mlevitsk@redhat.com Signed-off-by: Max Reitz <mreitz@redhat.com>
This commit is contained in:
parent
118d1b6a81
commit
258867d1dc
@ -318,7 +318,7 @@ static bool nvme_process_completion(BDRVNVMeState *s, NVMeQueuePair *q)
|
||||
while (q->inflight) {
|
||||
int16_t cid;
|
||||
c = (NvmeCqe *)&q->cq.queue[q->cq.head * NVME_CQ_ENTRY_BYTES];
|
||||
if (!c->cid || (le16_to_cpu(c->status) & 0x1) == q->cq_phase) {
|
||||
if ((le16_to_cpu(c->status) & 0x1) == q->cq_phase) {
|
||||
break;
|
||||
}
|
||||
q->cq.head = (q->cq.head + 1) % NVME_QUEUE_SIZE;
|
||||
@ -342,10 +342,7 @@ static bool nvme_process_completion(BDRVNVMeState *s, NVMeQueuePair *q)
|
||||
qemu_mutex_unlock(&q->lock);
|
||||
req.cb(req.opaque, nvme_translate_error(c));
|
||||
qemu_mutex_lock(&q->lock);
|
||||
c->cid = cpu_to_le16(0);
|
||||
q->inflight--;
|
||||
/* Flip Phase Tag bit. */
|
||||
c->status = cpu_to_le16(le16_to_cpu(c->status) ^ 0x1);
|
||||
progress = true;
|
||||
}
|
||||
if (progress) {
|
||||
|
Loading…
Reference in New Issue
Block a user