Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

net: stmmac: move MSI data out of struct stmmac_priv

Only three platforms supprt MSIs, which means having all the strings
and interrupt arrays always allocated wastes space. None of this data
is performance critical - this data is only used when requesting and
releasing the MSI interrupts.

Move the MSI data out of struct stmmac_priv into its own separately
allocated structure, and move its initialisation to a separate
function.

This removes 768 bytes from struct stmmac_priv.

Link: https://lore.kernel.org/r/aYtq4ypxXTvn_Is6@shell.armlinux.org.uk
Reviewed-by: Florian Bezdeka <florian.bezdeka@siemens.com>
Signed-off-by: Russell King (Oracle) <rmk+kernel@armlinux.org.uk>
Link: https://patch.msgid.link/E1w113e-0000000DDwc-2oRv@rmk-PC.armlinux.org.uk
Signed-off-by: Jakub Kicinski <kuba@kernel.org>

authored by

Russell King (Oracle) and committed by
Jakub Kicinski
dab177cb a91b5d44

+81 -52
+18 -13
drivers/net/ethernet/stmicro/stmmac/stmmac.h
··· 243 243 u32 max_sdu[MTL_MAX_TX_QUEUES]; 244 244 }; 245 245 246 + struct stmmac_msi { 247 + int sfty_ce_irq; 248 + int sfty_ue_irq; 249 + int rx_irq[MTL_MAX_RX_QUEUES]; 250 + int tx_irq[MTL_MAX_TX_QUEUES]; 251 + 252 + /*irq name */ 253 + char int_name_mac[IFNAMSIZ + 9]; 254 + char int_name_wol[IFNAMSIZ + 9]; 255 + char int_name_lpi[IFNAMSIZ + 9]; 256 + char int_name_sfty[IFNAMSIZ + 10]; 257 + char int_name_sfty_ce[IFNAMSIZ + 10]; 258 + char int_name_sfty_ue[IFNAMSIZ + 10]; 259 + char int_name_rx_irq[MTL_MAX_RX_QUEUES][IFNAMSIZ + 14]; 260 + char int_name_tx_irq[MTL_MAX_TX_QUEUES][IFNAMSIZ + 18]; 261 + }; 262 + 246 263 struct stmmac_priv { 247 264 /* Frequently used values are kept adjacent for cache effect */ 248 265 u32 tx_coal_frames[MTL_MAX_TX_QUEUES]; ··· 346 329 unsigned long active_vlans[BITS_TO_LONGS(VLAN_N_VID)]; 347 330 unsigned int num_double_vlans; 348 331 int sfty_irq; 349 - int sfty_ce_irq; 350 - int sfty_ue_irq; 351 - int rx_irq[MTL_MAX_RX_QUEUES]; 352 - int tx_irq[MTL_MAX_TX_QUEUES]; 353 - /*irq name */ 354 - char int_name_mac[IFNAMSIZ + 9]; 355 - char int_name_wol[IFNAMSIZ + 9]; 356 - char int_name_lpi[IFNAMSIZ + 9]; 357 - char int_name_sfty[IFNAMSIZ + 10]; 358 - char int_name_sfty_ce[IFNAMSIZ + 10]; 359 - char int_name_sfty_ue[IFNAMSIZ + 10]; 360 - char int_name_rx_irq[MTL_MAX_RX_QUEUES][IFNAMSIZ + 14]; 361 - char int_name_tx_irq[MTL_MAX_TX_QUEUES][IFNAMSIZ + 18]; 332 + struct stmmac_msi *msi; 362 333 363 334 #ifdef CONFIG_DEBUG_FS 364 335 struct dentry *dbgfs_dir;
+63 -39
drivers/net/ethernet/stmicro/stmmac/stmmac_main.c
··· 3725 3725 enum request_irq_err irq_err, int irq_idx) 3726 3726 { 3727 3727 struct stmmac_priv *priv = netdev_priv(dev); 3728 + struct stmmac_msi *msi = priv->msi; 3728 3729 int j; 3729 3730 3730 3731 switch (irq_err) { ··· 3733 3732 irq_idx = priv->plat->tx_queues_to_use; 3734 3733 fallthrough; 3735 3734 case REQ_IRQ_ERR_TX: 3736 - for (j = irq_idx - 1; j >= 0; j--) { 3737 - if (priv->tx_irq[j] > 0) { 3738 - irq_set_affinity_hint(priv->tx_irq[j], NULL); 3739 - free_irq(priv->tx_irq[j], &priv->dma_conf.tx_queue[j]); 3735 + for (j = irq_idx - 1; msi && j >= 0; j--) { 3736 + if (msi->tx_irq[j] > 0) { 3737 + irq_set_affinity_hint(msi->tx_irq[j], NULL); 3738 + free_irq(msi->tx_irq[j], 3739 + &priv->dma_conf.tx_queue[j]); 3740 3740 } 3741 3741 } 3742 3742 irq_idx = priv->plat->rx_queues_to_use; 3743 3743 fallthrough; 3744 3744 case REQ_IRQ_ERR_RX: 3745 - for (j = irq_idx - 1; j >= 0; j--) { 3746 - if (priv->rx_irq[j] > 0) { 3747 - irq_set_affinity_hint(priv->rx_irq[j], NULL); 3748 - free_irq(priv->rx_irq[j], &priv->dma_conf.rx_queue[j]); 3745 + for (j = irq_idx - 1; msi && j >= 0; j--) { 3746 + if (msi->rx_irq[j] > 0) { 3747 + irq_set_affinity_hint(msi->rx_irq[j], NULL); 3748 + free_irq(msi->rx_irq[j], 3749 + &priv->dma_conf.rx_queue[j]); 3749 3750 } 3750 3751 } 3751 3752 3752 - if (priv->sfty_ue_irq > 0 && priv->sfty_ue_irq != dev->irq) 3753 - free_irq(priv->sfty_ue_irq, dev); 3753 + if (msi && msi->sfty_ue_irq > 0 && msi->sfty_ue_irq != dev->irq) 3754 + free_irq(msi->sfty_ue_irq, dev); 3754 3755 fallthrough; 3755 3756 case REQ_IRQ_ERR_SFTY_UE: 3756 - if (priv->sfty_ce_irq > 0 && priv->sfty_ce_irq != dev->irq) 3757 - free_irq(priv->sfty_ce_irq, dev); 3757 + if (msi && msi->sfty_ce_irq > 0 && msi->sfty_ce_irq != dev->irq) 3758 + free_irq(msi->sfty_ce_irq, dev); 3758 3759 fallthrough; 3759 3760 case REQ_IRQ_ERR_SFTY_CE: 3760 3761 if (priv->wol_irq > 0 && priv->wol_irq != dev->irq) ··· 3776 3773 } 3777 3774 } 3778 3775 3776 + static int stmmac_msi_init(struct stmmac_priv *priv, 3777 + struct stmmac_resources *res) 3778 + { 3779 + int i; 3780 + 3781 + priv->msi = devm_kmalloc(priv->device, sizeof(*priv->msi), GFP_KERNEL); 3782 + if (!priv->msi) 3783 + return -ENOMEM; 3784 + 3785 + priv->msi->sfty_ce_irq = res->sfty_ce_irq; 3786 + priv->msi->sfty_ue_irq = res->sfty_ue_irq; 3787 + 3788 + for (i = 0; i < MTL_MAX_RX_QUEUES; i++) 3789 + priv->msi->rx_irq[i] = res->rx_irq[i]; 3790 + for (i = 0; i < MTL_MAX_TX_QUEUES; i++) 3791 + priv->msi->tx_irq[i] = res->tx_irq[i]; 3792 + 3793 + return 0; 3794 + } 3795 + 3779 3796 static int stmmac_request_irq_multi_msi(struct net_device *dev) 3780 3797 { 3781 3798 struct stmmac_priv *priv = netdev_priv(dev); 3799 + struct stmmac_msi *msi = priv->msi; 3782 3800 enum request_irq_err irq_err; 3783 3801 int irq_idx = 0; 3784 3802 char *int_name; ··· 3807 3783 int i; 3808 3784 3809 3785 /* For common interrupt */ 3810 - int_name = priv->int_name_mac; 3786 + int_name = msi->int_name_mac; 3811 3787 sprintf(int_name, "%s:%s", dev->name, "mac"); 3812 3788 ret = request_irq(dev->irq, stmmac_mac_interrupt, 3813 3789 0, int_name, dev); ··· 3823 3799 * is used for WoL 3824 3800 */ 3825 3801 if (priv->wol_irq > 0 && priv->wol_irq != dev->irq) { 3826 - int_name = priv->int_name_wol; 3802 + int_name = msi->int_name_wol; 3827 3803 sprintf(int_name, "%s:%s", dev->name, "wol"); 3828 3804 ret = request_irq(priv->wol_irq, 3829 3805 stmmac_mac_interrupt, ··· 3841 3817 * Error line in case of another line is used 3842 3818 */ 3843 3819 if (priv->sfty_irq > 0 && priv->sfty_irq != dev->irq) { 3844 - int_name = priv->int_name_sfty; 3820 + int_name = msi->int_name_sfty; 3845 3821 sprintf(int_name, "%s:%s", dev->name, "safety"); 3846 3822 ret = request_irq(priv->sfty_irq, stmmac_safety_interrupt, 3847 3823 0, int_name, dev); ··· 3857 3833 /* Request the Safety Feature Correctible Error line in 3858 3834 * case of another line is used 3859 3835 */ 3860 - if (priv->sfty_ce_irq > 0 && priv->sfty_ce_irq != dev->irq) { 3861 - int_name = priv->int_name_sfty_ce; 3836 + if (msi->sfty_ce_irq > 0 && msi->sfty_ce_irq != dev->irq) { 3837 + int_name = msi->int_name_sfty_ce; 3862 3838 sprintf(int_name, "%s:%s", dev->name, "safety-ce"); 3863 - ret = request_irq(priv->sfty_ce_irq, 3839 + ret = request_irq(msi->sfty_ce_irq, 3864 3840 stmmac_safety_interrupt, 3865 3841 0, int_name, dev); 3866 3842 if (unlikely(ret < 0)) { 3867 3843 netdev_err(priv->dev, 3868 3844 "%s: alloc sfty ce MSI %d (error: %d)\n", 3869 - __func__, priv->sfty_ce_irq, ret); 3845 + __func__, msi->sfty_ce_irq, ret); 3870 3846 irq_err = REQ_IRQ_ERR_SFTY_CE; 3871 3847 goto irq_error; 3872 3848 } ··· 3875 3851 /* Request the Safety Feature Uncorrectible Error line in 3876 3852 * case of another line is used 3877 3853 */ 3878 - if (priv->sfty_ue_irq > 0 && priv->sfty_ue_irq != dev->irq) { 3879 - int_name = priv->int_name_sfty_ue; 3854 + if (msi->sfty_ue_irq > 0 && msi->sfty_ue_irq != dev->irq) { 3855 + int_name = msi->int_name_sfty_ue; 3880 3856 sprintf(int_name, "%s:%s", dev->name, "safety-ue"); 3881 - ret = request_irq(priv->sfty_ue_irq, 3857 + ret = request_irq(msi->sfty_ue_irq, 3882 3858 stmmac_safety_interrupt, 3883 3859 0, int_name, dev); 3884 3860 if (unlikely(ret < 0)) { 3885 3861 netdev_err(priv->dev, 3886 3862 "%s: alloc sfty ue MSI %d (error: %d)\n", 3887 - __func__, priv->sfty_ue_irq, ret); 3863 + __func__, msi->sfty_ue_irq, ret); 3888 3864 irq_err = REQ_IRQ_ERR_SFTY_UE; 3889 3865 goto irq_error; 3890 3866 } ··· 3894 3870 for (i = 0; i < priv->plat->rx_queues_to_use; i++) { 3895 3871 if (i >= MTL_MAX_RX_QUEUES) 3896 3872 break; 3897 - if (priv->rx_irq[i] == 0) 3873 + if (msi->rx_irq[i] == 0) 3898 3874 continue; 3899 3875 3900 - int_name = priv->int_name_rx_irq[i]; 3876 + int_name = msi->int_name_rx_irq[i]; 3901 3877 sprintf(int_name, "%s:%s-%d", dev->name, "rx", i); 3902 - ret = request_irq(priv->rx_irq[i], 3878 + ret = request_irq(msi->rx_irq[i], 3903 3879 stmmac_msi_intr_rx, 3904 3880 0, int_name, &priv->dma_conf.rx_queue[i]); 3905 3881 if (unlikely(ret < 0)) { 3906 3882 netdev_err(priv->dev, 3907 3883 "%s: alloc rx-%d MSI %d (error: %d)\n", 3908 - __func__, i, priv->rx_irq[i], ret); 3884 + __func__, i, msi->rx_irq[i], ret); 3909 3885 irq_err = REQ_IRQ_ERR_RX; 3910 3886 irq_idx = i; 3911 3887 goto irq_error; 3912 3888 } 3913 - irq_set_affinity_hint(priv->rx_irq[i], 3889 + irq_set_affinity_hint(msi->rx_irq[i], 3914 3890 cpumask_of(i % num_online_cpus())); 3915 3891 } 3916 3892 ··· 3918 3894 for (i = 0; i < priv->plat->tx_queues_to_use; i++) { 3919 3895 if (i >= MTL_MAX_TX_QUEUES) 3920 3896 break; 3921 - if (priv->tx_irq[i] == 0) 3897 + if (msi->tx_irq[i] == 0) 3922 3898 continue; 3923 3899 3924 - int_name = priv->int_name_tx_irq[i]; 3900 + int_name = msi->int_name_tx_irq[i]; 3925 3901 sprintf(int_name, "%s:%s-%d", dev->name, "tx", i); 3926 - ret = request_irq(priv->tx_irq[i], 3902 + ret = request_irq(msi->tx_irq[i], 3927 3903 stmmac_msi_intr_tx, 3928 3904 0, int_name, &priv->dma_conf.tx_queue[i]); 3929 3905 if (unlikely(ret < 0)) { 3930 3906 netdev_err(priv->dev, 3931 3907 "%s: alloc tx-%d MSI %d (error: %d)\n", 3932 - __func__, i, priv->tx_irq[i], ret); 3908 + __func__, i, msi->tx_irq[i], ret); 3933 3909 irq_err = REQ_IRQ_ERR_TX; 3934 3910 irq_idx = i; 3935 3911 goto irq_error; 3936 3912 } 3937 - irq_set_affinity_hint(priv->tx_irq[i], 3913 + irq_set_affinity_hint(msi->tx_irq[i], 3938 3914 cpumask_of(i % num_online_cpus())); 3939 3915 } 3940 3916 ··· 7830 7806 priv->dev->irq = res->irq; 7831 7807 priv->wol_irq = res->wol_irq; 7832 7808 priv->sfty_irq = res->sfty_irq; 7833 - priv->sfty_ce_irq = res->sfty_ce_irq; 7834 - priv->sfty_ue_irq = res->sfty_ue_irq; 7835 - for (i = 0; i < MTL_MAX_RX_QUEUES; i++) 7836 - priv->rx_irq[i] = res->rx_irq[i]; 7837 - for (i = 0; i < MTL_MAX_TX_QUEUES; i++) 7838 - priv->tx_irq[i] = res->tx_irq[i]; 7809 + 7810 + if (priv->plat->flags & STMMAC_FLAG_MULTI_MSI_EN) { 7811 + ret = stmmac_msi_init(priv, res); 7812 + if (ret) 7813 + return ret; 7814 + } 7839 7815 7840 7816 if (!is_zero_ether_addr(res->mac)) 7841 7817 eth_hw_addr_set(priv->dev, res->mac);