Gitweb:     
http://git.kernel.org/git/?p=linux/kernel/git/torvalds/linux-2.6.git;a=commit;h=27186dc325c3bbb937a27a2467cefd64e2505158
Commit:     27186dc325c3bbb937a27a2467cefd64e2505158
Parent:     6e3f03b72c1e11e19ea233a411a782f7231ba13f
Author:     Divy Le Ray <[EMAIL PROTECTED]>
AuthorDate: Tue Aug 21 20:49:15 2007 -0700
Committer:  David S. Miller <[EMAIL PROTECTED]>
CommitDate: Wed Oct 10 16:50:48 2007 -0700

    cxgb3 - use immediate data for offload Tx
    
    Send small TX_DATA work requests as immediate data even when
    there are fragments. this avoids doing multiple DMAs for
    small fragmented packets.
    The driver already implements this optimization for small
    contiguous packets.
    
    Signed-off-by: Divy Le Ray <[EMAIL PROTECTED]>
    Signed-off-by: Jeff Garzik <[EMAIL PROTECTED]>
---
 drivers/net/cxgb3/sge.c |   17 +++++++++++------
 1 files changed, 11 insertions(+), 6 deletions(-)

diff --git a/drivers/net/cxgb3/sge.c b/drivers/net/cxgb3/sge.c
index 9233bbb..540ce5f 100644
--- a/drivers/net/cxgb3/sge.c
+++ b/drivers/net/cxgb3/sge.c
@@ -1179,8 +1179,8 @@ int t3_eth_xmit(struct sk_buff *skb, struct net_device 
*dev)
  *
  *     Writes a packet as immediate data into a Tx descriptor.  The packet
  *     contains a work request at its beginning.  We must write the packet
- *     carefully so the SGE doesn't read accidentally before it's written in
- *     its entirety.
+ *     carefully so the SGE doesn't read it accidentally before it's written
+ *     in its entirety.
  */
 static inline void write_imm(struct tx_desc *d, struct sk_buff *skb,
                             unsigned int len, unsigned int gen)
@@ -1188,7 +1188,11 @@ static inline void write_imm(struct tx_desc *d, struct 
sk_buff *skb,
        struct work_request_hdr *from = (struct work_request_hdr *)skb->data;
        struct work_request_hdr *to = (struct work_request_hdr *)d;
 
-       memcpy(&to[1], &from[1], len - sizeof(*from));
+       if (likely(!skb->data_len))
+               memcpy(&to[1], &from[1], len - sizeof(*from));
+       else
+               skb_copy_bits(skb, sizeof(*from), &to[1], len - sizeof(*from));
+
        to->wr_hi = from->wr_hi | htonl(F_WR_SOP | F_WR_EOP |
                                        V_WR_BCNTLFLT(len & 7));
        wmb();
@@ -1258,7 +1262,7 @@ static inline void reclaim_completed_tx_imm(struct 
sge_txq *q)
 
 static inline int immediate(const struct sk_buff *skb)
 {
-       return skb->len <= WR_LEN && !skb->data_len;
+       return skb->len <= WR_LEN;
 }
 
 /**
@@ -1464,12 +1468,13 @@ static void write_ofld_wr(struct adapter *adap, struct 
sk_buff *skb,
  */
 static inline unsigned int calc_tx_descs_ofld(const struct sk_buff *skb)
 {
-       unsigned int flits, cnt = skb_shinfo(skb)->nr_frags;
+       unsigned int flits, cnt;
 
-       if (skb->len <= WR_LEN && cnt == 0)
+       if (skb->len <= WR_LEN)
                return 1;       /* packet fits as immediate data */
 
        flits = skb_transport_offset(skb) / 8;  /* headers */
+       cnt = skb_shinfo(skb)->nr_frags;
        if (skb->tail != skb->transport_header)
                cnt++;
        return flits_to_desc(flits + sgl_len(cnt));
-
To unsubscribe from this list: send the line "unsubscribe git-commits-head" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to