bnx2x: (semantic) revise scheduling of sp_rtnl
This removes the various points where the driver use bit operations in order to schedule the sp_rtnl_task from the code, adding a single utility function that does it instead. Signed-off-by: Yuval Mintz <yuvalmin@broadcom.com> Signed-off-by: Ariel Elior <ariele@broadcom.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
0155a27cda
commit
230bb0f336
6 changed files with 32 additions and 44 deletions
|
@ -1402,7 +1402,7 @@ struct bnx2x_fw_stats_data {
|
||||||
};
|
};
|
||||||
|
|
||||||
/* Public slow path states */
|
/* Public slow path states */
|
||||||
enum {
|
enum sp_rtnl_flag {
|
||||||
BNX2X_SP_RTNL_SETUP_TC,
|
BNX2X_SP_RTNL_SETUP_TC,
|
||||||
BNX2X_SP_RTNL_TX_TIMEOUT,
|
BNX2X_SP_RTNL_TX_TIMEOUT,
|
||||||
BNX2X_SP_RTNL_FAN_FAILURE,
|
BNX2X_SP_RTNL_FAN_FAILURE,
|
||||||
|
|
|
@ -4773,12 +4773,8 @@ void bnx2x_tx_timeout(struct net_device *dev)
|
||||||
bnx2x_panic();
|
bnx2x_panic();
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
smp_mb__before_clear_bit();
|
|
||||||
set_bit(BNX2X_SP_RTNL_TX_TIMEOUT, &bp->sp_rtnl_state);
|
|
||||||
smp_mb__after_clear_bit();
|
|
||||||
|
|
||||||
/* This allows the netif to be shutdown gracefully before resetting */
|
/* This allows the netif to be shutdown gracefully before resetting */
|
||||||
schedule_delayed_work(&bp->sp_rtnl_task, 0);
|
bnx2x_schedule_sp_rtnl(bp, BNX2X_SP_RTNL_TX_TIMEOUT, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
int bnx2x_suspend(struct pci_dev *pdev, pm_message_t state)
|
int bnx2x_suspend(struct pci_dev *pdev, pm_message_t state)
|
||||||
|
@ -4906,3 +4902,15 @@ void bnx2x_update_coalesce_sb_index(struct bnx2x *bp, u8 fw_sb_id,
|
||||||
disable = disable ? 1 : (usec ? 0 : 1);
|
disable = disable ? 1 : (usec ? 0 : 1);
|
||||||
storm_memset_hc_disable(bp, port, fw_sb_id, sb_index, disable);
|
storm_memset_hc_disable(bp, port, fw_sb_id, sb_index, disable);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void bnx2x_schedule_sp_rtnl(struct bnx2x *bp, enum sp_rtnl_flag flag,
|
||||||
|
u32 verbose)
|
||||||
|
{
|
||||||
|
smp_mb__before_clear_bit();
|
||||||
|
set_bit(flag, &bp->sp_rtnl_state);
|
||||||
|
smp_mb__after_clear_bit();
|
||||||
|
DP((BNX2X_MSG_SP | verbose), "Scheduling sp_rtnl task [Flag: %d]\n",
|
||||||
|
flag);
|
||||||
|
schedule_delayed_work(&bp->sp_rtnl_task, 0);
|
||||||
|
}
|
||||||
|
EXPORT_SYMBOL(bnx2x_schedule_sp_rtnl);
|
||||||
|
|
|
@ -1324,4 +1324,7 @@ void bnx2x_fill_fw_str(struct bnx2x *bp, char *buf, size_t buf_len);
|
||||||
int bnx2x_drain_tx_queues(struct bnx2x *bp);
|
int bnx2x_drain_tx_queues(struct bnx2x *bp);
|
||||||
void bnx2x_squeeze_objects(struct bnx2x *bp);
|
void bnx2x_squeeze_objects(struct bnx2x *bp);
|
||||||
|
|
||||||
|
void bnx2x_schedule_sp_rtnl(struct bnx2x*, enum sp_rtnl_flag,
|
||||||
|
u32 verbose);
|
||||||
|
|
||||||
#endif /* BNX2X_CMN_H */
|
#endif /* BNX2X_CMN_H */
|
||||||
|
|
|
@ -710,8 +710,7 @@ static inline void bnx2x_dcbx_update_tc_mapping(struct bnx2x *bp)
|
||||||
* as we are handling an attention on a work queue which must be
|
* as we are handling an attention on a work queue which must be
|
||||||
* flushed at some rtnl-locked contexts (e.g. if down)
|
* flushed at some rtnl-locked contexts (e.g. if down)
|
||||||
*/
|
*/
|
||||||
if (!test_and_set_bit(BNX2X_SP_RTNL_SETUP_TC, &bp->sp_rtnl_state))
|
bnx2x_schedule_sp_rtnl(bp, BNX2X_SP_RTNL_SETUP_TC, 0);
|
||||||
schedule_delayed_work(&bp->sp_rtnl_task, 0);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void bnx2x_dcbx_set_params(struct bnx2x *bp, u32 state)
|
void bnx2x_dcbx_set_params(struct bnx2x *bp, u32 state)
|
||||||
|
@ -764,10 +763,7 @@ void bnx2x_dcbx_set_params(struct bnx2x *bp, u32 state)
|
||||||
if (IS_MF(bp))
|
if (IS_MF(bp))
|
||||||
bnx2x_link_sync_notify(bp);
|
bnx2x_link_sync_notify(bp);
|
||||||
|
|
||||||
set_bit(BNX2X_SP_RTNL_TX_STOP, &bp->sp_rtnl_state);
|
bnx2x_schedule_sp_rtnl(bp, BNX2X_SP_RTNL_TX_STOP, 0);
|
||||||
|
|
||||||
schedule_delayed_work(&bp->sp_rtnl_task, 0);
|
|
||||||
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
case BNX2X_DCBX_STATE_TX_PAUSED:
|
case BNX2X_DCBX_STATE_TX_PAUSED:
|
||||||
|
|
|
@ -3908,10 +3908,7 @@ static void bnx2x_fan_failure(struct bnx2x *bp)
|
||||||
* This is due to some boards consuming sufficient power when driver is
|
* This is due to some boards consuming sufficient power when driver is
|
||||||
* up to overheat if fan fails.
|
* up to overheat if fan fails.
|
||||||
*/
|
*/
|
||||||
smp_mb__before_clear_bit();
|
bnx2x_schedule_sp_rtnl(bp, BNX2X_SP_RTNL_FAN_FAILURE, 0);
|
||||||
set_bit(BNX2X_SP_RTNL_FAN_FAILURE, &bp->sp_rtnl_state);
|
|
||||||
smp_mb__after_clear_bit();
|
|
||||||
schedule_delayed_work(&bp->sp_rtnl_task, 0);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void bnx2x_attn_int_deasserted0(struct bnx2x *bp, u32 attn)
|
static void bnx2x_attn_int_deasserted0(struct bnx2x *bp, u32 attn)
|
||||||
|
@ -5303,6 +5300,8 @@ static void bnx2x_eq_int(struct bnx2x *bp)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
|
int cmd = BNX2X_SP_RTNL_AFEX_F_UPDATE;
|
||||||
|
|
||||||
DP(BNX2X_MSG_SP | BNX2X_MSG_MCP,
|
DP(BNX2X_MSG_SP | BNX2X_MSG_MCP,
|
||||||
"AFEX: ramrod completed FUNCTION_UPDATE\n");
|
"AFEX: ramrod completed FUNCTION_UPDATE\n");
|
||||||
f_obj->complete_cmd(bp, f_obj,
|
f_obj->complete_cmd(bp, f_obj,
|
||||||
|
@ -5312,12 +5311,7 @@ static void bnx2x_eq_int(struct bnx2x *bp)
|
||||||
* sp_rtnl task as all Queue SP operations
|
* sp_rtnl task as all Queue SP operations
|
||||||
* should run under rtnl_lock.
|
* should run under rtnl_lock.
|
||||||
*/
|
*/
|
||||||
smp_mb__before_clear_bit();
|
bnx2x_schedule_sp_rtnl(bp, cmd, 0);
|
||||||
set_bit(BNX2X_SP_RTNL_AFEX_F_UPDATE,
|
|
||||||
&bp->sp_rtnl_state);
|
|
||||||
smp_mb__after_clear_bit();
|
|
||||||
|
|
||||||
schedule_delayed_work(&bp->sp_rtnl_task, 0);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
goto next_spqe;
|
goto next_spqe;
|
||||||
|
@ -12082,11 +12076,8 @@ static void bnx2x_set_rx_mode(struct net_device *dev)
|
||||||
return;
|
return;
|
||||||
} else {
|
} else {
|
||||||
/* Schedule an SP task to handle rest of change */
|
/* Schedule an SP task to handle rest of change */
|
||||||
DP(NETIF_MSG_IFUP, "Scheduling an Rx mode change\n");
|
bnx2x_schedule_sp_rtnl(bp, BNX2X_SP_RTNL_RX_MODE,
|
||||||
smp_mb__before_clear_bit();
|
NETIF_MSG_IFUP);
|
||||||
set_bit(BNX2X_SP_RTNL_RX_MODE, &bp->sp_rtnl_state);
|
|
||||||
smp_mb__after_clear_bit();
|
|
||||||
schedule_delayed_work(&bp->sp_rtnl_task, 0);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -12119,11 +12110,8 @@ void bnx2x_set_rx_mode_inner(struct bnx2x *bp)
|
||||||
/* configuring mcast to a vf involves sleeping (when we
|
/* configuring mcast to a vf involves sleeping (when we
|
||||||
* wait for the pf's response).
|
* wait for the pf's response).
|
||||||
*/
|
*/
|
||||||
smp_mb__before_clear_bit();
|
bnx2x_schedule_sp_rtnl(bp,
|
||||||
set_bit(BNX2X_SP_RTNL_VFPF_MCAST,
|
BNX2X_SP_RTNL_VFPF_MCAST, 0);
|
||||||
&bp->sp_rtnl_state);
|
|
||||||
smp_mb__after_clear_bit();
|
|
||||||
schedule_delayed_work(&bp->sp_rtnl_task, 0);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -983,11 +983,8 @@ op_err:
|
||||||
op_done:
|
op_done:
|
||||||
case BNX2X_VFOP_QSETUP_DONE:
|
case BNX2X_VFOP_QSETUP_DONE:
|
||||||
vf->cfg_flags |= VF_CFG_VLAN;
|
vf->cfg_flags |= VF_CFG_VLAN;
|
||||||
smp_mb__before_clear_bit();
|
bnx2x_schedule_sp_rtnl(bp, BNX2X_SP_RTNL_HYPERVISOR_VLAN,
|
||||||
set_bit(BNX2X_SP_RTNL_HYPERVISOR_VLAN,
|
BNX2X_MSG_IOV);
|
||||||
&bp->sp_rtnl_state);
|
|
||||||
smp_mb__after_clear_bit();
|
|
||||||
schedule_delayed_work(&bp->sp_rtnl_task, 0);
|
|
||||||
bnx2x_vfop_end(bp, vf, vfop);
|
bnx2x_vfop_end(bp, vf, vfop);
|
||||||
return;
|
return;
|
||||||
default:
|
default:
|
||||||
|
@ -3812,13 +3809,9 @@ void bnx2x_timer_sriov(struct bnx2x *bp)
|
||||||
bnx2x_sample_bulletin(bp);
|
bnx2x_sample_bulletin(bp);
|
||||||
|
|
||||||
/* if channel is down we need to self destruct */
|
/* if channel is down we need to self destruct */
|
||||||
if (bp->old_bulletin.valid_bitmap & 1 << CHANNEL_DOWN) {
|
if (bp->old_bulletin.valid_bitmap & 1 << CHANNEL_DOWN)
|
||||||
smp_mb__before_clear_bit();
|
bnx2x_schedule_sp_rtnl(bp, BNX2X_SP_RTNL_VFPF_CHANNEL_DOWN,
|
||||||
set_bit(BNX2X_SP_RTNL_VFPF_CHANNEL_DOWN,
|
BNX2X_MSG_IOV);
|
||||||
&bp->sp_rtnl_state);
|
|
||||||
smp_mb__after_clear_bit();
|
|
||||||
schedule_delayed_work(&bp->sp_rtnl_task, 0);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void __iomem *bnx2x_vf_doorbells(struct bnx2x *bp)
|
void __iomem *bnx2x_vf_doorbells(struct bnx2x *bp)
|
||||||
|
|
Loading…
Add table
Reference in a new issue