From: Vitaly Kuznetsov <vkuznets@redhat.com>
To: "K. Y. Srinivasan" <kys@microsoft.com>
Cc: davem@davemloft.net, netdev@vger.kernel.org,
linux-kernel@vger.kernel.org, devel@linuxdriverproject.org,
olaf@aepfle.de, apw@canonical.com, jasowang@redhat.com
Subject: Re: [PATCH net-next 08/10] hv_netvsc: Don't ask for additional head room in the skb
Date: Tue, 24 Nov 2015 09:56:20 +0100 [thread overview]
Message-ID: <87vb8rlqrv.fsf@vitty.brq.redhat.com> (raw)
In-Reply-To: <1448321346-21357-8-git-send-email-kys@microsoft.com> (K. Y. Srinivasan's message of "Mon, 23 Nov 2015 15:29:04 -0800")
"K. Y. Srinivasan" <kys@microsoft.com> writes:
> The rndis header is 116 bytes big and can be placed in the default
> head room that will be available in the skb.
We have the following in include/linux/netdevice.h:
#if defined(CONFIG_WLAN) || IS_ENABLED(CONFIG_AX25)
# if defined(CONFIG_MAC80211_MESH)
# define LL_MAX_HEADER 128
# else
# define LL_MAX_HEADER 96
# endif
#else
# define LL_MAX_HEADER 32
#endif
In case someone disables MAC80211_MESH in his kernel config we're in
troubles again. I suggest we add additional patch here making sure it is
128 bytes for Hyper-V:
#if defined(CONFIG_HYPERV_NET)
# define LL_MAX_HEADER 128
#elseif defined(CONFIG_WLAN) || IS_ENABLED(CONFIG_AX25)
...
> 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>
> ---
> drivers/net/hyperv/hyperv_net.h | 3 +++
> drivers/net/hyperv/netvsc_drv.c | 28 +++++++++-------------------
> 2 files changed, 12 insertions(+), 19 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..9b6c507 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,19 @@ 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 */
> + packet = (struct hv_netvsc_packet *)skb->cb;
>
> packet->status = 0;
> packet->xmit_more = skb->xmit_more;
> @@ -482,8 +484,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 +1072,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 +1113,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;
--
Vitaly
next prev parent reply other threads:[~2015-11-24 8:56 UTC|newest]
Thread overview: 17+ messages / expand[flat|nested] mbox.gz Atom feed top
2015-11-23 23:28 [PATCH net-next 00/10] hv_netvsc: Eliminate the additional head room K. Y. Srinivasan
2015-11-23 23:28 ` [PATCH net-next 01/10] hv_netvsc: Resize some of the variables in hv_netvsc_packet K. Y. Srinivasan
2015-11-23 23:28 ` [PATCH net-next 02/10] hv_netvsc: Rearrange the hv_negtvsc_packet to be space efficient K. Y. Srinivasan
2015-11-23 23:28 ` [PATCH net-next 03/10] hv_netvsc: Eliminate the channel field in hv_netvsc_packet structure K. Y. Srinivasan
2015-11-23 23:29 ` [PATCH net-next 04/10] hv_netvsc: Eliminate rndis_msg pointer from " K. Y. Srinivasan
2015-11-23 23:29 ` [PATCH net-next 05/10] hv_netvsc: Eliminatte the data field from struct hv_netvsc_packet K. Y. Srinivasan
2015-11-23 23:29 ` [PATCH net-next 06/10] hv_netvsc: Eliminate send_completion " K. Y. Srinivasan
2015-11-23 23:29 ` [PATCH net-next 07/10] hv_netvsc: Eliminate send_completion_ctx " K. Y. Srinivasan
2015-11-23 23:29 ` [PATCH net-next 08/10] hv_netvsc: Don't ask for additional head room in the skb K. Y. Srinivasan
2015-11-24 8:55 ` Florian Westphal
2015-11-24 16:39 ` KY Srinivasan
2015-11-24 8:56 ` Vitaly Kuznetsov [this message]
2015-11-24 16:27 ` KY Srinivasan
2015-11-23 23:29 ` [PATCH net-next 09/10] hv_netvsc: move subchannel existence check to netvsc_select_queue() K. Y. Srinivasan
2015-11-23 23:29 ` [PATCH net-next 10/10] hv_netvsc: remove locking in netvsc_send() K. Y. Srinivasan
2015-11-24 8:48 ` [PATCH net-next 01/10] hv_netvsc: Resize some of the variables in hv_netvsc_packet Vitaly Kuznetsov
2015-11-24 16:29 ` KY Srinivasan
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=87vb8rlqrv.fsf@vitty.brq.redhat.com \
--to=vkuznets@redhat.com \
--cc=apw@canonical.com \
--cc=davem@davemloft.net \
--cc=devel@linuxdriverproject.org \
--cc=jasowang@redhat.com \
--cc=kys@microsoft.com \
--cc=linux-kernel@vger.kernel.org \
--cc=netdev@vger.kernel.org \
--cc=olaf@aepfle.de \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).