• Mike Marciniszyn's avatar
    IB/hfi1: Rework AIP and VNIC dummy netdev usage · 780278c2
    Mike Marciniszyn authored
    All other users of the dummy netdevice embed the netdev in other
    structures:
    
    init_dummy_netdev(&mal->dummy_dev);
    init_dummy_netdev(&eth->dummy_dev);
    init_dummy_netdev(&ar->napi_dev);
    init_dummy_netdev(&irq_grp->napi_ndev);
    init_dummy_netdev(&wil->napi_ndev);
    init_dummy_netdev(&trans_pcie->napi_dev);
    init_dummy_netdev(&dev->napi_dev);
    init_dummy_netdev(&bus->mux_dev);
    
    The AIP and VNIC implementation turns that model inside out and used a
    kfree() to free what appears to be a netdev struct when in reality, it is
    a struct that enbodies the rx state as well as the dummy netdev used to
    support napi_poll across disparate receive contexts.  The relationship is
    infered by the odd allocation:
    
    	const int netdev_size = sizeof(*dd->dummy_netdev) +
    		sizeof(struct hfi1_netdev_priv);
    	<snip>
    	dd->dummy_netdev = kcalloc_node(1, netdev_size, GFP_KERNEL, dd->node);
    
    Correct the issue by:
    - Correctly naming the alloc and free functions
    - Renaming hfi1_netdev_priv to hfi1_netdev_rx
    - Replacing dd dummy_netdev with a netdev_rx pointer
    - Embedding the net_device in hfi1_netdev_rx
    - Moving the init_dummy_netdev to the alloc routine
    - Adjusting wrappers to fit the new model
    
    Fixes: 6991abcb ("IB/hfi1: Add functions to receive accelerated ipoib packets")
    Link: https://lore.kernel.org/r/1617026056-50483-11-git-send-email-dennis.dalessandro@cornelisnetworks.comReviewed-by: default avatarKaike Wan <kaike.wan@intel.com>
    Signed-off-by: default avatarMike Marciniszyn <mike.marciniszyn@cornelisnetworks.com>
    Signed-off-by: default avatarDennis Dalessandro <dennis.dalessandro@cornelisnetworks.com>
    Signed-off-by: default avatarJason Gunthorpe <jgg@nvidia.com>
    780278c2
netdev.h 2.91 KB