Patch "rds: ib: add error handle" has been added to the 3.18-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 3.18-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-3.18 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:58:04 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
@@ -298,7 +298,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; } ic->i_recv_cq = ib_create_cq(dev, rds_ib_recv_cq_comp_handler,
@@ -308,19 +308,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? */
@@ -344,7 +344,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,
@@ -354,7 +354,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,
@@ -364,7 +364,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),
@@ -372,7 +372,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),
@@ -380,7 +380,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),
@@ -388,7 +388,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);
@@ -396,8 +396,33 @@ static int rds_ib_setup_qp(struct rds_cordsdebug ("conn %p pd %p mr %p cq %p %p\n" , conn, ic->i_pd, ic->i_mr, 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-3.18/rds-ib-add-error-handle.patch