===== drivers/net/ibmveth.c 1.14 vs edited ===== --- 1.14/drivers/net/ibmveth.c Tue Aug 10 19:09:45 2004 +++ edited/drivers/net/ibmveth.c Tue Aug 10 19:30:10 2004 @@ -271,7 +271,6 @@ adapter->rx_no_buffer = *(u64*)(((char*)adapter->buffer_list_addr) + 4096 - 8); atomic_inc(&adapter->not_replenishing); - ibmveth_assert(atomic_read(&adapter->not_replenishing) == 1); } /* kick the replenish tasklet if we need replenishing and it isn't already running */ @@ -733,6 +732,14 @@ if(ibmveth_rxq_pending_buffer(adapter)) { struct sk_buff *skb; + + /* This barrier is necessary because we might be + reading a control dword and then reading an old + cached correlator dword. Also, the hypervisor + guarantees that the control field will be globally + visible after all the other fields are visible, + */ + rmb(); if(!ibmveth_rxq_buffer_valid(adapter)) { wmb(); /* suggested by larson1 */