nvmet: synchronize sqhd update
Subsystems (2)
PATCH v3 1/1 nvmet: synchronize sqhd update
In testing target io in read write mix, we did indeed get into cases where sqhd didn't update properly and slowly missed enough updates to shutdown the queue.
Protect the updating sqhd by using cmpxchg
Signed-off-by James Smart <james.smart at broadcom.com>
---
v2: move locks so around update and assignment
v3: convert to cmpxchg
--- drivers/nvme/target/core.c | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-)
drivers/nvme/target/core.c +9 -2
@@ -387,11 +387,18 @@ struct nvmet_ns *nvmet_ns_alloc(struct nvmet_subsys *subsys, u32 nsid)static void __nvmet_req_complete (struct nvmet_req *req,u16 status) { +u16 old_sqhd, new_sqhd; +if (status)nvmet_set_status (req, status); -if (req->sq->size) - req->sq->sqhd = (req->sq->sqhd +1 ) % req->sq->size; +if (req->sq->size) { +do { + old_sqhd = req->sq->sqhd; + new_sqhd = (old_sqhd +1 ) % req->sq->size; + }while (cmpxchg (&req->sq->sqhd, old_sqhd, new_sqhd) != + old_sqhd); + } req->rsp->sq_head =cpu_to_le16 (req->sq->sqhd); req->rsp->sq_id =cpu_to_le16 (req->sq->qid); req->rsp->command_id = req->cmd->common.command_id;
Signature · 1 line
2.13.1
PATCH v3 1/1 nvmet: synchronize sqhd update
Looks good,
Reviewed-by: Johannes Thumshirn <jthumshirn at suse.de>
Signature · 6 lines
Johannes Thumshirn Storage jthumshirn at suse.de +49 911 74053 689 SUSE LINUX GmbH, Maxfeldstr. 5, 90409 N?rnberg GF: Felix Imend?rffer, Jane Smithard, Graham Norton HRB 21284 (AG N?rnberg) Key fingerprint = EC38 9CAB C2C4 F25D 8600 D0D0 0393 969D 2D76 0850