ipvlan: misc changes
1. scope correction for few functions that are used in single file. 2. Adjust variables that are used in fast-path to fit into single cacheline 3. Update rcv_frame() to skip shared check for frames coming over wire Signed-off-by: Mahesh Bandewar <maheshb@google.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
e93fbc5a15
commit
ab5b7013db
@ -84,19 +84,19 @@ struct ipvl_addr {
|
|||||||
#define ip4addr ipu.ip4
|
#define ip4addr ipu.ip4
|
||||||
struct hlist_node hlnode; /* Hash-table linkage */
|
struct hlist_node hlnode; /* Hash-table linkage */
|
||||||
struct list_head anode; /* logical-interface linkage */
|
struct list_head anode; /* logical-interface linkage */
|
||||||
struct rcu_head rcu;
|
|
||||||
ipvl_hdr_type atype;
|
ipvl_hdr_type atype;
|
||||||
|
struct rcu_head rcu;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct ipvl_port {
|
struct ipvl_port {
|
||||||
struct net_device *dev;
|
struct net_device *dev;
|
||||||
struct hlist_head hlhead[IPVLAN_HASH_SIZE];
|
struct hlist_head hlhead[IPVLAN_HASH_SIZE];
|
||||||
struct list_head ipvlans;
|
struct list_head ipvlans;
|
||||||
struct rcu_head rcu;
|
u16 mode;
|
||||||
struct work_struct wq;
|
struct work_struct wq;
|
||||||
struct sk_buff_head backlog;
|
struct sk_buff_head backlog;
|
||||||
int count;
|
int count;
|
||||||
u16 mode;
|
struct rcu_head rcu;
|
||||||
};
|
};
|
||||||
|
|
||||||
static inline struct ipvl_port *ipvlan_port_get_rcu(const struct net_device *d)
|
static inline struct ipvl_port *ipvlan_port_get_rcu(const struct net_device *d)
|
||||||
@ -114,7 +114,6 @@ static inline struct ipvl_port *ipvlan_port_get_rtnl(const struct net_device *d)
|
|||||||
return rtnl_dereference(d->rx_handler_data);
|
return rtnl_dereference(d->rx_handler_data);
|
||||||
}
|
}
|
||||||
|
|
||||||
void ipvlan_adjust_mtu(struct ipvl_dev *ipvlan, struct net_device *dev);
|
|
||||||
void ipvlan_init_secret(void);
|
void ipvlan_init_secret(void);
|
||||||
unsigned int ipvlan_mac_hash(const unsigned char *addr);
|
unsigned int ipvlan_mac_hash(const unsigned char *addr);
|
||||||
rx_handler_result_t ipvlan_handle_frame(struct sk_buff **pskb);
|
rx_handler_result_t ipvlan_handle_frame(struct sk_buff **pskb);
|
||||||
@ -124,7 +123,5 @@ void ipvlan_ht_addr_add(struct ipvl_dev *ipvlan, struct ipvl_addr *addr);
|
|||||||
struct ipvl_addr *ipvlan_find_addr(const struct ipvl_dev *ipvlan,
|
struct ipvl_addr *ipvlan_find_addr(const struct ipvl_dev *ipvlan,
|
||||||
const void *iaddr, bool is_v6);
|
const void *iaddr, bool is_v6);
|
||||||
bool ipvlan_addr_busy(struct ipvl_port *port, void *iaddr, bool is_v6);
|
bool ipvlan_addr_busy(struct ipvl_port *port, void *iaddr, bool is_v6);
|
||||||
struct ipvl_addr *ipvlan_ht_addr_lookup(const struct ipvl_port *port,
|
|
||||||
const void *iaddr, bool is_v6);
|
|
||||||
void ipvlan_ht_addr_del(struct ipvl_addr *addr);
|
void ipvlan_ht_addr_del(struct ipvl_addr *addr);
|
||||||
#endif /* __IPVLAN_H */
|
#endif /* __IPVLAN_H */
|
||||||
|
@ -53,8 +53,8 @@ static u8 ipvlan_get_v4_hash(const void *iaddr)
|
|||||||
IPVLAN_HASH_MASK;
|
IPVLAN_HASH_MASK;
|
||||||
}
|
}
|
||||||
|
|
||||||
struct ipvl_addr *ipvlan_ht_addr_lookup(const struct ipvl_port *port,
|
static struct ipvl_addr *ipvlan_ht_addr_lookup(const struct ipvl_port *port,
|
||||||
const void *iaddr, bool is_v6)
|
const void *iaddr, bool is_v6)
|
||||||
{
|
{
|
||||||
struct ipvl_addr *addr;
|
struct ipvl_addr *addr;
|
||||||
u8 hash;
|
u8 hash;
|
||||||
@ -265,20 +265,25 @@ static int ipvlan_rcv_frame(struct ipvl_addr *addr, struct sk_buff **pskb,
|
|||||||
struct sk_buff *skb = *pskb;
|
struct sk_buff *skb = *pskb;
|
||||||
|
|
||||||
len = skb->len + ETH_HLEN;
|
len = skb->len + ETH_HLEN;
|
||||||
if (unlikely(!(dev->flags & IFF_UP))) {
|
/* Only packets exchanged between two local slaves need to have
|
||||||
kfree_skb(skb);
|
* device-up check as well as skb-share check.
|
||||||
goto out;
|
*/
|
||||||
|
if (local) {
|
||||||
|
if (unlikely(!(dev->flags & IFF_UP))) {
|
||||||
|
kfree_skb(skb);
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
|
||||||
|
skb = skb_share_check(skb, GFP_ATOMIC);
|
||||||
|
if (!skb)
|
||||||
|
goto out;
|
||||||
|
|
||||||
|
*pskb = skb;
|
||||||
}
|
}
|
||||||
|
|
||||||
skb = skb_share_check(skb, GFP_ATOMIC);
|
|
||||||
if (!skb)
|
|
||||||
goto out;
|
|
||||||
|
|
||||||
*pskb = skb;
|
|
||||||
skb->dev = dev;
|
skb->dev = dev;
|
||||||
skb->pkt_type = PACKET_HOST;
|
|
||||||
|
|
||||||
if (local) {
|
if (local) {
|
||||||
|
skb->pkt_type = PACKET_HOST;
|
||||||
if (dev_forward_skb(ipvlan->dev, skb) == NET_RX_SUCCESS)
|
if (dev_forward_skb(ipvlan->dev, skb) == NET_RX_SUCCESS)
|
||||||
success = true;
|
success = true;
|
||||||
} else {
|
} else {
|
||||||
|
@ -9,7 +9,7 @@
|
|||||||
|
|
||||||
#include "ipvlan.h"
|
#include "ipvlan.h"
|
||||||
|
|
||||||
void ipvlan_adjust_mtu(struct ipvl_dev *ipvlan, struct net_device *dev)
|
static void ipvlan_adjust_mtu(struct ipvl_dev *ipvlan, struct net_device *dev)
|
||||||
{
|
{
|
||||||
ipvlan->dev->mtu = dev->mtu - ipvlan->mtu_adj;
|
ipvlan->dev->mtu = dev->mtu - ipvlan->mtu_adj;
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user