Commit 00dad5e4 authored by David S. Miller's avatar David S. Miller

Merge branch 'master' of master.kernel.org:/pub/scm/linux/kernel/git/davem/net-2.6

Conflicts:
	drivers/net/e1000e/hw.h
	net/bridge/br_device.c
	net/bridge/br_input.c
parents c477d044 3a3dfb06
...@@ -312,7 +312,7 @@ enum e1e_registers { ...@@ -312,7 +312,7 @@ enum e1e_registers {
#define E1000_KMRNCTRLSTA_INBAND_PARAM 0x9 /* Kumeran InBand Parameters */ #define E1000_KMRNCTRLSTA_INBAND_PARAM 0x9 /* Kumeran InBand Parameters */
#define E1000_KMRNCTRLSTA_DIAG_NELPBK 0x1000 /* Nearend Loopback mode */ #define E1000_KMRNCTRLSTA_DIAG_NELPBK 0x1000 /* Nearend Loopback mode */
#define E1000_KMRNCTRLSTA_K1_CONFIG 0x7 #define E1000_KMRNCTRLSTA_K1_CONFIG 0x7
#define E1000_KMRNCTRLSTA_K1_ENABLE 0x140E #define E1000_KMRNCTRLSTA_K1_ENABLE 0x0002
#define E1000_KMRNCTRLSTA_HD_CTRL 0x0002 #define E1000_KMRNCTRLSTA_HD_CTRL 0x0002
#define IFE_PHY_EXTENDED_STATUS_CONTROL 0x10 #define IFE_PHY_EXTENDED_STATUS_CONTROL 0x10
......
...@@ -22,7 +22,7 @@ ...@@ -22,7 +22,7 @@
#include <asm/uaccess.h> #include <asm/uaccess.h>
#include "br_private.h" #include "br_private.h"
/* net device transmit always called with no BH (preempt_disabled) */ /* net device transmit always called with BH disabled */
netdev_tx_t br_dev_xmit(struct sk_buff *skb, struct net_device *dev) netdev_tx_t br_dev_xmit(struct sk_buff *skb, struct net_device *dev)
{ {
struct net_bridge *br = netdev_priv(dev); struct net_bridge *br = netdev_priv(dev);
...@@ -48,13 +48,16 @@ netdev_tx_t br_dev_xmit(struct sk_buff *skb, struct net_device *dev) ...@@ -48,13 +48,16 @@ netdev_tx_t br_dev_xmit(struct sk_buff *skb, struct net_device *dev)
skb_reset_mac_header(skb); skb_reset_mac_header(skb);
skb_pull(skb, ETH_HLEN); skb_pull(skb, ETH_HLEN);
rcu_read_lock();
if (is_multicast_ether_addr(dest)) { if (is_multicast_ether_addr(dest)) {
if (unlikely(netpoll_tx_running(dev))) { if (unlikely(netpoll_tx_running(dev))) {
br_flood_deliver(br, skb); br_flood_deliver(br, skb);
goto out; goto out;
} }
if (br_multicast_rcv(br, NULL, skb)) if (br_multicast_rcv(br, NULL, skb)) {
kfree_skb(skb);
goto out; goto out;
}
mdst = br_mdb_get(br, skb); mdst = br_mdb_get(br, skb);
if (mdst || BR_INPUT_SKB_CB_MROUTERS_ONLY(skb)) if (mdst || BR_INPUT_SKB_CB_MROUTERS_ONLY(skb))
...@@ -67,6 +70,7 @@ netdev_tx_t br_dev_xmit(struct sk_buff *skb, struct net_device *dev) ...@@ -67,6 +70,7 @@ netdev_tx_t br_dev_xmit(struct sk_buff *skb, struct net_device *dev)
br_flood_deliver(br, skb); br_flood_deliver(br, skb);
out: out:
rcu_read_unlock();
return NETDEV_TX_OK; return NETDEV_TX_OK;
} }
......
...@@ -214,7 +214,7 @@ void br_fdb_delete_by_port(struct net_bridge *br, ...@@ -214,7 +214,7 @@ void br_fdb_delete_by_port(struct net_bridge *br,
spin_unlock_bh(&br->hash_lock); spin_unlock_bh(&br->hash_lock);
} }
/* No locking or refcounting, assumes caller has no preempt (rcu_read_lock) */ /* No locking or refcounting, assumes caller has rcu_read_lock */
struct net_bridge_fdb_entry *__br_fdb_get(struct net_bridge *br, struct net_bridge_fdb_entry *__br_fdb_get(struct net_bridge *br,
const unsigned char *addr) const unsigned char *addr)
{ {
......
...@@ -39,7 +39,7 @@ static int br_pass_frame_up(struct sk_buff *skb) ...@@ -39,7 +39,7 @@ static int br_pass_frame_up(struct sk_buff *skb)
netif_receive_skb); netif_receive_skb);
} }
/* note: already called with rcu_read_lock (preempt_disabled) */ /* note: already called with rcu_read_lock */
int br_handle_frame_finish(struct sk_buff *skb) int br_handle_frame_finish(struct sk_buff *skb)
{ {
const unsigned char *dest = eth_hdr(skb)->h_dest; const unsigned char *dest = eth_hdr(skb)->h_dest;
...@@ -110,7 +110,7 @@ int br_handle_frame_finish(struct sk_buff *skb) ...@@ -110,7 +110,7 @@ int br_handle_frame_finish(struct sk_buff *skb)
goto out; goto out;
} }
/* note: already called with rcu_read_lock (preempt_disabled) */ /* note: already called with rcu_read_lock */
static int br_handle_local_finish(struct sk_buff *skb) static int br_handle_local_finish(struct sk_buff *skb)
{ {
struct net_bridge_port *p = br_port_get_rcu(skb->dev); struct net_bridge_port *p = br_port_get_rcu(skb->dev);
...@@ -133,8 +133,7 @@ static inline int is_link_local(const unsigned char *dest) ...@@ -133,8 +133,7 @@ static inline int is_link_local(const unsigned char *dest)
/* /*
* Return NULL if skb is handled * Return NULL if skb is handled
* note: already called with rcu_read_lock (preempt_disabled) from * note: already called with rcu_read_lock
* netif_receive_skb
*/ */
struct sk_buff *br_handle_frame(struct sk_buff *skb) struct sk_buff *br_handle_frame(struct sk_buff *skb)
{ {
......
...@@ -131,7 +131,7 @@ void br_send_tcn_bpdu(struct net_bridge_port *p) ...@@ -131,7 +131,7 @@ void br_send_tcn_bpdu(struct net_bridge_port *p)
/* /*
* Called from llc. * Called from llc.
* *
* NO locks, but rcu_read_lock (preempt_disabled) * NO locks, but rcu_read_lock
*/ */
void br_stp_rcv(const struct stp_proto *proto, struct sk_buff *skb, void br_stp_rcv(const struct stp_proto *proto, struct sk_buff *skb,
struct net_device *dev) struct net_device *dev)
......
...@@ -2187,6 +2187,8 @@ static int do_tcp_setsockopt(struct sock *sk, int level, ...@@ -2187,6 +2187,8 @@ static int do_tcp_setsockopt(struct sock *sk, int level,
GFP_KERNEL); GFP_KERNEL);
if (cvp == NULL) if (cvp == NULL)
return -ENOMEM; return -ENOMEM;
kref_init(&cvp->kref);
} }
lock_sock(sk); lock_sock(sk);
tp->rx_opt.cookie_in_always = tp->rx_opt.cookie_in_always =
...@@ -2201,12 +2203,11 @@ static int do_tcp_setsockopt(struct sock *sk, int level, ...@@ -2201,12 +2203,11 @@ static int do_tcp_setsockopt(struct sock *sk, int level,
*/ */
kref_put(&tp->cookie_values->kref, kref_put(&tp->cookie_values->kref,
tcp_cookie_values_release); tcp_cookie_values_release);
kref_init(&cvp->kref);
tp->cookie_values = cvp;
} else { } else {
cvp = tp->cookie_values; cvp = tp->cookie_values;
} }
} }
if (cvp != NULL) { if (cvp != NULL) {
cvp->cookie_desired = ctd.tcpct_cookie_desired; cvp->cookie_desired = ctd.tcpct_cookie_desired;
...@@ -2220,6 +2221,8 @@ static int do_tcp_setsockopt(struct sock *sk, int level, ...@@ -2220,6 +2221,8 @@ static int do_tcp_setsockopt(struct sock *sk, int level,
cvp->s_data_desired = ctd.tcpct_s_data_desired; cvp->s_data_desired = ctd.tcpct_s_data_desired;
cvp->s_data_constant = 0; /* false */ cvp->s_data_constant = 0; /* false */
} }
tp->cookie_values = cvp;
} }
release_sock(sk); release_sock(sk);
return err; return err;
......
...@@ -218,6 +218,7 @@ static int tcf_nat(struct sk_buff *skb, struct tc_action *a, ...@@ -218,6 +218,7 @@ static int tcf_nat(struct sk_buff *skb, struct tc_action *a,
if (!pskb_may_pull(skb, ihl + sizeof(*icmph) + sizeof(*iph))) if (!pskb_may_pull(skb, ihl + sizeof(*icmph) + sizeof(*iph)))
goto drop; goto drop;
icmph = (void *)(skb_network_header(skb) + ihl);
iph = (void *)(icmph + 1); iph = (void *)(icmph + 1);
if (egress) if (egress)
addr = iph->daddr; addr = iph->daddr;
...@@ -246,7 +247,7 @@ static int tcf_nat(struct sk_buff *skb, struct tc_action *a, ...@@ -246,7 +247,7 @@ static int tcf_nat(struct sk_buff *skb, struct tc_action *a,
iph->saddr = new_addr; iph->saddr = new_addr;
inet_proto_csum_replace4(&icmph->checksum, skb, addr, new_addr, inet_proto_csum_replace4(&icmph->checksum, skb, addr, new_addr,
1); 0);
break; break;
} }
default: default:
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment