Enable configuring bonds on nes devices by adding missing support for master net_device to the driver
Signed-off-by: Maciej Sosnowski <[email protected]> --- kernel_patches/fixes/nes_0047_bonds.patch | 88 +++++++++++++++++++++++++++++ 1 files changed, 88 insertions(+), 0 deletions(-) diff --git a/kernel_patches/fixes/nes_0047_bonds.patch b/kernel_patches/fixes/nes_0047_bonds.patch new file mode 100644 index 0000000..d2141df --- /dev/null +++ b/kernel_patches/fixes/nes_0047_bonds.patch @@ -0,0 +1,88 @@ +diff --git a/drivers/infiniband/hw/nes/nes.c b/drivers/infiniband/hw/nes/nes.c +index 3817463..a7aea75 100644 +--- a/drivers/infiniband/hw/nes/nes.c ++++ b/drivers/infiniband/hw/nes/nes.c +@@ -145,6 +145,7 @@ static int nes_inetaddr_event(struct not + struct nes_device *nesdev; + struct net_device *netdev; + struct nes_vnic *nesvnic; ++ unsigned int is_bonded; + + nes_debug(NES_DBG_NETDEV, "nes_inetaddr_event: ip address %pI4, netmask %pI4.\n", + &ifa->ifa_address, &ifa->ifa_mask); +@@ -153,7 +154,8 @@ static int nes_inetaddr_event(struct not + nesdev, nesdev->netdev[0]->name); + netdev = nesdev->netdev[0]; + nesvnic = netdev_priv(netdev); +- if (netdev == event_netdev) { ++ is_bonded = (netdev->master == event_netdev); ++ if ((netdev == event_netdev) || is_bonded) { + if (nesvnic->rdma_enabled == 0) { + nes_debug(NES_DBG_NETDEV, "Returning without processing event for %s since" + " RDMA is not enabled.\n", +@@ -170,7 +172,10 @@ static int nes_inetaddr_event(struct not + nes_manage_arp_cache(netdev, netdev->dev_addr, + ntohl(nesvnic->local_ipaddr), NES_ARP_DELETE); + nesvnic->local_ipaddr = 0; +- return NOTIFY_OK; ++ if (is_bonded) ++ continue; ++ else ++ return NOTIFY_OK; + break; + case NETDEV_UP: + nes_debug(NES_DBG_NETDEV, "event:UP\n"); +@@ -179,15 +184,24 @@ static int nes_inetaddr_event(struct not + nes_debug(NES_DBG_NETDEV, "Interface already has local_ipaddr\n"); + return NOTIFY_OK; + } ++ /* fall through */ ++ case NETDEV_CHANGEADDR: + /* Add the address to the IP table */ +- nesvnic->local_ipaddr = ifa->ifa_address; ++ if (netdev->master) ++ nesvnic->local_ipaddr = ++ ((struct in_device *)netdev->master->ip_ptr)->ifa_list->ifa_address; ++ else ++ nesvnic->local_ipaddr = ifa->ifa_address; + + nes_write_indexed(nesdev, + NES_IDX_DST_IP_ADDR+(0x10*PCI_FUNC(nesdev->pcidev->devfn)), +- ntohl(ifa->ifa_address)); ++ ntohl(nesvnic->local_ipaddr)); + nes_manage_arp_cache(netdev, netdev->dev_addr, + ntohl(nesvnic->local_ipaddr), NES_ARP_ADD); +- return NOTIFY_OK; ++ if (is_bonded) ++ continue; ++ else ++ return NOTIFY_OK; + break; + default: + break; +diff --git a/drivers/infiniband/hw/nes/nes_cm.c b/drivers/infiniband/hw/nes/nes_cm.c +index 41b4fc2..f7edf6a 100644 +--- a/drivers/infiniband/hw/nes/nes_cm.c ++++ b/drivers/infiniband/hw/nes/nes_cm.c +@@ -1108,6 +1108,7 @@ static int nes_addr_resolve_neigh(struct + struct flowi fl; + struct neighbour *neigh; + int rc = arpindex; ++ struct net_device *netdev; + struct nes_adapter *nesadapter = nesvnic->nesdev->nesadapter; + + memset(&fl, 0, sizeof fl); +@@ -1118,7 +1119,12 @@ static int nes_addr_resolve_neigh(struct + return rc; + } + +- neigh = neigh_lookup(&arp_tbl, &rt->rt_gateway, nesvnic->netdev); ++ if (nesvnic->netdev->master) ++ netdev = nesvnic->netdev->master; ++ else ++ netdev = nesvnic->netdev; ++ ++ neigh = neigh_lookup(&arp_tbl, &rt->rt_gateway, netdev); + if (neigh) { + if (neigh->nud_state & NUD_VALID) { + if (arpindex >= 0) { _______________________________________________ ewg mailing list [email protected] http://lists.openfabrics.org/cgi-bin/mailman/listinfo/ewg
