diff options
Diffstat (limited to 'drivers/nvme/host/tcp.c')
| -rw-r--r-- | drivers/nvme/host/tcp.c | 20 | 
1 files changed, 15 insertions, 5 deletions
| diff --git a/drivers/nvme/host/tcp.c b/drivers/nvme/host/tcp.c index 69f59d2c5799..a0f00cb8f9f3 100644 --- a/drivers/nvme/host/tcp.c +++ b/drivers/nvme/host/tcp.c @@ -287,7 +287,7 @@ static inline void nvme_tcp_queue_request(struct nvme_tcp_request *req,  	 * directly, otherwise queue io_work. Also, only do that if we  	 * are on the same cpu, so we don't introduce contention.  	 */ -	if (queue->io_cpu == __smp_processor_id() && +	if (queue->io_cpu == raw_smp_processor_id() &&  	    sync && empty && mutex_trylock(&queue->send_mutex)) {  		queue->more_requests = !last;  		nvme_tcp_send_all(queue); @@ -568,6 +568,13 @@ static int nvme_tcp_setup_h2c_data_pdu(struct nvme_tcp_request *req,  	req->pdu_len = le32_to_cpu(pdu->r2t_length);  	req->pdu_sent = 0; +	if (unlikely(!req->pdu_len)) { +		dev_err(queue->ctrl->ctrl.device, +			"req %d r2t len is %u, probably a bug...\n", +			rq->tag, req->pdu_len); +		return -EPROTO; +	} +  	if (unlikely(req->data_sent + req->pdu_len > req->data_len)) {  		dev_err(queue->ctrl->ctrl.device,  			"req %d r2t len %u exceeded data len %u (%zu sent)\n", @@ -1575,7 +1582,7 @@ static struct blk_mq_tag_set *nvme_tcp_alloc_tagset(struct nvme_ctrl *nctrl,  		memset(set, 0, sizeof(*set));  		set->ops = &nvme_tcp_admin_mq_ops;  		set->queue_depth = NVME_AQ_MQ_TAG_DEPTH; -		set->reserved_tags = 2; /* connect + keep-alive */ +		set->reserved_tags = NVMF_RESERVED_TAGS;  		set->numa_node = nctrl->numa_node;  		set->flags = BLK_MQ_F_BLOCKING;  		set->cmd_size = sizeof(struct nvme_tcp_request); @@ -1587,7 +1594,7 @@ static struct blk_mq_tag_set *nvme_tcp_alloc_tagset(struct nvme_ctrl *nctrl,  		memset(set, 0, sizeof(*set));  		set->ops = &nvme_tcp_mq_ops;  		set->queue_depth = nctrl->sqsize + 1; -		set->reserved_tags = 1; /* fabric connect */ +		set->reserved_tags = NVMF_RESERVED_TAGS;  		set->numa_node = nctrl->numa_node;  		set->flags = BLK_MQ_F_SHOULD_MERGE | BLK_MQ_F_BLOCKING;  		set->cmd_size = sizeof(struct nvme_tcp_request); @@ -1745,8 +1752,11 @@ static int nvme_tcp_alloc_io_queues(struct nvme_ctrl *ctrl)  		return ret;  	ctrl->queue_count = nr_io_queues + 1; -	if (ctrl->queue_count < 2) -		return 0; +	if (ctrl->queue_count < 2) { +		dev_err(ctrl->device, +			"unable to set any I/O queues\n"); +		return -ENOMEM; +	}  	dev_info(ctrl->device,  		"creating %d I/O queues.\n", nr_io_queues); |