forked from Minki/linux
jme: Protect vlgrp structure by pause RX actions.
Temporary stop the RX IRQ, and disable (sync) tasklet or napi. And restore it after finished the vlgrp pointer assignment. Signed-off-by: Guo-Fu Tseng <cooldavid@cooldavid.org> Cc: stable@kernel.org Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
17da69b8bf
commit
bf5e5360fd
@ -2083,12 +2083,45 @@ jme_tx_timeout(struct net_device *netdev)
|
||||
jme_reset_link(jme);
|
||||
}
|
||||
|
||||
static inline void jme_pause_rx(struct jme_adapter *jme)
|
||||
{
|
||||
atomic_dec(&jme->link_changing);
|
||||
|
||||
jme_set_rx_pcc(jme, PCC_OFF);
|
||||
if (test_bit(JME_FLAG_POLL, &jme->flags)) {
|
||||
JME_NAPI_DISABLE(jme);
|
||||
} else {
|
||||
tasklet_disable(&jme->rxclean_task);
|
||||
tasklet_disable(&jme->rxempty_task);
|
||||
}
|
||||
}
|
||||
|
||||
static inline void jme_resume_rx(struct jme_adapter *jme)
|
||||
{
|
||||
struct dynpcc_info *dpi = &(jme->dpi);
|
||||
|
||||
if (test_bit(JME_FLAG_POLL, &jme->flags)) {
|
||||
JME_NAPI_ENABLE(jme);
|
||||
} else {
|
||||
tasklet_hi_enable(&jme->rxclean_task);
|
||||
tasklet_hi_enable(&jme->rxempty_task);
|
||||
}
|
||||
dpi->cur = PCC_P1;
|
||||
dpi->attempt = PCC_P1;
|
||||
dpi->cnt = 0;
|
||||
jme_set_rx_pcc(jme, PCC_P1);
|
||||
|
||||
atomic_inc(&jme->link_changing);
|
||||
}
|
||||
|
||||
static void
|
||||
jme_vlan_rx_register(struct net_device *netdev, struct vlan_group *grp)
|
||||
{
|
||||
struct jme_adapter *jme = netdev_priv(netdev);
|
||||
|
||||
jme_pause_rx(jme);
|
||||
jme->vlgrp = grp;
|
||||
jme_resume_rx(jme);
|
||||
}
|
||||
|
||||
static void
|
||||
|
Loading…
Reference in New Issue
Block a user