It contains the NFSRDMA fixes for SLES11 SP1. Thanks.

-jeff
diff --git 
a/kernel_patches/backport/2.6.32_sles11sp1/mlx4_semaphore_include.patch 
b/kernel_patches/backport/2.6.32_sles11sp1/mlx4_semaphore_include.patch
index f2141f1..011d364 100644
--- a/kernel_patches/backport/2.6.32_sles11sp1/mlx4_semaphore_include.patch
+++ b/kernel_patches/backport/2.6.32_sles11sp1/mlx4_semaphore_include.patch
@@ -1,14 +1,14 @@
-From: Sven-Thorsten Dietrich <sdietr...@suse.de>
-Subject: Include semaphore.h explicitly.
-
-Signed-off-by: Sven-Thorsten Dietrich <sdietr...@suse.de>
---- a/drivers/net/mlx4/cmd.c   2012-09-01 10:14:58.000000000 -0700
-+++ b/drivers/net/mlx4//cmd.c  2012-09-01 13:19:46.000000000 -0700
-@@ -35,6 +35,7 @@
- #include <linux/sched.h>
- #include <linux/pci.h>
- #include <linux/errno.h>
-+#include <linux/semaphore.h>
- 
- #include <linux/mlx4/cmd.h>
- 
+From: Sven-Thorsten Dietrich <sdietr...@suse.de>
+Subject: Include semaphore.h explicitly.
+
+Signed-off-by: Sven-Thorsten Dietrich <sdietr...@suse.de>
+--- a/drivers/net/mlx4/cmd.c   2012-09-01 10:14:58.000000000 -0700
++++ b/drivers/net/mlx4//cmd.c  2012-09-01 13:19:46.000000000 -0700
+@@ -35,6 +35,7 @@
+ #include <linux/sched.h>
+ #include <linux/pci.h>
+ #include <linux/errno.h>
++#include <linux/semaphore.h>
+ 
+ #include <linux/mlx4/cmd.h>
+ 
diff --git 
a/kernel_patches/backport/2.6.32_sles11sp1/net_skb-dst_accessors.patch 
b/kernel_patches/backport/2.6.32_sles11sp1/net_skb-dst_accessors.patch
index 36d612b..c742dad 100644
--- a/kernel_patches/backport/2.6.32_sles11sp1/net_skb-dst_accessors.patch
+++ b/kernel_patches/backport/2.6.32_sles11sp1/net_skb-dst_accessors.patch
@@ -1,149 +1,149 @@
-From: Sven-Thorsten Dietrich <sdietr...@suse.de>
-Subject: Forward-port new accessor for net: dst.
-
-See Kernel.org:
-commit adf30907d63893e4208dfe3f5c88ae12bc2f25d5
-Author: Eric Dumazet <eric.duma...@gmail.com>
-Date:   Tue Jun 2 05:19:30 2009 +0000
-Subject: net: skb->dst accessors
-
-Signed-off-by: Sven-Thorsten Dietrich <sdietr...@suse.de>
---- a/drivers/infiniband/ulp/ipoib/ipoib_cm.c
-+++ b/drivers/infiniband/ulp/ipoib/ipoib_cm.c
-@@ -1394,8 +1394,8 @@ void ipoib_cm_skb_too_long(struct net_device *dev, 
struct sk_buff *skb,
-       struct ipoib_dev_priv *priv = netdev_priv(dev);
-       int e = skb_queue_empty(&priv->cm.skb_queue);
- 
--      if (skb->dst)
--              skb->dst->ops->update_pmtu(skb->dst, mtu);
-+      if (skb_dst(skb))
-+              skb_dst(skb)->ops->update_pmtu(skb_dst(skb), mtu);
- 
-       skb_queue_tail(&priv->cm.skb_queue, skb);
-       if (e)
---- a/drivers/infiniband/ulp/ipoib/ipoib_main.c
-+++ b/drivers/infiniband/ulp/ipoib/ipoib_main.c
-@@ -561,7 +561,7 @@ static void neigh_add_path(struct sk_buff *skb, struct 
net_device *dev)
-       struct ipoib_neigh *neigh;
-       unsigned long flags;
- 
--      neigh = ipoib_neigh_alloc(skb->dst->neighbour, skb->dev);
-+      neigh = ipoib_neigh_alloc(skb_dst(skb)->neighbour, skb->dev);
-       if (!neigh) {
-               ++dev->stats.tx_dropped;
-               dev_kfree_skb_any(skb);
-@@ -570,9 +570,9 @@ static void neigh_add_path(struct sk_buff *skb, struct 
net_device *dev)
- 
-       spin_lock_irqsave(&priv->lock, flags);
- 
--      path = __path_find(dev, skb->dst->neighbour->ha + 4);
-+      path = __path_find(dev, skb_dst(skb)->neighbour->ha + 4);
-       if (!path) {
--              path = path_rec_create(dev, skb->dst->neighbour->ha + 4);
-+              path = path_rec_create(dev, skb_dst(skb)->neighbour->ha + 4);
-               if (!path)
-                       goto err_path;
- 
-@@ -605,7 +605,7 @@ static void neigh_add_path(struct sk_buff *skb, struct 
net_device *dev)
-                               goto err_drop;
-                       }
-               } else
--                      ipoib_send(dev, skb, path->ah, 
IPOIB_QPN(skb->dst->neighbour->ha));
-+                      ipoib_send(dev, skb, path->ah, 
IPOIB_QPN(skb_dst(skb)->neighbour->ha));
-       } else {
-               neigh->ah  = NULL;
- 
-@@ -635,15 +635,15 @@ static void ipoib_path_lookup(struct sk_buff *skb, 
struct net_device *dev)
-       struct ipoib_dev_priv *priv = netdev_priv(skb->dev);
- 
-       /* Look up path record for unicasts */
--      if (skb->dst->neighbour->ha[4] != 0xff) {
-+      if (skb_dst(skb)->neighbour->ha[4] != 0xff) {
-               neigh_add_path(skb, dev);
-               return;
-       }
- 
-       /* Add in the P_Key for multicasts */
--      skb->dst->neighbour->ha[8] = (priv->pkey >> 8) & 0xff;
--      skb->dst->neighbour->ha[9] = priv->pkey & 0xff;
--      ipoib_mcast_send(dev, skb->dst->neighbour->ha + 4, skb);
-+      skb_dst(skb)->neighbour->ha[8] = (priv->pkey >> 8) & 0xff;
-+      skb_dst(skb)->neighbour->ha[9] = priv->pkey & 0xff;
-+      ipoib_mcast_send(dev, skb_dst(skb)->neighbour->ha + 4, skb);
- }
- 
- static void unicast_arp_send(struct sk_buff *skb, struct net_device *dev,
-@@ -708,16 +708,16 @@ static int ipoib_start_xmit(struct sk_buff *skb, struct 
net_device *dev)
-       struct ipoib_neigh *neigh;
-       unsigned long flags;
- 
--      if (likely(skb->dst && skb->dst->neighbour)) {
--              if (unlikely(!*to_ipoib_neigh(skb->dst->neighbour))) {
-+      if (likely(skb_dst(skb) && skb_dst(skb)->neighbour)) {
-+              if (unlikely(!*to_ipoib_neigh(skb_dst(skb)->neighbour))) {
-                       ipoib_path_lookup(skb, dev);
-                       return NETDEV_TX_OK;
-               }
- 
--              neigh = *to_ipoib_neigh(skb->dst->neighbour);
-+              neigh = *to_ipoib_neigh(skb_dst(skb)->neighbour);
- 
-               if (unlikely((memcmp(&neigh->dgid.raw,
--                                   skb->dst->neighbour->ha + 4,
-+                                   skb_dst(skb)->neighbour->ha + 4,
-                                    sizeof(union ib_gid))) ||
-                            (neigh->dev != dev))) {
-                       spin_lock_irqsave(&priv->lock, flags);
-@@ -743,7 +743,7 @@ static int ipoib_start_xmit(struct sk_buff *skb, struct 
net_device *dev)
-                               return NETDEV_TX_OK;
-                       }
-               } else if (neigh->ah) {
--                      ipoib_send(dev, skb, neigh->ah, 
IPOIB_QPN(skb->dst->neighbour->ha));
-+                      ipoib_send(dev, skb, neigh->ah, 
IPOIB_QPN(skb_dst(skb)->neighbour->ha));
-                       return NETDEV_TX_OK;
-               }
- 
-@@ -772,7 +772,7 @@ static int ipoib_start_xmit(struct sk_buff *skb, struct 
net_device *dev)
-                       if ((be16_to_cpup((__be16 *) skb->data) != ETH_P_ARP) &&
-                           (be16_to_cpup((__be16 *) skb->data) != ETH_P_RARP)) 
{
-                               ipoib_warn(priv, "Unicast, no %s: type %04x, 
QPN %06x %pI6\n",
--                                         skb->dst ? "neigh" : "dst",
-+                                         skb_dst(skb) ? "neigh" : "dst",
-                                          be16_to_cpup((__be16 *) skb->data),
-                                          IPOIB_QPN(phdr->hwaddr),
-                                          phdr->hwaddr + 4);
-@@ -817,7 +817,7 @@ static int ipoib_hard_header(struct sk_buff *skb,
-        * destination address onto the front of the skb so we can
-        * figure out where to send the packet later.
-        */
--      if ((!skb->dst || !skb->dst->neighbour) && daddr) {
-+      if ((!skb_dst(skb) || !skb_dst(skb)->neighbour) && daddr) {
-               struct ipoib_pseudoheader *phdr =
-                       (struct ipoib_pseudoheader *) skb_push(skb, sizeof 
*phdr);
-               memcpy(phdr->hwaddr, daddr, INFINIBAND_ALEN);
---- a/drivers/infiniband/ulp/ipoib/ipoib_multicast.c
-+++ b/drivers/infiniband/ulp/ipoib/ipoib_multicast.c
-@@ -261,7 +261,7 @@ static int ipoib_mcast_join_finish(struct ipoib_mcast 
*mcast,
- 
-               skb->dev = dev;
- 
--              if (!skb->dst || !skb->dst->neighbour) {
-+              if (!skb_dst(skb) || !skb_dst(skb)->neighbour) {
-                       /* put pseudoheader back on for next time */
-                       skb_push(skb, sizeof (struct ipoib_pseudoheader));
-               }
-@@ -707,10 +707,10 @@ void ipoib_mcast_send(struct net_device *dev, void 
*mgid, struct sk_buff *skb)
- 
- out:
-       if (mcast && mcast->ah) {
--              if (skb->dst            &&
--                  skb->dst->neighbour &&
--                  !*to_ipoib_neigh(skb->dst->neighbour)) {
--                      struct ipoib_neigh *neigh = 
ipoib_neigh_alloc(skb->dst->neighbour,
-+              if (skb_dst(skb)                &&
-+                  skb_dst(skb)->neighbour &&
-+                  !*to_ipoib_neigh(skb_dst(skb)->neighbour)) {
-+                      struct ipoib_neigh *neigh = 
ipoib_neigh_alloc(skb_dst(skb)->neighbour,
-                                                                       
skb->dev);
- 
-                       if (neigh) {
+From: Sven-Thorsten Dietrich <sdietr...@suse.de>
+Subject: Forward-port new accessor for net: dst.
+
+See Kernel.org:
+commit adf30907d63893e4208dfe3f5c88ae12bc2f25d5
+Author: Eric Dumazet <eric.duma...@gmail.com>
+Date:   Tue Jun 2 05:19:30 2009 +0000
+Subject: net: skb->dst accessors
+
+Signed-off-by: Sven-Thorsten Dietrich <sdietr...@suse.de>
+--- a/drivers/infiniband/ulp/ipoib/ipoib_cm.c
++++ b/drivers/infiniband/ulp/ipoib/ipoib_cm.c
+@@ -1394,8 +1394,8 @@ void ipoib_cm_skb_too_long(struct net_device *dev, 
struct sk_buff *skb,
+       struct ipoib_dev_priv *priv = netdev_priv(dev);
+       int e = skb_queue_empty(&priv->cm.skb_queue);
+ 
+-      if (skb->dst)
+-              skb->dst->ops->update_pmtu(skb->dst, mtu);
++      if (skb_dst(skb))
++              skb_dst(skb)->ops->update_pmtu(skb_dst(skb), mtu);
+ 
+       skb_queue_tail(&priv->cm.skb_queue, skb);
+       if (e)
+--- a/drivers/infiniband/ulp/ipoib/ipoib_main.c
++++ b/drivers/infiniband/ulp/ipoib/ipoib_main.c
+@@ -561,7 +561,7 @@ static void neigh_add_path(struct sk_buff *skb, struct 
net_device *dev)
+       struct ipoib_neigh *neigh;
+       unsigned long flags;
+ 
+-      neigh = ipoib_neigh_alloc(skb->dst->neighbour, skb->dev);
++      neigh = ipoib_neigh_alloc(skb_dst(skb)->neighbour, skb->dev);
+       if (!neigh) {
+               ++dev->stats.tx_dropped;
+               dev_kfree_skb_any(skb);
+@@ -570,9 +570,9 @@ static void neigh_add_path(struct sk_buff *skb, struct 
net_device *dev)
+ 
+       spin_lock_irqsave(&priv->lock, flags);
+ 
+-      path = __path_find(dev, skb->dst->neighbour->ha + 4);
++      path = __path_find(dev, skb_dst(skb)->neighbour->ha + 4);
+       if (!path) {
+-              path = path_rec_create(dev, skb->dst->neighbour->ha + 4);
++              path = path_rec_create(dev, skb_dst(skb)->neighbour->ha + 4);
+               if (!path)
+                       goto err_path;
+ 
+@@ -605,7 +605,7 @@ static void neigh_add_path(struct sk_buff *skb, struct 
net_device *dev)
+                               goto err_drop;
+                       }
+               } else
+-                      ipoib_send(dev, skb, path->ah, 
IPOIB_QPN(skb->dst->neighbour->ha));
++                      ipoib_send(dev, skb, path->ah, 
IPOIB_QPN(skb_dst(skb)->neighbour->ha));
+       } else {
+               neigh->ah  = NULL;
+ 
+@@ -635,15 +635,15 @@ static void ipoib_path_lookup(struct sk_buff *skb, 
struct net_device *dev)
+       struct ipoib_dev_priv *priv = netdev_priv(skb->dev);
+ 
+       /* Look up path record for unicasts */
+-      if (skb->dst->neighbour->ha[4] != 0xff) {
++      if (skb_dst(skb)->neighbour->ha[4] != 0xff) {
+               neigh_add_path(skb, dev);
+               return;
+       }
+ 
+       /* Add in the P_Key for multicasts */
+-      skb->dst->neighbour->ha[8] = (priv->pkey >> 8) & 0xff;
+-      skb->dst->neighbour->ha[9] = priv->pkey & 0xff;
+-      ipoib_mcast_send(dev, skb->dst->neighbour->ha + 4, skb);
++      skb_dst(skb)->neighbour->ha[8] = (priv->pkey >> 8) & 0xff;
++      skb_dst(skb)->neighbour->ha[9] = priv->pkey & 0xff;
++      ipoib_mcast_send(dev, skb_dst(skb)->neighbour->ha + 4, skb);
+ }
+ 
+ static void unicast_arp_send(struct sk_buff *skb, struct net_device *dev,
+@@ -708,16 +708,16 @@ static int ipoib_start_xmit(struct sk_buff *skb, struct 
net_device *dev)
+       struct ipoib_neigh *neigh;
+       unsigned long flags;
+ 
+-      if (likely(skb->dst && skb->dst->neighbour)) {
+-              if (unlikely(!*to_ipoib_neigh(skb->dst->neighbour))) {
++      if (likely(skb_dst(skb) && skb_dst(skb)->neighbour)) {
++              if (unlikely(!*to_ipoib_neigh(skb_dst(skb)->neighbour))) {
+                       ipoib_path_lookup(skb, dev);
+                       return NETDEV_TX_OK;
+               }
+ 
+-              neigh = *to_ipoib_neigh(skb->dst->neighbour);
++              neigh = *to_ipoib_neigh(skb_dst(skb)->neighbour);
+ 
+               if (unlikely((memcmp(&neigh->dgid.raw,
+-                                   skb->dst->neighbour->ha + 4,
++                                   skb_dst(skb)->neighbour->ha + 4,
+                                    sizeof(union ib_gid))) ||
+                            (neigh->dev != dev))) {
+                       spin_lock_irqsave(&priv->lock, flags);
+@@ -743,7 +743,7 @@ static int ipoib_start_xmit(struct sk_buff *skb, struct 
net_device *dev)
+                               return NETDEV_TX_OK;
+                       }
+               } else if (neigh->ah) {
+-                      ipoib_send(dev, skb, neigh->ah, 
IPOIB_QPN(skb->dst->neighbour->ha));
++                      ipoib_send(dev, skb, neigh->ah, 
IPOIB_QPN(skb_dst(skb)->neighbour->ha));
+                       return NETDEV_TX_OK;
+               }
+ 
+@@ -772,7 +772,7 @@ static int ipoib_start_xmit(struct sk_buff *skb, struct 
net_device *dev)
+                       if ((be16_to_cpup((__be16 *) skb->data) != ETH_P_ARP) &&
+                           (be16_to_cpup((__be16 *) skb->data) != ETH_P_RARP)) 
{
+                               ipoib_warn(priv, "Unicast, no %s: type %04x, 
QPN %06x %pI6\n",
+-                                         skb->dst ? "neigh" : "dst",
++                                         skb_dst(skb) ? "neigh" : "dst",
+                                          be16_to_cpup((__be16 *) skb->data),
+                                          IPOIB_QPN(phdr->hwaddr),
+                                          phdr->hwaddr + 4);
+@@ -817,7 +817,7 @@ static int ipoib_hard_header(struct sk_buff *skb,
+        * destination address onto the front of the skb so we can
+        * figure out where to send the packet later.
+        */
+-      if ((!skb->dst || !skb->dst->neighbour) && daddr) {
++      if ((!skb_dst(skb) || !skb_dst(skb)->neighbour) && daddr) {
+               struct ipoib_pseudoheader *phdr =
+                       (struct ipoib_pseudoheader *) skb_push(skb, sizeof 
*phdr);
+               memcpy(phdr->hwaddr, daddr, INFINIBAND_ALEN);
+--- a/drivers/infiniband/ulp/ipoib/ipoib_multicast.c
++++ b/drivers/infiniband/ulp/ipoib/ipoib_multicast.c
+@@ -261,7 +261,7 @@ static int ipoib_mcast_join_finish(struct ipoib_mcast 
*mcast,
+ 
+               skb->dev = dev;
+ 
+-              if (!skb->dst || !skb->dst->neighbour) {
++              if (!skb_dst(skb) || !skb_dst(skb)->neighbour) {
+                       /* put pseudoheader back on for next time */
+                       skb_push(skb, sizeof (struct ipoib_pseudoheader));
+               }
+@@ -707,10 +707,10 @@ void ipoib_mcast_send(struct net_device *dev, void 
*mgid, struct sk_buff *skb)
+ 
+ out:
+       if (mcast && mcast->ah) {
+-              if (skb->dst            &&
+-                  skb->dst->neighbour &&
+-                  !*to_ipoib_neigh(skb->dst->neighbour)) {
+-                      struct ipoib_neigh *neigh = 
ipoib_neigh_alloc(skb->dst->neighbour,
++              if (skb_dst(skb)                &&
++                  skb_dst(skb)->neighbour &&
++                  !*to_ipoib_neigh(skb_dst(skb)->neighbour)) {
++                      struct ipoib_neigh *neigh = 
ipoib_neigh_alloc(skb_dst(skb)->neighbour,
+                                                                       
skb->dev);
+ 
+                       if (neigh) {
diff --git a/kernel_patches/backport/2.6.32_sles11sp1/new_frags_interface.patch 
b/kernel_patches/backport/2.6.32_sles11sp1/new_frags_interface.patch
index b1ad068..7025736 100644
--- a/kernel_patches/backport/2.6.32_sles11sp1/new_frags_interface.patch
+++ b/kernel_patches/backport/2.6.32_sles11sp1/new_frags_interface.patch
@@ -1,131 +1,131 @@
-From: Sven-Thorsten Dietrich <sdietr...@suse.de>
-
-See Kernel.org:
-commit 76620aafd66f0004829764940c5466144969cffc
-Author: Herbert Xu <herb...@gondor.apana.org.au>
-Date:   Thu Apr 16 02:02:07 2009 -0700
-Subject: gro: New frags interface to avoid copying shinfo
-
-
-Signed-off-by: Sven-Thorsten Dietrich <sdietr...@suse.de>
---- a/drivers/net/cxgb3/adapter.h
-+++ b/drivers/net/cxgb3/adapter.h
-@@ -195,7 +195,7 @@ struct sge_qset {          /* an SGE queue set */
-       struct sge_rspq rspq;
-       struct sge_fl fl[SGE_RXQ_PER_SET];
-       struct sge_txq txq[SGE_TXQ_PER_SET];
--      struct napi_gro_fraginfo lro_frag_tbl;
-+      int nomem;
-       int lro_enabled;
-       void *lro_va;
-       struct net_device *netdev;
---- a/drivers/net/cxgb3/sge.c
-+++ b/drivers/net/cxgb3/sge.c
-@@ -654,7 +654,8 @@ static void t3_reset_qset(struct sge_qset *q)
-       q->txq_stopped = 0;
-       q->tx_reclaim_timer.function = NULL; /* for t3_stop_sge_timers() */
-       q->rx_reclaim_timer.function = NULL;
--      q->lro_frag_tbl.nr_frags = q->lro_frag_tbl.len = 0;
-+      q->nomem = 0;
-+      napi_free_frags(&q->napi);
- }
- 
- 
-@@ -2074,20 +2075,19 @@ static void lro_add_page(struct adapter *adap, struct 
sge_qset *qs,
-                        struct sge_fl *fl, int len, int complete)
- {
-       struct rx_sw_desc *sd = &fl->sdesc[fl->cidx];
-+      struct sk_buff *skb = NULL;
-       struct cpl_rx_pkt *cpl;
--      struct skb_frag_struct *rx_frag = qs->lro_frag_tbl.frags;
--      int nr_frags = qs->lro_frag_tbl.nr_frags;
--      int frag_len = qs->lro_frag_tbl.len;
-+      struct skb_frag_struct *rx_frag;
-+      int nr_frags;
-       int offset = 0;
- 
--      if (!nr_frags) {
--              offset = 2 + sizeof(struct cpl_rx_pkt);
--              qs->lro_va = cpl = sd->pg_chunk.va + 2;
-+      if (!qs->nomem) {
-+              skb = napi_get_frags(&qs->napi);
-+              qs->nomem = !skb;
-       }
- 
-       fl->credits--;
- 
--      len -= offset;
-       pci_dma_sync_single_for_cpu(adap->pdev,
-                                   pci_unmap_addr(sd, dma_addr),
-                                   fl->buf_size - SGE_PG_RSVD,
-@@ -2100,21 +2100,38 @@ static void lro_add_page(struct adapter *adap, struct 
sge_qset *qs,
-                              fl->alloc_size,
-                              PCI_DMA_FROMDEVICE);
- 
-+      if (!skb) {
-+              put_page(sd->pg_chunk.page);
-+              if (complete)
-+                      qs->nomem = 0;
-+              return;
-+      }
-+
-+      rx_frag = skb_shinfo(skb)->frags;
-+      nr_frags = skb_shinfo(skb)->nr_frags;
-+
-+      if (!nr_frags) {
-+              offset = 2 + sizeof(struct cpl_rx_pkt);
-+              qs->lro_va = sd->pg_chunk.va + 2;
-+      }
-+      len -= offset;
-+
-       prefetch(qs->lro_va);
- 
-       rx_frag += nr_frags;
-       rx_frag->page = sd->pg_chunk.page;
-       rx_frag->page_offset = sd->pg_chunk.offset + offset;
-       rx_frag->size = len;
--      frag_len += len;
--      qs->lro_frag_tbl.nr_frags++;
--      qs->lro_frag_tbl.len = frag_len;
- 
-+      skb->len += len;
-+      skb->data_len += len;
-+      skb->truesize += len;
-+      skb_shinfo(skb)->nr_frags++;
- 
-       if (!complete)
-               return;
- 
--      qs->lro_frag_tbl.ip_summed = CHECKSUM_UNNECESSARY;
-+      skb->ip_summed = CHECKSUM_UNNECESSARY;
-       cpl = qs->lro_va;
- 
-       if (unlikely(cpl->vlan_valid)) {
-@@ -2123,15 +2140,11 @@ static void lro_add_page(struct adapter *adap, struct 
sge_qset *qs,
-               struct vlan_group *grp = pi->vlan_grp;
- 
-               if (likely(grp != NULL)) {
--                      vlan_gro_frags(&qs->napi, grp, ntohs(cpl->vlan),
--                                     &qs->lro_frag_tbl);
--                      goto out;
-+                      vlan_gro_frags(&qs->napi, grp, ntohs(cpl->vlan));
-+                      return;
-               }
-       }
--      napi_gro_frags(&qs->napi, &qs->lro_frag_tbl);
--
--out:
--      qs->lro_frag_tbl.nr_frags = qs->lro_frag_tbl.len = 0;
-+      napi_gro_frags(&qs->napi);
- }
- 
- /**
-@@ -2300,8 +2313,6 @@ no_mem:
-                       if (fl->use_pages) {
-                               void *addr = fl->sdesc[fl->cidx].pg_chunk.va;
- 
--                              prefetch(&qs->lro_frag_tbl);
--
-                               prefetch(addr);
- #if L1_CACHE_BYTES < 128
-                               prefetch(addr + L1_CACHE_BYTES);
+From: Sven-Thorsten Dietrich <sdietr...@suse.de>
+
+See Kernel.org:
+commit 76620aafd66f0004829764940c5466144969cffc
+Author: Herbert Xu <herb...@gondor.apana.org.au>
+Date:   Thu Apr 16 02:02:07 2009 -0700
+Subject: gro: New frags interface to avoid copying shinfo
+
+
+Signed-off-by: Sven-Thorsten Dietrich <sdietr...@suse.de>
+--- a/drivers/net/cxgb3/adapter.h
++++ b/drivers/net/cxgb3/adapter.h
+@@ -195,7 +195,7 @@ struct sge_qset {          /* an SGE queue set */
+       struct sge_rspq rspq;
+       struct sge_fl fl[SGE_RXQ_PER_SET];
+       struct sge_txq txq[SGE_TXQ_PER_SET];
+-      struct napi_gro_fraginfo lro_frag_tbl;
++      int nomem;
+       int lro_enabled;
+       void *lro_va;
+       struct net_device *netdev;
+--- a/drivers/net/cxgb3/sge.c
++++ b/drivers/net/cxgb3/sge.c
+@@ -654,7 +654,8 @@ static void t3_reset_qset(struct sge_qset *q)
+       q->txq_stopped = 0;
+       q->tx_reclaim_timer.function = NULL; /* for t3_stop_sge_timers() */
+       q->rx_reclaim_timer.function = NULL;
+-      q->lro_frag_tbl.nr_frags = q->lro_frag_tbl.len = 0;
++      q->nomem = 0;
++      napi_free_frags(&q->napi);
+ }
+ 
+ 
+@@ -2074,20 +2075,19 @@ static void lro_add_page(struct adapter *adap, struct 
sge_qset *qs,
+                        struct sge_fl *fl, int len, int complete)
+ {
+       struct rx_sw_desc *sd = &fl->sdesc[fl->cidx];
++      struct sk_buff *skb = NULL;
+       struct cpl_rx_pkt *cpl;
+-      struct skb_frag_struct *rx_frag = qs->lro_frag_tbl.frags;
+-      int nr_frags = qs->lro_frag_tbl.nr_frags;
+-      int frag_len = qs->lro_frag_tbl.len;
++      struct skb_frag_struct *rx_frag;
++      int nr_frags;
+       int offset = 0;
+ 
+-      if (!nr_frags) {
+-              offset = 2 + sizeof(struct cpl_rx_pkt);
+-              qs->lro_va = cpl = sd->pg_chunk.va + 2;
++      if (!qs->nomem) {
++              skb = napi_get_frags(&qs->napi);
++              qs->nomem = !skb;
+       }
+ 
+       fl->credits--;
+ 
+-      len -= offset;
+       pci_dma_sync_single_for_cpu(adap->pdev,
+                                   pci_unmap_addr(sd, dma_addr),
+                                   fl->buf_size - SGE_PG_RSVD,
+@@ -2100,21 +2100,38 @@ static void lro_add_page(struct adapter *adap, struct 
sge_qset *qs,
+                              fl->alloc_size,
+                              PCI_DMA_FROMDEVICE);
+ 
++      if (!skb) {
++              put_page(sd->pg_chunk.page);
++              if (complete)
++                      qs->nomem = 0;
++              return;
++      }
++
++      rx_frag = skb_shinfo(skb)->frags;
++      nr_frags = skb_shinfo(skb)->nr_frags;
++
++      if (!nr_frags) {
++              offset = 2 + sizeof(struct cpl_rx_pkt);
++              qs->lro_va = sd->pg_chunk.va + 2;
++      }
++      len -= offset;
++
+       prefetch(qs->lro_va);
+ 
+       rx_frag += nr_frags;
+       rx_frag->page = sd->pg_chunk.page;
+       rx_frag->page_offset = sd->pg_chunk.offset + offset;
+       rx_frag->size = len;
+-      frag_len += len;
+-      qs->lro_frag_tbl.nr_frags++;
+-      qs->lro_frag_tbl.len = frag_len;
+ 
++      skb->len += len;
++      skb->data_len += len;
++      skb->truesize += len;
++      skb_shinfo(skb)->nr_frags++;
+ 
+       if (!complete)
+               return;
+ 
+-      qs->lro_frag_tbl.ip_summed = CHECKSUM_UNNECESSARY;
++      skb->ip_summed = CHECKSUM_UNNECESSARY;
+       cpl = qs->lro_va;
+ 
+       if (unlikely(cpl->vlan_valid)) {
+@@ -2123,15 +2140,11 @@ static void lro_add_page(struct adapter *adap, struct 
sge_qset *qs,
+               struct vlan_group *grp = pi->vlan_grp;
+ 
+               if (likely(grp != NULL)) {
+-                      vlan_gro_frags(&qs->napi, grp, ntohs(cpl->vlan),
+-                                     &qs->lro_frag_tbl);
+-                      goto out;
++                      vlan_gro_frags(&qs->napi, grp, ntohs(cpl->vlan));
++                      return;
+               }
+       }
+-      napi_gro_frags(&qs->napi, &qs->lro_frag_tbl);
+-
+-out:
+-      qs->lro_frag_tbl.nr_frags = qs->lro_frag_tbl.len = 0;
++      napi_gro_frags(&qs->napi);
+ }
+ 
+ /**
+@@ -2300,8 +2313,6 @@ no_mem:
+                       if (fl->use_pages) {
+                               void *addr = fl->sdesc[fl->cidx].pg_chunk.va;
+ 
+-                              prefetch(&qs->lro_frag_tbl);
+-
+                               prefetch(addr);
+ #if L1_CACHE_BYTES < 128
+                               prefetch(addr + L1_CACHE_BYTES);
diff --git a/kernel_patches/backport/2.6.32_sles11sp1/nfsrdma_to_2_6_32.patch 
b/kernel_patches/backport/2.6.32_sles11sp1/nfsrdma_to_2_6_32.patch
new file mode 100644
index 0000000..f4f83e5
--- /dev/null
+++ b/kernel_patches/backport/2.6.32_sles11sp1/nfsrdma_to_2_6_32.patch
@@ -0,0 +1,77 @@
+diff --git a/net/sunrpc/xprtrdma/svc_rdma_transport.c 
b/net/sunrpc/xprtrdma/svc_rdma_transport.c
+index 5151f9f..2df5734 100644
+--- a/net/sunrpc/xprtrdma/svc_rdma_transport.c
++++ b/net/sunrpc/xprtrdma/svc_rdma_transport.c
+@@ -42,6 +42,7 @@
+ #include <linux/sunrpc/svc_xprt.h>
+ #include <linux/sunrpc/debug.h>
+ #include <linux/sunrpc/rpc_rdma.h>
++#include <linux/sched.h>
+ #include <linux/spinlock.h>
+ #include <rdma/ib_verbs.h>
+ #include <rdma/rdma_cm.h>
+diff --git a/net/sunrpc/xprtrdma/transport.c b/net/sunrpc/xprtrdma/transport.c
+index 1dd6123..9a63f66 100644
+--- a/net/sunrpc/xprtrdma/transport.c
++++ b/net/sunrpc/xprtrdma/transport.c
+@@ -168,47 +168,25 @@ static struct rpc_xprt_ops xprt_rdma_procs;      /* 
forward reference */
+ static void
+ xprt_rdma_format_addresses(struct rpc_xprt *xprt)
+ {
+-      struct sockaddr_in *addr = (struct sockaddr_in *)
++      struct sockaddr *sap = (struct sockaddr *)
+                                       &rpcx_to_rdmad(xprt).addr;
+-      char *buf;
++      struct sockaddr_in *sin = (struct sockaddr_in *)sap;
++      char buf[64];
+ 
+-      buf = kzalloc(20, GFP_KERNEL);
+-      if (buf)
+-              snprintf(buf, 20, "%pI4", &addr->sin_addr.s_addr);
+-      xprt->address_strings[RPC_DISPLAY_ADDR] = buf;
++      (void)rpc_ntop(sap, buf, sizeof(buf));
++      xprt->address_strings[RPC_DISPLAY_ADDR] = kstrdup(buf, GFP_KERNEL);
+ 
+-      buf = kzalloc(8, GFP_KERNEL);
+-      if (buf)
+-              snprintf(buf, 8, "%u", ntohs(addr->sin_port));
+-      xprt->address_strings[RPC_DISPLAY_PORT] = buf;
++      (void)snprintf(buf, sizeof(buf), "%u", rpc_get_port(sap));
++      xprt->address_strings[RPC_DISPLAY_PORT] = kstrdup(buf, GFP_KERNEL);
+ 
+       xprt->address_strings[RPC_DISPLAY_PROTO] = "rdma";
+ 
+-      buf = kzalloc(48, GFP_KERNEL);
+-      if (buf)
+-              snprintf(buf, 48, "addr=%pI4 port=%u proto=%s",
+-                      &addr->sin_addr.s_addr,
+-                      ntohs(addr->sin_port), "rdma");
+-      xprt->address_strings[RPC_DISPLAY_ALL] = buf;
+-
+-      buf = kzalloc(10, GFP_KERNEL);
+-      if (buf)
+-              snprintf(buf, 10, "%02x%02x%02x%02x",
+-                      NIPQUAD(addr->sin_addr.s_addr));
+-      xprt->address_strings[RPC_DISPLAY_HEX_ADDR] = buf;
+-
+-      buf = kzalloc(8, GFP_KERNEL);
+-      if (buf)
+-              snprintf(buf, 8, "%4hx", ntohs(addr->sin_port));
+-      xprt->address_strings[RPC_DISPLAY_HEX_PORT] = buf;
+-
+-      buf = kzalloc(30, GFP_KERNEL);
+-      if (buf)
+-              snprintf(buf, 30, "%pI4.%u.%u",
+-                      &addr->sin_addr.s_addr,
+-                      ntohs(addr->sin_port) >> 8,
+-                      ntohs(addr->sin_port) & 0xff);
+-      xprt->address_strings[RPC_DISPLAY_UNIVERSAL_ADDR] = buf;
++      (void)snprintf(buf, sizeof(buf), "%02x%02x%02x%02x",
++                              NIPQUAD(sin->sin_addr.s_addr));
++      xprt->address_strings[RPC_DISPLAY_HEX_ADDR] = kstrdup(buf, GFP_KERNEL);
++
++      (void)snprintf(buf, sizeof(buf), "%4hx", rpc_get_port(sap));
++      xprt->address_strings[RPC_DISPLAY_HEX_PORT] = kstrdup(buf, GFP_KERNEL);
+ 
+       /* netid */
+       xprt->address_strings[RPC_DISPLAY_NETID] = "rdma";
_______________________________________________
ewg mailing list
ewg@lists.openfabrics.org
http://lists.openfabrics.org/cgi-bin/mailman/listinfo/ewg

Reply via email to