On Mon, Apr 15, 2024 at 05:36:36PM +0800, Heng Qi wrote: ... > @@ -10229,6 +10230,61 @@ static void netdev_do_free_pcpu_stats(struct net_device *dev) > } > } > > +static int dev_dim_profile_init(struct net_device *dev) > +{ > +#if IS_ENABLED(CONFIG_DIMLIB) > + u32 supported = dev->ethtool_ops->supported_coalesce_params; > + struct netdev_profile_moder *moder; > + int length; > + > + dev->moderation = kzalloc(sizeof(*dev->moderation), GFP_KERNEL); > + if (!dev->moderation) > + goto err_moder; > + > + moder = dev->moderation; > + length = NET_DIM_PARAMS_NUM_PROFILES * sizeof(*moder->rx_eqe_profile); > + > + if (supported & ETHTOOL_COALESCE_RX_EQE_PROFILE) { > + moder->rx_eqe_profile = kzalloc(length, GFP_KERNEL); > + if (!moder->rx_eqe_profile) > + goto err_rx_eqe; > + memcpy(moder->rx_eqe_profile, rx_profile[0], length); > + } > + if (supported & ETHTOOL_COALESCE_RX_CQE_PROFILE) { > + moder->rx_cqe_profile = kzalloc(length, GFP_KERNEL); > + if (!moder->rx_cqe_profile) > + goto err_rx_cqe; > + memcpy(moder->rx_cqe_profile, rx_profile[1], length); > + } > + if (supported & ETHTOOL_COALESCE_TX_EQE_PROFILE) { > + moder->tx_eqe_profile = kzalloc(length, GFP_KERNEL); > + if (!moder->tx_eqe_profile) > + goto err_tx_eqe; > + memcpy(moder->tx_eqe_profile, tx_profile[0], length); > + } > + if (supported & ETHTOOL_COALESCE_TX_CQE_PROFILE) { > + moder->tx_cqe_profile = kzalloc(length, GFP_KERNEL); > + if (!moder->tx_cqe_profile) > + goto err_tx_cqe; > + memcpy(moder->tx_cqe_profile, tx_profile[1], length); > + } nit: Coccinelle suggests that the kzalloc()/memcpy() pattern above could be replaced with calls to kmemdup() > +#endif > + return 0; > + > +#if IS_ENABLED(CONFIG_DIMLIB) > +err_tx_cqe: > + kfree(moder->tx_eqe_profile); > +err_tx_eqe: > + kfree(moder->rx_cqe_profile); > +err_rx_cqe: > + kfree(moder->rx_eqe_profile); > +err_rx_eqe: > + kfree(moder); > +err_moder: > + return -ENOMEM; > +#endif > +} > + > /** > * register_netdevice() - register a network device > * @dev: device to register ...