Skip to content

Commit

Permalink
hv_netvsc: Fix the order of num_sc_offered decrement
Browse files Browse the repository at this point in the history
Reorder the code in netvsc_sc_open(), so num_sc_offered is only decremented
after vmbus_open() is called. This avoid pontential race of removing device
before all channels are setup.

Signed-off-by: Haiyang Zhang <[email protected]>
Reviewed-by: K. Y. Srinivasan <[email protected]>
Signed-off-by: David S. Miller <[email protected]>
  • Loading branch information
haiyangz authored and davem330 committed Mar 24, 2016
1 parent 5e82b4b commit 3f73513
Showing 1 changed file with 6 additions and 6 deletions.
12 changes: 6 additions & 6 deletions drivers/net/hyperv/rndis_filter.c
Original file line number Diff line number Diff line change
Expand Up @@ -986,12 +986,6 @@ static void netvsc_sc_open(struct vmbus_channel *new_sc)

nvscdev = hv_get_drvdata(new_sc->primary_channel->device_obj);

spin_lock_irqsave(&nvscdev->sc_lock, flags);
nvscdev->num_sc_offered--;
spin_unlock_irqrestore(&nvscdev->sc_lock, flags);
if (nvscdev->num_sc_offered == 0)
complete(&nvscdev->channel_init_wait);

if (chn_index >= nvscdev->num_chn)
return;

Expand All @@ -1004,6 +998,12 @@ static void netvsc_sc_open(struct vmbus_channel *new_sc)

if (ret == 0)
nvscdev->chn_table[chn_index] = new_sc;

spin_lock_irqsave(&nvscdev->sc_lock, flags);
nvscdev->num_sc_offered--;
spin_unlock_irqrestore(&nvscdev->sc_lock, flags);
if (nvscdev->num_sc_offered == 0)
complete(&nvscdev->channel_init_wait);
}

int rndis_filter_device_add(struct hv_device *dev,
Expand Down

0 comments on commit 3f73513

Please sign in to comment.