void do_task_queues(u_char key, void *dev_id, struct pt_regs *regs)
{
- u_long flags;
+ unsigned long flags;
struct task_struct *p;
- shared_info_t *s;
+ shared_info_t *s;
+ net_vif_t *v;
printk("'%c' pressed -> dumping task queues\n", key);
+
read_lock_irqsave(&tasklist_lock, flags);
+
p = &idle0_task;
do {
printk("Xen: DOM %d, CPU %d [has=%c], state = %s, "
p->domain, p->processor, p->has_cpu ? 'T':'F',
task_states[p->state], p->hyp_events);
s = p->shared_info;
- if(!is_idle_task(p)) {
- net_vif_t *v = find_vif_by_id((p->domain)<<VIF_DOMAIN_SHIFT);
+ if( !is_idle_task(p) )
+ {
+ net_vif_t *v = find_vif_by_id((p->domain)<<VIF_DOMAIN_SHIFT);
printk("Guest: events = %08lx, events_mask = %08lx\n",
s->events, s->events_mask);
- if (v) {
- printk("rx_prod=%d ,rx_cons=%d, tx_prod=%d, tx_cons=%d\n",
- v->rx_prod,v->rx_cons,v->tx_prod,v->tx_cons );
- printk("rx_req_cons=%d, rx_resp_prod=%d, tx_req_cons=%d, tx_resp_prod=%d\n",
- v->rx_req_cons,v->rx_resp_prod,v->tx_req_cons,v->tx_resp_prod);
- put_vif(v);
+ if ( v != NULL )
+ {
+ printk("rx_prod=%d ,rx_cons=%d, tx_prod=%d, tx_cons=%d\n",
+ v->rx_prod, v->rx_cons, v->tx_prod, v->tx_cons );
+ printk("rx_req_cons=%d, rx_resp_prod=%d, "
+ "tx_req_cons=%d, tx_resp_prod=%d\n",
+ v->rx_req_cons, v->rx_resp_prod,
+ v->tx_req_cons, v->tx_resp_prod);
+ put_vif(v);
}
printk("Notifying guest...\n");
set_bit(_EVENT_DEBUG, &s->events);
resp->status = st;
pos = TX_RING_INC(pos);
vif->tx_resp_prod = vif->shared_idxs->tx_resp_prod = pos;
+ smp_mb(); /* Update producer before checking event threshold. */
if ( pos == vif->shared_idxs->tx_event )
{
unsigned long cpu_mask = mark_guest_event(vif->domain, _EVENT_NET);
resp->offset = off;
pos = RX_RING_INC(pos);
vif->rx_resp_prod = vif->shared_idxs->rx_resp_prod = pos;
+ smp_mb(); /* Update producer before checking event threshold. */
if ( pos == vif->shared_idxs->rx_event )
{
unsigned long cpu_mask = mark_guest_event(vif->domain, _EVENT_NET);
/* Set a new event, then check for race with update of tx_cons. */
np->net_idx->tx_event =
TX_RING_ADD(prod, (atomic_read(&np->tx_entries)>>1) + 1);
- smp_mb();
+ mb();
}
while ( prod != np->net_idx->tx_resp_prod );
np->stats.tx_packets++;
/* Only notify Xen if there are no outstanding responses. */
- smp_mb();
+ mb();
if ( np->net_idx->tx_resp_prod == i )
HYPERVISOR_net_update();
network_alloc_rx_buffers(dev);
/* Deal with hypervisor racing our resetting of rx_event. */
- smp_mb();
+ mb();
if ( np->net_idx->rx_resp_prod != i ) goto again;
}