Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit c08cc3cc authored by Santiago Leon's avatar Santiago Leon Committed by David S. Miller
Browse files

ibmveth: Add tx_copybreak



Use the existing bounce buffer if we send a buffer under a certain size.
This saves the overhead of a TCE map/unmap.

I can't see any reason for the wmb() in the bounce buffer case, if we need
a barrier it will be before we call h_send_logical_lan but we have
nothing in the common case. Remove it.

Signed-off-by: default avatarAnton Blanchard <anton@samba.org>
Signed-off-by: default avatarSantiago Leon <santil@linux.vnet.ibm.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent e8cb7eb4
Loading
Loading
Loading
Loading
+20 −8
Original line number Original line Diff line number Diff line
@@ -117,6 +117,11 @@ MODULE_DESCRIPTION("IBM i/pSeries Virtual Ethernet Driver");
MODULE_LICENSE("GPL");
MODULE_LICENSE("GPL");
MODULE_VERSION(ibmveth_driver_version);
MODULE_VERSION(ibmveth_driver_version);


static unsigned int tx_copybreak __read_mostly = 128;
module_param(tx_copybreak, uint, 0644);
MODULE_PARM_DESC(tx_copybreak,
	"Maximum size of packet that is copied to a new buffer on transmit");

struct ibmveth_stat {
struct ibmveth_stat {
	char name[ETH_GSTRING_LEN];
	char name[ETH_GSTRING_LEN];
	int offset;
	int offset;
@@ -931,17 +936,24 @@ static netdev_tx_t ibmveth_start_xmit(struct sk_buff *skb,
		buf[1] = 0;
		buf[1] = 0;
	}
	}


	if (skb->len < tx_copybreak) {
		used_bounce = 1;
	} else {
		data_dma_addr = dma_map_single(&adapter->vdev->dev, skb->data,
		data_dma_addr = dma_map_single(&adapter->vdev->dev, skb->data,
					       skb->len, DMA_TO_DEVICE);
					       skb->len, DMA_TO_DEVICE);
		if (dma_mapping_error(&adapter->vdev->dev, data_dma_addr)) {
		if (dma_mapping_error(&adapter->vdev->dev, data_dma_addr)) {
			if (!firmware_has_feature(FW_FEATURE_CMO))
			if (!firmware_has_feature(FW_FEATURE_CMO))
			ibmveth_error_printk("tx: unable to map xmit buffer\n");
				ibmveth_error_printk("tx: unable to map "
						     "xmit buffer\n");
			tx_map_failed++;
			used_bounce = 1;
		}
	}

	if (used_bounce) {
		skb_copy_from_linear_data(skb, adapter->bounce_buffer,
		skb_copy_from_linear_data(skb, adapter->bounce_buffer,
					  skb->len);
					  skb->len);
		desc.fields.address = adapter->bounce_buffer_dma;
		desc.fields.address = adapter->bounce_buffer_dma;
		tx_map_failed++;
		used_bounce = 1;
		wmb();
	} else
	} else
		desc.fields.address = data_dma_addr;
		desc.fields.address = data_dma_addr;