hw/nvme fixes

Two small fixes.
 -----BEGIN PGP SIGNATURE-----
 
 iQEzBAABCgAdFiEEUigzqnXi3OaiR2bATeGvMW1PDekFAmNiKUkACgkQTeGvMW1P
 DenBuAf/fwznY98HVg8zYQ/chLGMCmjAa80buf867usnL5Iuhms1XCkxpETFfMAZ
 HR5gg+52vHZg/FCGbQ3E8d/ZLwDZHboiEuZDPo9aYI4uTj3gs66j9S0y6DUVkn5I
 7Ad+BYW7/d4++8fZAdaUV67rmo89OvjgSqOs+O094nGAPIEgJnsL7HrOFniKnNqu
 MMWvFlK1bAz/iPKPf2WWVeuAs1cMs+TPsjE+ZHhUEYaZAiB1myKVPIAVyOHx5yoT
 6VTsNMLvNEi5+4Ucg1TkIwb/dAXrYYEvreo8ri1yuHCVOqw4lU9FfPhmiz5h76Sc
 sI0cMiNL/RW5pk6rnDLkPZyjTKw30A==
 =s2fM
 -----END PGP SIGNATURE-----

Merge tag 'nvme-fixes-pull-request' of git://git.infradead.org/qemu-nvme into staging

hw/nvme fixes

Two small fixes.

# -----BEGIN PGP SIGNATURE-----
#
# iQEzBAABCgAdFiEEUigzqnXi3OaiR2bATeGvMW1PDekFAmNiKUkACgkQTeGvMW1P
# DenBuAf/fwznY98HVg8zYQ/chLGMCmjAa80buf867usnL5Iuhms1XCkxpETFfMAZ
# HR5gg+52vHZg/FCGbQ3E8d/ZLwDZHboiEuZDPo9aYI4uTj3gs66j9S0y6DUVkn5I
# 7Ad+BYW7/d4++8fZAdaUV67rmo89OvjgSqOs+O094nGAPIEgJnsL7HrOFniKnNqu
# MMWvFlK1bAz/iPKPf2WWVeuAs1cMs+TPsjE+ZHhUEYaZAiB1myKVPIAVyOHx5yoT
# 6VTsNMLvNEi5+4Ucg1TkIwb/dAXrYYEvreo8ri1yuHCVOqw4lU9FfPhmiz5h76Sc
# sI0cMiNL/RW5pk6rnDLkPZyjTKw30A==
# =s2fM
# -----END PGP SIGNATURE-----
# gpg: Signature made Wed 02 Nov 2022 04:24:41 EDT
# gpg:                using RSA key 522833AA75E2DCE6A24766C04DE1AF316D4F0DE9
# gpg: Good signature from "Klaus Jensen <its@irrelevant.dk>" [unknown]
# gpg:                 aka "Klaus Jensen <k.jensen@samsung.com>" [unknown]
# gpg: WARNING: This key is not certified with a trusted signature!
# gpg:          There is no indication that the signature belongs to the owner.
# Primary key fingerprint: DDCA 4D9C 9EF9 31CC 3468  4272 63D5 6FC5 E55D A838
#      Subkey fingerprint: 5228 33AA 75E2 DCE6 A247  66C0 4DE1 AF31 6D4F 0DE9

* tag 'nvme-fixes-pull-request' of git://git.infradead.org/qemu-nvme:
  hw/nvme: Abort copy command when format is one while pif
  hw/nvme: reenable cqe batching

Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
This commit is contained in:
Stefan Hajnoczi 2022-11-03 10:54:07 -04:00
commit 5e82102268
2 changed files with 15 additions and 18 deletions

View File

@ -1401,13 +1401,7 @@ static void nvme_enqueue_req_completion(NvmeCQueue *cq, NvmeRequest *req)
QTAILQ_REMOVE(&req->sq->out_req_list, req, entry); QTAILQ_REMOVE(&req->sq->out_req_list, req, entry);
QTAILQ_INSERT_TAIL(&cq->req_list, req, entry); QTAILQ_INSERT_TAIL(&cq->req_list, req, entry);
if (req->sq->ioeventfd_enabled) { qemu_bh_schedule(cq->bh);
/* Post CQE directly since we are in main loop thread */
nvme_post_cqes(cq);
} else {
/* Schedule the timer to post CQE later since we are in vcpu thread */
timer_mod(cq->timer, qemu_clock_get_ns(QEMU_CLOCK_VIRTUAL) + 500);
}
} }
static void nvme_process_aers(void *opaque) static void nvme_process_aers(void *opaque)
@ -3040,7 +3034,8 @@ static uint16_t nvme_copy(NvmeCtrl *n, NvmeRequest *req)
goto invalid; goto invalid;
} }
if (ns->pif && format != 0x1) { if ((ns->pif == 0x0 && format != 0x0) ||
(ns->pif != 0x0 && format != 0x1)) {
status = NVME_INVALID_FORMAT | NVME_DNR; status = NVME_INVALID_FORMAT | NVME_DNR;
goto invalid; goto invalid;
} }
@ -4252,7 +4247,7 @@ static void nvme_cq_notifier(EventNotifier *e)
nvme_irq_deassert(n, cq); nvme_irq_deassert(n, cq);
} }
nvme_post_cqes(cq); qemu_bh_schedule(cq->bh);
} }
static int nvme_init_cq_ioeventfd(NvmeCQueue *cq) static int nvme_init_cq_ioeventfd(NvmeCQueue *cq)
@ -4307,7 +4302,7 @@ static void nvme_free_sq(NvmeSQueue *sq, NvmeCtrl *n)
uint16_t offset = sq->sqid << 3; uint16_t offset = sq->sqid << 3;
n->sq[sq->sqid] = NULL; n->sq[sq->sqid] = NULL;
timer_free(sq->timer); qemu_bh_delete(sq->bh);
if (sq->ioeventfd_enabled) { if (sq->ioeventfd_enabled) {
memory_region_del_eventfd(&n->iomem, memory_region_del_eventfd(&n->iomem,
0x1000 + offset, 4, false, 0, &sq->notifier); 0x1000 + offset, 4, false, 0, &sq->notifier);
@ -4381,7 +4376,8 @@ static void nvme_init_sq(NvmeSQueue *sq, NvmeCtrl *n, uint64_t dma_addr,
sq->io_req[i].sq = sq; sq->io_req[i].sq = sq;
QTAILQ_INSERT_TAIL(&(sq->req_list), &sq->io_req[i], entry); QTAILQ_INSERT_TAIL(&(sq->req_list), &sq->io_req[i], entry);
} }
sq->timer = timer_new_ns(QEMU_CLOCK_VIRTUAL, nvme_process_sq, sq);
sq->bh = qemu_bh_new(nvme_process_sq, sq);
if (n->dbbuf_enabled) { if (n->dbbuf_enabled) {
sq->db_addr = n->dbbuf_dbs + (sqid << 3); sq->db_addr = n->dbbuf_dbs + (sqid << 3);
@ -4698,7 +4694,7 @@ static void nvme_free_cq(NvmeCQueue *cq, NvmeCtrl *n)
uint16_t offset = (cq->cqid << 3) + (1 << 2); uint16_t offset = (cq->cqid << 3) + (1 << 2);
n->cq[cq->cqid] = NULL; n->cq[cq->cqid] = NULL;
timer_free(cq->timer); qemu_bh_delete(cq->bh);
if (cq->ioeventfd_enabled) { if (cq->ioeventfd_enabled) {
memory_region_del_eventfd(&n->iomem, memory_region_del_eventfd(&n->iomem,
0x1000 + offset, 4, false, 0, &cq->notifier); 0x1000 + offset, 4, false, 0, &cq->notifier);
@ -4771,7 +4767,7 @@ static void nvme_init_cq(NvmeCQueue *cq, NvmeCtrl *n, uint64_t dma_addr,
} }
} }
n->cq[cqid] = cq; n->cq[cqid] = cq;
cq->timer = timer_new_ns(QEMU_CLOCK_VIRTUAL, nvme_post_cqes, cq); cq->bh = qemu_bh_new(nvme_post_cqes, cq);
} }
static uint16_t nvme_create_cq(NvmeCtrl *n, NvmeRequest *req) static uint16_t nvme_create_cq(NvmeCtrl *n, NvmeRequest *req)
@ -6913,9 +6909,9 @@ static void nvme_process_db(NvmeCtrl *n, hwaddr addr, int val)
if (start_sqs) { if (start_sqs) {
NvmeSQueue *sq; NvmeSQueue *sq;
QTAILQ_FOREACH(sq, &cq->sq_list, entry) { QTAILQ_FOREACH(sq, &cq->sq_list, entry) {
timer_mod(sq->timer, qemu_clock_get_ns(QEMU_CLOCK_VIRTUAL) + 500); qemu_bh_schedule(sq->bh);
} }
timer_mod(cq->timer, qemu_clock_get_ns(QEMU_CLOCK_VIRTUAL) + 500); qemu_bh_schedule(cq->bh);
} }
if (cq->tail == cq->head) { if (cq->tail == cq->head) {
@ -6984,7 +6980,8 @@ static void nvme_process_db(NvmeCtrl *n, hwaddr addr, int val)
pci_dma_write(&n->parent_obj, sq->db_addr, &sq->tail, pci_dma_write(&n->parent_obj, sq->db_addr, &sq->tail,
sizeof(sq->tail)); sizeof(sq->tail));
} }
timer_mod(sq->timer, qemu_clock_get_ns(QEMU_CLOCK_VIRTUAL) + 500);
qemu_bh_schedule(sq->bh);
} }
} }

View File

@ -375,7 +375,7 @@ typedef struct NvmeSQueue {
uint64_t dma_addr; uint64_t dma_addr;
uint64_t db_addr; uint64_t db_addr;
uint64_t ei_addr; uint64_t ei_addr;
QEMUTimer *timer; QEMUBH *bh;
EventNotifier notifier; EventNotifier notifier;
bool ioeventfd_enabled; bool ioeventfd_enabled;
NvmeRequest *io_req; NvmeRequest *io_req;
@ -396,7 +396,7 @@ typedef struct NvmeCQueue {
uint64_t dma_addr; uint64_t dma_addr;
uint64_t db_addr; uint64_t db_addr;
uint64_t ei_addr; uint64_t ei_addr;
QEMUTimer *timer; QEMUBH *bh;
EventNotifier notifier; EventNotifier notifier;
bool ioeventfd_enabled; bool ioeventfd_enabled;
QTAILQ_HEAD(, NvmeSQueue) sq_list; QTAILQ_HEAD(, NvmeSQueue) sq_list;