Skip to content

Commit

Permalink
rds: ib: update WR sizes when bringing up connection
Browse files Browse the repository at this point in the history
Currently WR sizes are updated from rds_ib_sysctl_max_send_wr and
rds_ib_sysctl_max_recv_wr when a connection is shut down. As a result,
a connection being down while rds_ib_sysctl_max_send_wr or
rds_ib_sysctl_max_recv_wr are updated, will not update the sizes when
it comes back up.

Move resizing of WRs to rds_ib_setup_qp so that connections will be setup
with the most current WR sizes.

Signed-off-by: Dag Moxnes <dag.moxnes@oracle.com>
Acked-by: Santosh Shilimkar <santosh.shilimkar@oracle.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
  • Loading branch information
Dag Moxnes authored and David S. Miller committed Nov 16, 2019
1 parent 18d647a commit a36e629
Showing 1 changed file with 15 additions and 8 deletions.
23 changes: 15 additions & 8 deletions net/rds/ib_cm.c
Original file line number Diff line number Diff line change
Expand Up @@ -450,6 +450,7 @@ static int rds_ib_setup_qp(struct rds_connection *conn)
struct ib_qp_init_attr attr;
struct ib_cq_init_attr cq_attr = {};
struct rds_ib_device *rds_ibdev;
unsigned long max_wrs;
int ret, fr_queue_space;

/*
Expand All @@ -469,10 +470,15 @@ static int rds_ib_setup_qp(struct rds_connection *conn)
/* add the conn now so that connection establishment has the dev */
rds_ib_add_conn(rds_ibdev, conn);

if (rds_ibdev->max_wrs < ic->i_send_ring.w_nr + 1)
rds_ib_ring_resize(&ic->i_send_ring, rds_ibdev->max_wrs - 1);
if (rds_ibdev->max_wrs < ic->i_recv_ring.w_nr + 1)
rds_ib_ring_resize(&ic->i_recv_ring, rds_ibdev->max_wrs - 1);
max_wrs = rds_ibdev->max_wrs < rds_ib_sysctl_max_send_wr + 1 ?
rds_ibdev->max_wrs - 1 : rds_ib_sysctl_max_send_wr;
if (ic->i_send_ring.w_nr != max_wrs)
rds_ib_ring_resize(&ic->i_send_ring, max_wrs);

max_wrs = rds_ibdev->max_wrs < rds_ib_sysctl_max_recv_wr + 1 ?
rds_ibdev->max_wrs - 1 : rds_ib_sysctl_max_recv_wr;
if (ic->i_recv_ring.w_nr != max_wrs)
rds_ib_ring_resize(&ic->i_recv_ring, max_wrs);

/* Protection domain and memory range */
ic->i_pd = rds_ibdev->pd;
Expand Down Expand Up @@ -1099,8 +1105,9 @@ void rds_ib_conn_path_shutdown(struct rds_conn_path *cp)
ic->i_flowctl = 0;
atomic_set(&ic->i_credits, 0);

rds_ib_ring_init(&ic->i_send_ring, rds_ib_sysctl_max_send_wr);
rds_ib_ring_init(&ic->i_recv_ring, rds_ib_sysctl_max_recv_wr);
/* Re-init rings, but retain sizes. */
rds_ib_ring_init(&ic->i_send_ring, ic->i_send_ring.w_nr);
rds_ib_ring_init(&ic->i_recv_ring, ic->i_recv_ring.w_nr);

if (ic->i_ibinc) {
rds_inc_put(&ic->i_ibinc->ii_inc);
Expand Down Expand Up @@ -1147,8 +1154,8 @@ int rds_ib_conn_alloc(struct rds_connection *conn, gfp_t gfp)
* rds_ib_conn_shutdown() waits for these to be emptied so they
* must be initialized before it can be called.
*/
rds_ib_ring_init(&ic->i_send_ring, rds_ib_sysctl_max_send_wr);
rds_ib_ring_init(&ic->i_recv_ring, rds_ib_sysctl_max_recv_wr);
rds_ib_ring_init(&ic->i_send_ring, 0);
rds_ib_ring_init(&ic->i_recv_ring, 0);

ic->conn = conn;
conn->c_transport_data = ic;
Expand Down

0 comments on commit a36e629

Please sign in to comment.