Merge branch 'master' of git://git.kernel.org/pub/scm/linux/kernel/git/jkirsher/net
Jeff Kirsher says: ==================== Intel Wired LAN Driver Updates 2014-10-16 This series contains updates to fm10k and ixgbe. Matthew provides two fixes for fm10k, first sets the flag to fetch the host state before kicking off the service task that reads the host state when bringing the interface up. The second makes sure that we release the mailbox lock after detecting an error and before we return the error code. Andy Zhou provides a compile fix for fm10k, when the driver is compiled into the kernel and the VXLAN driver is compiled as a module. Emil provides a fix for ixgbe to prevent against a panic by trying to dereference a NULL pointer in ixgbe_ndo_set_vf_spoofchk(). ==================== Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
Коммит
3331177cbd
|
@ -320,4 +320,15 @@ config FM10K
|
|||
To compile this driver as a module, choose M here. The module
|
||||
will be called fm10k. MSI-X interrupt support is required
|
||||
|
||||
config FM10K_VXLAN
|
||||
bool "Virtual eXtensible Local Area Network Support"
|
||||
default n
|
||||
depends on FM10K && VXLAN && !(FM10K=y && VXLAN=m)
|
||||
---help---
|
||||
This allows one to create VXLAN virtual interfaces that provide
|
||||
Layer 2 Networks over Layer 3 Networks. VXLAN is often used
|
||||
to tunnel virtual network infrastructure in virtualized environments.
|
||||
Say Y here if you want to use Virtual eXtensible Local Area Network
|
||||
(VXLAN) in the driver.
|
||||
|
||||
endif # NET_VENDOR_INTEL
|
||||
|
|
|
@ -20,9 +20,9 @@
|
|||
|
||||
#include "fm10k.h"
|
||||
#include <linux/vmalloc.h>
|
||||
#if IS_ENABLED(CONFIG_VXLAN)
|
||||
#if IS_ENABLED(CONFIG_FM10K_VXLAN)
|
||||
#include <net/vxlan.h>
|
||||
#endif /* CONFIG_VXLAN */
|
||||
#endif /* CONFIG_FM10K_VXLAN */
|
||||
|
||||
/**
|
||||
* fm10k_setup_tx_resources - allocate Tx resources (Descriptors)
|
||||
|
@ -556,7 +556,7 @@ int fm10k_open(struct net_device *netdev)
|
|||
if (err)
|
||||
goto err_set_queues;
|
||||
|
||||
#if IS_ENABLED(CONFIG_VXLAN)
|
||||
#if IS_ENABLED(CONFIG_FM10K_VXLAN)
|
||||
/* update VXLAN port configuration */
|
||||
vxlan_get_rx_port(netdev);
|
||||
|
||||
|
@ -785,14 +785,14 @@ static int fm10k_update_vid(struct net_device *netdev, u16 vid, bool set)
|
|||
if (!(netdev->flags & IFF_PROMISC)) {
|
||||
err = hw->mac.ops.update_vlan(hw, vid, 0, set);
|
||||
if (err)
|
||||
return err;
|
||||
goto err_out;
|
||||
}
|
||||
|
||||
/* update our base MAC address */
|
||||
err = hw->mac.ops.update_uc_addr(hw, interface->glort, hw->mac.addr,
|
||||
vid, set, 0);
|
||||
if (err)
|
||||
return err;
|
||||
goto err_out;
|
||||
|
||||
/* set vid prior to syncing/unsyncing the VLAN */
|
||||
interface->vid = vid + (set ? VLAN_N_VID : 0);
|
||||
|
@ -801,9 +801,10 @@ static int fm10k_update_vid(struct net_device *netdev, u16 vid, bool set)
|
|||
__dev_uc_unsync(netdev, fm10k_uc_vlan_unsync);
|
||||
__dev_mc_unsync(netdev, fm10k_mc_vlan_unsync);
|
||||
|
||||
err_out:
|
||||
fm10k_mbx_unlock(interface);
|
||||
|
||||
return 0;
|
||||
return err;
|
||||
}
|
||||
|
||||
static int fm10k_vlan_rx_add_vid(struct net_device *netdev,
|
||||
|
|
|
@ -1489,6 +1489,7 @@ void fm10k_up(struct fm10k_intfc *interface)
|
|||
netif_tx_start_all_queues(interface->netdev);
|
||||
|
||||
/* kick off the service timer */
|
||||
hw->mac.get_host_state = 1;
|
||||
mod_timer(&interface->service_timer, jiffies);
|
||||
}
|
||||
|
||||
|
|
|
@ -1261,6 +1261,9 @@ int ixgbe_ndo_set_vf_spoofchk(struct net_device *netdev, int vf, bool setting)
|
|||
struct ixgbe_hw *hw = &adapter->hw;
|
||||
u32 regval;
|
||||
|
||||
if (vf >= adapter->num_vfs)
|
||||
return -EINVAL;
|
||||
|
||||
adapter->vfinfo[vf].spoofchk_enabled = setting;
|
||||
|
||||
regval = IXGBE_READ_REG(hw, IXGBE_PFVFSPOOF(vf_target_reg));
|
||||
|
|
|
@ -1437,9 +1437,6 @@ static int neigh_reduce(struct net_device *dev, struct sk_buff *skb)
|
|||
if (!in6_dev)
|
||||
goto out;
|
||||
|
||||
if (!pskb_may_pull(skb, skb->len))
|
||||
goto out;
|
||||
|
||||
iphdr = ipv6_hdr(skb);
|
||||
saddr = &iphdr->saddr;
|
||||
daddr = &iphdr->daddr;
|
||||
|
@ -1668,6 +1665,8 @@ static void vxlan_encap_bypass(struct sk_buff *skb, struct vxlan_dev *src_vxlan,
|
|||
struct pcpu_sw_netstats *tx_stats, *rx_stats;
|
||||
union vxlan_addr loopback;
|
||||
union vxlan_addr *remote_ip = &dst_vxlan->default_dst.remote_ip;
|
||||
struct net_device *dev = skb->dev;
|
||||
int len = skb->len;
|
||||
|
||||
tx_stats = this_cpu_ptr(src_vxlan->dev->tstats);
|
||||
rx_stats = this_cpu_ptr(dst_vxlan->dev->tstats);
|
||||
|
@ -1691,16 +1690,16 @@ static void vxlan_encap_bypass(struct sk_buff *skb, struct vxlan_dev *src_vxlan,
|
|||
|
||||
u64_stats_update_begin(&tx_stats->syncp);
|
||||
tx_stats->tx_packets++;
|
||||
tx_stats->tx_bytes += skb->len;
|
||||
tx_stats->tx_bytes += len;
|
||||
u64_stats_update_end(&tx_stats->syncp);
|
||||
|
||||
if (netif_rx(skb) == NET_RX_SUCCESS) {
|
||||
u64_stats_update_begin(&rx_stats->syncp);
|
||||
rx_stats->rx_packets++;
|
||||
rx_stats->rx_bytes += skb->len;
|
||||
rx_stats->rx_bytes += len;
|
||||
u64_stats_update_end(&rx_stats->syncp);
|
||||
} else {
|
||||
skb->dev->stats.rx_dropped++;
|
||||
dev->stats.rx_dropped++;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -1878,7 +1877,8 @@ static netdev_tx_t vxlan_xmit(struct sk_buff *skb, struct net_device *dev)
|
|||
return arp_reduce(dev, skb);
|
||||
#if IS_ENABLED(CONFIG_IPV6)
|
||||
else if (ntohs(eth->h_proto) == ETH_P_IPV6 &&
|
||||
skb->len >= sizeof(struct ipv6hdr) + sizeof(struct nd_msg) &&
|
||||
pskb_may_pull(skb, sizeof(struct ipv6hdr)
|
||||
+ sizeof(struct nd_msg)) &&
|
||||
ipv6_hdr(skb)->nexthdr == IPPROTO_ICMPV6) {
|
||||
struct nd_msg *msg;
|
||||
|
||||
|
|
|
@ -30,7 +30,7 @@
|
|||
|
||||
/**
|
||||
* struct geneve_port - Keeps track of open UDP ports
|
||||
* @sock: The socket created for this port number.
|
||||
* @gs: The socket created for this port number.
|
||||
* @name: vport name.
|
||||
*/
|
||||
struct geneve_port {
|
||||
|
|
|
@ -408,13 +408,13 @@ int ovs_vport_get_upcall_portids(const struct vport *vport,
|
|||
*
|
||||
* Returns the portid of the target socket. Must be called with rcu_read_lock.
|
||||
*/
|
||||
u32 ovs_vport_find_upcall_portid(const struct vport *p, struct sk_buff *skb)
|
||||
u32 ovs_vport_find_upcall_portid(const struct vport *vport, struct sk_buff *skb)
|
||||
{
|
||||
struct vport_portids *ids;
|
||||
u32 ids_index;
|
||||
u32 hash;
|
||||
|
||||
ids = rcu_dereference(p->upcall_portids);
|
||||
ids = rcu_dereference(vport->upcall_portids);
|
||||
|
||||
if (ids->n_ids == 1 && ids->ids[0] == 0)
|
||||
return 0;
|
||||
|
|
Загрузка…
Ссылка в новой задаче