diff options
Diffstat (limited to 'drivers/scsi/virtio_scsi.c')
| -rw-r--r-- | drivers/scsi/virtio_scsi.c | 40 | 
1 files changed, 20 insertions, 20 deletions
diff --git a/drivers/scsi/virtio_scsi.c b/drivers/scsi/virtio_scsi.c index b83846fc7859..22e70126425b 100644 --- a/drivers/scsi/virtio_scsi.c +++ b/drivers/scsi/virtio_scsi.c @@ -561,6 +561,15 @@ static int virtscsi_queuecommand_single(struct Scsi_Host *sh,  	return virtscsi_queuecommand(vscsi, &vscsi->req_vqs[0], sc);  } +static struct virtio_scsi_vq *virtscsi_pick_vq_mq(struct virtio_scsi *vscsi, +						  struct scsi_cmnd *sc) +{ +	u32 tag = blk_mq_unique_tag(sc->request); +	u16 hwq = blk_mq_unique_tag_to_hwq(tag); + +	return &vscsi->req_vqs[hwq]; +} +  static struct virtio_scsi_vq *virtscsi_pick_vq(struct virtio_scsi *vscsi,  					       struct virtio_scsi_target_state *tgt)  { @@ -604,7 +613,12 @@ static int virtscsi_queuecommand_multi(struct Scsi_Host *sh,  	struct virtio_scsi *vscsi = shost_priv(sh);  	struct virtio_scsi_target_state *tgt =  				scsi_target(sc->device)->hostdata; -	struct virtio_scsi_vq *req_vq = virtscsi_pick_vq(vscsi, tgt); +	struct virtio_scsi_vq *req_vq; + +	if (shost_use_blk_mq(sh)) +		req_vq = virtscsi_pick_vq_mq(vscsi, sc); +	else +		req_vq = virtscsi_pick_vq(vscsi, tgt);  	return virtscsi_queuecommand(vscsi, req_vq, sc);  } @@ -668,30 +682,13 @@ static int virtscsi_device_reset(struct scsi_cmnd *sc)   * virtscsi_change_queue_depth() - Change a virtscsi target's queue depth   * @sdev:	Virtscsi target whose queue depth to change   * @qdepth:	New queue depth - * @reason:	Reason for the queue depth change.   */ -static int virtscsi_change_queue_depth(struct scsi_device *sdev, -				       int qdepth, -				       int reason) +static int virtscsi_change_queue_depth(struct scsi_device *sdev, int qdepth)  {  	struct Scsi_Host *shost = sdev->host;  	int max_depth = shost->cmd_per_lun; -	switch (reason) { -	case SCSI_QDEPTH_QFULL: /* Drop qdepth in response to BUSY state */ -		scsi_track_queue_full(sdev, qdepth); -		break; -	case SCSI_QDEPTH_RAMP_UP: /* Raise qdepth after BUSY state resolved */ -	case SCSI_QDEPTH_DEFAULT: /* Manual change via sysfs */ -		scsi_adjust_queue_depth(sdev, -					scsi_get_tag_type(sdev), -					min(max_depth, qdepth)); -		break; -	default: -		return -EOPNOTSUPP; -	} - -	return sdev->queue_depth; +	return scsi_change_queue_depth(sdev, min(max_depth, qdepth));  }  static int virtscsi_abort(struct scsi_cmnd *sc) @@ -758,6 +755,7 @@ static struct scsi_host_template virtscsi_host_template_single = {  	.use_clustering = ENABLE_CLUSTERING,  	.target_alloc = virtscsi_target_alloc,  	.target_destroy = virtscsi_target_destroy, +	.track_queue_depth = 1,  };  static struct scsi_host_template virtscsi_host_template_multi = { @@ -776,6 +774,7 @@ static struct scsi_host_template virtscsi_host_template_multi = {  	.use_clustering = ENABLE_CLUSTERING,  	.target_alloc = virtscsi_target_alloc,  	.target_destroy = virtscsi_target_destroy, +	.track_queue_depth = 1,  };  #define virtscsi_config_get(vdev, fld) \ @@ -983,6 +982,7 @@ static int virtscsi_probe(struct virtio_device *vdev)  	shost->max_id = num_targets;  	shost->max_channel = 0;  	shost->max_cmd_len = VIRTIO_SCSI_CDB_SIZE; +	shost->nr_hw_queues = num_queues;  	if (virtio_has_feature(vdev, VIRTIO_SCSI_F_T10_PI)) {  		host_prot = SHOST_DIF_TYPE1_PROTECTION | SHOST_DIF_TYPE2_PROTECTION |  |