diff options
| author | Jiri Kosina <jkosina@suse.cz> | 2011-09-15 15:08:05 +0200 | 
|---|---|---|
| committer | Jiri Kosina <jkosina@suse.cz> | 2011-09-15 15:08:18 +0200 | 
| commit | e060c38434b2caa78efe7cedaff4191040b65a15 (patch) | |
| tree | 407361230bf6733f63d8e788e4b5e6566ee04818 /drivers/net/ibmveth.c | |
| parent | 10e4ac572eeffe5317019bd7330b6058a400dfc2 (diff) | |
| parent | cc39c6a9bbdebfcf1a7dee64d83bf302bc38d941 (diff) | |
| download | olio-linux-3.10-e060c38434b2caa78efe7cedaff4191040b65a15.tar.xz olio-linux-3.10-e060c38434b2caa78efe7cedaff4191040b65a15.zip  | |
Merge branch 'master' into for-next
Fast-forward merge with Linus to be able to merge patches
based on more recent version of the tree.
Diffstat (limited to 'drivers/net/ibmveth.c')
| -rw-r--r-- | drivers/net/ibmveth.c | 14 | 
1 files changed, 10 insertions, 4 deletions
diff --git a/drivers/net/ibmveth.c b/drivers/net/ibmveth.c index 838c5b67376..3e667926940 100644 --- a/drivers/net/ibmveth.c +++ b/drivers/net/ibmveth.c @@ -43,7 +43,7 @@  #include <linux/ipv6.h>  #include <linux/slab.h>  #include <asm/hvcall.h> -#include <asm/atomic.h> +#include <linux/atomic.h>  #include <asm/vio.h>  #include <asm/iommu.h>  #include <asm/firmware.h> @@ -395,7 +395,7 @@ static inline struct sk_buff *ibmveth_rxq_get_buffer(struct ibmveth_adapter *ada  }  /* recycle the current buffer on the rx queue */ -static void ibmveth_rxq_recycle_buffer(struct ibmveth_adapter *adapter) +static int ibmveth_rxq_recycle_buffer(struct ibmveth_adapter *adapter)  {  	u32 q_index = adapter->rx_queue.index;  	u64 correlator = adapter->rx_queue.queue_addr[q_index].correlator; @@ -403,6 +403,7 @@ static void ibmveth_rxq_recycle_buffer(struct ibmveth_adapter *adapter)  	unsigned int index = correlator & 0xffffffffUL;  	union ibmveth_buf_desc desc;  	unsigned long lpar_rc; +	int ret = 1;  	BUG_ON(pool >= IBMVETH_NUM_BUFF_POOLS);  	BUG_ON(index >= adapter->rx_buff_pool[pool].size); @@ -410,7 +411,7 @@ static void ibmveth_rxq_recycle_buffer(struct ibmveth_adapter *adapter)  	if (!adapter->rx_buff_pool[pool].active) {  		ibmveth_rxq_harvest_buffer(adapter);  		ibmveth_free_buffer_pool(adapter, &adapter->rx_buff_pool[pool]); -		return; +		goto out;  	}  	desc.fields.flags_len = IBMVETH_BUF_VALID | @@ -423,12 +424,16 @@ static void ibmveth_rxq_recycle_buffer(struct ibmveth_adapter *adapter)  		netdev_dbg(adapter->netdev, "h_add_logical_lan_buffer failed "  			   "during recycle rc=%ld", lpar_rc);  		ibmveth_remove_buffer_from_pool(adapter, adapter->rx_queue.queue_addr[adapter->rx_queue.index].correlator); +		ret = 0;  	}  	if (++adapter->rx_queue.index == adapter->rx_queue.num_slots) {  		adapter->rx_queue.index = 0;  		adapter->rx_queue.toggle = !adapter->rx_queue.toggle;  	} + +out: +	return ret;  }  static void ibmveth_rxq_harvest_buffer(struct ibmveth_adapter *adapter) @@ -1084,8 +1089,9 @@ restart_poll:  				if (rx_flush)  					ibmveth_flush_buffer(skb->data,  						length + offset); +				if (!ibmveth_rxq_recycle_buffer(adapter)) +					kfree_skb(skb);  				skb = new_skb; -				ibmveth_rxq_recycle_buffer(adapter);  			} else {  				ibmveth_rxq_harvest_buffer(adapter);  				skb_reserve(skb, offset);  |