aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/infiniband/ulp/ipoib/ipoib.h5
-rw-r--r--drivers/infiniband/ulp/ipoib/ipoib_ib.c67
-rw-r--r--drivers/infiniband/ulp/ipoib/ipoib_verbs.c13
3 files changed, 13 insertions, 72 deletions
diff --git a/drivers/infiniband/ulp/ipoib/ipoib.h b/drivers/infiniband/ulp/ipoib/ipoib.h
index c79dcd5ee8ad..769044c25ca5 100644
--- a/drivers/infiniband/ulp/ipoib/ipoib.h
+++ b/drivers/infiniband/ulp/ipoib/ipoib.h
@@ -434,11 +434,6 @@ struct ipoib_neigh {
434#define IPOIB_UD_MTU(ib_mtu) (ib_mtu - IPOIB_ENCAP_LEN) 434#define IPOIB_UD_MTU(ib_mtu) (ib_mtu - IPOIB_ENCAP_LEN)
435#define IPOIB_UD_BUF_SIZE(ib_mtu) (ib_mtu + IB_GRH_BYTES) 435#define IPOIB_UD_BUF_SIZE(ib_mtu) (ib_mtu + IB_GRH_BYTES)
436 436
437static inline int ipoib_ud_need_sg(unsigned int ib_mtu)
438{
439 return IPOIB_UD_BUF_SIZE(ib_mtu) > PAGE_SIZE;
440}
441
442void ipoib_neigh_dtor(struct ipoib_neigh *neigh); 437void ipoib_neigh_dtor(struct ipoib_neigh *neigh);
443static inline void ipoib_neigh_put(struct ipoib_neigh *neigh) 438static inline void ipoib_neigh_put(struct ipoib_neigh *neigh)
444{ 439{
diff --git a/drivers/infiniband/ulp/ipoib/ipoib_ib.c b/drivers/infiniband/ulp/ipoib/ipoib_ib.c
index e144d07d53cc..29b376dadd2b 100644
--- a/drivers/infiniband/ulp/ipoib/ipoib_ib.c
+++ b/drivers/infiniband/ulp/ipoib/ipoib_ib.c
@@ -94,39 +94,9 @@ void ipoib_free_ah(struct kref *kref)
94static void ipoib_ud_dma_unmap_rx(struct ipoib_dev_priv *priv, 94static void ipoib_ud_dma_unmap_rx(struct ipoib_dev_priv *priv,
95 u64 mapping[IPOIB_UD_RX_SG]) 95 u64 mapping[IPOIB_UD_RX_SG])
96{ 96{
97 if (ipoib_ud_need_sg(priv->max_ib_mtu)) { 97 ib_dma_unmap_single(priv->ca, mapping[0],
98 ib_dma_unmap_single(priv->ca, mapping[0], IPOIB_UD_HEAD_SIZE, 98 IPOIB_UD_BUF_SIZE(priv->max_ib_mtu),
99 DMA_FROM_DEVICE); 99 DMA_FROM_DEVICE);
100 ib_dma_unmap_page(priv->ca, mapping[1], PAGE_SIZE,
101 DMA_FROM_DEVICE);
102 } else
103 ib_dma_unmap_single(priv->ca, mapping[0],
104 IPOIB_UD_BUF_SIZE(priv->max_ib_mtu),
105 DMA_FROM_DEVICE);
106}
107
108static void ipoib_ud_skb_put_frags(struct ipoib_dev_priv *priv,
109 struct sk_buff *skb,
110 unsigned int length)
111{
112 if (ipoib_ud_need_sg(priv->max_ib_mtu)) {
113 skb_frag_t *frag = &skb_shinfo(skb)->frags[0];
114 unsigned int size;
115 /*
116 * There is only two buffers needed for max_payload = 4K,
117 * first buf size is IPOIB_UD_HEAD_SIZE
118 */
119 skb->tail += IPOIB_UD_HEAD_SIZE;
120 skb->len += length;
121
122 size = length - IPOIB_UD_HEAD_SIZE;
123
124 skb_frag_size_set(frag, size);
125 skb->data_len += size;
126 skb->truesize += PAGE_SIZE;
127 } else
128 skb_put(skb, length);
129
130} 100}
131 101
132static int ipoib_ib_post_receive(struct net_device *dev, int id) 102static int ipoib_ib_post_receive(struct net_device *dev, int id)
@@ -156,18 +126,11 @@ static struct sk_buff *ipoib_alloc_rx_skb(struct net_device *dev, int id)
156 struct ipoib_dev_priv *priv = netdev_priv(dev); 126 struct ipoib_dev_priv *priv = netdev_priv(dev);
157 struct sk_buff *skb; 127 struct sk_buff *skb;
158 int buf_size; 128 int buf_size;
159 int tailroom;
160 u64 *mapping; 129 u64 *mapping;
161 130
162 if (ipoib_ud_need_sg(priv->max_ib_mtu)) { 131 buf_size = IPOIB_UD_BUF_SIZE(priv->max_ib_mtu);
163 buf_size = IPOIB_UD_HEAD_SIZE;
164 tailroom = 128; /* reserve some tailroom for IP/TCP headers */
165 } else {
166 buf_size = IPOIB_UD_BUF_SIZE(priv->max_ib_mtu);
167 tailroom = 0;
168 }
169 132
170 skb = dev_alloc_skb(buf_size + tailroom + 4); 133 skb = dev_alloc_skb(buf_size + IPOIB_ENCAP_LEN);
171 if (unlikely(!skb)) 134 if (unlikely(!skb))
172 return NULL; 135 return NULL;
173 136
@@ -184,23 +147,8 @@ static struct sk_buff *ipoib_alloc_rx_skb(struct net_device *dev, int id)
184 if (unlikely(ib_dma_mapping_error(priv->ca, mapping[0]))) 147 if (unlikely(ib_dma_mapping_error(priv->ca, mapping[0])))
185 goto error; 148 goto error;
186 149
187 if (ipoib_ud_need_sg(priv->max_ib_mtu)) {
188 struct page *page = alloc_page(GFP_ATOMIC);
189 if (!page)
190 goto partial_error;
191 skb_fill_page_desc(skb, 0, page, 0, PAGE_SIZE);
192 mapping[1] =
193 ib_dma_map_page(priv->ca, page,
194 0, PAGE_SIZE, DMA_FROM_DEVICE);
195 if (unlikely(ib_dma_mapping_error(priv->ca, mapping[1])))
196 goto partial_error;
197 }
198
199 priv->rx_ring[id].skb = skb; 150 priv->rx_ring[id].skb = skb;
200 return skb; 151 return skb;
201
202partial_error:
203 ib_dma_unmap_single(priv->ca, mapping[0], buf_size, DMA_FROM_DEVICE);
204error: 152error:
205 dev_kfree_skb_any(skb); 153 dev_kfree_skb_any(skb);
206 return NULL; 154 return NULL;
@@ -278,7 +226,8 @@ static void ipoib_ib_handle_rx_wc(struct net_device *dev, struct ib_wc *wc)
278 wc->byte_len, wc->slid); 226 wc->byte_len, wc->slid);
279 227
280 ipoib_ud_dma_unmap_rx(priv, mapping); 228 ipoib_ud_dma_unmap_rx(priv, mapping);
281 ipoib_ud_skb_put_frags(priv, skb, wc->byte_len); 229
230 skb_put(skb, wc->byte_len);
282 231
283 /* First byte of dgid signals multicast when 0xff */ 232 /* First byte of dgid signals multicast when 0xff */
284 dgid = &((struct ib_grh *)skb->data)->dgid; 233 dgid = &((struct ib_grh *)skb->data)->dgid;
@@ -296,6 +245,8 @@ static void ipoib_ib_handle_rx_wc(struct net_device *dev, struct ib_wc *wc)
296 skb_reset_mac_header(skb); 245 skb_reset_mac_header(skb);
297 skb_pull(skb, IPOIB_ENCAP_LEN); 246 skb_pull(skb, IPOIB_ENCAP_LEN);
298 247
248 skb->truesize = SKB_TRUESIZE(skb->len);
249
299 ++dev->stats.rx_packets; 250 ++dev->stats.rx_packets;
300 dev->stats.rx_bytes += skb->len; 251 dev->stats.rx_bytes += skb->len;
301 252
diff --git a/drivers/infiniband/ulp/ipoib/ipoib_verbs.c b/drivers/infiniband/ulp/ipoib/ipoib_verbs.c
index 34628403fd83..e5cc43074196 100644
--- a/drivers/infiniband/ulp/ipoib/ipoib_verbs.c
+++ b/drivers/infiniband/ulp/ipoib/ipoib_verbs.c
@@ -227,15 +227,10 @@ int ipoib_transport_dev_init(struct net_device *dev, struct ib_device *ca)
227 priv->tx_wr.send_flags = IB_SEND_SIGNALED; 227 priv->tx_wr.send_flags = IB_SEND_SIGNALED;
228 228
229 priv->rx_sge[0].lkey = priv->mr->lkey; 229 priv->rx_sge[0].lkey = priv->mr->lkey;
230 if (ipoib_ud_need_sg(priv->max_ib_mtu)) { 230
231 priv->rx_sge[0].length = IPOIB_UD_HEAD_SIZE; 231 priv->rx_sge[0].length = IPOIB_UD_BUF_SIZE(priv->max_ib_mtu);
232 priv->rx_sge[1].length = PAGE_SIZE; 232 priv->rx_wr.num_sge = 1;
233 priv->rx_sge[1].lkey = priv->mr->lkey; 233
234 priv->rx_wr.num_sge = IPOIB_UD_RX_SG;
235 } else {
236 priv->rx_sge[0].length = IPOIB_UD_BUF_SIZE(priv->max_ib_mtu);
237 priv->rx_wr.num_sge = 1;
238 }
239 priv->rx_wr.next = NULL; 234 priv->rx_wr.next = NULL;
240 priv->rx_wr.sg_list = priv->rx_sge; 235 priv->rx_wr.sg_list = priv->rx_sge;
241 236