nvme: refactor _nvme_ns_cmd_rw()
Pull the almost-identical request splitting code for driver-assisted striping and maximum I/O size into its own function, _nvme_ns_cmd_split_request(). Change-Id: I3c15ac2073f8f5aec721c427199c8fb1a5d6a1fc Signed-off-by: Daniel Verkamp <daniel.verkamp@intel.com>
This commit is contained in:
parent
766afaaacc
commit
736ec4967e
@ -38,6 +38,41 @@
|
|||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
static struct nvme_request *
|
||||||
|
_nvme_ns_cmd_rw(struct nvme_namespace *ns, void *payload, uint64_t lba,
|
||||||
|
uint32_t lba_count, nvme_cb_fn_t cb_fn, void *cb_arg,
|
||||||
|
uint32_t opc);
|
||||||
|
|
||||||
|
static struct nvme_request *
|
||||||
|
_nvme_ns_cmd_split_request(struct nvme_namespace *ns, void *payload,
|
||||||
|
uint64_t lba, uint32_t lba_count,
|
||||||
|
nvme_cb_fn_t cb_fn, void *cb_arg, uint32_t opc,
|
||||||
|
struct nvme_request *req,
|
||||||
|
uint32_t sectors_per_max_io, uint32_t sector_mask)
|
||||||
|
{
|
||||||
|
uint32_t sector_size = ns->sector_size;
|
||||||
|
uint32_t remaining_lba_count = lba_count;
|
||||||
|
struct nvme_request *child;
|
||||||
|
|
||||||
|
while (remaining_lba_count > 0) {
|
||||||
|
lba_count = sectors_per_max_io - (lba & sector_mask);
|
||||||
|
lba_count = nvme_min(remaining_lba_count, lba_count);
|
||||||
|
|
||||||
|
child = _nvme_ns_cmd_rw(ns, payload, lba, lba_count, cb_fn,
|
||||||
|
cb_arg, opc);
|
||||||
|
if (child == NULL) {
|
||||||
|
nvme_free_request(req);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
nvme_request_add_child(req, child);
|
||||||
|
remaining_lba_count -= lba_count;
|
||||||
|
lba += lba_count;
|
||||||
|
payload = (void *)((uintptr_t)payload + (lba_count * sector_size));
|
||||||
|
}
|
||||||
|
|
||||||
|
return req;
|
||||||
|
}
|
||||||
|
|
||||||
static struct nvme_request *
|
static struct nvme_request *
|
||||||
_nvme_ns_cmd_rw(struct nvme_namespace *ns, void *payload, uint64_t lba,
|
_nvme_ns_cmd_rw(struct nvme_namespace *ns, void *payload, uint64_t lba,
|
||||||
uint32_t lba_count, nvme_cb_fn_t cb_fn, void *cb_arg,
|
uint32_t lba_count, nvme_cb_fn_t cb_fn, void *cb_arg,
|
||||||
@ -67,41 +102,12 @@ _nvme_ns_cmd_rw(struct nvme_namespace *ns, void *payload, uint64_t lba,
|
|||||||
*/
|
*/
|
||||||
if (sectors_per_stripe > 0 &&
|
if (sectors_per_stripe > 0 &&
|
||||||
(((lba & (sectors_per_stripe - 1)) + lba_count) > sectors_per_stripe)) {
|
(((lba & (sectors_per_stripe - 1)) + lba_count) > sectors_per_stripe)) {
|
||||||
uint64_t remaining_lba_count = lba_count;
|
|
||||||
struct nvme_request *child;
|
|
||||||
|
|
||||||
while (remaining_lba_count > 0) {
|
return _nvme_ns_cmd_split_request(ns, payload, lba, lba_count, cb_fn, cb_arg, opc,
|
||||||
lba_count = sectors_per_stripe - (lba & (sectors_per_stripe - 1));
|
req, sectors_per_stripe, sectors_per_stripe - 1);
|
||||||
lba_count = nvme_min(remaining_lba_count, lba_count);
|
|
||||||
|
|
||||||
child = _nvme_ns_cmd_rw(ns, payload, lba, lba_count, cb_fn,
|
|
||||||
cb_arg, opc);
|
|
||||||
if (child == NULL) {
|
|
||||||
nvme_free_request(req);
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
nvme_request_add_child(req, child);
|
|
||||||
remaining_lba_count -= lba_count;
|
|
||||||
lba += lba_count;
|
|
||||||
payload = (void *)((uintptr_t)payload + (lba_count * sector_size));
|
|
||||||
}
|
|
||||||
} else if (lba_count > sectors_per_max_io) {
|
} else if (lba_count > sectors_per_max_io) {
|
||||||
uint64_t remaining_lba_count = lba_count;
|
return _nvme_ns_cmd_split_request(ns, payload, lba, lba_count, cb_fn, cb_arg, opc,
|
||||||
struct nvme_request *child;
|
req, sectors_per_max_io, 0);
|
||||||
|
|
||||||
while (remaining_lba_count > 0) {
|
|
||||||
lba_count = nvme_min(remaining_lba_count, sectors_per_max_io);
|
|
||||||
child = _nvme_ns_cmd_rw(ns, payload, lba, lba_count, cb_fn,
|
|
||||||
cb_arg, opc);
|
|
||||||
if (child == NULL) {
|
|
||||||
nvme_free_request(req);
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
nvme_request_add_child(req, child);
|
|
||||||
remaining_lba_count -= lba_count;
|
|
||||||
lba += lba_count;
|
|
||||||
payload = (void *)((uintptr_t)payload + (lba_count * sector_size));
|
|
||||||
}
|
|
||||||
} else {
|
} else {
|
||||||
cmd = &req->cmd;
|
cmd = &req->cmd;
|
||||||
cmd->opc = opc;
|
cmd->opc = opc;
|
||||||
|
Loading…
Reference in New Issue
Block a user