From: Julian Wiedmann <jwi@linux.vnet.ibm.com> To: David Miller <davem@davemloft.net> Cc: <netdev@vger.kernel.org>, <linux-s390@vger.kernel.org>, Martin Schwidefsky <schwidefsky@de.ibm.com>, Heiko Carstens <heiko.carstens@de.ibm.com>, Stefan Raspl <raspl@linux.vnet.ibm.com>, Ursula Braun <ubraun@linux.vnet.ibm.com>, Julian Wiedmann <jwi@linux.vnet.ibm.com> Subject: [PATCH net-next 10/13] s390/qeth: consolidate skb allocation Date: Wed, 18 Oct 2017 17:40:22 +0200 [thread overview] Message-ID: <20171018154025.73630-11-jwi@linux.vnet.ibm.com> (raw) In-Reply-To: <20171018154025.73630-1-jwi@linux.vnet.ibm.com> Move the allocation of SG skbs into the main path. This allows for a little code sharing, and handling ENOMEM from within one place. As side effect, L2 SG skbs now get the proper amount of additional headroom (read: zero) instead of the hard-coded ETH_HLEN. Signed-off-by: Julian Wiedmann <jwi@linux.vnet.ibm.com> --- drivers/s390/net/qeth_core_main.c | 71 +++++++++++++++++---------------------- 1 file changed, 31 insertions(+), 40 deletions(-) diff --git a/drivers/s390/net/qeth_core_main.c b/drivers/s390/net/qeth_core_main.c index 1cf4e066955f..23b439fb5f2c 100644 --- a/drivers/s390/net/qeth_core_main.c +++ b/drivers/s390/net/qeth_core_main.c @@ -5170,41 +5170,27 @@ int qeth_core_hardsetup_card(struct qeth_card *card) } EXPORT_SYMBOL_GPL(qeth_core_hardsetup_card); -static int qeth_create_skb_frag(struct qeth_qdio_buffer *qethbuffer, - struct qdio_buffer_element *element, - struct sk_buff **pskb, int offset, int data_len) +static void qeth_create_skb_frag(struct qdio_buffer_element *element, + struct sk_buff *skb, int offset, int data_len) { struct page *page = virt_to_page(element->addr); unsigned int next_frag; - if (*pskb == NULL) { - if (qethbuffer->rx_skb) { - /* only if qeth_card.options.cq == QETH_CQ_ENABLED */ - *pskb = qethbuffer->rx_skb; - qethbuffer->rx_skb = NULL; - } else { - *pskb = dev_alloc_skb(QETH_RX_PULL_LEN + ETH_HLEN); - if (!(*pskb)) - return -ENOMEM; - } + /* first fill the linear space */ + if (!skb->len) { + unsigned int linear = min(data_len, skb_tailroom(skb)); - skb_reserve(*pskb, ETH_HLEN); - if (data_len <= QETH_RX_PULL_LEN) { - skb_put_data(*pskb, element->addr + offset, data_len); - return 0; - } else { - skb_put_data(*pskb, element->addr + offset, - QETH_RX_PULL_LEN); - data_len -= QETH_RX_PULL_LEN; - offset += QETH_RX_PULL_LEN; - /* fall through to add page frag for remaining data */ - } + skb_put_data(skb, element->addr + offset, linear); + data_len -= linear; + if (!data_len) + return; + offset += linear; + /* fall through to add page frag for remaining data */ } - next_frag = skb_shinfo(*pskb)->nr_frags; + next_frag = skb_shinfo(skb)->nr_frags; get_page(page); - skb_add_rx_frag(*pskb, next_frag, page, offset, data_len, data_len); - return 0; + skb_add_rx_frag(skb, next_frag, page, offset, data_len, data_len); } static inline int qeth_is_last_sbale(struct qdio_buffer_element *sbale) @@ -5220,7 +5206,7 @@ struct sk_buff *qeth_core_get_next_skb(struct qeth_card *card, struct qdio_buffer_element *element = *__element; struct qdio_buffer *buffer = qethbuffer->buffer; int offset = *__offset; - struct sk_buff *skb = NULL; + struct sk_buff *skb; int skb_len = 0; void *data_ptr; int data_len; @@ -5261,27 +5247,32 @@ struct sk_buff *qeth_core_get_next_skb(struct qeth_card *card, if (((skb_len >= card->options.rx_sg_cb) && (!(card->info.type == QETH_CARD_TYPE_OSN)) && (!atomic_read(&card->force_alloc_skb))) || - (card->options.cq == QETH_CQ_ENABLED)) { + (card->options.cq == QETH_CQ_ENABLED)) use_rx_sg = 1; + + if (use_rx_sg && qethbuffer->rx_skb) { + /* QETH_CQ_ENABLED only: */ + skb = qethbuffer->rx_skb; + qethbuffer->rx_skb = NULL; } else { - skb = dev_alloc_skb(skb_len + headroom); - if (!skb) - goto no_mem; - if (headroom) - skb_reserve(skb, headroom); + unsigned int linear = (use_rx_sg) ? QETH_RX_PULL_LEN : skb_len; + + skb = dev_alloc_skb(linear + headroom); } + if (!skb) + goto no_mem; + if (headroom) + skb_reserve(skb, headroom); data_ptr = element->addr + offset; while (skb_len) { data_len = min(skb_len, (int)(element->length - offset)); if (data_len) { - if (use_rx_sg) { - if (qeth_create_skb_frag(qethbuffer, element, - &skb, offset, data_len)) - goto no_mem; - } else { + if (use_rx_sg) + qeth_create_skb_frag(element, skb, offset, + data_len); + else skb_put_data(skb, data_ptr, data_len); - } } skb_len -= data_len; if (skb_len) { -- 2.13.5
WARNING: multiple messages have this Message-ID (diff)
From: Julian Wiedmann <jwi@linux.vnet.ibm.com> To: David Miller <davem@davemloft.net> Cc: netdev@vger.kernel.org, linux-s390@vger.kernel.org, Martin Schwidefsky <schwidefsky@de.ibm.com>, Heiko Carstens <heiko.carstens@de.ibm.com>, Stefan Raspl <raspl@linux.vnet.ibm.com>, Ursula Braun <ubraun@linux.vnet.ibm.com>, Julian Wiedmann <jwi@linux.vnet.ibm.com> Subject: [PATCH net-next 10/13] s390/qeth: consolidate skb allocation Date: Wed, 18 Oct 2017 17:40:22 +0200 [thread overview] Message-ID: <20171018154025.73630-11-jwi@linux.vnet.ibm.com> (raw) In-Reply-To: <20171018154025.73630-1-jwi@linux.vnet.ibm.com> Move the allocation of SG skbs into the main path. This allows for a little code sharing, and handling ENOMEM from within one place. As side effect, L2 SG skbs now get the proper amount of additional headroom (read: zero) instead of the hard-coded ETH_HLEN. Signed-off-by: Julian Wiedmann <jwi@linux.vnet.ibm.com> --- drivers/s390/net/qeth_core_main.c | 71 +++++++++++++++++---------------------- 1 file changed, 31 insertions(+), 40 deletions(-) diff --git a/drivers/s390/net/qeth_core_main.c b/drivers/s390/net/qeth_core_main.c index 1cf4e066955f..23b439fb5f2c 100644 --- a/drivers/s390/net/qeth_core_main.c +++ b/drivers/s390/net/qeth_core_main.c @@ -5170,41 +5170,27 @@ int qeth_core_hardsetup_card(struct qeth_card *card) } EXPORT_SYMBOL_GPL(qeth_core_hardsetup_card); -static int qeth_create_skb_frag(struct qeth_qdio_buffer *qethbuffer, - struct qdio_buffer_element *element, - struct sk_buff **pskb, int offset, int data_len) +static void qeth_create_skb_frag(struct qdio_buffer_element *element, + struct sk_buff *skb, int offset, int data_len) { struct page *page = virt_to_page(element->addr); unsigned int next_frag; - if (*pskb == NULL) { - if (qethbuffer->rx_skb) { - /* only if qeth_card.options.cq == QETH_CQ_ENABLED */ - *pskb = qethbuffer->rx_skb; - qethbuffer->rx_skb = NULL; - } else { - *pskb = dev_alloc_skb(QETH_RX_PULL_LEN + ETH_HLEN); - if (!(*pskb)) - return -ENOMEM; - } + /* first fill the linear space */ + if (!skb->len) { + unsigned int linear = min(data_len, skb_tailroom(skb)); - skb_reserve(*pskb, ETH_HLEN); - if (data_len <= QETH_RX_PULL_LEN) { - skb_put_data(*pskb, element->addr + offset, data_len); - return 0; - } else { - skb_put_data(*pskb, element->addr + offset, - QETH_RX_PULL_LEN); - data_len -= QETH_RX_PULL_LEN; - offset += QETH_RX_PULL_LEN; - /* fall through to add page frag for remaining data */ - } + skb_put_data(skb, element->addr + offset, linear); + data_len -= linear; + if (!data_len) + return; + offset += linear; + /* fall through to add page frag for remaining data */ } - next_frag = skb_shinfo(*pskb)->nr_frags; + next_frag = skb_shinfo(skb)->nr_frags; get_page(page); - skb_add_rx_frag(*pskb, next_frag, page, offset, data_len, data_len); - return 0; + skb_add_rx_frag(skb, next_frag, page, offset, data_len, data_len); } static inline int qeth_is_last_sbale(struct qdio_buffer_element *sbale) @@ -5220,7 +5206,7 @@ struct sk_buff *qeth_core_get_next_skb(struct qeth_card *card, struct qdio_buffer_element *element = *__element; struct qdio_buffer *buffer = qethbuffer->buffer; int offset = *__offset; - struct sk_buff *skb = NULL; + struct sk_buff *skb; int skb_len = 0; void *data_ptr; int data_len; @@ -5261,27 +5247,32 @@ struct sk_buff *qeth_core_get_next_skb(struct qeth_card *card, if (((skb_len >= card->options.rx_sg_cb) && (!(card->info.type == QETH_CARD_TYPE_OSN)) && (!atomic_read(&card->force_alloc_skb))) || - (card->options.cq == QETH_CQ_ENABLED)) { + (card->options.cq == QETH_CQ_ENABLED)) use_rx_sg = 1; + + if (use_rx_sg && qethbuffer->rx_skb) { + /* QETH_CQ_ENABLED only: */ + skb = qethbuffer->rx_skb; + qethbuffer->rx_skb = NULL; } else { - skb = dev_alloc_skb(skb_len + headroom); - if (!skb) - goto no_mem; - if (headroom) - skb_reserve(skb, headroom); + unsigned int linear = (use_rx_sg) ? QETH_RX_PULL_LEN : skb_len; + + skb = dev_alloc_skb(linear + headroom); } + if (!skb) + goto no_mem; + if (headroom) + skb_reserve(skb, headroom); data_ptr = element->addr + offset; while (skb_len) { data_len = min(skb_len, (int)(element->length - offset)); if (data_len) { - if (use_rx_sg) { - if (qeth_create_skb_frag(qethbuffer, element, - &skb, offset, data_len)) - goto no_mem; - } else { + if (use_rx_sg) + qeth_create_skb_frag(element, skb, offset, + data_len); + else skb_put_data(skb, data_ptr, data_len); - } } skb_len -= data_len; if (skb_len) { -- 2.13.5
next prev parent reply other threads:[~2017-10-18 15:40 UTC|newest] Thread overview: 30+ messages / expand[flat|nested] mbox.gz Atom feed top 2017-10-18 15:40 [PATCH net-next 00/13] s390/net: updates 2017-10-18 Julian Wiedmann 2017-10-18 15:40 ` Julian Wiedmann 2017-10-18 15:40 ` [PATCH net-next 01/13] s390/qeth: rely on kernel for feature recovery Julian Wiedmann 2017-10-18 15:40 ` Julian Wiedmann 2017-10-18 15:40 ` [PATCH net-next 02/13] s390/drivers: use setup_timer Julian Wiedmann 2017-10-18 15:40 ` Julian Wiedmann 2017-10-18 15:40 ` [PATCH net-next 03/13] s390/qeth: remove duplicated device matching Julian Wiedmann 2017-10-18 15:40 ` Julian Wiedmann 2017-10-18 15:40 ` [PATCH net-next 04/13] s390/qeth: use kstrtobool() in qeth_bridgeport_hostnotification_store() Julian Wiedmann 2017-10-18 15:40 ` Julian Wiedmann 2017-10-18 15:40 ` [PATCH net-next 05/13] s390/qeth: fix early exit from error path Julian Wiedmann 2017-10-18 15:40 ` Julian Wiedmann 2017-10-18 15:40 ` [PATCH net-next 06/13] s390/qeth: clean up initial MTU determination Julian Wiedmann 2017-10-18 15:40 ` Julian Wiedmann 2017-10-18 15:40 ` [PATCH net-next 07/13] s390/qeth: don't verify device when setting MAC address Julian Wiedmann 2017-10-18 15:40 ` Julian Wiedmann 2017-10-18 15:40 ` [PATCH net-next 08/13] s390/qeth: no VLAN support on OSM Julian Wiedmann 2017-10-18 15:40 ` Julian Wiedmann 2017-10-18 15:40 ` [PATCH net-next 09/13] s390/qeth: clean up page frag creation Julian Wiedmann 2017-10-18 15:40 ` Julian Wiedmann 2017-10-18 15:40 ` Julian Wiedmann [this message] 2017-10-18 15:40 ` [PATCH net-next 10/13] s390/qeth: consolidate skb allocation Julian Wiedmann 2017-10-18 15:40 ` [PATCH net-next 11/13] s390/qeth: try harder to get packets from RX buffer Julian Wiedmann 2017-10-18 15:40 ` Julian Wiedmann 2017-10-18 15:40 ` [PATCH net-next 12/13] s390/qeth: support GRO flush timer Julian Wiedmann 2017-10-18 15:40 ` Julian Wiedmann 2017-10-18 16:08 ` Eric Dumazet 2017-10-18 15:40 ` [PATCH net-next 13/13] s390/qeth: don't dump control cmd twice Julian Wiedmann 2017-10-18 15:40 ` Julian Wiedmann 2017-10-20 12:12 ` [PATCH net-next 00/13] s390/net: updates 2017-10-18 David Miller
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=20171018154025.73630-11-jwi@linux.vnet.ibm.com \ --to=jwi@linux.vnet.ibm.com \ --cc=davem@davemloft.net \ --cc=heiko.carstens@de.ibm.com \ --cc=linux-s390@vger.kernel.org \ --cc=netdev@vger.kernel.org \ --cc=raspl@linux.vnet.ibm.com \ --cc=schwidefsky@de.ibm.com \ --cc=ubraun@linux.vnet.ibm.com \ /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: linkBe sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes, see mirroring instructions on how to clone and mirror all data and code used by this external index.