Hi Sridhar, Thank you for the patch! Yet something to improve: [auto build test ERROR on net/master] [also build test ERROR on v4.17-rc1] [cannot apply to net-next/master next-20180420] [if your patch is applied to the wrong git tree, please drop us a note to help improve the system] url: https://github.com/0day-ci/linux/commits/Sridhar-Samudrala/Enable-virtio_net-to-act-as-a-standby-for-a-passthru-device/20180422-210557 config: x86_64-allyesdebian (attached as .config) compiler: gcc-7 (Debian 7.3.0-16) 7.3.0 reproduce: # save the attached .config to linux build tree make ARCH=x86_64 All error/warnings (new ones prefixed by >>): In file included from drivers/net/hyperv/netvsc_drv.c:46:0: include/net/failover.h:67:1: error: expected identifier or '(' before '{' token { ^ include/net/failover.h:78:16: warning: 'struct pfailover' declared inside parameter list will not be visible outside of this definition or declaration struct pfailover **pfailover); ^~~~~~~~~ include/net/failover.h:79:1: error: expected identifier or '(' before '{' token { ^ drivers/net/hyperv/netvsc_drv.c: In function 'netvsc_probe': >> drivers/net/hyperv/netvsc_drv.c:2020:5: error: passing argument 3 of 'failover_register' from incompatible pointer type [-Werror=incompatible-pointer-types] &net_device_ctx->failover); ^ In file included from drivers/net/hyperv/netvsc_drv.c:46:0: include/net/failover.h:77:5: note: expected 'struct pfailover **' but argument is of type 'struct failover **' int failover_register(struct net_device *standby_dev, struct failover_ops *ops, ^~~~~~~~~~~~~~~~~ drivers/net/hyperv/netvsc_drv.c: At top level: include/net/failover.h:65:5: warning: 'failover_create' declared 'static' but never defined [-Wunused-function] int failover_create(struct net_device *standby_dev, ^~~~~~~~~~~~~~~ >> include/net/failover.h:77:5: warning: 'failover_register' used but never defined int failover_register(struct net_device *standby_dev, struct failover_ops *ops, ^~~~~~~~~~~~~~~~~ cc1: some warnings being treated as errors -- In file included from drivers/net//hyperv/netvsc_drv.c:46:0: include/net/failover.h:67:1: error: expected identifier or '(' before '{' token { ^ include/net/failover.h:78:16: warning: 'struct pfailover' declared inside parameter list will not be visible outside of this definition or declaration struct pfailover **pfailover); ^~~~~~~~~ include/net/failover.h:79:1: error: expected identifier or '(' before '{' token { ^ drivers/net//hyperv/netvsc_drv.c: In function 'netvsc_probe': drivers/net//hyperv/netvsc_drv.c:2020:5: error: passing argument 3 of 'failover_register' from incompatible pointer type [-Werror=incompatible-pointer-types] &net_device_ctx->failover); ^ In file included from drivers/net//hyperv/netvsc_drv.c:46:0: include/net/failover.h:77:5: note: expected 'struct pfailover **' but argument is of type 'struct failover **' int failover_register(struct net_device *standby_dev, struct failover_ops *ops, ^~~~~~~~~~~~~~~~~ drivers/net//hyperv/netvsc_drv.c: At top level: include/net/failover.h:65:5: warning: 'failover_create' declared 'static' but never defined [-Wunused-function] int failover_create(struct net_device *standby_dev, ^~~~~~~~~~~~~~~ >> include/net/failover.h:77:5: warning: 'failover_register' used but never defined int failover_register(struct net_device *standby_dev, struct failover_ops *ops, ^~~~~~~~~~~~~~~~~ cc1: some warnings being treated as errors vim +/failover_register +2020 drivers/net/hyperv/netvsc_drv.c 1929 1930 static int netvsc_probe(struct hv_device *dev, 1931 const struct hv_vmbus_device_id *dev_id) 1932 { 1933 struct net_device *net = NULL; 1934 struct net_device_context *net_device_ctx; 1935 struct netvsc_device_info device_info; 1936 struct netvsc_device *nvdev; 1937 int ret = -ENOMEM; 1938 1939 net = alloc_etherdev_mq(sizeof(struct net_device_context), 1940 VRSS_CHANNEL_MAX); 1941 if (!net) 1942 goto no_net; 1943 1944 netif_carrier_off(net); 1945 1946 netvsc_init_settings(net); 1947 1948 net_device_ctx = netdev_priv(net); 1949 net_device_ctx->device_ctx = dev; 1950 net_device_ctx->msg_enable = netif_msg_init(debug, default_msg); 1951 if (netif_msg_probe(net_device_ctx)) 1952 netdev_dbg(net, "netvsc msg_enable: %d\n", 1953 net_device_ctx->msg_enable); 1954 1955 hv_set_drvdata(dev, net); 1956 1957 INIT_DELAYED_WORK(&net_device_ctx->dwork, netvsc_link_change); 1958 1959 spin_lock_init(&net_device_ctx->lock); 1960 INIT_LIST_HEAD(&net_device_ctx->reconfig_events); 1961 INIT_DELAYED_WORK(&net_device_ctx->vf_takeover, netvsc_vf_setup); 1962 1963 net_device_ctx->vf_stats 1964 = netdev_alloc_pcpu_stats(struct netvsc_vf_pcpu_stats); 1965 if (!net_device_ctx->vf_stats) 1966 goto no_stats; 1967 1968 net->netdev_ops = &device_ops; 1969 net->ethtool_ops = ðtool_ops; 1970 SET_NETDEV_DEV(net, &dev->device); 1971 1972 /* We always need headroom for rndis header */ 1973 net->needed_headroom = RNDIS_AND_PPI_SIZE; 1974 1975 /* Initialize the number of queues to be 1, we may change it if more 1976 * channels are offered later. 1977 */ 1978 netif_set_real_num_tx_queues(net, 1); 1979 netif_set_real_num_rx_queues(net, 1); 1980 1981 /* Notify the netvsc driver of the new device */ 1982 memset(&device_info, 0, sizeof(device_info)); 1983 device_info.num_chn = VRSS_CHANNEL_DEFAULT; 1984 device_info.send_sections = NETVSC_DEFAULT_TX; 1985 device_info.send_section_size = NETVSC_SEND_SECTION_SIZE; 1986 device_info.recv_sections = NETVSC_DEFAULT_RX; 1987 device_info.recv_section_size = NETVSC_RECV_SECTION_SIZE; 1988 1989 nvdev = rndis_filter_device_add(dev, &device_info); 1990 if (IS_ERR(nvdev)) { 1991 ret = PTR_ERR(nvdev); 1992 netdev_err(net, "unable to add netvsc device (ret %d)\n", ret); 1993 goto rndis_failed; 1994 } 1995 1996 memcpy(net->dev_addr, device_info.mac_adr, ETH_ALEN); 1997 1998 /* hw_features computed in rndis_netdev_set_hwcaps() */ 1999 net->features = net->hw_features | 2000 NETIF_F_HIGHDMA | NETIF_F_SG | 2001 NETIF_F_HW_VLAN_CTAG_TX | NETIF_F_HW_VLAN_CTAG_RX; 2002 net->vlan_features = net->features; 2003 2004 netdev_lockdep_set_classes(net); 2005 2006 /* MTU range: 68 - 1500 or 65521 */ 2007 net->min_mtu = NETVSC_MTU_MIN; 2008 if (nvdev->nvsp_version >= NVSP_PROTOCOL_VERSION_2) 2009 net->max_mtu = NETVSC_MTU - ETH_HLEN; 2010 else 2011 net->max_mtu = ETH_DATA_LEN; 2012 2013 ret = register_netdev(net); 2014 if (ret != 0) { 2015 pr_err("Unable to register netdev.\n"); 2016 goto register_failed; 2017 } 2018 2019 ret = failover_register(net, &netvsc_failover_ops, > 2020 &net_device_ctx->failover); 2021 if (ret != 0) 2022 goto err_failover; 2023 2024 return ret; 2025 2026 err_failover: 2027 unregister_netdev(net); 2028 register_failed: 2029 rndis_filter_device_remove(dev, nvdev); 2030 rndis_failed: 2031 free_percpu(net_device_ctx->vf_stats); 2032 no_stats: 2033 hv_set_drvdata(dev, NULL); 2034 free_netdev(net); 2035 no_net: 2036 return ret; 2037 } 2038 --- 0-DAY kernel test infrastructure Open Source Technology Center https://lists.01.org/pipermail/kbuild-all Intel Corporation