From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 4B1BCC43334 for ; Fri, 3 Jun 2022 15:33:43 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S245547AbiFCPdl (ORCPT ); Fri, 3 Jun 2022 11:33:41 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:52400 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S230520AbiFCPdk (ORCPT ); Fri, 3 Jun 2022 11:33:40 -0400 Received: from mail-ed1-x52f.google.com (mail-ed1-x52f.google.com [IPv6:2a00:1450:4864:20::52f]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 3BE2744A14; Fri, 3 Jun 2022 08:33:39 -0700 (PDT) Received: by mail-ed1-x52f.google.com with SMTP id fd25so10652128edb.3; Fri, 03 Jun 2022 08:33:39 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=mime-version:references:in-reply-to:from:date:message-id:subject:to :cc; bh=oq/7Nt8hH+8An2BVROqJRuKS0FRepvvGNwqF4LhpwJ4=; b=DzV8Du2HCN9eSAgLq3MmS7PYFIDS1VRh6mUcBFhEV21yX/IAgSreSh/t0mxzUtlImT rfOo2ZsgUXTal15h7gqJ3yfC67EuvjyOCTFfTAcVFPBROXrLgimo9pbQA2jauTKqdiHv 8rYPBk3HZh2QD+PnAMm9CTzNQeC5kO98ipf8eDi4YcO3RoVLWo/3YXOTCHmj0RWgcqGV p2isfYtVh+mgHQ+vs/Y7M792D41OHL9f2VzELxLiQe6NQ8qI8ZrlyU+QZtDPjUQKZowp h7ivIuhuz8cQZi3TiKh9mmfcCwiZR1BLqwfiiwt7n4xMegJPJiL3JMgE2+XaZ9FfJl8o 1xMg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:mime-version:references:in-reply-to:from:date :message-id:subject:to:cc; bh=oq/7Nt8hH+8An2BVROqJRuKS0FRepvvGNwqF4LhpwJ4=; b=p6bJLr3//zxGLT86rkDCdFcBgy+5YDqDsQEKUtr5hROZQ+vNEKMY5lN0l6ORJhcTj0 OgJEZlbmOpbMOZMYsCmxOCSIdsmdTaWgmAip3eLPIZA0O7AcdVh7Q/VfJPssGxHJDAk3 faxhQZMjlvkknxNNnJ2uDITCmeC037clNCftBprAB7jPjPzwF9+PasvlDeQd0aKOIFMS ryGk+o+xWHycJVCpIuDnxWu2cX2jI4hdtJFmGGRbc6H1jh07k330CQfSZS5cYGITSSsd DxVnxjxfLLos9nq1YjSUvdW/oh1gCFynl1RVZwzbw2kPoRrh7BJCTsf8lO6r/SCjlwlK NaMg== X-Gm-Message-State: AOAM530ENG2Y39qOn+BH+qOWNEzFooLVhCx7uumlFsFir5a12VU9vvKW 8L/RKCbPo1AphIR0aYz1ZcO1C4pqovu0F6ecKjk= X-Google-Smtp-Source: ABdhPJx9Um0Wr5FdUvDXEQcoa+psDOXWhyl3zgwebxsBe9AFwJLM9ZB77SuRP2YlibAkeQyKiO2cU5TxiNb6TkEepiU= X-Received: by 2002:a05:6402:1399:b0:410:9fa2:60d6 with SMTP id b25-20020a056402139900b004109fa260d6mr11253369edv.35.1654270416705; Fri, 03 Jun 2022 08:33:36 -0700 (PDT) MIME-Version: 1.0 References: <2997c5b0-3611-5e00-466c-b2966f09f067@nbd.name> <1654245968-8067-1-git-send-email-chen45464546@163.com> In-Reply-To: From: Alexander Duyck Date: Fri, 3 Jun 2022 08:33:25 -0700 Message-ID: Subject: Re: [PATCH v2] net: ethernet: mtk_eth_soc: fix misuse of mem alloc interface netdev[napi]_alloc_frag To: Chen Lin Cc: Felix Fietkau , Jakub Kicinski , John Crispin , Sean Wang , Mark-MC.Lee@mediatek.com, David Miller , Eric Dumazet , Paolo Abeni , matthias.bgg@gmail.com, Netdev , linux-arm-kernel@lists.infradead.org, linux-mediatek@lists.infradead.org, LKML Content-Type: text/plain; charset="UTF-8" Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On Fri, Jun 3, 2022 at 8:25 AM Alexander Duyck wrote: > > On Fri, Jun 3, 2022 at 2:03 AM Chen Lin wrote: > > > > When rx_flag == MTK_RX_FLAGS_HWLRO, > > rx_data_len = MTK_MAX_LRO_RX_LENGTH(4096 * 3) > PAGE_SIZE. > > netdev_alloc_frag is for alloction of page fragment only. > > Reference to other drivers and Documentation/vm/page_frags.rst > > > > Branch to use alloc_pages when ring->frag_size > PAGE_SIZE. > > > > Signed-off-by: Chen Lin > > --- > > drivers/net/ethernet/mediatek/mtk_eth_soc.c | 22 ++++++++++++++++++++-- > > 1 file changed, 20 insertions(+), 2 deletions(-) > > > > diff --git a/drivers/net/ethernet/mediatek/mtk_eth_soc.c b/drivers/net/ethernet/mediatek/mtk_eth_soc.c > > index b3b3c07..772d903 100644 > > --- a/drivers/net/ethernet/mediatek/mtk_eth_soc.c > > +++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.c > > @@ -1467,7 +1467,16 @@ static int mtk_poll_rx(struct napi_struct *napi, int budget, > > goto release_desc; > > > > /* alloc new buffer */ > > - new_data = napi_alloc_frag(ring->frag_size); > > + if (ring->frag_size <= PAGE_SIZE) { > > + new_data = napi_alloc_frag(ring->frag_size); > > + } else { > > + struct page *page; > > + unsigned int order = get_order(ring->frag_size); > > + > > + page = alloc_pages(GFP_ATOMIC | __GFP_COMP | > > + __GFP_NOWARN, order); > > + new_data = page ? page_address(page) : NULL; > > + } > > if (unlikely(!new_data)) { > > netdev->stats.rx_dropped++; > > goto release_desc; > > @@ -1914,7 +1923,16 @@ static int mtk_rx_alloc(struct mtk_eth *eth, int ring_no, int rx_flag) > > return -ENOMEM; > > > > for (i = 0; i < rx_dma_size; i++) { > > - ring->data[i] = netdev_alloc_frag(ring->frag_size); > > + if (ring->frag_size <= PAGE_SIZE) { > > + ring->data[i] = netdev_alloc_frag(ring->frag_size); > > + } else { > > + struct page *page; > > + unsigned int order = get_order(ring->frag_size); > > + > > + page = alloc_pages(GFP_KERNEL | __GFP_COMP | > > + __GFP_NOWARN, order); > > + ring->data[i] = page ? page_address(page) : NULL; > > + } > > if (!ring->data[i]) > > return -ENOMEM; > > } > > Actually I looked closer at this driver. Is it able to receive frames > larger than 2K? If not there isn't any point in this change. > > Based on commit 4fd59792097a ("net: ethernet: mediatek: support > setting MTU") it looks like it doesn't, so odds are this patch is not > necessary. I spoke too soon. I had overlooked the LRO part. With that being the case you can probably optimize this code to do away with the get_order piece entirely, at least during runtime. My main concern is that doing that in the fast-path will be expensive so you would be much better off doing something like get_order(mtk_max_frag_size(MTK_RX_FLAGS_HWLRO)) which would be converted into a constant at compile time since everything else would be less than 1 page in size. Also you could then replace alloc_pages with __get_free_pages which would take care of the page_address call for you. From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.133]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id 98060C43334 for ; Fri, 3 Jun 2022 15:34:07 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20210309; h=Sender: Content-Transfer-Encoding:Content-Type:List-Subscribe:List-Help:List-Post: List-Archive:List-Unsubscribe:List-Id:Cc:To:Subject:Message-ID:Date:From: In-Reply-To:References:MIME-Version:Reply-To:Content-ID:Content-Description: Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID: List-Owner; bh=z04GqdIq0nbbJumXjS8MwxzVoOdY5hmfOR7O5JxL2HI=; b=N/qdukl9yC6XSk Mm7fvqvSpOX4ty7U1ihP7xs6bfGtggRp5LBEz7B0GDhlc9I4m51A+3Tf9JFDPPC0v1wzz3eMsm1+j MyaphboEKvmDdcei08xX+CoPJQp6yx4kxxBAuh0EteTvumUy9KrVHzLRUAB1qhcM32NNLl506xQOp 1lZ8bOy2Y153rCnznXXkVdf3gH+V96+aoc4Pgf7iSdPobS4ElbxcVNbJwOD7xJQylXxut+Hfq+tkj qNyHx1bm6B5ciSQ/V0dICclRxONriECPsEJjmRT5ttgyxCua/qzPQuO4pg4u89Wk7sct6zJTA7aGD mzGZmkyyP44Ztb8vrpZA==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.94.2 #2 (Red Hat Linux)) id 1nx9JH-0081GB-1N; Fri, 03 Jun 2022 15:33:59 +0000 Received: from mail-ed1-x52e.google.com ([2a00:1450:4864:20::52e]) by bombadil.infradead.org with esmtps (Exim 4.94.2 #2 (Red Hat Linux)) id 1nx9J4-00818J-Ue; Fri, 03 Jun 2022 15:33:48 +0000 Received: by mail-ed1-x52e.google.com with SMTP id v19so10642574edd.4; Fri, 03 Jun 2022 08:33:37 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=mime-version:references:in-reply-to:from:date:message-id:subject:to :cc; bh=oq/7Nt8hH+8An2BVROqJRuKS0FRepvvGNwqF4LhpwJ4=; b=DzV8Du2HCN9eSAgLq3MmS7PYFIDS1VRh6mUcBFhEV21yX/IAgSreSh/t0mxzUtlImT rfOo2ZsgUXTal15h7gqJ3yfC67EuvjyOCTFfTAcVFPBROXrLgimo9pbQA2jauTKqdiHv 8rYPBk3HZh2QD+PnAMm9CTzNQeC5kO98ipf8eDi4YcO3RoVLWo/3YXOTCHmj0RWgcqGV p2isfYtVh+mgHQ+vs/Y7M792D41OHL9f2VzELxLiQe6NQ8qI8ZrlyU+QZtDPjUQKZowp h7ivIuhuz8cQZi3TiKh9mmfcCwiZR1BLqwfiiwt7n4xMegJPJiL3JMgE2+XaZ9FfJl8o 1xMg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:mime-version:references:in-reply-to:from:date :message-id:subject:to:cc; bh=oq/7Nt8hH+8An2BVROqJRuKS0FRepvvGNwqF4LhpwJ4=; b=wlXxup/B1SLl+Y40f1Qc5jyprvRSJGahJr/rYgoAXsfnWP5+u8slYxEQQShm/xFlSf vtv389FjY/mEG5FvJ7yzA66iPAyXzuH1StWHEvO+3yOlObqMQeYQfN6JXT3J9+nQ2xrt JE82CyjlX9ur8xI+/Ce3T23pnXIJ9GUiS1UEOKx219g8VFye5bpiTBwkqMeyi3vb1bWO FZy4zOxWuXKsVwuN7meGFDIfxjQ4is2z1hfPkGFJOgof9HwDYmMtxL0Yarlf0W341f1t wSQqZbpgX73IDZXrLZ3e34XVGLp51T+T5JADFQouRQoh/wpIAe0laYVRrNrUsFC6nIZD Ediw== X-Gm-Message-State: AOAM531YZYmrzU+Cd/erALoBWAVkNJPedVbAxp4KVdIjz/cbVsToE2eb rFgrZ0WfPxyx9aLzdMOlAnbRk25TKh3v2MiqPnM= X-Google-Smtp-Source: ABdhPJx9Um0Wr5FdUvDXEQcoa+psDOXWhyl3zgwebxsBe9AFwJLM9ZB77SuRP2YlibAkeQyKiO2cU5TxiNb6TkEepiU= X-Received: by 2002:a05:6402:1399:b0:410:9fa2:60d6 with SMTP id b25-20020a056402139900b004109fa260d6mr11253369edv.35.1654270416705; Fri, 03 Jun 2022 08:33:36 -0700 (PDT) MIME-Version: 1.0 References: <2997c5b0-3611-5e00-466c-b2966f09f067@nbd.name> <1654245968-8067-1-git-send-email-chen45464546@163.com> In-Reply-To: From: Alexander Duyck Date: Fri, 3 Jun 2022 08:33:25 -0700 Message-ID: Subject: Re: [PATCH v2] net: ethernet: mtk_eth_soc: fix misuse of mem alloc interface netdev[napi]_alloc_frag To: Chen Lin Cc: Felix Fietkau , Jakub Kicinski , John Crispin , Sean Wang , Mark-MC.Lee@mediatek.com, David Miller , Eric Dumazet , Paolo Abeni , matthias.bgg@gmail.com, Netdev , linux-arm-kernel@lists.infradead.org, linux-mediatek@lists.infradead.org, LKML X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20220603_083347_031597_E493E4A4 X-CRM114-Status: GOOD ( 26.33 ) X-BeenThere: linux-mediatek@lists.infradead.org X-Mailman-Version: 2.1.34 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Sender: "Linux-mediatek" Errors-To: linux-mediatek-bounces+linux-mediatek=archiver.kernel.org@lists.infradead.org On Fri, Jun 3, 2022 at 8:25 AM Alexander Duyck wrote: > > On Fri, Jun 3, 2022 at 2:03 AM Chen Lin wrote: > > > > When rx_flag == MTK_RX_FLAGS_HWLRO, > > rx_data_len = MTK_MAX_LRO_RX_LENGTH(4096 * 3) > PAGE_SIZE. > > netdev_alloc_frag is for alloction of page fragment only. > > Reference to other drivers and Documentation/vm/page_frags.rst > > > > Branch to use alloc_pages when ring->frag_size > PAGE_SIZE. > > > > Signed-off-by: Chen Lin > > --- > > drivers/net/ethernet/mediatek/mtk_eth_soc.c | 22 ++++++++++++++++++++-- > > 1 file changed, 20 insertions(+), 2 deletions(-) > > > > diff --git a/drivers/net/ethernet/mediatek/mtk_eth_soc.c b/drivers/net/ethernet/mediatek/mtk_eth_soc.c > > index b3b3c07..772d903 100644 > > --- a/drivers/net/ethernet/mediatek/mtk_eth_soc.c > > +++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.c > > @@ -1467,7 +1467,16 @@ static int mtk_poll_rx(struct napi_struct *napi, int budget, > > goto release_desc; > > > > /* alloc new buffer */ > > - new_data = napi_alloc_frag(ring->frag_size); > > + if (ring->frag_size <= PAGE_SIZE) { > > + new_data = napi_alloc_frag(ring->frag_size); > > + } else { > > + struct page *page; > > + unsigned int order = get_order(ring->frag_size); > > + > > + page = alloc_pages(GFP_ATOMIC | __GFP_COMP | > > + __GFP_NOWARN, order); > > + new_data = page ? page_address(page) : NULL; > > + } > > if (unlikely(!new_data)) { > > netdev->stats.rx_dropped++; > > goto release_desc; > > @@ -1914,7 +1923,16 @@ static int mtk_rx_alloc(struct mtk_eth *eth, int ring_no, int rx_flag) > > return -ENOMEM; > > > > for (i = 0; i < rx_dma_size; i++) { > > - ring->data[i] = netdev_alloc_frag(ring->frag_size); > > + if (ring->frag_size <= PAGE_SIZE) { > > + ring->data[i] = netdev_alloc_frag(ring->frag_size); > > + } else { > > + struct page *page; > > + unsigned int order = get_order(ring->frag_size); > > + > > + page = alloc_pages(GFP_KERNEL | __GFP_COMP | > > + __GFP_NOWARN, order); > > + ring->data[i] = page ? page_address(page) : NULL; > > + } > > if (!ring->data[i]) > > return -ENOMEM; > > } > > Actually I looked closer at this driver. Is it able to receive frames > larger than 2K? If not there isn't any point in this change. > > Based on commit 4fd59792097a ("net: ethernet: mediatek: support > setting MTU") it looks like it doesn't, so odds are this patch is not > necessary. I spoke too soon. I had overlooked the LRO part. With that being the case you can probably optimize this code to do away with the get_order piece entirely, at least during runtime. My main concern is that doing that in the fast-path will be expensive so you would be much better off doing something like get_order(mtk_max_frag_size(MTK_RX_FLAGS_HWLRO)) which would be converted into a constant at compile time since everything else would be less than 1 page in size. Also you could then replace alloc_pages with __get_free_pages which would take care of the page_address call for you. _______________________________________________ Linux-mediatek mailing list Linux-mediatek@lists.infradead.org http://lists.infradead.org/mailman/listinfo/linux-mediatek From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.133]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id 3EF00C433EF for ; Fri, 3 Jun 2022 15:34:57 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20210309; h=Sender: Content-Transfer-Encoding:Content-Type:List-Subscribe:List-Help:List-Post: List-Archive:List-Unsubscribe:List-Id:Cc:To:Subject:Message-ID:Date:From: In-Reply-To:References:MIME-Version:Reply-To:Content-ID:Content-Description: Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID: List-Owner; bh=B3HOwjTPwYrkLzdWTp/IPcaWfgZkfPqQ8vrs3nLmzMM=; b=BGl4gEJcXaY3K/ lLZZ97aSPu4IN8pWKkyIQDxLmDo05hzH969evR9f+dqaricpCQ8OsBYXfG0DNAFtbUFpM+ApiNpj5 0sdg0QaixYB8wjzWycOuVTY2gsrLrdQCb8fLNJcC6Og5iNpNxhvJAsFQEaJqobk2OSa151RZ7H2W5 78kQFb+thdCrNNSmNPE5GpTMKS42aXWvgQ8pyPLy6dEnYh7XP4S99pD6+3XpCpc53axAL5Fy3QVqg OoKln+jJqg4vCp0DW3xcd6cIhpRdEUi85bxXqtKw3ze5PqsmoJbd+5xRgZiD7lNactwYQXvhR/mmm isGWVSQd2IntPbu5DtIA==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.94.2 #2 (Red Hat Linux)) id 1nx9J8-0081EV-Sm; Fri, 03 Jun 2022 15:33:51 +0000 Received: from mail-ed1-x52e.google.com ([2a00:1450:4864:20::52e]) by bombadil.infradead.org with esmtps (Exim 4.94.2 #2 (Red Hat Linux)) id 1nx9J4-00818J-Ue; Fri, 03 Jun 2022 15:33:48 +0000 Received: by mail-ed1-x52e.google.com with SMTP id v19so10642574edd.4; Fri, 03 Jun 2022 08:33:37 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=mime-version:references:in-reply-to:from:date:message-id:subject:to :cc; bh=oq/7Nt8hH+8An2BVROqJRuKS0FRepvvGNwqF4LhpwJ4=; b=DzV8Du2HCN9eSAgLq3MmS7PYFIDS1VRh6mUcBFhEV21yX/IAgSreSh/t0mxzUtlImT rfOo2ZsgUXTal15h7gqJ3yfC67EuvjyOCTFfTAcVFPBROXrLgimo9pbQA2jauTKqdiHv 8rYPBk3HZh2QD+PnAMm9CTzNQeC5kO98ipf8eDi4YcO3RoVLWo/3YXOTCHmj0RWgcqGV p2isfYtVh+mgHQ+vs/Y7M792D41OHL9f2VzELxLiQe6NQ8qI8ZrlyU+QZtDPjUQKZowp h7ivIuhuz8cQZi3TiKh9mmfcCwiZR1BLqwfiiwt7n4xMegJPJiL3JMgE2+XaZ9FfJl8o 1xMg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:mime-version:references:in-reply-to:from:date :message-id:subject:to:cc; bh=oq/7Nt8hH+8An2BVROqJRuKS0FRepvvGNwqF4LhpwJ4=; b=wlXxup/B1SLl+Y40f1Qc5jyprvRSJGahJr/rYgoAXsfnWP5+u8slYxEQQShm/xFlSf vtv389FjY/mEG5FvJ7yzA66iPAyXzuH1StWHEvO+3yOlObqMQeYQfN6JXT3J9+nQ2xrt JE82CyjlX9ur8xI+/Ce3T23pnXIJ9GUiS1UEOKx219g8VFye5bpiTBwkqMeyi3vb1bWO FZy4zOxWuXKsVwuN7meGFDIfxjQ4is2z1hfPkGFJOgof9HwDYmMtxL0Yarlf0W341f1t wSQqZbpgX73IDZXrLZ3e34XVGLp51T+T5JADFQouRQoh/wpIAe0laYVRrNrUsFC6nIZD Ediw== X-Gm-Message-State: AOAM531YZYmrzU+Cd/erALoBWAVkNJPedVbAxp4KVdIjz/cbVsToE2eb rFgrZ0WfPxyx9aLzdMOlAnbRk25TKh3v2MiqPnM= X-Google-Smtp-Source: ABdhPJx9Um0Wr5FdUvDXEQcoa+psDOXWhyl3zgwebxsBe9AFwJLM9ZB77SuRP2YlibAkeQyKiO2cU5TxiNb6TkEepiU= X-Received: by 2002:a05:6402:1399:b0:410:9fa2:60d6 with SMTP id b25-20020a056402139900b004109fa260d6mr11253369edv.35.1654270416705; Fri, 03 Jun 2022 08:33:36 -0700 (PDT) MIME-Version: 1.0 References: <2997c5b0-3611-5e00-466c-b2966f09f067@nbd.name> <1654245968-8067-1-git-send-email-chen45464546@163.com> In-Reply-To: From: Alexander Duyck Date: Fri, 3 Jun 2022 08:33:25 -0700 Message-ID: Subject: Re: [PATCH v2] net: ethernet: mtk_eth_soc: fix misuse of mem alloc interface netdev[napi]_alloc_frag To: Chen Lin Cc: Felix Fietkau , Jakub Kicinski , John Crispin , Sean Wang , Mark-MC.Lee@mediatek.com, David Miller , Eric Dumazet , Paolo Abeni , matthias.bgg@gmail.com, Netdev , linux-arm-kernel@lists.infradead.org, linux-mediatek@lists.infradead.org, LKML X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20220603_083347_031597_E493E4A4 X-CRM114-Status: GOOD ( 26.33 ) X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.34 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+linux-arm-kernel=archiver.kernel.org@lists.infradead.org On Fri, Jun 3, 2022 at 8:25 AM Alexander Duyck wrote: > > On Fri, Jun 3, 2022 at 2:03 AM Chen Lin wrote: > > > > When rx_flag == MTK_RX_FLAGS_HWLRO, > > rx_data_len = MTK_MAX_LRO_RX_LENGTH(4096 * 3) > PAGE_SIZE. > > netdev_alloc_frag is for alloction of page fragment only. > > Reference to other drivers and Documentation/vm/page_frags.rst > > > > Branch to use alloc_pages when ring->frag_size > PAGE_SIZE. > > > > Signed-off-by: Chen Lin > > --- > > drivers/net/ethernet/mediatek/mtk_eth_soc.c | 22 ++++++++++++++++++++-- > > 1 file changed, 20 insertions(+), 2 deletions(-) > > > > diff --git a/drivers/net/ethernet/mediatek/mtk_eth_soc.c b/drivers/net/ethernet/mediatek/mtk_eth_soc.c > > index b3b3c07..772d903 100644 > > --- a/drivers/net/ethernet/mediatek/mtk_eth_soc.c > > +++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.c > > @@ -1467,7 +1467,16 @@ static int mtk_poll_rx(struct napi_struct *napi, int budget, > > goto release_desc; > > > > /* alloc new buffer */ > > - new_data = napi_alloc_frag(ring->frag_size); > > + if (ring->frag_size <= PAGE_SIZE) { > > + new_data = napi_alloc_frag(ring->frag_size); > > + } else { > > + struct page *page; > > + unsigned int order = get_order(ring->frag_size); > > + > > + page = alloc_pages(GFP_ATOMIC | __GFP_COMP | > > + __GFP_NOWARN, order); > > + new_data = page ? page_address(page) : NULL; > > + } > > if (unlikely(!new_data)) { > > netdev->stats.rx_dropped++; > > goto release_desc; > > @@ -1914,7 +1923,16 @@ static int mtk_rx_alloc(struct mtk_eth *eth, int ring_no, int rx_flag) > > return -ENOMEM; > > > > for (i = 0; i < rx_dma_size; i++) { > > - ring->data[i] = netdev_alloc_frag(ring->frag_size); > > + if (ring->frag_size <= PAGE_SIZE) { > > + ring->data[i] = netdev_alloc_frag(ring->frag_size); > > + } else { > > + struct page *page; > > + unsigned int order = get_order(ring->frag_size); > > + > > + page = alloc_pages(GFP_KERNEL | __GFP_COMP | > > + __GFP_NOWARN, order); > > + ring->data[i] = page ? page_address(page) : NULL; > > + } > > if (!ring->data[i]) > > return -ENOMEM; > > } > > Actually I looked closer at this driver. Is it able to receive frames > larger than 2K? If not there isn't any point in this change. > > Based on commit 4fd59792097a ("net: ethernet: mediatek: support > setting MTU") it looks like it doesn't, so odds are this patch is not > necessary. I spoke too soon. I had overlooked the LRO part. With that being the case you can probably optimize this code to do away with the get_order piece entirely, at least during runtime. My main concern is that doing that in the fast-path will be expensive so you would be much better off doing something like get_order(mtk_max_frag_size(MTK_RX_FLAGS_HWLRO)) which would be converted into a constant at compile time since everything else would be less than 1 page in size. Also you could then replace alloc_pages with __get_free_pages which would take care of the page_address call for you. _______________________________________________ linux-arm-kernel mailing list linux-arm-kernel@lists.infradead.org http://lists.infradead.org/mailman/listinfo/linux-arm-kernel