nvmet: confirm sq percpu has scheduled and switched to atomic
Subsystems (2)
Sagi Grimberg
maintainerPATCH 1/1 nvmet: confirm sq percpu has scheduled and switched to atomic
percpu_ref_kill is not enough to prevent subsequent percpu_ref_tryget_live from failing. Hence call perfcpu_ref_kill_confirm to make it safe.
Signed-off-by Sagi Grimberg <sagi at grimberg.me>
--- drivers/nvme/target/core.c | 11 ++++++++++- drivers/nvme/target/nvmet.h | 1 + 2 files changed, 11 insertions(+), 1 deletion(-)
drivers/nvme/target/core.c +10 -1
@@ -425,6 +425,13 @@ void nvmet_sq_setup(struct nvmet_ctrl *ctrl, struct nvmet_sq *sq, ctrl->sqs[qid] = sq; } +static void nvmet_confirm_sq (struct percpu_ref *ref) +{ + struct nvmet_sq *sq = container_of(ref, struct nvmet_sq, ref); + +complete (&sq->confirm_done); +} +void nvmet_sq_destroy (struct nvmet_sq *sq) {/*
@@ -433,7 +440,8 @@ void nvmet_sq_destroy(struct nvmet_sq *sq)*/ if (sq->ctrl && sq->ctrl->sqs && sq->ctrl->sqs[0 ] == sq)nvmet_async_events_free (sq->ctrl); -percpu_ref_kill (&sq->ref); +percpu_ref_kill_and_confirm (&sq->ref, nvmet_confirm_sq); +wait_for_completion (&sq->confirm_done);wait_for_completion (&sq->free_done);percpu_ref_exit (&sq->ref);
@@ -461,6 +469,7 @@ int nvmet_sq_init(struct nvmet_sq *sq)return ret; }init_completion (&sq->free_done); +init_completion (&sq->confirm_done);return 0 ; }
drivers/nvme/target/nvmet.h +1 -0
@@ -73,6 +73,7 @@ struct nvmet_sq {u16 qid;u16 size;struct completion free_done; +struct completion confirm_done; };/**
Signature · 1 line
2.7.4
Christoph Hellwig
maintainerPATCH 1/1 nvmet: confirm sq percpu has scheduled and switched to atomic
Looks good,
Reviewed-by Christoph Hellwig <hch at lst.de>
PATCH 1/1 nvmet: confirm sq percpu has scheduled and switched to atomic
In reply to Sagi GrimbergLooks good,
Reviewed-by Max Gurtovoy <maxg at mellanox.com>