stable.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH stable-5.0+ 1/3] nvme-tcp: rename function to have nvme_tcp prefix
@ 2019-06-10  4:58 Sagi Grimberg
  2019-06-10  4:58 ` [PATCH stable-5.0+ 2/3] nvme-tcp: fix possible null deref on a timed out io queue connect Sagi Grimberg
                   ` (2 more replies)
  0 siblings, 3 replies; 9+ messages in thread
From: Sagi Grimberg @ 2019-06-10  4:58 UTC (permalink / raw)
  To: stable

Upstream commit: 7e6e5ffa7ed2 ("nvme-tcp: rename function to have nvme_tcp prefix")

usually nvme_ prefix is for core functions.
While we're cleaning up, remove redundant empty lines

Signed-off-by: Sagi Grimberg <sagi@grimberg.me>
Reviewed-by: Minwoo Im <minwoo.im@samsung.com>
Signed-off-by: Christoph Hellwig <hch@lst.de>
---
 drivers/nvme/host/tcp.c | 10 ++++------
 1 file changed, 4 insertions(+), 6 deletions(-)

diff --git a/drivers/nvme/host/tcp.c b/drivers/nvme/host/tcp.c
index aae5374d2b93..2405bb9c63cc 100644
--- a/drivers/nvme/host/tcp.c
+++ b/drivers/nvme/host/tcp.c
@@ -473,7 +473,6 @@ static int nvme_tcp_handle_c2h_data(struct nvme_tcp_queue *queue,
 	}
 
 	return 0;
-
 }
 
 static int nvme_tcp_handle_comp(struct nvme_tcp_queue *queue,
@@ -634,7 +633,6 @@ static inline void nvme_tcp_end_request(struct request *rq, u16 status)
 	nvme_end_request(rq, cpu_to_le16(status << 1), res);
 }
 
-
 static int nvme_tcp_recv_data(struct nvme_tcp_queue *queue, struct sk_buff *skb,
 			      unsigned int *offset, size_t *len)
 {
@@ -1535,7 +1533,7 @@ static int nvme_tcp_alloc_admin_queue(struct nvme_ctrl *ctrl)
 	return ret;
 }
 
-static int nvme_tcp_alloc_io_queues(struct nvme_ctrl *ctrl)
+static int __nvme_tcp_alloc_io_queues(struct nvme_ctrl *ctrl)
 {
 	int i, ret;
 
@@ -1565,7 +1563,7 @@ static unsigned int nvme_tcp_nr_io_queues(struct nvme_ctrl *ctrl)
 	return nr_io_queues;
 }
 
-static int nvme_alloc_io_queues(struct nvme_ctrl *ctrl)
+static int nvme_tcp_alloc_io_queues(struct nvme_ctrl *ctrl)
 {
 	unsigned int nr_io_queues;
 	int ret;
@@ -1582,7 +1580,7 @@ static int nvme_alloc_io_queues(struct nvme_ctrl *ctrl)
 	dev_info(ctrl->device,
 		"creating %d I/O queues.\n", nr_io_queues);
 
-	return nvme_tcp_alloc_io_queues(ctrl);
+	return __nvme_tcp_alloc_io_queues(ctrl);
 }
 
 static void nvme_tcp_destroy_io_queues(struct nvme_ctrl *ctrl, bool remove)
@@ -1599,7 +1597,7 @@ static int nvme_tcp_configure_io_queues(struct nvme_ctrl *ctrl, bool new)
 {
 	int ret;
 
-	ret = nvme_alloc_io_queues(ctrl);
+	ret = nvme_tcp_alloc_io_queues(ctrl);
 	if (ret)
 		return ret;
 
-- 
2.17.1


^ permalink raw reply related	[flat|nested] 9+ messages in thread

* [PATCH stable-5.0+ 2/3] nvme-tcp: fix possible null deref on a timed out io queue connect
  2019-06-10  4:58 [PATCH stable-5.0+ 1/3] nvme-tcp: rename function to have nvme_tcp prefix Sagi Grimberg
@ 2019-06-10  4:58 ` Sagi Grimberg
  2019-06-10 20:41   ` Sasha Levin
  2019-06-10  4:58 ` [PATCH stable-5.0+ 3/3] nvme-tcp: fix queue mapping when queue count is limited Sagi Grimberg
  2019-06-13  7:44 ` [PATCH stable-5.0+ 1/3] nvme-tcp: rename function to have nvme_tcp prefix Greg KH
  2 siblings, 1 reply; 9+ messages in thread
From: Sagi Grimberg @ 2019-06-10  4:58 UTC (permalink / raw)
  To: stable

Upstream commit: Fixes: d10325e5a9ca ("nvme-tcp: fix possible null deref
on a timed out io queue connect"

If I/O queue connect times out, we might have freed the queue socket
already, so check for that on the error path in nvme_tcp_start_queue.

Signed-off-by: Sagi Grimberg <sagi@grimberg.me>
Signed-off-by: Christoph Hellwig <hch@lst.de>
---
 drivers/nvme/host/tcp.c | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/drivers/nvme/host/tcp.c b/drivers/nvme/host/tcp.c
index 2405bb9c63cc..2b107a1d152b 100644
--- a/drivers/nvme/host/tcp.c
+++ b/drivers/nvme/host/tcp.c
@@ -1423,7 +1423,8 @@ static int nvme_tcp_start_queue(struct nvme_ctrl *nctrl, int idx)
 	if (!ret) {
 		set_bit(NVME_TCP_Q_LIVE, &ctrl->queues[idx].flags);
 	} else {
-		__nvme_tcp_stop_queue(&ctrl->queues[idx]);
+		if (test_bit(NVME_TCP_Q_ALLOCATED, &ctrl->queues[idx].flags))
+			__nvme_tcp_stop_queue(&ctrl->queues[idx]);
 		dev_err(nctrl->device,
 			"failed to connect queue: %d ret=%d\n", idx, ret);
 	}
-- 
2.17.1


^ permalink raw reply related	[flat|nested] 9+ messages in thread

* [PATCH stable-5.0+ 3/3] nvme-tcp: fix queue mapping when queue count is limited
  2019-06-10  4:58 [PATCH stable-5.0+ 1/3] nvme-tcp: rename function to have nvme_tcp prefix Sagi Grimberg
  2019-06-10  4:58 ` [PATCH stable-5.0+ 2/3] nvme-tcp: fix possible null deref on a timed out io queue connect Sagi Grimberg
@ 2019-06-10  4:58 ` Sagi Grimberg
  2019-06-13  7:45   ` Greg KH
  2019-06-13  7:44 ` [PATCH stable-5.0+ 1/3] nvme-tcp: rename function to have nvme_tcp prefix Greg KH
  2 siblings, 1 reply; 9+ messages in thread
From: Sagi Grimberg @ 2019-06-10  4:58 UTC (permalink / raw)
  To: stable

Upstream commit: 0ddbb30d5acc ("nvme-tcp: fix queue mapping when queue
count is limited")

When the controller supports less queues than requested, we
should make sure that queue mapping does the right thing and
not assume that all queues are available. This fixes a crash
when the controller supports less queues than requested.

The rules are:
1. if no write queues are requested, we assign the available queues
   to the default queue map. The default and read queue maps share the
   existing queues.
2. if write queues are requested:
  - first make sure that read queue map gets the requested
    nr_io_queues count
  - then grant the default queue map the minimum between the requested
    nr_write_queues and the remaining queues. If there are no available
    queues to dedicate to the default queue map, fallback to (1) and
    share all the queues in the existing queue map.

Also, provide a log indication on how we constructed the different
queue maps.

Reported-by: Harris, James R <james.r.harris@intel.com>
Tested-by: Jim Harris <james.r.harris@intel.com>
Cc: <stable@vger.kernel.org> # v5.0+
Suggested-by: Roy Shterman <roys@lightbitslabs.com>
Signed-off-by: Sagi Grimberg <sagi@grimberg.me>
---
 drivers/nvme/host/tcp.c | 57 ++++++++++++++++++++++++++++++++++++-----
 1 file changed, 50 insertions(+), 7 deletions(-)

diff --git a/drivers/nvme/host/tcp.c b/drivers/nvme/host/tcp.c
index 2b107a1d152b..08a2501b9357 100644
--- a/drivers/nvme/host/tcp.c
+++ b/drivers/nvme/host/tcp.c
@@ -111,6 +111,7 @@ struct nvme_tcp_ctrl {
 	struct work_struct	err_work;
 	struct delayed_work	connect_work;
 	struct nvme_tcp_request async_req;
+	u32			io_queues[HCTX_MAX_TYPES];
 };
 
 static LIST_HEAD(nvme_tcp_ctrl_list);
@@ -1564,6 +1565,35 @@ static unsigned int nvme_tcp_nr_io_queues(struct nvme_ctrl *ctrl)
 	return nr_io_queues;
 }
 
+static void nvme_tcp_set_io_queues(struct nvme_ctrl *nctrl,
+		unsigned int nr_io_queues)
+{
+	struct nvme_tcp_ctrl *ctrl = to_tcp_ctrl(nctrl);
+	struct nvmf_ctrl_options *opts = nctrl->opts;
+
+	if (opts->nr_write_queues && opts->nr_io_queues < nr_io_queues) {
+		/*
+		 * separate read/write queues
+		 * hand out dedicated default queues only after we have
+		 * sufficient read queues.
+		 */
+		ctrl->io_queues[HCTX_TYPE_READ] = opts->nr_io_queues;
+		nr_io_queues -= ctrl->io_queues[HCTX_TYPE_READ];
+		ctrl->io_queues[HCTX_TYPE_DEFAULT] =
+			min(opts->nr_write_queues, nr_io_queues);
+		nr_io_queues -= ctrl->io_queues[HCTX_TYPE_DEFAULT];
+	} else {
+		/*
+		 * shared read/write queues
+		 * either no write queues were requested, or we don't have
+		 * sufficient queue count to have dedicated default queues.
+		 */
+		ctrl->io_queues[HCTX_TYPE_DEFAULT] =
+			min(opts->nr_io_queues, nr_io_queues);
+		nr_io_queues -= ctrl->io_queues[HCTX_TYPE_DEFAULT];
+	}
+}
+
 static int nvme_tcp_alloc_io_queues(struct nvme_ctrl *ctrl)
 {
 	unsigned int nr_io_queues;
@@ -1581,6 +1611,8 @@ static int nvme_tcp_alloc_io_queues(struct nvme_ctrl *ctrl)
 	dev_info(ctrl->device,
 		"creating %d I/O queues.\n", nr_io_queues);
 
+	nvme_tcp_set_io_queues(ctrl, nr_io_queues);
+
 	return __nvme_tcp_alloc_io_queues(ctrl);
 }
 
@@ -2089,23 +2121,34 @@ static blk_status_t nvme_tcp_queue_rq(struct blk_mq_hw_ctx *hctx,
 static int nvme_tcp_map_queues(struct blk_mq_tag_set *set)
 {
 	struct nvme_tcp_ctrl *ctrl = set->driver_data;
+	struct nvmf_ctrl_options *opts = ctrl->ctrl.opts;
 
-	set->map[HCTX_TYPE_DEFAULT].queue_offset = 0;
-	set->map[HCTX_TYPE_READ].nr_queues = ctrl->ctrl.opts->nr_io_queues;
-	if (ctrl->ctrl.opts->nr_write_queues) {
+	if (opts->nr_write_queues && ctrl->io_queues[HCTX_TYPE_READ]) {
 		/* separate read/write queues */
 		set->map[HCTX_TYPE_DEFAULT].nr_queues =
-				ctrl->ctrl.opts->nr_write_queues;
+			ctrl->io_queues[HCTX_TYPE_DEFAULT];
+		set->map[HCTX_TYPE_DEFAULT].queue_offset = 0;
+		set->map[HCTX_TYPE_READ].nr_queues =
+			ctrl->io_queues[HCTX_TYPE_READ];
 		set->map[HCTX_TYPE_READ].queue_offset =
-				ctrl->ctrl.opts->nr_write_queues;
+			ctrl->io_queues[HCTX_TYPE_DEFAULT];
 	} else {
-		/* mixed read/write queues */
+		/* shared read/write queues */
 		set->map[HCTX_TYPE_DEFAULT].nr_queues =
-				ctrl->ctrl.opts->nr_io_queues;
+			ctrl->io_queues[HCTX_TYPE_DEFAULT];
+		set->map[HCTX_TYPE_DEFAULT].queue_offset = 0;
+		set->map[HCTX_TYPE_READ].nr_queues =
+			ctrl->io_queues[HCTX_TYPE_DEFAULT];
 		set->map[HCTX_TYPE_READ].queue_offset = 0;
 	}
 	blk_mq_map_queues(&set->map[HCTX_TYPE_DEFAULT]);
 	blk_mq_map_queues(&set->map[HCTX_TYPE_READ]);
+
+	dev_info(ctrl->ctrl.device,
+		"mapped %d/%d default/read queues.\n",
+		ctrl->io_queues[HCTX_TYPE_DEFAULT],
+		ctrl->io_queues[HCTX_TYPE_READ]);
+
 	return 0;
 }
 
-- 
2.17.1


^ permalink raw reply related	[flat|nested] 9+ messages in thread

* Re: [PATCH stable-5.0+ 2/3] nvme-tcp: fix possible null deref on a timed out io queue connect
  2019-06-10  4:58 ` [PATCH stable-5.0+ 2/3] nvme-tcp: fix possible null deref on a timed out io queue connect Sagi Grimberg
@ 2019-06-10 20:41   ` Sasha Levin
  0 siblings, 0 replies; 9+ messages in thread
From: Sasha Levin @ 2019-06-10 20:41 UTC (permalink / raw)
  To: Sagi Grimberg; +Cc: stable

On Sun, Jun 09, 2019 at 09:58:25PM -0700, Sagi Grimberg wrote:
>Upstream commit: Fixes: d10325e5a9ca ("nvme-tcp: fix possible null deref
>on a timed out io queue connect"

Upstream commit here is f34e25898a608 :)

--
Thanks,
Sasha

>If I/O queue connect times out, we might have freed the queue socket
>already, so check for that on the error path in nvme_tcp_start_queue.
>
>Signed-off-by: Sagi Grimberg <sagi@grimberg.me>
>Signed-off-by: Christoph Hellwig <hch@lst.de>
>---
> drivers/nvme/host/tcp.c | 3 ++-
> 1 file changed, 2 insertions(+), 1 deletion(-)
>
>diff --git a/drivers/nvme/host/tcp.c b/drivers/nvme/host/tcp.c
>index 2405bb9c63cc..2b107a1d152b 100644
>--- a/drivers/nvme/host/tcp.c
>+++ b/drivers/nvme/host/tcp.c
>@@ -1423,7 +1423,8 @@ static int nvme_tcp_start_queue(struct nvme_ctrl *nctrl, int idx)
> 	if (!ret) {
> 		set_bit(NVME_TCP_Q_LIVE, &ctrl->queues[idx].flags);
> 	} else {
>-		__nvme_tcp_stop_queue(&ctrl->queues[idx]);
>+		if (test_bit(NVME_TCP_Q_ALLOCATED, &ctrl->queues[idx].flags))
>+			__nvme_tcp_stop_queue(&ctrl->queues[idx]);
> 		dev_err(nctrl->device,
> 			"failed to connect queue: %d ret=%d\n", idx, ret);
> 	}
>-- 
>2.17.1
>

^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [PATCH stable-5.0+ 1/3] nvme-tcp: rename function to have nvme_tcp prefix
  2019-06-10  4:58 [PATCH stable-5.0+ 1/3] nvme-tcp: rename function to have nvme_tcp prefix Sagi Grimberg
  2019-06-10  4:58 ` [PATCH stable-5.0+ 2/3] nvme-tcp: fix possible null deref on a timed out io queue connect Sagi Grimberg
  2019-06-10  4:58 ` [PATCH stable-5.0+ 3/3] nvme-tcp: fix queue mapping when queue count is limited Sagi Grimberg
@ 2019-06-13  7:44 ` Greg KH
  2 siblings, 0 replies; 9+ messages in thread
From: Greg KH @ 2019-06-13  7:44 UTC (permalink / raw)
  To: Sagi Grimberg; +Cc: stable

On Sun, Jun 09, 2019 at 09:58:24PM -0700, Sagi Grimberg wrote:
> Upstream commit: 7e6e5ffa7ed2 ("nvme-tcp: rename function to have nvme_tcp prefix")

There is no such commit in Linus's tree :(


^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [PATCH stable-5.0+ 3/3] nvme-tcp: fix queue mapping when queue count is limited
  2019-06-10  4:58 ` [PATCH stable-5.0+ 3/3] nvme-tcp: fix queue mapping when queue count is limited Sagi Grimberg
@ 2019-06-13  7:45   ` Greg KH
  2019-06-14 13:29     ` Sagi Grimberg
  0 siblings, 1 reply; 9+ messages in thread
From: Greg KH @ 2019-06-13  7:45 UTC (permalink / raw)
  To: Sagi Grimberg; +Cc: stable

On Sun, Jun 09, 2019 at 09:58:26PM -0700, Sagi Grimberg wrote:
> Upstream commit: 0ddbb30d5acc ("nvme-tcp: fix queue mapping when queue
> count is limited")

Again, no such commit :(

Can you fix all of these up to have the correct git id and resend?

thanks,

greg k-h

^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [PATCH stable-5.0+ 3/3] nvme-tcp: fix queue mapping when queue count is limited
  2019-06-13  7:45   ` Greg KH
@ 2019-06-14 13:29     ` Sagi Grimberg
  2019-06-14 13:40       ` Greg KH
  0 siblings, 1 reply; 9+ messages in thread
From: Sagi Grimberg @ 2019-06-14 13:29 UTC (permalink / raw)
  To: Greg KH; +Cc: stable

Its on its way to Linus...

Should I just respin again once it lands there?

^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [PATCH stable-5.0+ 3/3] nvme-tcp: fix queue mapping when queue count is limited
  2019-06-14 13:29     ` Sagi Grimberg
@ 2019-06-14 13:40       ` Greg KH
  2019-06-14 13:40         ` Greg KH
  0 siblings, 1 reply; 9+ messages in thread
From: Greg KH @ 2019-06-14 13:40 UTC (permalink / raw)
  To: Sagi Grimberg; +Cc: stable

On Fri, Jun 14, 2019 at 06:29:39AM -0700, Sagi Grimberg wrote:
> Its on its way to Linus...
> 
> Should I just respin again once it lands there?

Yes please, there's nothing we can do until then.

greg k-h

^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [PATCH stable-5.0+ 3/3] nvme-tcp: fix queue mapping when queue count is limited
  2019-06-14 13:40       ` Greg KH
@ 2019-06-14 13:40         ` Greg KH
  0 siblings, 0 replies; 9+ messages in thread
From: Greg KH @ 2019-06-14 13:40 UTC (permalink / raw)
  To: Sagi Grimberg; +Cc: stable

On Fri, Jun 14, 2019 at 03:40:00PM +0200, Greg KH wrote:
> On Fri, Jun 14, 2019 at 06:29:39AM -0700, Sagi Grimberg wrote:
> > Its on its way to Linus...
> > 
> > Should I just respin again once it lands there?
> 
> Yes please, there's nothing we can do until then.

And you have read the documentation for how to do all of this properly,
right?
    https://www.kernel.org/doc/html/latest/process/stable-kernel-rules.html

^ permalink raw reply	[flat|nested] 9+ messages in thread

end of thread, other threads:[~2019-06-14 13:40 UTC | newest]

Thread overview: 9+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2019-06-10  4:58 [PATCH stable-5.0+ 1/3] nvme-tcp: rename function to have nvme_tcp prefix Sagi Grimberg
2019-06-10  4:58 ` [PATCH stable-5.0+ 2/3] nvme-tcp: fix possible null deref on a timed out io queue connect Sagi Grimberg
2019-06-10 20:41   ` Sasha Levin
2019-06-10  4:58 ` [PATCH stable-5.0+ 3/3] nvme-tcp: fix queue mapping when queue count is limited Sagi Grimberg
2019-06-13  7:45   ` Greg KH
2019-06-14 13:29     ` Sagi Grimberg
2019-06-14 13:40       ` Greg KH
2019-06-14 13:40         ` Greg KH
2019-06-13  7:44 ` [PATCH stable-5.0+ 1/3] nvme-tcp: rename function to have nvme_tcp prefix Greg KH

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).