mirror of
https://github.com/AuxXxilium/linux_dsm_epyc7002.git
synced 2024-12-18 15:16:56 +07:00
liquidio: Disabling tasklet when NAPI is active
Control packets are processed in tasklet when interface is down and in NAPI when interface is up. So tasklet can be disabled when interface up and re-enabled when interface is down. Signed-off-by: Intiyaz Basha <intiyaz.basha@cavium.com> Acked-by: Derek Chickles <derek.chickles@cavium.com> Signed-off-by: Felix Manlunas <felix.manlunas@cavium.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
aad06d1104
commit
fe2d22b172
@ -1239,8 +1239,10 @@ static void send_rx_ctrl_cmd(struct lio *lio, int start_stop)
|
||||
static void liquidio_destroy_nic_device(struct octeon_device *oct, int ifidx)
|
||||
{
|
||||
struct net_device *netdev = oct->props[ifidx].netdev;
|
||||
struct lio *lio;
|
||||
struct octeon_device_priv *oct_priv =
|
||||
(struct octeon_device_priv *)oct->priv;
|
||||
struct napi_struct *napi, *n;
|
||||
struct lio *lio;
|
||||
|
||||
if (!netdev) {
|
||||
dev_err(&oct->pci_dev->dev, "%s No netdevice ptr for index %d\n",
|
||||
@ -1269,6 +1271,8 @@ static void liquidio_destroy_nic_device(struct octeon_device *oct, int ifidx)
|
||||
list_for_each_entry_safe(napi, n, &netdev->napi_list, dev_list)
|
||||
netif_napi_del(napi);
|
||||
|
||||
tasklet_enable(&oct_priv->droq_tasklet);
|
||||
|
||||
if (atomic_read(&lio->ifstate) & LIO_IFSTATE_REGISTERED)
|
||||
unregister_netdev(netdev);
|
||||
|
||||
@ -1805,9 +1809,13 @@ static int liquidio_open(struct net_device *netdev)
|
||||
{
|
||||
struct lio *lio = GET_LIO(netdev);
|
||||
struct octeon_device *oct = lio->oct_dev;
|
||||
struct octeon_device_priv *oct_priv =
|
||||
(struct octeon_device_priv *)oct->priv;
|
||||
struct napi_struct *napi, *n;
|
||||
|
||||
if (oct->props[lio->ifidx].napi_enabled == 0) {
|
||||
tasklet_disable(&oct_priv->droq_tasklet);
|
||||
|
||||
list_for_each_entry_safe(napi, n, &netdev->napi_list, dev_list)
|
||||
napi_enable(napi);
|
||||
|
||||
@ -1861,6 +1869,8 @@ static int liquidio_stop(struct net_device *netdev)
|
||||
{
|
||||
struct lio *lio = GET_LIO(netdev);
|
||||
struct octeon_device *oct = lio->oct_dev;
|
||||
struct octeon_device_priv *oct_priv =
|
||||
(struct octeon_device_priv *)oct->priv;
|
||||
struct napi_struct *napi, *n;
|
||||
|
||||
ifstate_reset(lio, LIO_IFSTATE_RUNNING);
|
||||
@ -1907,6 +1917,8 @@ static int liquidio_stop(struct net_device *netdev)
|
||||
|
||||
if (OCTEON_CN23XX_PF(oct))
|
||||
oct->droq[0]->ops.poll_mode = 0;
|
||||
|
||||
tasklet_enable(&oct_priv->droq_tasklet);
|
||||
}
|
||||
|
||||
dev_info(&oct->pci_dev->dev, "%s interface is stopped\n", netdev->name);
|
||||
|
@ -444,6 +444,8 @@ static void octeon_pci_flr(struct octeon_device *oct)
|
||||
*/
|
||||
static void octeon_destroy_resources(struct octeon_device *oct)
|
||||
{
|
||||
struct octeon_device_priv *oct_priv =
|
||||
(struct octeon_device_priv *)oct->priv;
|
||||
struct msix_entry *msix_entries;
|
||||
int i;
|
||||
|
||||
@ -587,6 +589,8 @@ static void octeon_destroy_resources(struct octeon_device *oct)
|
||||
/* Nothing to be done here either */
|
||||
break;
|
||||
}
|
||||
|
||||
tasklet_kill(&oct_priv->droq_tasklet);
|
||||
}
|
||||
|
||||
/**
|
||||
@ -652,6 +656,8 @@ static void send_rx_ctrl_cmd(struct lio *lio, int start_stop)
|
||||
static void liquidio_destroy_nic_device(struct octeon_device *oct, int ifidx)
|
||||
{
|
||||
struct net_device *netdev = oct->props[ifidx].netdev;
|
||||
struct octeon_device_priv *oct_priv =
|
||||
(struct octeon_device_priv *)oct->priv;
|
||||
struct napi_struct *napi, *n;
|
||||
struct lio *lio;
|
||||
|
||||
@ -681,6 +687,8 @@ static void liquidio_destroy_nic_device(struct octeon_device *oct, int ifidx)
|
||||
list_for_each_entry_safe(napi, n, &netdev->napi_list, dev_list)
|
||||
netif_napi_del(napi);
|
||||
|
||||
tasklet_enable(&oct_priv->droq_tasklet);
|
||||
|
||||
if (atomic_read(&lio->ifstate) & LIO_IFSTATE_REGISTERED)
|
||||
unregister_netdev(netdev);
|
||||
|
||||
@ -898,9 +906,13 @@ static int liquidio_open(struct net_device *netdev)
|
||||
{
|
||||
struct lio *lio = GET_LIO(netdev);
|
||||
struct octeon_device *oct = lio->oct_dev;
|
||||
struct octeon_device_priv *oct_priv =
|
||||
(struct octeon_device_priv *)oct->priv;
|
||||
struct napi_struct *napi, *n;
|
||||
|
||||
if (!oct->props[lio->ifidx].napi_enabled) {
|
||||
tasklet_disable(&oct_priv->droq_tasklet);
|
||||
|
||||
list_for_each_entry_safe(napi, n, &netdev->napi_list, dev_list)
|
||||
napi_enable(napi);
|
||||
|
||||
@ -938,6 +950,8 @@ static int liquidio_stop(struct net_device *netdev)
|
||||
{
|
||||
struct lio *lio = GET_LIO(netdev);
|
||||
struct octeon_device *oct = lio->oct_dev;
|
||||
struct octeon_device_priv *oct_priv =
|
||||
(struct octeon_device_priv *)oct->priv;
|
||||
struct napi_struct *napi, *n;
|
||||
|
||||
/* tell Octeon to stop forwarding packets to host */
|
||||
@ -967,6 +981,8 @@ static int liquidio_stop(struct net_device *netdev)
|
||||
oct->props[lio->ifidx].napi_enabled = 0;
|
||||
|
||||
oct->droq[0]->ops.poll_mode = 0;
|
||||
|
||||
tasklet_enable(&oct_priv->droq_tasklet);
|
||||
}
|
||||
|
||||
cancel_delayed_work_sync(&lio->stats_wk.work);
|
||||
|
Loading…
Reference in New Issue
Block a user