RE: [PATCH 2.6.29 1/1] cxgb3i - more transmit work-request checks

2009-02-05 Thread Karen Xie

Thanks, Mike,

I will re-submit the patch against scsi-rc-fixes. This one was based on
scsi-misc-2.6/linux-2.6-iscsi.

Karen 

-Original Message-
From: Mike Christie [mailto:micha...@cs.wisc.edu] 
Sent: Thursday, February 05, 2009 1:43 PM
To: Karen Xie
Cc: open-iscsi@googlegroups.com; linux-s...@vger.kernel.org;
james.bottom...@hansenpartnership.com
Subject: Re: [PATCH 2.6.29 1/1] cxgb3i - more transmit work-request
checks

Karen Xie wrote:
> [PATCH 2.6.29 1/1] cxgb3i - more transmit work-request checks
> 
> From: Karen Xie 
> 
> - added more checkings for transmit work-request.
> - reserve one work-request for credit return.
> - stop queueing up the outgoing pdus if transmit window is full.
> - split the skb cb into tx and rx portion
> 

What kernel was this made against? I think the patch might include some 
changes that already went upstream. You might want to rebase the patch 
against scsi-rc-fixes.

--~--~-~--~~~---~--~~
You received this message because you are subscribed to the Google Groups 
"open-iscsi" group.
To post to this group, send email to open-iscsi@googlegroups.com
To unsubscribe from this group, send email to 
open-iscsi+unsubscr...@googlegroups.com
For more options, visit this group at http://groups.google.com/group/open-iscsi
-~--~~~~--~~--~--~---



Re: [PATCH 2.6.29 1/1] cxgb3i - more transmit work-request checks

2009-02-05 Thread Mike Christie

Karen Xie wrote:
> [PATCH 2.6.29 1/1] cxgb3i - more transmit work-request checks
> 
> From: Karen Xie 
> 
> - added more checkings for transmit work-request.
> - reserve one work-request for credit return.
> - stop queueing up the outgoing pdus if transmit window is full.
> - split the skb cb into tx and rx portion
> 

What kernel was this made against? I think the patch might include some 
changes that already went upstream. You might want to rebase the patch 
against scsi-rc-fixes.

--~--~-~--~~~---~--~~
You received this message because you are subscribed to the Google Groups 
"open-iscsi" group.
To post to this group, send email to open-iscsi@googlegroups.com
To unsubscribe from this group, send email to 
open-iscsi+unsubscr...@googlegroups.com
For more options, visit this group at http://groups.google.com/group/open-iscsi
-~--~~~~--~~--~--~---



[PATCH 2.6.29 1/1] cxgb3i - more transmit work-request checks

2009-02-03 Thread Karen Xie

[PATCH 2.6.29 1/1] cxgb3i - more transmit work-request checks

From: Karen Xie 

- added more checkings for transmit work-request.
- reserve one work-request for credit return.
- stop queueing up the outgoing pdus if transmit window is full.
- split the skb cb into tx and rx portion

Signed-off-by: Karen Xie 
---

 drivers/scsi/cxgb3i/cxgb3i_ddp.h |2 +
 drivers/scsi/cxgb3i/cxgb3i_offload.c |  132 --
 drivers/scsi/cxgb3i/cxgb3i_offload.h |   28 +--
 drivers/scsi/cxgb3i/cxgb3i_pdu.c |2 -
 4 files changed, 114 insertions(+), 50 deletions(-)


diff --git a/drivers/scsi/cxgb3i/cxgb3i_ddp.h b/drivers/scsi/cxgb3i/cxgb3i_ddp.h
index 5c7c4d9..f675807 100644
--- a/drivers/scsi/cxgb3i/cxgb3i_ddp.h
+++ b/drivers/scsi/cxgb3i/cxgb3i_ddp.h
@@ -13,6 +13,8 @@
 #ifndef __CXGB3I_ULP2_DDP_H__
 #define __CXGB3I_ULP2_DDP_H__
 
+#include 
+
 /**
  * struct cxgb3i_tag_format - cxgb3i ulp tag format for an iscsi entity
  *
diff --git a/drivers/scsi/cxgb3i/cxgb3i_offload.c 
b/drivers/scsi/cxgb3i/cxgb3i_offload.c
index a865f1f..faa7a36 100644
--- a/drivers/scsi/cxgb3i/cxgb3i_offload.c
+++ b/drivers/scsi/cxgb3i/cxgb3i_offload.c
@@ -23,19 +23,19 @@
 #include "cxgb3i_ddp.h"
 
 #ifdef __DEBUG_C3CN_CONN__
-#define c3cn_conn_debug cxgb3i_log_info
+#define c3cn_conn_debugcxgb3i_log_debug
 #else
 #define c3cn_conn_debug(fmt...)
 #endif
 
 #ifdef __DEBUG_C3CN_TX__
-#define c3cn_tx_debug cxgb3i_log_debug
+#define c3cn_tx_debug  cxgb3i_log_debug
 #else
 #define c3cn_tx_debug(fmt...)
 #endif
 
 #ifdef __DEBUG_C3CN_RX__
-#define c3cn_rx_debug cxgb3i_log_debug
+#define c3cn_rx_debug  cxgb3i_log_debug
 #else
 #define c3cn_rx_debug(fmt...)
 #endif
@@ -301,8 +301,8 @@ static void act_open_req_arp_failure(struct t3cdev *dev, 
struct sk_buff *skb)
 static void skb_entail(struct s3_conn *c3cn, struct sk_buff *skb,
   int flags)
 {
-   CXGB3_SKB_CB(skb)->seq = c3cn->write_seq;
-   CXGB3_SKB_CB(skb)->flags = flags;
+   skb_tcp_seq(skb) = c3cn->write_seq;
+   skb_flags(skb) = flags;
__skb_queue_tail(&c3cn->write_queue, skb);
 }
 
@@ -457,12 +457,9 @@ static unsigned int wrlen __read_mostly;
  * The number of WRs needed for an skb depends on the number of fragments
  * in the skb and whether it has any payload in its main body.  This maps the
  * length of the gather list represented by an skb into the # of necessary WRs.
- *
- * The max. length of an skb is controlled by the max pdu size which is ~16K.
- * Also, assume the min. fragment length is the sector size (512), then add
- * extra fragment counts for iscsi bhs and payload padding.
+ * The extra two fragments are for iscsi bhs and payload padding.
  */
-#define SKB_WR_LIST_SIZE   (16384/512 + 3)
+#define SKB_WR_LIST_SIZE   (MAX_SKB_FRAGS + 2)
 static unsigned int skb_wrs[SKB_WR_LIST_SIZE] __read_mostly;
 
 static void s3_init_wr_tab(unsigned int wr_len)
@@ -485,7 +482,7 @@ static void s3_init_wr_tab(unsigned int wr_len)
 
 static inline void reset_wr_list(struct s3_conn *c3cn)
 {
-   c3cn->wr_pending_head = NULL;
+   c3cn->wr_pending_head = c3cn->wr_pending_tail = NULL;
 }
 
 /*
@@ -496,7 +493,7 @@ static inline void reset_wr_list(struct s3_conn *c3cn)
 static inline void enqueue_wr(struct s3_conn *c3cn,
  struct sk_buff *skb)
 {
-   skb_wr_data(skb) = NULL;
+   skb_tx_wr_next(skb) = NULL;
 
/*
 * We want to take an extra reference since both us and the driver
@@ -509,10 +506,22 @@ static inline void enqueue_wr(struct s3_conn *c3cn,
if (!c3cn->wr_pending_head)
c3cn->wr_pending_head = skb;
else
-   skb_wr_data(skb) = skb;
+   skb_tx_wr_next(c3cn->wr_pending_tail) = skb;
c3cn->wr_pending_tail = skb;
 }
 
+static int count_pending_wrs(struct s3_conn *c3cn)
+{
+   int n = 0;
+   const struct sk_buff *skb = c3cn->wr_pending_head;
+
+   while (skb) {
+   n += skb->csum;
+   skb = skb_tx_wr_next(skb);
+   }
+   return n;
+}
+
 static inline struct sk_buff *peek_wr(const struct s3_conn *c3cn)
 {
return c3cn->wr_pending_head;
@@ -529,8 +538,8 @@ static inline struct sk_buff *dequeue_wr(struct s3_conn 
*c3cn)
 
if (likely(skb)) {
/* Don't bother clearing the tail */
-   c3cn->wr_pending_head = skb_wr_data(skb);
-   skb_wr_data(skb) = NULL;
+   c3cn->wr_pending_head = skb_tx_wr_next(skb);
+   skb_tx_wr_next(skb) = NULL;
}
return skb;
 }
@@ -543,13 +552,14 @@ static void purge_wr_queue(struct s3_conn *c3cn)
 }
 
 static inline void make_tx_data_wr(struct s3_conn *c3cn, struct sk_buff *skb,
-  int len)
+  int len, int req_completion)
 {
struct tx_data_wr