diff options
| author | Ingo Molnar <mingo@kernel.org> | 2017-11-10 08:21:08 +0100 |
|---|---|---|
| committer | Ingo Molnar <mingo@kernel.org> | 2017-11-10 08:21:08 +0100 |
| commit | b5cd3b51e247473e290be5cd09e77171e466cd89 (patch) | |
| tree | ac8c87e1b38f61a4c879c574dc9373db41f3df01 /drivers/nvme/target/core.c | |
| parent | x86/platform/UV: Convert timers to use timer_setup() (diff) | |
| parent | Merge branch 'akpm' (patches from Andrew) (diff) | |
| download | linux-b5cd3b51e247473e290be5cd09e77171e466cd89.tar.gz linux-b5cd3b51e247473e290be5cd09e77171e466cd89.zip | |
Merge branch 'linus' into x86/platform, to refresh the branch
Signed-off-by: Ingo Molnar <mingo@kernel.org>
Diffstat (limited to 'drivers/nvme/target/core.c')
| -rw-r--r-- | drivers/nvme/target/core.c | 15 |
1 files changed, 12 insertions, 3 deletions
diff --git a/drivers/nvme/target/core.c b/drivers/nvme/target/core.c index 1b208beeef50..645ba7eee35d 100644 --- a/drivers/nvme/target/core.c +++ b/drivers/nvme/target/core.c @@ -387,12 +387,21 @@ struct nvmet_ns *nvmet_ns_alloc(struct nvmet_subsys *subsys, u32 nsid) static void __nvmet_req_complete(struct nvmet_req *req, u16 status) { + u32 old_sqhd, new_sqhd; + u16 sqhd; + if (status) nvmet_set_status(req, status); - if (req->sq->size) - req->sq->sqhd = (req->sq->sqhd + 1) % req->sq->size; - req->rsp->sq_head = cpu_to_le16(req->sq->sqhd); + 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); + } + sqhd = req->sq->sqhd & 0x0000FFFF; + req->rsp->sq_head = cpu_to_le16(sqhd); req->rsp->sq_id = cpu_to_le16(req->sq->qid); req->rsp->command_id = req->cmd->common.command_id; |
