diff options
Diffstat (limited to 'drivers/nvme/host/pci.c')
| -rw-r--r-- | drivers/nvme/host/pci.c | 30 | 
1 files changed, 12 insertions, 18 deletions
| diff --git a/drivers/nvme/host/pci.c b/drivers/nvme/host/pci.c index 7249ae74f71f..09d4c5f99fc3 100644 --- a/drivers/nvme/host/pci.c +++ b/drivers/nvme/host/pci.c @@ -224,6 +224,7 @@ struct nvme_queue {   */  struct nvme_iod {  	struct nvme_request req; +	struct nvme_command cmd;  	struct nvme_queue *nvmeq;  	bool use_sgl;  	int aborted; @@ -429,6 +430,7 @@ static int nvme_init_request(struct blk_mq_tag_set *set, struct request *req,  	iod->nvmeq = nvmeq;  	nvme_req(req)->ctrl = &dev->ctrl; +	nvme_req(req)->cmd = &iod->cmd;  	return 0;  } @@ -852,7 +854,7 @@ static blk_status_t nvme_map_data(struct nvme_dev *dev, struct request *req,  				return nvme_setup_prp_simple(dev, req,  							     &cmnd->rw, &bv); -			if (iod->nvmeq->qid && +			if (iod->nvmeq->qid && sgl_threshold &&  			    dev->ctrl.sgls & ((1 << 0) | (1 << 1)))  				return nvme_setup_sgl_simple(dev, req,  							     &cmnd->rw, &bv); @@ -917,7 +919,7 @@ static blk_status_t nvme_queue_rq(struct blk_mq_hw_ctx *hctx,  	struct nvme_dev *dev = nvmeq->dev;  	struct request *req = bd->rq;  	struct nvme_iod *iod = blk_mq_rq_to_pdu(req); -	struct nvme_command cmnd; +	struct nvme_command *cmnd = &iod->cmd;  	blk_status_t ret;  	iod->aborted = 0; @@ -931,24 +933,24 @@ static blk_status_t nvme_queue_rq(struct blk_mq_hw_ctx *hctx,  	if (unlikely(!test_bit(NVMEQ_ENABLED, &nvmeq->flags)))  		return BLK_STS_IOERR; -	ret = nvme_setup_cmd(ns, req, &cmnd); +	ret = nvme_setup_cmd(ns, req);  	if (ret)  		return ret;  	if (blk_rq_nr_phys_segments(req)) { -		ret = nvme_map_data(dev, req, &cmnd); +		ret = nvme_map_data(dev, req, cmnd);  		if (ret)  			goto out_free_cmd;  	}  	if (blk_integrity_rq(req)) { -		ret = nvme_map_metadata(dev, req, &cmnd); +		ret = nvme_map_metadata(dev, req, cmnd);  		if (ret)  			goto out_unmap_data;  	}  	blk_mq_start_request(req); -	nvme_submit_cmd(nvmeq, &cmnd, bd->last); +	nvme_submit_cmd(nvmeq, cmnd, bd->last);  	return BLK_STS_OK;  out_unmap_data:  	nvme_unmap_data(dev, req); @@ -1060,18 +1062,10 @@ static inline int nvme_process_cq(struct nvme_queue *nvmeq)  static irqreturn_t nvme_irq(int irq, void *data)  {  	struct nvme_queue *nvmeq = data; -	irqreturn_t ret = IRQ_NONE; -	/* -	 * The rmb/wmb pair ensures we see all updates from a previous run of -	 * the irq handler, even if that was on another CPU. -	 */ -	rmb();  	if (nvme_process_cq(nvmeq)) -		ret = IRQ_HANDLED; -	wmb(); - -	return ret; +		return IRQ_HANDLED; +	return IRQ_NONE;  }  static irqreturn_t nvme_irq_check(int irq, void *data) @@ -2178,7 +2172,7 @@ static int nvme_setup_io_queues(struct nvme_dev *dev)  	if (nr_io_queues == 0)  		return 0; -	 +  	clear_bit(NVMEQ_ENABLED, &adminq->flags);  	if (dev->cmb_use_sqes) { @@ -2653,7 +2647,7 @@ static void nvme_reset_work(struct work_struct *work)  	 */  	dev->ctrl.max_integrity_segments = 1; -	result = nvme_init_identify(&dev->ctrl); +	result = nvme_init_ctrl_finish(&dev->ctrl);  	if (result)  		goto out; | 
