aa0ab681ae
Coherently read the phase bit of the status completion record. We loop over the completion record array, looking for all the transactions in the same phase that have been completed. In doing that, we have to be careful to read the status field first, and if it indicates a complete record, we need to read and process that record. Otherwise, the host might be overtaken by device when reading this completion record, leading to a mistaken belief that the record is in phase. This leads to the code using old values and looking at an already completed entry, which has no current tracker. To work around this problem, we read the status and make sure it is in phase, we then re-read the entire completion record guaranteeing it's complete, valid, and consistent . In addition we resync the dmatag to reflect changes since the prior loop for the bouncing dma case. Reviewed by: jrtc27@, chuck@ Found by: jrtc27 (this fix is based in part on her D30995 fix) Sponsored by: Netflix Differential Revision: https://reviews.freebsd.org/D31002 |
||
---|---|---|
.. | ||
nvme_ahci.c | ||
nvme_ctrlr_cmd.c | ||
nvme_ctrlr.c | ||
nvme_ns_cmd.c | ||
nvme_ns.c | ||
nvme_pci.c | ||
nvme_private.h | ||
nvme_qpair.c | ||
nvme_sim.c | ||
nvme_sysctl.c | ||
nvme_test.c | ||
nvme_util.c | ||
nvme.c | ||
nvme.h |