From 2446861aba2715b9b4795a30d7140895adf1f201 Mon Sep 17 00:00:00 2001 From: Amir Vadai Date: Mon, 7 Sep 2009 16:02:27 +0300 Subject: [PATCH] sdp: get max send sge from device capabilities instead of hard coded Signed-off-by: Amir Vadai --- drivers/infiniband/ulp/sdp/sdp.h | 3 ++- drivers/infiniband/ulp/sdp/sdp_cma.c | 28 +++++++++++++++++++++++++- drivers/infiniband/ulp/sdp/sdp_zcopy.c | 2 +- 3 files changed, 30 insertions(+), 3 deletions(-) diff --git a/drivers/infiniband/ulp/sdp/sdp.h b/drivers/infiniband/ulp/sdp/sdp.h index d973f5253261..930d68cf6bbb 100644 --- a/drivers/infiniband/ulp/sdp/sdp.h +++ b/drivers/infiniband/ulp/sdp/sdp.h @@ -35,7 +35,6 @@ #define SDP_MAX_RECV_SKB_FRAGS (PAGE_SIZE > 0x8000 ? 1 : 0x8000 / PAGE_SIZE) #define SDP_MAX_SEND_SKB_FRAGS (SDP_MAX_RECV_SKB_FRAGS + 1) -#define SDP_MAX_SEND_SGES 32 /* payload len - rest will be rx'ed into frags */ #define SDP_HEAD_SIZE (PAGE_SIZE / 2 + sizeof(struct sdp_bsdh)) @@ -324,6 +323,8 @@ struct sdp_sock { struct delayed_work srcavail_cancel_work; int srcavail_cancel_mseq; + int max_sge; + struct work_struct rx_comp_work; wait_queue_head_t wq; diff --git a/drivers/infiniband/ulp/sdp/sdp_cma.c b/drivers/infiniband/ulp/sdp/sdp_cma.c index d977d44d43e8..258ec0575cf1 100644 --- a/drivers/infiniband/ulp/sdp/sdp_cma.c +++ b/drivers/infiniband/ulp/sdp/sdp_cma.c @@ -57,12 +57,27 @@ static void sdp_qp_event_handler(struct ib_event *event, void *data) { } +static int sdp_get_max_send_sge(struct ib_device *dev) +{ + struct ib_device_attr attr; + static int max_sges = -1; + + if (max_sges > 0) + goto out; + + ib_query_device(dev, &attr); + + max_sges = attr.max_sge; + +out: + return max_sges; +} + static int sdp_init_qp(struct sock *sk, struct rdma_cm_id *id) { struct ib_qp_init_attr qp_init_attr = { .event_handler = sdp_qp_event_handler, .cap.max_send_wr = SDP_TX_SIZE, - .cap.max_send_sge = SDP_MAX_SEND_SGES, .cap.max_recv_wr = SDP_RX_SIZE, .cap.max_recv_sge = SDP_MAX_RECV_SKB_FRAGS + 1, .sq_sig_type = IB_SIGNAL_REQ_WR, @@ -73,6 +88,17 @@ static int sdp_init_qp(struct sock *sk, struct rdma_cm_id *id) sdp_dbg(sk, "%s\n", __func__); + sdp_sk(sk)->max_sge = sdp_get_max_send_sge(device); + if (sdp_sk(sk)->max_sge < (SDP_MAX_RECV_SKB_FRAGS + 1)) { + sdp_warn(sk, "recv sge's. capability: %d needed: %ld\n", + sdp_sk(sk)->max_sge, SDP_MAX_RECV_SKB_FRAGS + 1); + rc = -ENOMEM; + goto err_tx; + } + + qp_init_attr.cap.max_send_sge = sdp_sk(sk)->max_sge; + sdp_dbg(sk, "Setting max send sge to: %d\n", sdp_sk(sk)->max_sge); + sdp_sk(sk)->sdp_dev = ib_get_client_data(device, &sdp_client); rc = sdp_rx_ring_create(sdp_sk(sk), device); diff --git a/drivers/infiniband/ulp/sdp/sdp_zcopy.c b/drivers/infiniband/ulp/sdp/sdp_zcopy.c index c8b91ea2d833..373b6bee1ff8 100644 --- a/drivers/infiniband/ulp/sdp/sdp_zcopy.c +++ b/drivers/infiniband/ulp/sdp/sdp_zcopy.c @@ -688,7 +688,7 @@ int sdp_rdma_to_iovec(struct sock *sk, struct iovec *iov, struct sk_buff *skb, sge_left = rx_sa->page_cnt; do { /* Len error when using sge_cnt > 30 ?? */ - int sge_cnt = min(sge_left, SDP_MAX_SEND_SGES - 2); + int sge_cnt = min(sge_left, ssk->max_sge - 2); wr.wr.rdma.remote_addr = rx_sa->vaddr + copied + rx_sa->used; wr.num_sge = sge_cnt; -- 2.50.1