Re: [PATCH 2/2] ehea: NAPI multi queue TX/RX path for SMP

2007-05-01 Thread Michael Ellerman
On Wed, 2007-02-28 at 18:34 +0100, Jan-Bernd Themann wrote:
> This patch provides a functionality that allows parallel 
> RX processing on multiple RX queues by using dummy netdevices.
> 
> 
> Signed-off-by: Jan-Bernd Themann <[EMAIL PROTECTED]>
> ---

> @@ -1789,6 +1798,22 @@ static void ehea_xmit3(struct sk_buff *s
>   dev_kfree_skb(skb);
>  }
>  
> +static inline int ehea_hash_skb(struct sk_buff *skb, int num_qps)
> +{
> + struct tcphdr *tcp;
> + u32 tmp;
> +
> + if ((skb->protocol == htons(ETH_P_IP)) &&
> + (skb->nh.iph->protocol == IPPROTO_TCP)) {

This breaks the build, looks like skb->nh went away:
b0e380b1d8a8e0aca215df97702f99815f05c094

/scratch/michael/kisskb-build/src/drivers/net/ehea/ehea_main.c:1806: error: 
'struct sk_buff' has no member named 'nh'
/scratch/michael/kisskb-build/src/drivers/net/ehea/ehea_main.c:1807: error: 
'struct sk_buff' has no member named 'nh'
/scratch/michael/kisskb-build/src/drivers/net/ehea/ehea_main.c:1807: error: 
'struct sk_buff' has no member named 'nh'
/scratch/michael/kisskb-build/src/drivers/net/ehea/ehea_main.c:1809: error: 
'struct sk_buff' has no member named 'nh'

cheers

-- 
Michael Ellerman
OzLabs, IBM Australia Development Lab

wwweb: http://michael.ellerman.id.au
phone: +61 2 6212 1183 (tie line 70 21183)

We do not inherit the earth from our ancestors,
we borrow it from our children. - S.M.A.R.T Person


signature.asc
Description: This is a digitally signed message part


[PATCH 2/2] ehea: NAPI multi queue TX/RX path for SMP

2007-02-28 Thread Jan-Bernd Themann
This patch provides a functionality that allows parallel 
RX processing on multiple RX queues by using dummy netdevices.


Signed-off-by: Jan-Bernd Themann <[EMAIL PROTECTED]>
---


diff -Nurp -X dontdiff linux-2.6.21-rc1/drivers/net/ehea/ehea.h 
patched_kernel/drivers/net/ehea/ehea.h
--- linux-2.6.21-rc1/drivers/net/ehea/ehea.h2007-02-28 18:20:06.0 
+0100
+++ patched_kernel/drivers/net/ehea/ehea.h  2007-02-28 18:21:23.0 
+0100
@@ -39,7 +39,7 @@
 #include 
 
 #define DRV_NAME   "ehea"
-#define DRV_VERSION"EHEA_0048"
+#define DRV_VERSION"EHEA_0052"
 
 #define EHEA_MSG_DEFAULT (NETIF_MSG_LINK | NETIF_MSG_TIMER \
| NETIF_MSG_RX_ERR | NETIF_MSG_TX_ERR)
@@ -78,8 +78,6 @@
 #define EHEA_RQ2_PKT_SIZE   1522
 #define EHEA_L_PKT_SIZE 256/* low latency */
 
-#define EHEA_POLL_MAX_RWQE  1000
-
 /* Send completion signaling */
 #define EHEA_SIG_IV_LONG   1
 
@@ -357,8 +355,8 @@ struct ehea_port_res {
struct ehea_qp *qp;
struct ehea_cq *send_cq;
struct ehea_cq *recv_cq;
-   struct ehea_eq *send_eq;
-   struct ehea_eq *recv_eq;
+   struct ehea_eq *eq;
+   struct net_device *d_netdev;
spinlock_t send_lock;
struct ehea_q_skb_arr rq1_skba;
struct ehea_q_skb_arr rq2_skba;
@@ -372,7 +370,6 @@ struct ehea_port_res {
int swqe_count;
u32 swqe_id_counter;
u64 tx_packets;
-   struct tasklet_struct send_comp_task;
spinlock_t recv_lock;
struct port_state p_state;
u64 rx_packets;
@@ -416,7 +413,9 @@ struct ehea_port {
char int_aff_name[EHEA_IRQ_NAME_SIZE];
int allmulti;/* Indicates IFF_ALLMULTI state */
int promisc; /* Indicates IFF_PROMISC state */
+   int num_tx_qps;
int num_add_tx_qps;
+   int num_mcs;
int resets;
u64 mac_addr;
u32 logical_port_id;
diff -Nurp -X dontdiff linux-2.6.21-rc1/drivers/net/ehea/ehea_main.c 
patched_kernel/drivers/net/ehea/ehea_main.c
--- linux-2.6.21-rc1/drivers/net/ehea/ehea_main.c   2007-02-28 
18:20:06.0 +0100
+++ patched_kernel/drivers/net/ehea/ehea_main.c 2007-02-28 18:21:29.0 
+0100
@@ -51,13 +51,18 @@ static int rq1_entries = EHEA_DEF_ENTRIE
 static int rq2_entries = EHEA_DEF_ENTRIES_RQ2;
 static int rq3_entries = EHEA_DEF_ENTRIES_RQ3;
 static int sq_entries = EHEA_DEF_ENTRIES_SQ;
+static int use_mcs = 0;
+static int num_tx_qps = EHEA_NUM_TX_QP;
 
 module_param(msg_level, int, 0);
 module_param(rq1_entries, int, 0);
 module_param(rq2_entries, int, 0);
 module_param(rq3_entries, int, 0);
 module_param(sq_entries, int, 0);
+module_param(use_mcs, int, 0);
+module_param(num_tx_qps, int, 0);
 
+MODULE_PARM_DESC(num_tx_qps, "Number of TX-QPS");
 MODULE_PARM_DESC(msg_level, "msg_level");
 MODULE_PARM_DESC(rq3_entries, "Number of entries for Receive Queue 3 "
 "[2^x - 1], x = [6..14]. Default = "
@@ -71,6 +76,7 @@ MODULE_PARM_DESC(rq1_entries, "Number of
 MODULE_PARM_DESC(sq_entries, " Number of entries for the Send Queue  "
 "[2^x - 1], x = [6..14]. Default = "
 __MODULE_STRING(EHEA_DEF_ENTRIES_SQ) ")");
+MODULE_PARM_DESC(use_mcs, " 0:NAPI, 1:Multiple receive queues, Default = 1 ");
 
 void ehea_dump(void *adr, int len, char *msg) {
int x;
@@ -197,7 +203,7 @@ static int ehea_refill_rq_def(struct ehe
struct sk_buff *skb = netdev_alloc_skb(dev, packet_size);
if (!skb) {
ehea_error("%s: no mem for skb/%d wqes filled",
-  dev->name, i);
+  pr->port->netdev->name, i);
q_skba->os_skbs = fill_wqes - i;
ret = -ENOMEM;
break;
@@ -345,10 +351,11 @@ static int ehea_treat_poll_error(struct 
return 0;
 }
 
-static int ehea_poll(struct net_device *dev, int *budget)
+static struct ehea_cqe *ehea_proc_rwqes(struct net_device *dev,
+   struct ehea_port_res *pr,
+   int *budget)
 {
-   struct ehea_port *port = netdev_priv(dev);
-   struct ehea_port_res *pr = &port->port_res[0];
+   struct ehea_port *port = pr->port;
struct ehea_qp *qp = pr->qp;
struct ehea_cqe *cqe;
struct sk_buff *skb;
@@ -359,14 +366,12 @@ static int ehea_poll(struct net_device *
int skb_arr_rq2_len = pr->rq2_skba.len;
int skb_arr_rq3_len = pr->rq3_skba.len;
int processed, processed_rq1, processed_rq2, processed_rq3;
-   int wqe_index, last_wqe_index, rq, intreq, my_quota, port_reset;
+   int wqe_index, last_wqe_index, rq, my_quota, port_reset;
 
processed = processed_rq1 = processed_rq2 = processed_rq3 = 0;
last_wqe_index = 0;
my_quota = min(*budget, dev->quota);
-   my_quota = min(my_quota, EHEA_POLL_MAX_RWQE);
 
-   /* rq0 i

Re: [PATCH 2/2] ehea: NAPI multi queue TX/RX path for SMP

2007-02-28 Thread Jan-Bernd Themann
Hi,

> >  
> > +static inline int ehea_hash_skb(struct sk_buff *skb, int num_qps)
> > +{
> > +   u32 tmp;
> > +   if ((skb->nh.iph->protocol == IPPROTO_TCP)
> > +   && skb->protocol == ETH_P_IP) {
> 
> skb->protocol has network byte order. The ETH_P_IP test should also
> logically come before checking the IP protocol.
> 

fixed.

> > +   tmp = (skb->h.th->source + (skb->h.th->dest << 16)) % 31;
> 
> Only locally generated packets have a valid h.th pointer.
> 
good point. I'll fix that.

I'll send a new patch set later today

Thanks,
Jan-Bernd
-
To unsubscribe from this list: send the line "unsubscribe netdev" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Re: [PATCH 2/2] ehea: NAPI multi queue TX/RX path for SMP

2007-02-27 Thread Patrick McHardy
Jan-Bernd Themann wrote:
> This patch provides a functionality that allows parallel 
> RX processing on multiple RX queues by using dummy netdevices.
> 
>  
> +static inline int ehea_hash_skb(struct sk_buff *skb, int num_qps)
> +{
> + u32 tmp;
> + if ((skb->nh.iph->protocol == IPPROTO_TCP)
> + && skb->protocol == ETH_P_IP) {

skb->protocol has network byte order. The ETH_P_IP test should also
logically come before checking the IP protocol.

> + tmp = (skb->h.th->source + (skb->h.th->dest << 16)) % 31;

Only locally generated packets have a valid h.th pointer.

> + tmp += skb->nh.iph->daddr % 31;
> + return tmp % num_qps;
> + }
> + else
> + return 0;
> +}
> +
>  static int ehea_start_xmit(struct sk_buff *skb, struct net_device *dev)
>  {
>   struct ehea_port *port = netdev_priv(dev);
> @@ -1796,9 +1818,18 @@ static int ehea_start_xmit(struct sk_buf
>   unsigned long flags;
>   u32 lkey;
>   int swqe_index;
> - struct ehea_port_res *pr = &port->port_res[0];
> + struct ehea_port_res *pr;
> +
> + pr = &port->port_res[ehea_hash_skb(skb, port->num_tx_qps)];
> +

-
To unsubscribe from this list: send the line "unsubscribe netdev" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[PATCH 2/2] ehea: NAPI multi queue TX/RX path for SMP

2007-02-27 Thread Jan-Bernd Themann
This patch provides a functionality that allows parallel 
RX processing on multiple RX queues by using dummy netdevices.


Signed-off-by: Jan-Bernd Themann <[EMAIL PROTECTED]>
---


diff -Nurp -X dontdiff linux-2.6.21-rc1/drivers/net/ehea/ehea.h 
patched_kernel/drivers/net/ehea/ehea.h
--- linux-2.6.21-rc1/drivers/net/ehea/ehea.h2007-02-26 16:17:14.0 
+0100
+++ patched_kernel/drivers/net/ehea/ehea.h  2007-02-27 15:18:24.0 
+0100
@@ -39,7 +39,7 @@
 #include 
 
 #define DRV_NAME   "ehea"
-#define DRV_VERSION"EHEA_0048"
+#define DRV_VERSION"EHEA_0051"
 
 #define EHEA_MSG_DEFAULT (NETIF_MSG_LINK | NETIF_MSG_TIMER \
| NETIF_MSG_RX_ERR | NETIF_MSG_TX_ERR)
@@ -78,8 +78,6 @@
 #define EHEA_RQ2_PKT_SIZE   1522
 #define EHEA_L_PKT_SIZE 256/* low latency */
 
-#define EHEA_POLL_MAX_RWQE  1000
-
 /* Send completion signaling */
 #define EHEA_SIG_IV_LONG   1
 
@@ -357,8 +355,8 @@ struct ehea_port_res {
struct ehea_qp *qp;
struct ehea_cq *send_cq;
struct ehea_cq *recv_cq;
-   struct ehea_eq *send_eq;
-   struct ehea_eq *recv_eq;
+   struct ehea_eq *eq;
+   struct net_device *d_netdev;
spinlock_t send_lock;
struct ehea_q_skb_arr rq1_skba;
struct ehea_q_skb_arr rq2_skba;
@@ -372,7 +370,6 @@ struct ehea_port_res {
int swqe_count;
u32 swqe_id_counter;
u64 tx_packets;
-   struct tasklet_struct send_comp_task;
spinlock_t recv_lock;
struct port_state p_state;
u64 rx_packets;
@@ -416,7 +413,9 @@ struct ehea_port {
char int_aff_name[EHEA_IRQ_NAME_SIZE];
int allmulti;/* Indicates IFF_ALLMULTI state */
int promisc; /* Indicates IFF_PROMISC state */
+   int num_tx_qps;
int num_add_tx_qps;
+   int num_mcs;
int resets;
u64 mac_addr;
u32 logical_port_id;
diff -Nurp -X dontdiff linux-2.6.21-rc1/drivers/net/ehea/ehea_main.c 
patched_kernel/drivers/net/ehea/ehea_main.c
--- linux-2.6.21-rc1/drivers/net/ehea/ehea_main.c   2007-02-26 
16:17:14.0 +0100
+++ patched_kernel/drivers/net/ehea/ehea_main.c 2007-02-27 15:18:30.0 
+0100
@@ -51,13 +51,18 @@ static int rq1_entries = EHEA_DEF_ENTRIE
 static int rq2_entries = EHEA_DEF_ENTRIES_RQ2;
 static int rq3_entries = EHEA_DEF_ENTRIES_RQ3;
 static int sq_entries = EHEA_DEF_ENTRIES_SQ;
+static int use_mcs = 0;
+static int num_tx_qps = EHEA_NUM_TX_QP;
 
 module_param(msg_level, int, 0);
 module_param(rq1_entries, int, 0);
 module_param(rq2_entries, int, 0);
 module_param(rq3_entries, int, 0);
 module_param(sq_entries, int, 0);
+module_param(use_mcs, int, 0);
+module_param(num_tx_qps, int, 0);
 
+MODULE_PARM_DESC(num_tx_qps, "Number of TX-QPS");
 MODULE_PARM_DESC(msg_level, "msg_level");
 MODULE_PARM_DESC(rq3_entries, "Number of entries for Receive Queue 3 "
 "[2^x - 1], x = [6..14]. Default = "
@@ -71,6 +76,7 @@ MODULE_PARM_DESC(rq1_entries, "Number of
 MODULE_PARM_DESC(sq_entries, " Number of entries for the Send Queue  "
 "[2^x - 1], x = [6..14]. Default = "
 __MODULE_STRING(EHEA_DEF_ENTRIES_SQ) ")");
+MODULE_PARM_DESC(use_mcs, " 0:NAPI, 1:Multiple receive queues, Default = 1 ");
 
 void ehea_dump(void *adr, int len, char *msg) {
int x;
@@ -197,7 +203,7 @@ static int ehea_refill_rq_def(struct ehe
struct sk_buff *skb = netdev_alloc_skb(dev, packet_size);
if (!skb) {
ehea_error("%s: no mem for skb/%d wqes filled",
-  dev->name, i);
+  pr->port->netdev->name, i);
q_skba->os_skbs = fill_wqes - i;
ret = -ENOMEM;
break;
@@ -345,10 +351,11 @@ static int ehea_treat_poll_error(struct 
return 0;
 }
 
-static int ehea_poll(struct net_device *dev, int *budget)
+static struct ehea_cqe *ehea_proc_rwqes(struct net_device *dev,
+   struct ehea_port_res *pr,
+   int *budget)
 {
-   struct ehea_port *port = netdev_priv(dev);
-   struct ehea_port_res *pr = &port->port_res[0];
+   struct ehea_port *port = pr->port;
struct ehea_qp *qp = pr->qp;
struct ehea_cqe *cqe;
struct sk_buff *skb;
@@ -359,14 +366,12 @@ static int ehea_poll(struct net_device *
int skb_arr_rq2_len = pr->rq2_skba.len;
int skb_arr_rq3_len = pr->rq3_skba.len;
int processed, processed_rq1, processed_rq2, processed_rq3;
-   int wqe_index, last_wqe_index, rq, intreq, my_quota, port_reset;
+   int wqe_index, last_wqe_index, rq, my_quota, port_reset;
 
processed = processed_rq1 = processed_rq2 = processed_rq3 = 0;
last_wqe_index = 0;
my_quota = min(*budget, dev->quota);
-   my_quota = min(my_quota, EHEA_POLL_MAX_RWQE);
 
-   /* rq0 i