Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 97332
b: refs/heads/master
c: 5b9e207
h: refs/heads/master
v: v3
  • Loading branch information
Ben Hutchings authored and Jeff Garzik committed May 22, 2008
1 parent d76aab7 commit fc17f85
Show file tree
Hide file tree
Showing 2 changed files with 15 additions and 7 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: 086ea3564a5378a06c7cbfaf9d2727bc58a8c285
refs/heads/master: 5b9e207ced5bb7af98b3c147171893435f5104ca
20 changes: 14 additions & 6 deletions trunk/drivers/net/sfc/efx.c
Original file line number Diff line number Diff line change
Expand Up @@ -199,11 +199,12 @@ static inline int efx_process_channel(struct efx_channel *channel, int rx_quota)
*/
static inline void efx_channel_processed(struct efx_channel *channel)
{
/* Write to EVQ_RPTR_REG. If a new event arrived in a race
* with finishing processing, a new interrupt will be raised.
*/
/* The interrupt handler for this channel may set work_pending
* as soon as we acknowledge the events we've seen. Make sure
* it's cleared before then. */
channel->work_pending = 0;
smp_wmb(); /* Ensure channel updated before any new interrupt. */
smp_wmb();

falcon_eventq_read_ack(channel);
}

Expand Down Expand Up @@ -427,9 +428,12 @@ static void efx_start_channel(struct efx_channel *channel)
netif_napi_add(channel->napi_dev, &channel->napi_str,
efx_poll, napi_weight);

/* The interrupt handler for this channel may set work_pending
* as soon as we enable it. Make sure it's cleared before
* then. Similarly, make sure it sees the enabled flag set. */
channel->work_pending = 0;
channel->enabled = 1;
smp_wmb(); /* ensure channel updated before first interrupt */
smp_wmb();

napi_enable(&channel->napi_str);

Expand Down Expand Up @@ -1332,13 +1336,17 @@ static int efx_net_stop(struct net_device *net_dev)
return 0;
}

/* Context: process, dev_base_lock held, non-blocking. */
/* Context: process, dev_base_lock or RTNL held, non-blocking. */
static struct net_device_stats *efx_net_stats(struct net_device *net_dev)
{
struct efx_nic *efx = net_dev->priv;
struct efx_mac_stats *mac_stats = &efx->mac_stats;
struct net_device_stats *stats = &net_dev->stats;

/* Update stats if possible, but do not wait if another thread
* is updating them (or resetting the NIC); slightly stale
* stats are acceptable.
*/
if (!spin_trylock(&efx->stats_lock))
return stats;
if (efx->state == STATE_RUNNING) {
Expand Down

0 comments on commit fc17f85

Please sign in to comment.