From 42fc5dc042796a825d9e2db8ee4cd977b12f73d1 Mon Sep 17 00:00:00 2001 From: Andre Guedes Date: Fri, 24 Apr 2020 13:16:22 -0700 Subject: [PATCH] igc: Change adapter->nfc_rule_lock to mutex This patch changes adapter->nfc_rule_lock type from spin_lock to mutex so we avoid unnecessary busy waiting on lock contention. A closer look at the execution context of NFC rule API users shows that all of them run in process context. The API users are: ethtool ops, igc_configure(), called when interface is brought up by user or reset workequeue thread, igc_down(), called when interface is brought down, and igc_remove(), called when driver is unloaded. Signed-off-by: Andre Guedes Tested-by: Aaron Brown Signed-off-by: Jeff Kirsher --- drivers/net/ethernet/intel/igc/igc.h | 2 +- drivers/net/ethernet/intel/igc/igc_ethtool.c | 24 ++++++++++---------- drivers/net/ethernet/intel/igc/igc_main.c | 14 ++++++------ 3 files changed, 20 insertions(+), 20 deletions(-) diff --git a/drivers/net/ethernet/intel/igc/igc.h b/drivers/net/ethernet/intel/igc/igc.h index a484b328268b..14f9edaaaf83 100644 --- a/drivers/net/ethernet/intel/igc/igc.h +++ b/drivers/net/ethernet/intel/igc/igc.h @@ -190,7 +190,7 @@ struct igc_adapter { /* Any access to elements in nfc_rule_list is protected by the * nfc_rule_lock. */ - spinlock_t nfc_rule_lock; + struct mutex nfc_rule_lock; struct list_head nfc_rule_list; unsigned int nfc_rule_count; diff --git a/drivers/net/ethernet/intel/igc/igc_ethtool.c b/drivers/net/ethernet/intel/igc/igc_ethtool.c index d14c46dce053..946e775e34ae 100644 --- a/drivers/net/ethernet/intel/igc/igc_ethtool.c +++ b/drivers/net/ethernet/intel/igc/igc_ethtool.c @@ -939,7 +939,7 @@ static int igc_ethtool_get_nfc_rule(struct igc_adapter *adapter, cmd->data = IGC_MAX_RXNFC_RULES; - spin_lock(&adapter->nfc_rule_lock); + mutex_lock(&adapter->nfc_rule_lock); rule = igc_get_nfc_rule(adapter, fsp->location); if (!rule) @@ -971,11 +971,11 @@ static int igc_ethtool_get_nfc_rule(struct igc_adapter *adapter, eth_broadcast_addr(fsp->m_u.ether_spec.h_source); } - spin_unlock(&adapter->nfc_rule_lock); + mutex_unlock(&adapter->nfc_rule_lock); return 0; out: - spin_unlock(&adapter->nfc_rule_lock); + mutex_unlock(&adapter->nfc_rule_lock); return -EINVAL; } @@ -988,18 +988,18 @@ static int igc_ethtool_get_nfc_rules(struct igc_adapter *adapter, cmd->data = IGC_MAX_RXNFC_RULES; - spin_lock(&adapter->nfc_rule_lock); + mutex_lock(&adapter->nfc_rule_lock); list_for_each_entry(rule, &adapter->nfc_rule_list, list) { if (cnt == cmd->rule_cnt) { - spin_unlock(&adapter->nfc_rule_lock); + mutex_unlock(&adapter->nfc_rule_lock); return -EMSGSIZE; } rule_locs[cnt] = rule->location; cnt++; } - spin_unlock(&adapter->nfc_rule_lock); + mutex_unlock(&adapter->nfc_rule_lock); cmd->rule_cnt = cnt; @@ -1303,7 +1303,7 @@ static int igc_ethtool_add_nfc_rule(struct igc_adapter *adapter, igc_ethtool_init_nfc_rule(rule, fsp); - spin_lock(&adapter->nfc_rule_lock); + mutex_lock(&adapter->nfc_rule_lock); err = igc_ethtool_check_nfc_rule(adapter, rule); if (err) @@ -1317,11 +1317,11 @@ static int igc_ethtool_add_nfc_rule(struct igc_adapter *adapter, if (err) goto err; - spin_unlock(&adapter->nfc_rule_lock); + mutex_unlock(&adapter->nfc_rule_lock); return 0; err: - spin_unlock(&adapter->nfc_rule_lock); + mutex_unlock(&adapter->nfc_rule_lock); kfree(rule); return err; } @@ -1333,17 +1333,17 @@ static int igc_ethtool_del_nfc_rule(struct igc_adapter *adapter, (struct ethtool_rx_flow_spec *)&cmd->fs; struct igc_nfc_rule *rule; - spin_lock(&adapter->nfc_rule_lock); + mutex_lock(&adapter->nfc_rule_lock); rule = igc_get_nfc_rule(adapter, fsp->location); if (!rule) { - spin_unlock(&adapter->nfc_rule_lock); + mutex_unlock(&adapter->nfc_rule_lock); return -EINVAL; } igc_del_nfc_rule(adapter, rule); - spin_unlock(&adapter->nfc_rule_lock); + mutex_unlock(&adapter->nfc_rule_lock); return 0; } diff --git a/drivers/net/ethernet/intel/igc/igc_main.c b/drivers/net/ethernet/intel/igc/igc_main.c index 9338209cedf2..165263ae8add 100644 --- a/drivers/net/ethernet/intel/igc/igc_main.c +++ b/drivers/net/ethernet/intel/igc/igc_main.c @@ -2539,12 +2539,12 @@ static void igc_flush_nfc_rules(struct igc_adapter *adapter) { struct igc_nfc_rule *rule, *tmp; - spin_lock(&adapter->nfc_rule_lock); + mutex_lock(&adapter->nfc_rule_lock); list_for_each_entry_safe(rule, tmp, &adapter->nfc_rule_list, list) igc_del_nfc_rule(adapter, rule); - spin_unlock(&adapter->nfc_rule_lock); + mutex_unlock(&adapter->nfc_rule_lock); } /** @@ -2583,24 +2583,24 @@ static void igc_restore_nfc_rules(struct igc_adapter *adapter) { struct igc_nfc_rule *rule; - spin_lock(&adapter->nfc_rule_lock); + mutex_lock(&adapter->nfc_rule_lock); list_for_each_entry_reverse(rule, &adapter->nfc_rule_list, list) igc_enable_nfc_rule(adapter, rule); - spin_unlock(&adapter->nfc_rule_lock); + mutex_unlock(&adapter->nfc_rule_lock); } static void igc_nfc_rule_exit(struct igc_adapter *adapter) { struct igc_nfc_rule *rule; - spin_lock(&adapter->nfc_rule_lock); + mutex_lock(&adapter->nfc_rule_lock); list_for_each_entry(rule, &adapter->nfc_rule_list, list) igc_disable_nfc_rule(adapter, rule); - spin_unlock(&adapter->nfc_rule_lock); + mutex_unlock(&adapter->nfc_rule_lock); } static int igc_uc_sync(struct net_device *netdev, const unsigned char *addr) @@ -3573,7 +3573,7 @@ static int igc_sw_init(struct igc_adapter *adapter) VLAN_HLEN; adapter->min_frame_size = ETH_ZLEN + ETH_FCS_LEN; - spin_lock_init(&adapter->nfc_rule_lock); + mutex_init(&adapter->nfc_rule_lock); INIT_LIST_HEAD(&adapter->nfc_rule_list); adapter->nfc_rule_count = 0;