Re: [PATCH net-next v2 11/16] net: txgbe: Allocate Rx and Tx resources
From: kernel test robot <hidden>
Date: 2022-08-30 23:31:56
Hi Jiawen, I love your patch! Perhaps something to improve: [auto build test WARNING on net-next/master] url: https://github.com/intel-lab-lkp/linux/commits/Jiawen-Wu/net-WangXun-txgbe-ethernet-driver/20220830-151052 base: https://git.kernel.org/pub/scm/linux/kernel/git/davem/net-next.git f97e971dbdc7c83d697fa2209fed0ea50fffa12e config: sparc-allyesconfig (https://download.01.org/0day-ci/archive/20220831/202208310732.sJ1RQ8FS-lkp@intel.com/config) compiler: sparc64-linux-gcc (GCC) 12.1.0 reproduce (this is a W=1 build): wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross chmod +x ~/bin/make.cross # https://github.com/intel-lab-lkp/linux/commit/c864cd7572cc2087b05b4b7850e9fd01f8a1c3ea git remote add linux-review https://github.com/intel-lab-lkp/linux git fetch --no-tags linux-review Jiawen-Wu/net-WangXun-txgbe-ethernet-driver/20220830-151052 git checkout c864cd7572cc2087b05b4b7850e9fd01f8a1c3ea # save the config file mkdir build_dir && cp config build_dir/.config COMPILER_INSTALL_PATH=$HOME/0day COMPILER=gcc-12.1.0 make.cross W=1 O=build_dir ARCH=sparc SHELL=/bin/bash drivers/net/ethernet/wangxun/txgbe/ If you fix the issue, kindly add following tag where applicable Reported-by: kernel test robot <redacted> All warnings (new ones prefixed by >>): drivers/net/ethernet/wangxun/txgbe/txgbe_main.c: In function 'txgbe_setup_tx_resources': drivers/net/ethernet/wangxun/txgbe/txgbe_main.c:1786:35: error: implicit declaration of function 'vzalloc_node'; did you mean 'kvzalloc_node'? [-Werror=implicit-function-declaration] 1786 | tx_ring->tx_buffer_info = vzalloc_node(size, numa_node); | ^~~~~~~~~~~~ | kvzalloc_node
quoted
drivers/net/ethernet/wangxun/txgbe/txgbe_main.c:1786:33: warning: assignment to 'struct txgbe_tx_buffer *' from 'int' makes pointer from integer without a cast [-Wint-conversion]
1786 | tx_ring->tx_buffer_info = vzalloc_node(size, numa_node);
| ^
drivers/net/ethernet/wangxun/txgbe/txgbe_main.c:1788:43: error: implicit declaration of function 'vzalloc'; did you mean 'kvzalloc'? [-Werror=implicit-function-declaration]
1788 | tx_ring->tx_buffer_info = vzalloc(size);
| ^~~~~~~
| kvzalloc
drivers/net/ethernet/wangxun/txgbe/txgbe_main.c:1788:41: warning: assignment to 'struct txgbe_tx_buffer *' from 'int' makes pointer from integer without a cast [-Wint-conversion]
1788 | tx_ring->tx_buffer_info = vzalloc(size);
| ^
drivers/net/ethernet/wangxun/txgbe/txgbe_main.c:1811:9: error: implicit declaration of function 'vfree'; did you mean 'kvfree'? [-Werror=implicit-function-declaration]
1811 | vfree(tx_ring->tx_buffer_info);
| ^~~~~
| kvfree
drivers/net/ethernet/wangxun/txgbe/txgbe_main.c: In function 'txgbe_setup_rx_resources':quoted
drivers/net/ethernet/wangxun/txgbe/txgbe_main.c:1867:33: warning: assignment to 'struct txgbe_rx_buffer *' from 'int' makes pointer from integer without a cast [-Wint-conversion]
1867 | rx_ring->rx_buffer_info = vzalloc_node(size, numa_node);
| ^
drivers/net/ethernet/wangxun/txgbe/txgbe_main.c:1869:41: warning: assignment to 'struct txgbe_rx_buffer *' from 'int' makes pointer from integer without a cast [-Wint-conversion]
1869 | rx_ring->rx_buffer_info = vzalloc(size);
| ^
cc1: some warnings being treated as errors
vim +1786 drivers/net/ethernet/wangxun/txgbe/txgbe_main.c
1767
1768 /**
1769 * txgbe_setup_tx_resources - allocate Tx resources (Descriptors)
1770 * @tx_ring: tx descriptor ring (for a specific queue) to setup
1771 *
1772 * Return 0 on success, negative on failure
1773 **/
1774 int txgbe_setup_tx_resources(struct txgbe_ring *tx_ring)
1775 {
1776 struct device *dev = tx_ring->dev;
1777 int orig_node = dev_to_node(dev);
1778 int numa_node = -1;
1779 int size;
1780
1781 size = sizeof(struct txgbe_tx_buffer) * tx_ring->count;
1782
1783 if (tx_ring->q_vector)
1784 numa_node = tx_ring->q_vector->numa_node;
1785 1786 tx_ring->tx_buffer_info = vzalloc_node(size, numa_node);
1787 if (!tx_ring->tx_buffer_info)
1788 tx_ring->tx_buffer_info = vzalloc(size);
1789 if (!tx_ring->tx_buffer_info)
1790 goto err;
1791
1792 /* round up to nearest 4K */
1793 tx_ring->size = tx_ring->count * sizeof(union txgbe_tx_desc);
1794 tx_ring->size = ALIGN(tx_ring->size, 4096);
1795
1796 set_dev_node(dev, numa_node);
1797 tx_ring->desc = dma_alloc_coherent(dev,
1798 tx_ring->size,
1799 &tx_ring->dma,
1800 GFP_KERNEL);
1801 set_dev_node(dev, orig_node);
1802 if (!tx_ring->desc)
1803 tx_ring->desc = dma_alloc_coherent(dev, tx_ring->size,
1804 &tx_ring->dma, GFP_KERNEL);
1805 if (!tx_ring->desc)
1806 goto err;
1807
1808 return 0;
1809
1810 err:
1811 vfree(tx_ring->tx_buffer_info);
1812 tx_ring->tx_buffer_info = NULL;
1813 dev_err(dev, "Unable to allocate memory for the Tx descriptor ring\n");
1814 return -ENOMEM;
1815 }
1816
1817 /**
1818 * txgbe_setup_all_tx_resources - allocate all queues Tx resources
1819 * @adapter: board private structure
1820 *
1821 * If this function returns with an error, then it's possible one or
1822 * more of the rings is populated (while the rest are not). It is the
1823 * callers duty to clean those orphaned rings.
1824 *
1825 * Return 0 on success, negative on failure
1826 **/
1827 static int txgbe_setup_all_tx_resources(struct txgbe_adapter *adapter)
1828 {
1829 int i, err = 0;
1830
1831 for (i = 0; i < adapter->num_tx_queues; i++) {
1832 err = txgbe_setup_tx_resources(adapter->tx_ring[i]);
1833 if (!err)
1834 continue;
1835
1836 netif_err(adapter, probe, adapter->netdev,
1837 "Allocation for Tx Queue %u failed\n", i);
1838 goto err_setup_tx;
1839 }
1840
1841 return 0;
1842 err_setup_tx:
1843 /* rewind the index freeing the rings as we go */
1844 while (i--)
1845 txgbe_free_tx_resources(adapter->tx_ring[i]);
1846 return err;
1847 }
1848
1849 /**
1850 * txgbe_setup_rx_resources - allocate Rx resources (Descriptors)
1851 * @rx_ring: rx descriptor ring (for a specific queue) to setup
1852 *
1853 * Returns 0 on success, negative on failure
1854 **/
1855 int txgbe_setup_rx_resources(struct txgbe_ring *rx_ring)
1856 {
1857 struct device *dev = rx_ring->dev;
1858 int orig_node = dev_to_node(dev);
1859 int numa_node = -1;
1860 int size;
1861
1862 size = sizeof(struct txgbe_rx_buffer) * rx_ring->count;
1863
1864 if (rx_ring->q_vector)
1865 numa_node = rx_ring->q_vector->numa_node;
1866 1867 rx_ring->rx_buffer_info = vzalloc_node(size, numa_node);
1868 if (!rx_ring->rx_buffer_info) 1869 rx_ring->rx_buffer_info = vzalloc(size); 1870 if (!rx_ring->rx_buffer_info) 1871 goto err; 1872 1873 /* Round up to nearest 4K */ 1874 rx_ring->size = rx_ring->count * sizeof(union txgbe_rx_desc); 1875 rx_ring->size = ALIGN(rx_ring->size, 4096); 1876 1877 set_dev_node(dev, numa_node); 1878 rx_ring->desc = dma_alloc_coherent(dev, 1879 rx_ring->size, 1880 &rx_ring->dma, 1881 GFP_KERNEL); 1882 set_dev_node(dev, orig_node); 1883 if (!rx_ring->desc) 1884 rx_ring->desc = dma_alloc_coherent(dev, rx_ring->size, 1885 &rx_ring->dma, GFP_KERNEL); 1886 if (!rx_ring->desc) 1887 goto err; 1888 1889 return 0; 1890 err: 1891 vfree(rx_ring->rx_buffer_info); 1892 rx_ring->rx_buffer_info = NULL; 1893 dev_err(dev, "Unable to allocate memory for the Rx descriptor ring\n"); 1894 return -ENOMEM; 1895 } 1896 -- 0-DAY CI Kernel Test Service https://01.org/lkp