Hi Juliet, Juliet Kim <juli...@linux.vnet.ibm.com> writes: > Signed-off-by: Juliet Kim <juli...@linux.vnet.ibm.com> > --- > drivers/net/ethernet/ibm/ibmvnic.c | 23 ++++++++++++++++++++++- > drivers/net/ethernet/ibm/ibmvnic.h | 3 +++ > 2 files changed, 25 insertions(+), 1 deletion(-) > > diff --git a/drivers/net/ethernet/ibm/ibmvnic.c > b/drivers/net/ethernet/ibm/ibmvnic.c > index ba340aaff1b3..f344ccd68ad9 100644 > --- a/drivers/net/ethernet/ibm/ibmvnic.c > +++ b/drivers/net/ethernet/ibm/ibmvnic.c > @@ -2054,6 +2054,13 @@ static void __ibmvnic_reset(struct work_struct *work) > > adapter = container_of(work, struct ibmvnic_adapter, ibmvnic_reset); > > + if (adapter->resetting) { > + schedule_delayed_work(&adapter->ibmvnic_delayed_reset, > + IBMVNIC_RESET_DELAY); > + return; > + } > + > + adapter->resetting = true; > reset_state = adapter->state;
Is there some locking/serialisation around this? Otherwise that looks very racy. ie. two CPUs could both see adapter->resetting == false, then both set it to true, and then continue executing and stomp on each other. cheers