From de5871bda462f9822addea35d16e11c42bb3014b Mon Sep 17 00:00:00 2001 From: Jiri Pirko Date: Tue, 19 Jun 2012 05:54:06 +0000 Subject: [PATCH] --- yaml --- r: 314497 b: refs/heads/master c: 596e2024c42159fedf71b3d17fba78eed9b5bf10 h: refs/heads/master i: 314495: f33d7aeecf75aae74f3c6e090d0d4b9bfabf4bac v: v3 --- [refs] | 2 +- .../drivers/net/team/team_mode_loadbalance.c | 23 +++++++++++++------ 2 files changed, 17 insertions(+), 8 deletions(-) diff --git a/[refs] b/[refs] index 740253582382..5c4748b3a776 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: 5149ee58385bdfef260fb07a89a8ff0913be6b25 +refs/heads/master: 596e2024c42159fedf71b3d17fba78eed9b5bf10 diff --git a/trunk/drivers/net/team/team_mode_loadbalance.c b/trunk/drivers/net/team/team_mode_loadbalance.c index 6452428a1d6c..a475b1304f9a 100644 --- a/trunk/drivers/net/team/team_mode_loadbalance.c +++ b/trunk/drivers/net/team/team_mode_loadbalance.c @@ -27,18 +27,27 @@ static struct lb_priv *lb_priv(struct team *team) return (struct lb_priv *) &team->mode_priv; } -static bool lb_transmit(struct team *team, struct sk_buff *skb) +static unsigned char lb_get_skb_hash(struct lb_priv *lb_priv, + struct sk_buff *skb) { struct sk_filter *fp; + uint32_t lhash; + unsigned char *c; + + fp = rcu_dereference(lb_priv->fp); + if (unlikely(!fp)) + return 0; + lhash = SK_RUN_FILTER(fp, skb); + c = (char *) &lhash; + return c[0] ^ c[1] ^ c[2] ^ c[3]; +} + +static bool lb_transmit(struct team *team, struct sk_buff *skb) +{ struct team_port *port; - unsigned int hash; int port_index; - fp = rcu_dereference(lb_priv(team)->fp); - if (unlikely(!fp)) - goto drop; - hash = SK_RUN_FILTER(fp, skb); - port_index = hash % team->en_port_count; + port_index = lb_get_skb_hash(lb_priv(team), skb) % team->en_port_count; port = team_get_port_by_index_rcu(team, port_index); if (unlikely(!port)) goto drop;