Skip to content

Commit

Permalink
nvme: enable to inject errors into admin commands
Browse files Browse the repository at this point in the history
This enables to inject errors into the commands submitted to the admin
queue.

It is useful to test error handling in the controller initialization.

	# echo 100 > /sys/kernel/debug/nvme0/fault_inject/probability
	# echo 1 > /sys/kernel/debug/nvme0/fault_inject/times
	# echo 10 > /sys/kernel/debug/nvme0/fault_inject/space
	# nvme reset /dev/nvme0
	# dmesg
	...
	nvme nvme0: Could not set queue count (16385)
	nvme nvme0: IO queues not created

Signed-off-by: Akinobu Mita <[email protected]>
Reviewed-by: Minwoo Im <[email protected]>
Reviewed-by: Sagi Grimberg <[email protected]>
Reviewed-by: Chaitanya Kulkarni <[email protected]>
Reviewed-by: Christoph Hellwig <[email protected]>
Signed-off-by: Christoph Hellwig <[email protected]>
  • Loading branch information
mita authored and Christoph Hellwig committed Jun 21, 2019
1 parent a364645 commit f79d5fd
Show file tree
Hide file tree
Showing 3 changed files with 7 additions and 3 deletions.
3 changes: 3 additions & 0 deletions drivers/nvme/host/core.c
Original file line number Diff line number Diff line change
Expand Up @@ -3722,6 +3722,7 @@ EXPORT_SYMBOL_GPL(nvme_start_ctrl);

void nvme_uninit_ctrl(struct nvme_ctrl *ctrl)
{
nvme_fault_inject_fini(&ctrl->fault_inject);
dev_pm_qos_hide_latency_tolerance(ctrl->device);
cdev_device_del(&ctrl->cdev, ctrl->device);
}
Expand Down Expand Up @@ -3817,6 +3818,8 @@ int nvme_init_ctrl(struct nvme_ctrl *ctrl, struct device *dev,
dev_pm_qos_update_user_latency_tolerance(ctrl->device,
min(default_ps_max_latency_us, (unsigned long)S32_MAX));

nvme_fault_inject_init(&ctrl->fault_inject, dev_name(ctrl->device));

return 0;
out_free_name:
kfree_const(ctrl->device->kobj.name);
Expand Down
5 changes: 2 additions & 3 deletions drivers/nvme/host/fault_inject.c
Original file line number Diff line number Diff line change
Expand Up @@ -60,16 +60,15 @@ void nvme_should_fail(struct request *req)
struct nvme_fault_inject *fault_inject = NULL;
u16 status;

/*
* make sure this request is coming from a valid namespace
*/
if (disk) {
struct nvme_ns *ns = disk->private_data;

if (ns)
fault_inject = &ns->fault_inject;
else
WARN_ONCE(1, "No namespace found for request\n");
} else {
fault_inject = &nvme_req(req)->ctrl->fault_inject;
}

if (fault_inject && should_fail(&fault_inject->attr, 1)) {
Expand Down
2 changes: 2 additions & 0 deletions drivers/nvme/host/nvme.h
Original file line number Diff line number Diff line change
Expand Up @@ -256,6 +256,8 @@ struct nvme_ctrl {

struct page *discard_page;
unsigned long discard_page_busy;

struct nvme_fault_inject fault_inject;
};

enum nvme_iopolicy {
Expand Down

0 comments on commit f79d5fd

Please sign in to comment.