Patch "rds: ib: add error handle" has been added to the 4.9-stable tree
Subsystems (3)
This is a note to let you know that I've just added the patch titled
rds: ib: add error handle
to the 4.9-stable tree which can be found at:
http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary
The filename of the patch is:
rds-ib-add-error-handle.patch
and it can be found in the queue-4.9 subdirectory.
If you, or anyone else, feels it should not be added to the stable tree, please let <[email protected]> know about it.
Quoted 1 line
From foo@baz Thu Oct 5 10:28:31 CEST 2017
From: Zhu Yanjun <[email protected]>
Date: Tue, 7 Mar 2017 02:48:36 -0500
Subject: rds: ib: add error handle
From: Zhu Yanjun <[email protected]>
[ Upstream commit 3b12f73a5c2977153f28a224392fd4729b50d1dc ]
In the function rds_ib_setup_qp, the error handle is missing. When some error occurs, it is possible that memory leak occurs. As such, error handle is added.
--- net/rds/ib_cm.c | 47 ++++++++++++++++++++++++++++++++++++----------- 1 file changed, 36 insertions(+), 11 deletions(-)
net/rds/ib_cm.c +36 -11
@@ -405,7 +405,7 @@ static int rds_ib_setup_qp(struct rds_co ret =PTR_ERR (ic->i_send_cq); ic->i_send_cq =NULL ;rdsdebug ("ib_create_cq send failed: %d\n" , ret); - goto out; + goto rds_ibdev_out; } cq_attr.cqe = ic->i_recv_ring.w_nr;
@@ -416,19 +416,19 @@ static int rds_ib_setup_qp(struct rds_co ret =PTR_ERR (ic->i_recv_cq); ic->i_recv_cq =NULL ;rdsdebug ("ib_create_cq recv failed: %d\n" , ret); - goto out; + goto send_cq_out; } ret =ib_req_notify_cq (ic->i_send_cq,IB_CQ_NEXT_COMP );if (ret) {rdsdebug ("ib_req_notify_cq send failed: %d\n" , ret); - goto out; + goto recv_cq_out; } ret =ib_req_notify_cq (ic->i_recv_cq,IB_CQ_SOLICITED );if (ret) {rdsdebug ("ib_req_notify_cq recv failed: %d\n" , ret); - goto out; + goto recv_cq_out; }/* XXX negotiate max send/recv with remote? */
@@ -453,7 +453,7 @@ static int rds_ib_setup_qp(struct rds_co ret =rdma_create_qp (ic->i_cm_id, ic->i_pd, &attr);if (ret) {rdsdebug ("rdma_create_qp failed: %d\n" , ret); - goto out; + goto recv_cq_out; } ic->i_send_hdrs = ib_dma_alloc_coherent(dev,
@@ -463,7 +463,7 @@ static int rds_ib_setup_qp(struct rds_coif (!ic->i_send_hdrs) { ret = -ENOMEM ;rdsdebug ("ib_dma_alloc_coherent send failed\n" ); - goto out; + goto qp_out; } ic->i_recv_hdrs = ib_dma_alloc_coherent(dev,
@@ -473,7 +473,7 @@ static int rds_ib_setup_qp(struct rds_coif (!ic->i_recv_hdrs) { ret = -ENOMEM ;rdsdebug ("ib_dma_alloc_coherent recv failed\n" ); - goto out; + goto send_hdrs_dma_out; } ic->i_ack = ib_dma_alloc_coherent(dev, sizeof(struct rds_header),
@@ -481,7 +481,7 @@ static int rds_ib_setup_qp(struct rds_coif (!ic->i_ack) { ret = -ENOMEM ;rdsdebug ("ib_dma_alloc_coherent ack failed\n" ); - goto out; + goto recv_hdrs_dma_out; } ic->i_sends = vzalloc_node(ic->i_send_ring.w_nr * sizeof(struct rds_ib_send_work),
@@ -489,7 +489,7 @@ static int rds_ib_setup_qp(struct rds_coif (!ic->i_sends) { ret = -ENOMEM ;rdsdebug ("send allocation failed\n" ); - goto out; + goto ack_dma_out; } ic->i_recvs = vzalloc_node(ic->i_recv_ring.w_nr * sizeof(struct rds_ib_recv_work),
@@ -497,7 +497,7 @@ static int rds_ib_setup_qp(struct rds_coif (!ic->i_recvs) { ret = -ENOMEM ;rdsdebug ("recv allocation failed\n" ); - goto out; + goto sends_out; }rds_ib_recv_init_ack (ic);
@@ -505,8 +505,33 @@ static int rds_ib_setup_qp(struct rds_cordsdebug ("conn %p pd %p cq %p %p\n" , conn, ic->i_pd, ic->i_send_cq, ic->i_recv_cq); -out: +return ret; + +sends_out: +vfree (ic->i_sends); +ack_dma_out: +ib_dma_free_coherent (dev,sizeof (struct rds_header ), + ic->i_ack, ic->i_ack_dma); +recv_hdrs_dma_out: +ib_dma_free_coherent (dev, ic->i_recv_ring.w_nr * +sizeof (struct rds_header ), + ic->i_recv_hdrs, ic->i_recv_hdrs_dma); +send_hdrs_dma_out: +ib_dma_free_coherent (dev, ic->i_send_ring.w_nr * +sizeof (struct rds_header ), + ic->i_send_hdrs, ic->i_send_hdrs_dma); +qp_out: +rdma_destroy_qp (ic->i_cm_id); +recv_cq_out: +if (!ib_destroy_cq (ic->i_recv_cq)) + ic->i_recv_cq =NULL ; +send_cq_out: +if (!ib_destroy_cq (ic->i_send_cq)) + ic->i_send_cq =NULL ; +rds_ibdev_out: +rds_ib_remove_conn (rds_ibdev, conn);rds_ib_dev_put (rds_ibdev); +return ret; }
Patches currently in stable-queue which might be from [email protected] are
queue-4.9/rds-ib-add-error-handle.patch