Message ID | 1652778276-2986-2-git-send-email-longli@linuxonhyperv.com (mailing list archive) |
---|---|
State | Superseded |
Delegated to: | Jason Gunthorpe |
Headers | show |
Series | Introduce Microsoft Azure Network Adapter (MANA) RDMA driver | expand |
Hi, Thank you for the patch! Perhaps something to improve: [auto build test WARNING on linus/master] [also build test WARNING on v5.18-rc7] [If your patch is applied to the wrong git tree, kindly drop us a note. And when submitting patch, we suggest to use '--base' as documented in https://git-scm.com/docs/git-format-patch] url: https://github.com/intel-lab-lkp/linux/commits/longli-linuxonhyperv-com/Introduce-Microsoft-Azure-Network-Adapter-MANA-RDMA-driver/20220517-170632 base: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git 42226c989789d8da4af1de0c31070c96726d990c config: x86_64-allyesconfig (https://download.01.org/0day-ci/archive/20220520/202205200250.8xo3zYa3-lkp@intel.com/config) compiler: gcc-11 (Debian 11.2.0-20) 11.2.0 reproduce (this is a W=1 build): # https://github.com/intel-lab-lkp/linux/commit/5c9b22b8d4038fba4019bb1e5bcda9a101d285b7 git remote add linux-review https://github.com/intel-lab-lkp/linux git fetch --no-tags linux-review longli-linuxonhyperv-com/Introduce-Microsoft-Azure-Network-Adapter-MANA-RDMA-driver/20220517-170632 git checkout 5c9b22b8d4038fba4019bb1e5bcda9a101d285b7 # save the config file mkdir build_dir && cp config build_dir/.config make W=1 O=build_dir ARCH=x86_64 SHELL=/bin/bash drivers/infiniband/hw/ drivers/net/ethernet/microsoft/mana/ If you fix the issue, kindly add following tag as appropriate Reported-by: kernel test robot <lkp@intel.com> All warnings (new ones prefixed by >>): >> drivers/net/ethernet/microsoft/mana/mana_en.c:18:5: warning: no previous prototype for 'mana_adev_idx_alloc' [-Wmissing-prototypes] 18 | int mana_adev_idx_alloc(void) | ^~~~~~~~~~~~~~~~~~~ >> drivers/net/ethernet/microsoft/mana/mana_en.c:23:6: warning: no previous prototype for 'mana_adev_idx_free' [-Wmissing-prototypes] 23 | void mana_adev_idx_free(int idx) | ^~~~~~~~~~~~~~~~~~ vim +/mana_adev_idx_alloc +18 drivers/net/ethernet/microsoft/mana/mana_en.c 17 > 18 int mana_adev_idx_alloc(void) 19 { 20 return ida_alloc(&mana_adev_ida, GFP_KERNEL); 21 } 22 > 23 void mana_adev_idx_free(int idx) 24 { 25 ida_free(&mana_adev_ida, idx); 26 } 27
diff --git a/drivers/net/ethernet/microsoft/mana/gdma.h b/drivers/net/ethernet/microsoft/mana/gdma.h index 41ecd156e95f..d815d323be87 100644 --- a/drivers/net/ethernet/microsoft/mana/gdma.h +++ b/drivers/net/ethernet/microsoft/mana/gdma.h @@ -204,6 +204,8 @@ struct gdma_dev { /* GDMA driver specific pointer */ void *driver_data; + + struct auxiliary_device *adev; }; #define MINIMUM_SUPPORTED_PAGE_SIZE PAGE_SIZE diff --git a/drivers/net/ethernet/microsoft/mana/mana.h b/drivers/net/ethernet/microsoft/mana/mana.h index d36405af9432..51bff91b63ee 100644 --- a/drivers/net/ethernet/microsoft/mana/mana.h +++ b/drivers/net/ethernet/microsoft/mana/mana.h @@ -6,6 +6,7 @@ #include "gdma.h" #include "hw_channel.h" +#include <linux/auxiliary_bus.h> /* Microsoft Azure Network Adapter (MANA)'s definitions * @@ -561,4 +562,9 @@ struct mana_tx_package { struct gdma_posted_wqe_info wqe_info; }; +struct mana_adev { + struct auxiliary_device adev; + struct gdma_dev *mdev; +}; + #endif /* _MANA_H */ diff --git a/drivers/net/ethernet/microsoft/mana/mana_en.c b/drivers/net/ethernet/microsoft/mana/mana_en.c index b7d3ba1b4d17..c706bf943e49 100644 --- a/drivers/net/ethernet/microsoft/mana/mana_en.c +++ b/drivers/net/ethernet/microsoft/mana/mana_en.c @@ -13,6 +13,18 @@ #include "mana.h" +static DEFINE_IDA(mana_adev_ida); + +int mana_adev_idx_alloc(void) +{ + return ida_alloc(&mana_adev_ida, GFP_KERNEL); +} + +void mana_adev_idx_free(int idx) +{ + ida_free(&mana_adev_ida, idx); +} + /* Microsoft Azure Network Adapter (MANA) functions */ static int mana_open(struct net_device *ndev) @@ -1960,6 +1972,70 @@ static int mana_probe_port(struct mana_context *ac, int port_idx, return err; } +static void adev_release(struct device *dev) +{ + struct mana_adev *madev = container_of(dev, struct mana_adev, adev.dev); + + kfree(madev); +} + +static void remove_adev(struct gdma_dev *gd) +{ + struct auxiliary_device *adev = gd->adev; + int id = adev->id; + + auxiliary_device_delete(adev); + auxiliary_device_uninit(adev); + + mana_adev_idx_free(id); + gd->adev = NULL; +} + +static int add_adev(struct gdma_dev *gd) +{ + int ret = 0; + struct mana_adev *madev; + struct auxiliary_device *adev; + + madev = kzalloc(sizeof(*madev), GFP_KERNEL); + if (!madev) + return -ENOMEM; + + adev = &madev->adev; + adev->id = mana_adev_idx_alloc(); + if (adev->id < 0) { + ret = adev->id; + goto idx_fail; + } + + adev->name = "rdma"; + adev->dev.parent = gd->gdma_context->dev; + adev->dev.release = adev_release; + madev->mdev = gd; + + ret = auxiliary_device_init(adev); + if (ret) + goto init_fail; + + ret = auxiliary_device_add(adev); + if (ret) + goto add_fail; + + gd->adev = adev; + return 0; + +add_fail: + auxiliary_device_uninit(adev); + +init_fail: + mana_adev_idx_free(adev->id); + +idx_fail: + kfree(madev); + + return ret; +} + int mana_probe(struct gdma_dev *gd, bool resuming) { struct gdma_context *gc = gd->gdma_context; @@ -2027,6 +2103,8 @@ int mana_probe(struct gdma_dev *gd, bool resuming) break; } } + + err = add_adev(gd); out: if (err) mana_remove(gd, false); @@ -2043,6 +2121,10 @@ void mana_remove(struct gdma_dev *gd, bool suspending) int err; int i; + /* adev currently doesn't support suspending, always remove it */ + if (gd->adev) + remove_adev(gd); + for (i = 0; i < ac->num_ports; i++) { ndev = ac->ports[i]; if (!ndev) { @@ -2075,7 +2157,6 @@ void mana_remove(struct gdma_dev *gd, bool suspending) } mana_destroy_eq(ac); - out: mana_gd_deregister_device(gd);