bhyve nvme: Fix NVM Format completion status
The NVM Format command is unique among the Admin commands in that it needs to finish asynchronously. For this reason, the emulation code invented a synthetic completion status (NVME_NO_STATUS) to indicate that the command was still in progress and the command processing loop should not generate a completion message. The implementation used the value 0xffff for the synthetic value as this set both the Status Code and Status Code Type fields to reserved values. Format initialized the completion status to this value and expected error cases to override it with a status code/type appropriate to the situation. The macros used to set the NVMe status are careful not to modify bit 0 (i.e. the phase bit), which with the synthetic completion status, causes the phase bit to get out of sync. When running tests in a guest with illegal NVM Format commands, Admin commands would eventually hang because it appeared there were no completions due to the incorrect phase bit value. Fix is to only set NVME_NO_STATUS if the blockif delete command succeeds. While in the neighborhood, add a missing break statement when NVM Format is not supported. Reviewed by: imp, allanjude Tested by: jason@tubnor.net MFC after: 1 month Differential Revision: https://reviews.freebsd.org/D33565
This commit is contained in:
parent
595a12f18b
commit
cf76cdd4bf
@ -1773,7 +1773,8 @@ nvme_opc_format_nvm(struct pci_nvme_softc* sc, struct nvme_command* command,
|
||||
pci_nvme_status_genc(&compl->status,
|
||||
NVME_SC_INTERNAL_DEVICE_ERROR);
|
||||
pci_nvme_release_ioreq(sc, req);
|
||||
}
|
||||
} else
|
||||
compl->status = NVME_NO_STATUS;
|
||||
}
|
||||
|
||||
return (1);
|
||||
@ -1900,8 +1901,8 @@ pci_nvme_handle_admin_cmd(struct pci_nvme_softc* sc, uint64_t value)
|
||||
if ((sc->ctrldata.oacs &
|
||||
(1 << NVME_CTRLR_DATA_OACS_FORMAT_SHIFT)) == 0) {
|
||||
pci_nvme_status_genc(&compl.status, NVME_SC_INVALID_OPCODE);
|
||||
break;
|
||||
}
|
||||
compl.status = NVME_NO_STATUS;
|
||||
nvme_opc_format_nvm(sc, cmd, &compl);
|
||||
break;
|
||||
default:
|
||||
|
Loading…
Reference in New Issue
Block a user