Philippe Mathieu-Daudé
fcc8672aca
block/nvme: Trace NVMe spec version supported by the controller
...
NVMe controllers implement different versions of the spec,
and different features of it. It is useful to gather this
information when debugging.
Signed-off-by: Philippe Mathieu-Daudé <philmd@redhat.com >
Message-Id: <20210127212137.3482291-3-philmd@redhat.com >
Reviewed-by: Klaus Jensen <k.jensen@samsung.com >
Signed-off-by: Kevin Wolf <kwolf@redhat.com >
2021-02-02 17:05:38 +01:00
Philippe Mathieu-Daudé
97b709f32e
block/nvme: Properly display doorbell stride length in trace event
...
Commit 15b2260bef ("block/nvme: Trace controller capabilities")
misunderstood the doorbell stride value from the datasheet, use
the correct one. The 'doorbell_scale' variable used few lines
later is correct.
Signed-off-by: Philippe Mathieu-Daudé <philmd@redhat.com >
Message-Id: <20210127212137.3482291-2-philmd@redhat.com >
Reviewed-by: Klaus Jensen <k.jensen@samsung.com >
Signed-off-by: Kevin Wolf <kwolf@redhat.com >
2021-02-02 17:05:38 +01:00
Philippe Mathieu-Daudé
c8807c5edc
block/nvme: Implement fake truncate() coroutine
...
NVMe drive cannot be shrunk.
Since commit c80d8b06cf we can use the @exact parameter (set
to false) to return success if the block device is larger than
the requested offset (even if we can not be shrunk).
Use this parameter to implement the NVMe truncate() coroutine,
similarly how it is done for the iscsi and file-posix drivers
(see commit 82325ae5f2 "Evaluate @exact in protocol drivers").
Reported-by: Xueqiang Wei <xuwei@redhat.com >
Suggested-by: Max Reitz <mreitz@redhat.com >
Signed-off-by: Philippe Mathieu-Daudé <philmd@redhat.com >
Message-Id: <20201210125202.858656-1-philmd@redhat.com >
Signed-off-by: Max Reitz <mreitz@redhat.com >
2020-12-18 12:35:55 +01:00
Philippe Mathieu-Daudé
a0546a7b6f
block/nvme: Fix nvme_submit_command() on big-endian host
...
The Completion Queue Command Identifier is a 16-bit value,
so nvme_submit_command() is unlikely to work on big-endian
hosts, as the relevant bits are truncated.
Fix by using the correct byte-swap function.
Fixes: bdd6a90a9e ("block: Add VFIO based NVMe driver")
Reported-by: Keith Busch <kbusch@kernel.org >
Signed-off-by: Philippe Mathieu-Daudé <philmd@redhat.com >
Reviewed-by: Stefan Hajnoczi <stefanha@redhat.com >
Message-id: 20201029093306.1063879-25-philmd@redhat.com
Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com >
Tested-by: Eric Auger <eric.auger@redhat.com >
2020-11-03 19:06:22 +00:00
Philippe Mathieu-Daudé
4b19e9b815
block/nvme: Fix use of write-only doorbells page on Aarch64 arch
...
qemu_vfio_pci_map_bar() calls mmap(), and mmap(2) states:
'offset' must be a multiple of the page size as returned
by sysconf(_SC_PAGE_SIZE).
In commit f68453237b we started to use an offset of 4K which
broke this contract on Aarch64 arch.
Fix by mapping at offset 0, and and accessing doorbells at offset=4K.
Fixes: f68453237b ("block/nvme: Map doorbells pages write-only")
Reported-by: Eric Auger <eric.auger@redhat.com >
Reviewed-by: Eric Auger <eric.auger@redhat.com >
Reviewed-by: Stefan Hajnoczi <stefanha@redhat.com >
Tested-by: Eric Auger <eric.auger@redhat.com >
Signed-off-by: Philippe Mathieu-Daudé <philmd@redhat.com >
Message-id: 20201029093306.1063879-24-philmd@redhat.com
Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com >
Tested-by: Eric Auger <eric.auger@redhat.com >
2020-11-03 19:06:22 +00:00
Eric Auger
9e13d59884
block/nvme: Align iov's va and size on host page size
...
Make sure iov's va and size are properly aligned on the
host page size.
Signed-off-by: Eric Auger <eric.auger@redhat.com >
Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com >
Reviewed-by: Stefan Hajnoczi <stefanha@redhat.com >
Tested-by: Eric Auger <eric.auger@redhat.com >
Signed-off-by: Philippe Mathieu-Daudé <philmd@redhat.com >
Message-id: 20201029093306.1063879-23-philmd@redhat.com
Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com >
Tested-by: Eric Auger <eric.auger@redhat.com >
2020-11-03 19:06:22 +00:00
Eric Auger
f8fd3ebac3
block/nvme: Change size and alignment of prp_list_pages
...
In preparation of 64kB host page support, let's change the size
and alignment of the prp_list_pages so that the VFIO DMA MAP succeeds
with 64kB host page size. We align on the host page size.
Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com >
Signed-off-by: Eric Auger <eric.auger@redhat.com >
Reviewed-by: Stefan Hajnoczi <stefanha@redhat.com >
Tested-by: Eric Auger <eric.auger@redhat.com >
Signed-off-by: Philippe Mathieu-Daudé <philmd@redhat.com >
Message-id: 20201029093306.1063879-22-philmd@redhat.com
Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com >
Tested-by: Eric Auger <eric.auger@redhat.com >
2020-11-03 19:06:22 +00:00
Eric Auger
2387aaced7
block/nvme: Change size and alignment of queue
...
In preparation of 64kB host page support, let's change the size
and alignment of the queue so that the VFIO DMA MAP succeeds.
We align on the host page size.
Signed-off-by: Eric Auger <eric.auger@redhat.com >
Reviewed-by: Stefan Hajnoczi <stefanha@redhat.com >
Tested-by: Eric Auger <eric.auger@redhat.com >
Signed-off-by: Philippe Mathieu-Daudé <philmd@redhat.com >
Message-id: 20201029093306.1063879-21-philmd@redhat.com
Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com >
Tested-by: Eric Auger <eric.auger@redhat.com >
2020-11-03 19:06:22 +00:00
Eric Auger
0aecd06049
block/nvme: Change size and alignment of IDENTIFY response buffer
...
In preparation of 64kB host page support, let's change the size
and alignment of the IDENTIFY command response buffer so that
the VFIO DMA MAP succeeds. We align on the host page size.
Signed-off-by: Eric Auger <eric.auger@redhat.com >
Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com >
Reviewed-by: Stefan Hajnoczi <stefanha@redhat.com >
Tested-by: Eric Auger <eric.auger@redhat.com >
Signed-off-by: Philippe Mathieu-Daudé <philmd@redhat.com >
Message-id: 20201029093306.1063879-20-philmd@redhat.com
Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com >
Tested-by: Eric Auger <eric.auger@redhat.com >
2020-11-03 19:06:22 +00:00
Philippe Mathieu-Daudé
a652a3ec69
block/nvme: Correct minimum device page size
...
While trying to simplify the code using a macro, we forgot
the 12-bit shift... Correct that.
Fixes: fad1eb6886 ("block/nvme: Use register definitions from 'block/nvme.h'")
Reported-by: Eric Auger <eric.auger@redhat.com >
Reviewed-by: Stefan Hajnoczi <stefanha@redhat.com >
Reviewed-by: Eric Auger <eric.auger@redhat.com >
Tested-by: Eric Auger <eric.auger@redhat.com >
Signed-off-by: Philippe Mathieu-Daudé <philmd@redhat.com >
Message-id: 20201029093306.1063879-19-philmd@redhat.com
Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com >
Tested-by: Eric Auger <eric.auger@redhat.com >
2020-11-03 19:06:22 +00:00
Philippe Mathieu-Daudé
c8228ac355
block/nvme: Set request_alignment at initialization
...
Commit bdd6a90a9e ("block: Add VFIO based NVMe driver")
sets the request_alignment in nvme_refresh_limits().
For consistency, also set it during initialization.
Reported-by: Stefan Hajnoczi <stefanha@redhat.com >
Reviewed-by: Eric Auger <eric.auger@redhat.com >
Reviewed-by: Stefan Hajnoczi <stefanha@redhat.com >
Tested-by: Eric Auger <eric.auger@redhat.com >
Signed-off-by: Philippe Mathieu-Daudé <philmd@redhat.com >
Message-id: 20201029093306.1063879-18-philmd@redhat.com
Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com >
Tested-by: Eric Auger <eric.auger@redhat.com >
2020-11-03 19:06:21 +00:00
Philippe Mathieu-Daudé
08d5406798
block/nvme: Simplify nvme_cmd_sync()
...
As all commands use the ADMIN queue, it is pointless to pass
it as argument each time. Remove the argument, and rename the
function as nvme_admin_cmd_sync() to make this new behavior
clearer.
Reviewed-by: Eric Auger <eric.auger@redhat.com >
Tested-by: Eric Auger <eric.auger@redhat.com >
Signed-off-by: Philippe Mathieu-Daudé <philmd@redhat.com >
Reviewed-by: Stefan Hajnoczi <stefanha@redhat.com >
Message-id: 20201029093306.1063879-17-philmd@redhat.com
Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com >
Tested-by: Eric Auger <eric.auger@redhat.com >
2020-11-03 19:06:21 +00:00
Philippe Mathieu-Daudé
52b75ea8ec
block/nvme: Simplify ADMIN queue access
...
We don't need to dereference from BDRVNVMeState each time.
Use a NVMeQueuePair pointer on the admin queue.
The nvme_init() becomes easier to review, matching the style
of nvme_add_io_queue().
Reviewed-by: Eric Auger <eric.auger@redhat.com >
Reviewed-by: Stefan Hajnoczi <stefanha@redhat.com >
Tested-by: Eric Auger <eric.auger@redhat.com >
Signed-off-by: Philippe Mathieu-Daudé <philmd@redhat.com >
Message-id: 20201029093306.1063879-16-philmd@redhat.com
Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com >
Tested-by: Eric Auger <eric.auger@redhat.com >
2020-11-03 19:06:21 +00:00
Philippe Mathieu-Daudé
3c363c073e
block/nvme: Correctly initialize Admin Queue Attributes
...
From the specification chapter 3.1.8 "AQA - Admin Queue Attributes"
the Admin Submission Queue Size field is a 0’s based value:
Admin Submission Queue Size (ASQS):
Defines the size of the Admin Submission Queue in entries.
Enabling a controller while this field is cleared to 00h
produces undefined results. The minimum size of the Admin
Submission Queue is two entries. The maximum size of the
Admin Submission Queue is 4096 entries.
This is a 0’s based value.
This bug has never been hit because the device initialization
uses a single command synchronously :)
Reviewed-by: Eric Auger <eric.auger@redhat.com >
Reviewed-by: Stefan Hajnoczi <stefanha@redhat.com >
Tested-by: Eric Auger <eric.auger@redhat.com >
Signed-off-by: Philippe Mathieu-Daudé <philmd@redhat.com >
Message-id: 20201029093306.1063879-15-philmd@redhat.com
Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com >
Tested-by: Eric Auger <eric.auger@redhat.com >
2020-11-03 19:06:21 +00:00
Philippe Mathieu-Daudé
76a24781cc
block/nvme: Use definitions instead of magic values in add_io_queue()
...
Replace magic values by definitions, and simplifiy since the
number of queues will never reach 64K.
Reviewed-by: Eric Auger <eric.auger@redhat.com >
Reviewed-by: Stefan Hajnoczi <stefanha@redhat.com >
Tested-by: Eric Auger <eric.auger@redhat.com >
Signed-off-by: Philippe Mathieu-Daudé <philmd@redhat.com >
Message-id: 20201029093306.1063879-14-philmd@redhat.com
Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com >
Tested-by: Eric Auger <eric.auger@redhat.com >
2020-11-03 19:06:21 +00:00
Philippe Mathieu-Daudé
dfa9c6c656
block/nvme: Make nvme_init_queue() return boolean indicating error
...
Just for consistency, following the example documented since
commit e3fe3988d7 ("error: Document Error API usage rules"),
return a boolean value indicating an error is set or not.
Directly pass errp as the local_err is not requested in our
case. This simplifies a bit nvme_create_queue_pair().
Reviewed-by: Stefan Hajnoczi <stefanha@redhat.com >
Tested-by: Eric Auger <eric.auger@redhat.com >
Signed-off-by: Philippe Mathieu-Daudé <philmd@redhat.com >
Message-id: 20201029093306.1063879-12-philmd@redhat.com
Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com >
Tested-by: Eric Auger <eric.auger@redhat.com >
2020-11-03 19:06:21 +00:00
Philippe Mathieu-Daudé
7a5f00dde3
block/nvme: Make nvme_identify() return boolean indicating error
...
Just for consistency, following the example documented since
commit e3fe3988d7 ("error: Document Error API usage rules"),
return a boolean value indicating an error is set or not.
Directly pass errp as the local_err is not requested in our
case.
Tested-by: Eric Auger <eric.auger@redhat.com >
Signed-off-by: Philippe Mathieu-Daudé <philmd@redhat.com >
Reviewed-by: Stefan Hajnoczi <stefanha@redhat.com >
Message-id: 20201029093306.1063879-11-philmd@redhat.com
Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com >
Tested-by: Eric Auger <eric.auger@redhat.com >
2020-11-03 19:06:21 +00:00
Philippe Mathieu-Daudé
1b539bd6db
block/nvme: Use unsigned integer for queue counter/size
...
We can not have negative queue count/size/index, use unsigned type.
Rename 'nr_queues' as 'queue_count' to match the spec naming.
Reviewed-by: Eric Auger <eric.auger@redhat.com >
Reviewed-by: Stefan Hajnoczi <stefanha@redhat.com >
Tested-by: Eric Auger <eric.auger@redhat.com >
Signed-off-by: Philippe Mathieu-Daudé <philmd@redhat.com >
Message-id: 20201029093306.1063879-10-philmd@redhat.com
Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com >
Tested-by: Eric Auger <eric.auger@redhat.com >
2020-11-03 19:06:21 +00:00
Philippe Mathieu-Daudé
3214b0f094
block/nvme: Move definitions before structure declarations
...
To be able to use some definitions in structure declarations,
move them earlier. No logical change.
Reviewed-by: Eric Auger <eric.auger@redhat.com >
Reviewed-by: Stefan Hajnoczi <stefanha@redhat.com >
Tested-by: Eric Auger <eric.auger@redhat.com >
Signed-off-by: Philippe Mathieu-Daudé <philmd@redhat.com >
Message-id: 20201029093306.1063879-9-philmd@redhat.com
Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com >
Tested-by: Eric Auger <eric.auger@redhat.com >
2020-11-03 19:06:21 +00:00
Philippe Mathieu-Daudé
6e1e9ff2d3
block/nvme: Trace queue pair creation/deletion
...
Reviewed-by: Eric Auger <eric.auger@redhat.com >
Reviewed-by: Stefan Hajnoczi <stefanha@redhat.com >
Tested-by: Eric Auger <eric.auger@redhat.com >
Signed-off-by: Philippe Mathieu-Daudé <philmd@redhat.com >
Message-id: 20201029093306.1063879-8-philmd@redhat.com
Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com >
Tested-by: Eric Auger <eric.auger@redhat.com >
2020-11-03 19:06:20 +00:00
Philippe Mathieu-Daudé
51e98b6d21
block/nvme: Improve nvme_free_req_queue_wait() trace information
...
What we want to trace is the block driver state and the queue index.
Suggested-by: Stefan Hajnoczi <stefanha@redhat.com >
Reviewed-by: Eric Auger <eric.auger@redhat.com >
Reviewed-by: Stefan Hajnoczi <stefanha@redhat.com >
Tested-by: Eric Auger <eric.auger@redhat.com >
Signed-off-by: Philippe Mathieu-Daudé <philmd@redhat.com >
Message-id: 20201029093306.1063879-7-philmd@redhat.com
Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com >
Tested-by: Eric Auger <eric.auger@redhat.com >
2020-11-03 19:06:20 +00:00
Philippe Mathieu-Daudé
1c914cd120
block/nvme: Trace nvme_poll_queue() per queue
...
As we want to enable multiple queues, report the event
in each nvme_poll_queue() call, rather than once in
the callback calling nvme_poll_queues().
Reviewed-by: Eric Auger <eric.auger@redhat.com >
Reviewed-by: Stefan Hajnoczi <stefanha@redhat.com >
Tested-by: Eric Auger <eric.auger@redhat.com >
Signed-off-by: Philippe Mathieu-Daudé <philmd@redhat.com >
Message-id: 20201029093306.1063879-6-philmd@redhat.com
Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com >
Tested-by: Eric Auger <eric.auger@redhat.com >
2020-11-03 19:06:20 +00:00
Philippe Mathieu-Daudé
15b2260bef
block/nvme: Trace controller capabilities
...
Controllers have different capabilities and report them in the
CAP register. We are particularly interested by the page size
limits.
Reviewed-by: Stefan Hajnoczi <stefanha@redhat.com >
Reviewed-by: Eric Auger <eric.auger@redhat.com >
Tested-by: Eric Auger <eric.auger@redhat.com >
Signed-off-by: Philippe Mathieu-Daudé <philmd@redhat.com >
Message-id: 20201029093306.1063879-5-philmd@redhat.com
Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com >
Tested-by: Eric Auger <eric.auger@redhat.com >
2020-11-03 19:06:20 +00:00
Philippe Mathieu-Daudé
58ad6ae0cb
block/nvme: Report warning with warn_report()
...
Instead of displaying warning on stderr, use warn_report()
which also displays it on the monitor.
Reviewed-by: Eric Auger <eric.auger@redhat.com >
Reviewed-by: Stefan Hajnoczi <stefanha@redhat.com >
Tested-by: Eric Auger <eric.auger@redhat.com >
Signed-off-by: Philippe Mathieu-Daudé <philmd@redhat.com >
Message-id: 20201029093306.1063879-4-philmd@redhat.com
Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com >
Tested-by: Eric Auger <eric.auger@redhat.com >
2020-11-03 19:06:20 +00:00
Philippe Mathieu-Daudé
f25e7ab2b0
block/nvme: Add driver statistics for access alignment and hw errors
...
Keep statistics of some hardware errors, and number of
aligned/unaligned I/O accesses.
QMP example booting a full RHEL 8.3 aarch64 guest:
{ "execute": "query-blockstats" }
{
"return": [
{
"device": "",
"node-name": "drive0",
"stats": {
"flush_total_time_ns": 6026948,
"wr_highest_offset": 3383991230464,
"wr_total_time_ns": 807450995,
"failed_wr_operations": 0,
"failed_rd_operations": 0,
"wr_merged": 3,
"wr_bytes": 50133504,
"failed_unmap_operations": 0,
"failed_flush_operations": 0,
"account_invalid": false,
"rd_total_time_ns": 1846979900,
"flush_operations": 130,
"wr_operations": 659,
"rd_merged": 1192,
"rd_bytes": 218244096,
"account_failed": false,
"idle_time_ns": 2678641497,
"rd_operations": 7406,
},
"driver-specific": {
"driver": "nvme",
"completion-errors": 0,
"unaligned-accesses": 2959,
"aligned-accesses": 4477
},
"qdev": "/machine/peripheral-anon/device[0]/virtio-backend"
}
]
}
Suggested-by: Stefan Hajnoczi <stefanha@gmail.com >
Signed-off-by: Philippe Mathieu-Daudé <philmd@redhat.com >
Acked-by: Markus Armbruster <armbru@redhat.com >
Message-id: 20201001162939.1567915-1-philmd@redhat.com
Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com >
2020-10-23 13:42:16 +01:00
Philippe Mathieu-Daudé
eefffb0244
block/nvme: Replace magic value by SCALE_MS definition
...
Use self-explicit SCALE_MS definition instead of magic value
(missed in similar commit e4f310fe7f ).
Signed-off-by: Philippe Mathieu-Daudé <philmd@redhat.com >
Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com >
Message-Id: <20200922083821.578519-7-philmd@redhat.com >
2020-10-05 09:35:52 +01:00
Philippe Mathieu-Daudé
fad1eb6886
block/nvme: Use register definitions from 'block/nvme.h'
...
Use the NVMe register definitions from "block/nvme.h" which
ease a bit reviewing the code while matching the datasheet.
Signed-off-by: Philippe Mathieu-Daudé <philmd@redhat.com >
Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com >
Message-Id: <20200922083821.578519-6-philmd@redhat.com >
2020-10-05 09:35:52 +01:00
Philippe Mathieu-Daudé
9406e0d97e
block/nvme: Drop NVMeRegs structure, directly use NvmeBar
...
NVMeRegs only contains NvmeBar. Simplify the code by using NvmeBar
directly.
This triggers a checkpatch.pl error:
ERROR: Use of volatile is usually wrong, please add a comment
#30 : FILE: block/nvme.c:691:
+ volatile NvmeBar *regs;
This is a false positive as in our case we are using I/O registers,
so the 'volatile' use is justified.
Signed-off-by: Philippe Mathieu-Daudé <philmd@redhat.com >
Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com >
Message-Id: <20200922083821.578519-5-philmd@redhat.com >
2020-10-05 09:35:52 +01:00
Philippe Mathieu-Daudé
37d7a45abd
block/nvme: Reduce I/O registers scope
...
We only access the I/O register in nvme_init().
Remove the reference in BDRVNVMeState and reduce its scope.
Signed-off-by: Philippe Mathieu-Daudé <philmd@redhat.com >
Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com >
Message-Id: <20200922083821.578519-4-philmd@redhat.com >
2020-10-05 09:35:52 +01:00
Philippe Mathieu-Daudé
f68453237b
block/nvme: Map doorbells pages write-only
...
Per the datasheet sections 3.1.13/3.1.14:
"The host should not read the doorbell registers."
As we don't need read access, map the doorbells with write-only
permission. We keep a reference to this mapped address in the
BDRVNVMeState structure.
Signed-off-by: Philippe Mathieu-Daudé <philmd@redhat.com >
Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com >
Message-Id: <20200922083821.578519-3-philmd@redhat.com >
2020-10-05 09:35:52 +01:00
Philippe Mathieu-Daudé
b02c01a513
util/vfio-helpers: Pass page protections to qemu_vfio_pci_map_bar()
...
Pages are currently mapped READ/WRITE. To be able to use different
protections, add a new argument to qemu_vfio_pci_map_bar().
Signed-off-by: Philippe Mathieu-Daudé <philmd@redhat.com >
Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com >
Message-Id: <20200922083821.578519-2-philmd@redhat.com >
2020-10-05 09:35:52 +01:00
Philippe Mathieu-Daudé
e5ff22ba9f
block/nvme: Pair doorbell registers
...
For each queue doorbell registers are paired as:
- Submission Queue Tail Doorbell
- Completion Queue Head Doorbell
Reflect that in the NVMeRegs structure, and adapt
nvme_create_queue_pair() accordingly.
Signed-off-by: Philippe Mathieu-Daudé <philmd@redhat.com >
Message-Id: <20200904124130.583838-4-philmd@redhat.com >
Reviewed-by: Klaus Jensen <k.jensen@samsung.com >
Reviewed-by: Fam Zheng <fam@euphon.net >
Signed-off-by: Kevin Wolf <kwolf@redhat.com >
2020-09-10 11:11:13 +02:00
Philippe Mathieu-Daudé
c7100f0a0b
block/nvme: Use generic NvmeBar structure
...
Commit f3c507adcd ("NVMe: Initial commit for new storage interface")
introduced the NvmeBar structure. Unfortunately in commit bdd6a90a9e
("block: Add VFIO based NVMe driver") we duplicated it.
Apparently in commit a3d9a352d4 ("block: Move NVMe constants to
a separate header") we tried to unify headers but forgot to remove
the structure declared in the block/nvme.c source file.
Do it now, and remove the structure size check which is redundant
with the header check added in commit 74e18435c0 ("hw/block/nvme:
Align I/O BAR to 4 KiB").
Signed-off-by: Philippe Mathieu-Daudé <philmd@redhat.com >
Message-Id: <20200904124130.583838-3-philmd@redhat.com >
Reviewed-by: Klaus Jensen <k.jensen@samsung.com >
Reviewed-by: Fam Zheng <fam@euphon.net >
Signed-off-by: Kevin Wolf <kwolf@redhat.com >
2020-09-10 11:11:13 +02:00
Philippe Mathieu-Daudé
0ea32f34ce
block/nvme: Group controller registers in NVMeRegs structure
...
We want to use the NvmeBar structure from "block/nvme.h" in the
next commit. As a preliminary step, group all the NVMe controller
registers in the 'ctrl' field, keeping the doorbells registers
out of it.
Signed-off-by: Philippe Mathieu-Daudé <philmd@redhat.com >
Message-Id: <20200904124130.583838-2-philmd@redhat.com >
Reviewed-by: Klaus Jensen <k.jensen@samsung.com >
Reviewed-by: Fam Zheng <fam@euphon.net >
Signed-off-by: Kevin Wolf <kwolf@redhat.com >
2020-09-10 11:11:12 +02:00
Philippe Mathieu-Daudé
b111b3fcde
block/nvme: Use an array of EventNotifier
...
In preparation of using multiple IRQ (thus multiple eventfds)
make BDRVNVMeState::irq_notifier an array (for now of a single
element, the admin queue notifier).
Reviewed-by: Stefan Hajnoczi <stefanha@redhat.com >
Reviewed-by: Stefano Garzarella <sgarzare@redhat.com >
Signed-off-by: Philippe Mathieu-Daudé <philmd@redhat.com >
Message-Id: <20200821195359.1285345-16-philmd@redhat.com >
Signed-off-by: Kevin Wolf <kwolf@redhat.com >
2020-09-07 12:31:30 +02:00
Philippe Mathieu-Daudé
7a1fb2ef40
block/nvme: Extract nvme_poll_queue()
...
As we want to do per-queue polling, extract the nvme_poll_queue()
method which operates on a single queue.
Reviewed-by: Stefan Hajnoczi <stefanha@redhat.com >
Reviewed-by: Stefano Garzarella <sgarzare@redhat.com >
Signed-off-by: Philippe Mathieu-Daudé <philmd@redhat.com >
Message-Id: <20200821195359.1285345-15-philmd@redhat.com >
Signed-off-by: Kevin Wolf <kwolf@redhat.com >
2020-09-07 12:31:30 +02:00
Philippe Mathieu-Daudé
0a28b02ef9
block/nvme: Simplify nvme_create_queue_pair() arguments
...
nvme_create_queue_pair() doesn't require BlockDriverState anymore.
Replace it by BDRVNVMeState and AioContext to simplify.
Reviewed-by: Stefan Hajnoczi <stefanha@redhat.com >
Reviewed-by: Stefano Garzarella <sgarzare@redhat.com >
Signed-off-by: Philippe Mathieu-Daudé <philmd@redhat.com >
Message-Id: <20200821195359.1285345-14-philmd@redhat.com >
Signed-off-by: Kevin Wolf <kwolf@redhat.com >
2020-09-07 12:31:30 +02:00
Philippe Mathieu-Daudé
073a06978c
block/nvme: Replace BDRV_POLL_WHILE by AIO_WAIT_WHILE
...
BDRV_POLL_WHILE() is defined as:
#define BDRV_POLL_WHILE(bs, cond) ({ \
BlockDriverState *bs_ = (bs); \
AIO_WAIT_WHILE(bdrv_get_aio_context(bs_), \
cond); })
As we will remove the BlockDriverState use in the next commit,
start by using the exploded version of BDRV_POLL_WHILE().
Reviewed-by: Stefan Hajnoczi <stefanha@redhat.com >
Reviewed-by: Stefano Garzarella <sgarzare@redhat.com >
Signed-off-by: Philippe Mathieu-Daudé <philmd@redhat.com >
Message-Id: <20200821195359.1285345-13-philmd@redhat.com >
Signed-off-by: Kevin Wolf <kwolf@redhat.com >
2020-09-07 12:31:30 +02:00
Philippe Mathieu-Daudé
3a6d34d066
block/nvme: Simplify nvme_init_queue() arguments
...
nvme_init_queue() doesn't require BlockDriverState anymore.
Replace it by BDRVNVMeState to simplify.
Reviewed-by: Stefan Hajnoczi <stefanha@redhat.com >
Reviewed-by: Stefano Garzarella <sgarzare@redhat.com >
Signed-off-by: Philippe Mathieu-Daudé <philmd@redhat.com >
Message-Id: <20200821195359.1285345-12-philmd@redhat.com >
Signed-off-by: Kevin Wolf <kwolf@redhat.com >
2020-09-07 12:31:30 +02:00
Philippe Mathieu-Daudé
38e1f8186f
block/nvme: Replace qemu_try_blockalign(bs) by qemu_try_memalign(pg_sz)
...
qemu_try_blockalign() is a generic API that call back to the
block driver to return its page alignment. As we call from
within the very same driver, we already know to page alignment
stored in our state. Remove indirections and use the value from
BDRVNVMeState.
This change is required to later remove the BlockDriverState
argument, to make nvme_init_queue() per hardware, and not per
block driver.
Reviewed-by: Stefan Hajnoczi <stefanha@redhat.com >
Reviewed-by: Stefano Garzarella <sgarzare@redhat.com >
Signed-off-by: Philippe Mathieu-Daudé <philmd@redhat.com >
Message-Id: <20200821195359.1285345-11-philmd@redhat.com >
Signed-off-by: Kevin Wolf <kwolf@redhat.com >
2020-09-07 12:31:30 +02:00
Philippe Mathieu-Daudé
2ed846930d
block/nvme: Replace qemu_try_blockalign0 by qemu_try_blockalign/memset
...
In the next commit we'll get rid of qemu_try_blockalign().
To ease review, first replace qemu_try_blockalign0() by explicit
calls to qemu_try_blockalign() and memset().
Reviewed-by: Stefan Hajnoczi <stefanha@redhat.com >
Reviewed-by: Stefano Garzarella <sgarzare@redhat.com >
Signed-off-by: Philippe Mathieu-Daudé <philmd@redhat.com >
Message-Id: <20200821195359.1285345-10-philmd@redhat.com >
Signed-off-by: Kevin Wolf <kwolf@redhat.com >
2020-09-07 12:31:30 +02:00
Philippe Mathieu-Daudé
7d3b214ae4
block/nvme: Use union of NvmeIdCtrl / NvmeIdNs structures
...
We allocate an unique chunk of memory then use it for two
different structures. By using an union, we make it clear
the data is overlapping (and we can remove the casts).
Suggested-by: Stefan Hajnoczi <stefanha@redhat.com >
Reviewed-by: Stefan Hajnoczi <stefanha@redhat.com >
Reviewed-by: Stefano Garzarella <sgarzare@redhat.com >
Signed-off-by: Philippe Mathieu-Daudé <philmd@redhat.com >
Message-Id: <20200821195359.1285345-9-philmd@redhat.com >
Signed-off-by: Kevin Wolf <kwolf@redhat.com >
2020-09-07 12:24:53 +02:00
Philippe Mathieu-Daudé
4d98093937
block/nvme: Rename local variable
...
We are going to modify the code in the next commit. Renaming
the 'resp' variable to 'id' first makes the next commit easier
to review. No logical changes.
Reviewed-by: Stefan Hajnoczi <stefanha@redhat.com >
Reviewed-by: Stefano Garzarella <sgarzare@redhat.com >
Signed-off-by: Philippe Mathieu-Daudé <philmd@redhat.com >
Message-Id: <20200821195359.1285345-8-philmd@redhat.com >
Signed-off-by: Kevin Wolf <kwolf@redhat.com >
2020-09-07 12:23:55 +02:00
Philippe Mathieu-Daudé
c8edbfb2cc
block/nvme: Use common error path in nvme_add_io_queue()
...
Rearrange nvme_add_io_queue() by using a common error path.
This will be proven useful in few commits where we add IRQ
notification to the IO queues.
Reviewed-by: Stefan Hajnoczi <stefanha@redhat.com >
Reviewed-by: Stefano Garzarella <sgarzare@redhat.com >
Signed-off-by: Philippe Mathieu-Daudé <philmd@redhat.com >
Message-Id: <20200821195359.1285345-7-philmd@redhat.com >
Signed-off-by: Kevin Wolf <kwolf@redhat.com >
2020-09-07 12:23:55 +02:00
Philippe Mathieu-Daudé
bf6ce5ec6d
block/nvme: Improve error message when IO queue creation failed
...
Do not use the same error message for different failures.
Display a different error whether it is the CQ or the SQ.
Reviewed-by: Stefan Hajnoczi <stefanha@redhat.com >
Reviewed-by: Stefano Garzarella <sgarzare@redhat.com >
Signed-off-by: Philippe Mathieu-Daudé <philmd@redhat.com >
Message-Id: <20200821195359.1285345-6-philmd@redhat.com >
Signed-off-by: Kevin Wolf <kwolf@redhat.com >
2020-09-07 12:23:55 +02:00
Philippe Mathieu-Daudé
73159e52e6
block/nvme: Define INDEX macros to ease code review
...
Use definitions instead of '0' or '1' indexes. Also this will
be useful when using multi-queues later.
Reviewed-by: Stefan Hajnoczi <stefanha@redhat.com >
Reviewed-by: Stefano Garzarella <sgarzare@redhat.com >
Signed-off-by: Philippe Mathieu-Daudé <philmd@redhat.com >
Message-Id: <20200821195359.1285345-5-philmd@redhat.com >
Signed-off-by: Kevin Wolf <kwolf@redhat.com >
2020-09-07 12:23:55 +02:00
Philippe Mathieu-Daudé
0ea45f76eb
block/nvme: Let nvme_create_queue_pair() fail gracefully
...
As nvme_create_queue_pair() is allowed to fail, replace the
alloc() calls by try_alloc() to avoid aborting QEMU.
Reviewed-by: Stefan Hajnoczi <stefanha@redhat.com >
Reviewed-by: Stefano Garzarella <sgarzare@redhat.com >
Signed-off-by: Philippe Mathieu-Daudé <philmd@redhat.com >
Message-Id: <20200821195359.1285345-4-philmd@redhat.com >
Signed-off-by: Kevin Wolf <kwolf@redhat.com >
2020-09-07 12:23:55 +02:00
Philippe Mathieu-Daudé
e266f52cfb
block/nvme: Avoid further processing if trace event not enabled
...
Avoid further processing if TRACE_NVME_SUBMIT_COMMAND_RAW is
not enabled. This is an untested intend of performance optimization.
Reviewed-by: Stefan Hajnoczi <stefanha@redhat.com >
Signed-off-by: Philippe Mathieu-Daudé <philmd@redhat.com >
Message-Id: <20200821195359.1285345-3-philmd@redhat.com >
Signed-off-by: Kevin Wolf <kwolf@redhat.com >
2020-09-07 12:23:55 +02:00
Philippe Mathieu-Daudé
e4f310fe7f
block/nvme: Replace magic value by SCALE_MS definition
...
Use self-explicit SCALE_MS definition instead of magic value.
Reviewed-by: Stefan Hajnoczi <stefanha@redhat.com >
Reviewed-by: Stefano Garzarella <sgarzare@redhat.com >
Signed-off-by: Philippe Mathieu-Daudé <philmd@redhat.com >
Message-Id: <20200821195359.1285345-2-philmd@redhat.com >
Signed-off-by: Kevin Wolf <kwolf@redhat.com >
2020-09-07 12:23:55 +02:00
Klaus Jensen
69265150aa
hw/block/nvme: be consistent about zeros vs zeroes
...
The NVM Express specification generally uses 'zeroes' and not 'zeros',
so let us align with it.
Cc: Fam Zheng <fam@euphon.net >
Signed-off-by: Klaus Jensen <k.jensen@samsung.com >
Reviewed-by: Minwoo Im <minwoo.im.dev@gmail.com >
Reviewed-by: Maxim Levitsky <mlevitsk@redhat.com >
2020-09-02 08:48:50 +02:00