Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]
Groups > linux.kernel > #1281304
| From | "K. Y. Srinivasan" <kys@microsoft.com> |
|---|---|
| Newsgroups | linux.kernel |
| Subject | [PATCH net-next V3 08/17] hv_netvsc: Don't ask for additional head room in the skb |
| Date | 2015-12-02 00:20 +0100 |
| Message-ID | <qB2ng-7GU-17@gated-at.bofh.it> (permalink) |
| References | <qB2nf-7GU-3@gated-at.bofh.it> <qB2nf-7GU-5@gated-at.bofh.it> |
| Organization | linux.* mail to news gateway |
The rndis header is 116 bytes big and can be placed in the default
head room that will be available in the skb. Since the netvsc packet
is less than 48 bytes, we can use the skb control buffer
for the netvsc packet. With these changes we don't need to
ask for additional head room.
Signed-off-by: K. Y. Srinivasan <kys@microsoft.com>
Reviewed-by: Haiyang Zhang <haiyangz@microsoft.com>
---
V2: When HYPERV_NET is configured, set LL_MAX_HEADER to 128 - Vitaly Kuznetsov <vkuznets@redhat.com>
V2: Add a build time check on the skb control buffer - Florian Westphal <fw@strlen.de>
V3: Fix a typo - David Miller
drivers/net/hyperv/hyperv_net.h | 3 +++
drivers/net/hyperv/netvsc_drv.c | 30 +++++++++++-------------------
include/linux/netdevice.h | 4 +++-
3 files changed, 17 insertions(+), 20 deletions(-)
diff --git a/drivers/net/hyperv/hyperv_net.h b/drivers/net/hyperv/hyperv_net.h
index 9504ca9..e15dc2c 100644
--- a/drivers/net/hyperv/hyperv_net.h
+++ b/drivers/net/hyperv/hyperv_net.h
@@ -124,6 +124,9 @@ struct ndis_tcp_ip_checksum_info;
/*
* Represent netvsc packet which contains 1 RNDIS and 1 ethernet frame
* within the RNDIS
+ *
+ * The size of this structure is less than 48 bytes and we can now
+ * place this structure in the skb->cb field.
*/
struct hv_netvsc_packet {
/* Bookkeeping stuff */
diff --git a/drivers/net/hyperv/netvsc_drv.c b/drivers/net/hyperv/netvsc_drv.c
index 947b778..90cc8d9 100644
--- a/drivers/net/hyperv/netvsc_drv.c
+++ b/drivers/net/hyperv/netvsc_drv.c
@@ -432,7 +432,6 @@ static int netvsc_start_xmit(struct sk_buff *skb, struct net_device *net)
u32 net_trans_info;
u32 hash;
u32 skb_length;
- u32 pkt_sz;
struct hv_page_buffer page_buf[MAX_PAGE_BUFFER_COUNT];
struct netvsc_stats *tx_stats = this_cpu_ptr(net_device_ctx->tx_stats);
@@ -460,16 +459,21 @@ check_size:
goto check_size;
}
- pkt_sz = sizeof(struct hv_netvsc_packet) + RNDIS_AND_PPI_SIZE;
-
- ret = skb_cow_head(skb, pkt_sz);
+ /*
+ * Place the rndis header in the skb head room and
+ * the skb->cb will be used for hv_netvsc_packet
+ * structure.
+ */
+ ret = skb_cow_head(skb, RNDIS_AND_PPI_SIZE);
if (ret) {
netdev_err(net, "unable to alloc hv_netvsc_packet\n");
ret = -ENOMEM;
goto drop;
}
- /* Use the headroom for building up the packet */
- packet = (struct hv_netvsc_packet *)skb->head;
+ /* Use the skb control buffer for building up the packet */
+ BUILD_BUG_ON(sizeof(struct hv_netvsc_packet) >
+ FIELD_SIZEOF(struct sk_buff, cb));
+ packet = (struct hv_netvsc_packet *)skb->cb;
packet->status = 0;
packet->xmit_more = skb->xmit_more;
@@ -482,8 +486,7 @@ check_size:
packet->is_data_pkt = true;
packet->total_data_buflen = skb->len;
- rndis_msg = (struct rndis_message *)((unsigned long)packet +
- sizeof(struct hv_netvsc_packet));
+ rndis_msg = (struct rndis_message *)skb->head;
memset(rndis_msg, 0, RNDIS_AND_PPI_SIZE);
@@ -1071,16 +1074,12 @@ static int netvsc_probe(struct hv_device *dev,
struct netvsc_device_info device_info;
struct netvsc_device *nvdev;
int ret;
- u32 max_needed_headroom;
net = alloc_etherdev_mq(sizeof(struct net_device_context),
num_online_cpus());
if (!net)
return -ENOMEM;
- max_needed_headroom = sizeof(struct hv_netvsc_packet) +
- RNDIS_AND_PPI_SIZE;
-
netif_carrier_off(net);
net_device_ctx = netdev_priv(net);
@@ -1116,13 +1115,6 @@ static int netvsc_probe(struct hv_device *dev,
net->ethtool_ops = ðtool_ops;
SET_NETDEV_DEV(net, &dev->device);
- /*
- * Request additional head room in the skb.
- * We will use this space to build the rndis
- * heaser and other state we need to maintain.
- */
- net->needed_headroom = max_needed_headroom;
-
/* Notify the netvsc driver of the new device */
memset(&device_info, 0, sizeof(device_info));
device_info.ring_size = ring_size;
diff --git a/include/linux/netdevice.h b/include/linux/netdevice.h
index d208914..96975f8 100644
--- a/include/linux/netdevice.h
+++ b/include/linux/netdevice.h
@@ -132,7 +132,9 @@ static inline bool dev_xmit_complete(int rc)
* used.
*/
-#if defined(CONFIG_WLAN) || IS_ENABLED(CONFIG_AX25)
+#if defined(CONFIG_HYPERV_NET)
+# define LL_MAX_HEADER 128
+#elif defined(CONFIG_WLAN) || IS_ENABLED(CONFIG_AX25)
# if defined(CONFIG_MAC80211_MESH)
# define LL_MAX_HEADER 128
# else
--
1.7.4.1
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/
Back to linux.kernel | Previous | Next — Previous in thread | Next in thread | Find similar | Unroll thread
[PATCH net-next V3 01/17] hv_netvsc: Resize some of the variables in hv_netvsc_packet "K. Y. Srinivasan" <kys@microsoft.com> - 2015-12-02 00:20 +0100 [PATCH net-next V3 04/17] hv_netvsc: Eliminate rndis_msg pointer from hv_netvsc_packet structure "K. Y. Srinivasan" <kys@microsoft.com> - 2015-12-02 00:20 +0100 [PATCH net-next V3 15/17] hv_netvsc: Eliminate xmit_more from struct hv_netvsc_packet "K. Y. Srinivasan" <kys@microsoft.com> - 2015-12-02 00:20 +0100 [PATCH net-next V3 10/17] hv_netvsc: remove locking in netvsc_send() "K. Y. Srinivasan" <kys@microsoft.com> - 2015-12-02 00:20 +0100 [PATCH net-next V3 08/17] hv_netvsc: Don't ask for additional head room in the skb "K. Y. Srinivasan" <kys@microsoft.com> - 2015-12-02 00:20 +0100 [PATCH net-next V3 03/17] hv_netvsc: Eliminate the channel field in hv_netvsc_packet structure "K. Y. Srinivasan" <kys@microsoft.com> - 2015-12-02 00:20 +0100 [PATCH net-next V3 07/17] hv_netvsc: Eliminate send_completion_ctx from struct hv_netvsc_packet "K. Y. Srinivasan" <kys@microsoft.com> - 2015-12-02 00:20 +0100 [PATCH net-next V3 17/17] hv_netvsc: Eliminate vlan_tci from struct hv_netvsc_packet "K. Y. Srinivasan" <kys@microsoft.com> - 2015-12-02 00:20 +0100 [PATCH ney-next V3 12/17] hv_netvsc: Eliminate send_completion_tid from struct hv_netvsc_packet "K. Y. Srinivasan" <kys@microsoft.com> - 2015-12-02 00:20 +0100 [PATCH net-next V3 09/17] hv_netvsc: move subchannel existence check to netvsc_select_queue() "K. Y. Srinivasan" <kys@microsoft.com> - 2015-12-02 00:20 +0100 [PATCH net-next V3 06/17] hv_netvsc: Eliminate send_completion from struct hv_netvsc_packet "K. Y. Srinivasan" <kys@microsoft.com> - 2015-12-02 00:20 +0100 [PATCH net-next V3 05/17] hv_netvsc: Eliminatte the data field from struct hv_netvsc_packet "K. Y. Srinivasan" <kys@microsoft.com> - 2015-12-02 00:20 +0100 [PATCH net-next V3 02/17] hv_netvsc: Rearrange the hv_negtvsc_packet to be space efficient "K. Y. Srinivasan" <kys@microsoft.com> - 2015-12-02 00:20 +0100 [PATCH net-next V3 11/17] hv_netvsc: Eliminate page_buf from struct hv_netvsc_packet "K. Y. Srinivasan" <kys@microsoft.com> - 2015-12-02 00:20 +0100 [PATCH net-next V3 13/17] hv_netvsc: Eliminate is_data_pkt from struct hv_netvsc_packet "K. Y. Srinivasan" <kys@microsoft.com> - 2015-12-02 00:20 +0100 [PATCH net-next V3 14/17] hv_netvsc: Eliminate completion_func from struct hv_netvsc_packet "K. Y. Srinivasan" <kys@microsoft.com> - 2015-12-02 00:20 +0100 [PATCH net-next V3 16/17] hv_netvsc: Eliminate status from struct hv_netvsc_packet "K. Y. Srinivasan" <kys@microsoft.com> - 2015-12-02 00:20 +0100
csiph-web