From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from list by lists.gnu.org with archive (Exim 4.71) id 1b05B4-0007Ot-PS for mharc-grub-devel@gnu.org; Tue, 10 May 2016 06:46:10 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:57452) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1b05B1-0007Km-To for grub-devel@gnu.org; Tue, 10 May 2016 06:46:09 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1b05Aw-0002ks-Q6 for grub-devel@gnu.org; Tue, 10 May 2016 06:46:07 -0400 Received: from aserp1040.oracle.com ([141.146.126.69]:23129) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1b05Aw-0002k4-Ho for grub-devel@gnu.org; Tue, 10 May 2016 06:46:02 -0400 Received: from userv0021.oracle.com (userv0021.oracle.com [156.151.31.71]) by aserp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id u4AAjvx1010262 (version=TLSv1 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Tue, 10 May 2016 10:45:58 GMT Received: from aserv0121.oracle.com (aserv0121.oracle.com [141.146.126.235]) by userv0021.oracle.com (8.13.8/8.13.8) with ESMTP id u4AAjvX9013804 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Tue, 10 May 2016 10:45:57 GMT Received: from abhmp0015.oracle.com (abhmp0015.oracle.com [141.146.116.21]) by aserv0121.oracle.com (8.13.8/8.13.8) with ESMTP id u4AAjufH003629 for ; Tue, 10 May 2016 10:45:56 GMT Received: from [10.162.81.53] (/10.162.81.53) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Tue, 10 May 2016 03:45:55 -0700 Subject: Re: [PATCH 2/2] ofnet: implement a receive buffer Reply-To: The development of GNU GRUB References: <1460464796-24738-1-git-send-email-stanislav.kholmanskikh@oracle.com> <1460464796-24738-2-git-send-email-stanislav.kholmanskikh@oracle.com> To: grub-devel@gnu.org Cc: vasily.isaenko@oracle.com From: Stanislav Kholmanskikh Message-ID: <5731BBDC.1060906@oracle.com> Date: Tue, 10 May 2016 13:45:48 +0300 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:38.0) Gecko/20100101 Thunderbird/38.2.0 MIME-Version: 1.0 In-Reply-To: <1460464796-24738-2-git-send-email-stanislav.kholmanskikh@oracle.com> Content-Type: text/plain; charset=windows-1252; format=flowed Content-Transfer-Encoding: 7bit X-Source-IP: userv0021.oracle.com [156.151.31.71] X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.4.x-2.6.x [generic] X-Received-From: 141.146.126.69 X-BeenThere: grub-devel@gnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: The development of GNU GRUB List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Tue, 10 May 2016 10:46:09 -0000 Hi. Could anybody have a look at this series, please? Thanks. On 04/12/2016 03:39 PM, Stanislav Kholmanskikh wrote: > get_card_packet() from ofnet.c allocates a netbuff based on the device's MTU: > > nb = grub_netbuff_alloc (dev->mtu + 64 + 2); > > In the case when the MTU is large, and the received packet is > relatively small, this leads to allocation of significantly more memory, > than it's required. An example could be transmission of TFTP packets > with 0x400 blksize via a network card with 0x10000 MTU. > > This patch implements a per-card receive buffer in a way similar to efinet.c, > and makes get_card_packet() allocate a netbuff of the received data size. > > Signed-off-by: Stanislav Kholmanskikh > --- > grub-core/net/drivers/ieee1275/ofnet.c | 100 ++++++++++++++++++------------- > 1 files changed, 58 insertions(+), 42 deletions(-) > > diff --git a/grub-core/net/drivers/ieee1275/ofnet.c b/grub-core/net/drivers/ieee1275/ofnet.c > index 6bd3b92..09ec77e 100644 > --- a/grub-core/net/drivers/ieee1275/ofnet.c > +++ b/grub-core/net/drivers/ieee1275/ofnet.c > @@ -85,24 +85,35 @@ get_card_packet (struct grub_net_card *dev) > grub_uint64_t start_time; > struct grub_net_buff *nb; > > - nb = grub_netbuff_alloc (dev->mtu + 64 + 2); > + start_time = grub_get_time_ms (); > + do > + rc = grub_ieee1275_read (data->handle, dev->rcvbuf, dev->rcvbufsize, &actual); > + while ((actual <= 0 || rc < 0) && (grub_get_time_ms () - start_time < 200)); > + > + if (actual <= 0) > + return NULL; > + > + nb = grub_netbuff_alloc (actual + 2); > if (!nb) > return NULL; > + > /* Reserve 2 bytes so that 2 + 14/18 bytes of ethernet header is divisible > by 4. So that IP header is aligned on 4 bytes. */ > - grub_netbuff_reserve (nb, 2); > + if (grub_netbuff_reserve (nb, 2)) > + { > + grub_netbuff_free (nb); > + return NULL; > + } > > - start_time = grub_get_time_ms (); > - do > - rc = grub_ieee1275_read (data->handle, nb->data, dev->mtu + 64, &actual); > - while ((actual <= 0 || rc < 0) && (grub_get_time_ms () - start_time < 200)); > - if (actual > 0) > + grub_memcpy (nb->data, dev->rcvbuf, actual); > + > + if (grub_netbuff_put (nb, actual)) > { > - grub_netbuff_put (nb, actual); > - return nb; > + grub_netbuff_free (nb); > + return NULL; > } > - grub_netbuff_free (nb); > - return NULL; > + > + return nb; > } > > static struct grub_net_card_driver ofdriver = > @@ -294,6 +305,24 @@ grub_ieee1275_net_config_real (const char *devpath, char **device, char **path, > } > } > > +static void * > +ofnet_alloc_netbuf (grub_size_t len) > +{ > + if (grub_ieee1275_test_flag (GRUB_IEEE1275_FLAG_VIRT_TO_REAL_BROKEN)) > + return grub_ieee1275_alloc_mem (len); > + else > + return grub_malloc (len); > +} > + > +static void > +ofnet_free_netbuf (void *addr, grub_size_t len) > +{ > + if (grub_ieee1275_test_flag (GRUB_IEEE1275_FLAG_VIRT_TO_REAL_BROKEN)) > + grub_ieee1275_free_mem (addr, len); > + else > + grub_free (addr); > +} > + > static int > search_net_devices (struct grub_ieee1275_devalias *alias) > { > @@ -409,41 +438,21 @@ search_net_devices (struct grub_ieee1275_devalias *alias) > card->default_address = lla; > > card->txbufsize = ALIGN_UP (card->mtu, 64) + 256; > + card->rcvbufsize = ALIGN_UP (card->mtu, 64) + 256; > > - if (grub_ieee1275_test_flag (GRUB_IEEE1275_FLAG_VIRT_TO_REAL_BROKEN)) > - { > - struct alloc_args > - { > - struct grub_ieee1275_common_hdr common; > - grub_ieee1275_cell_t method; > - grub_ieee1275_cell_t len; > - grub_ieee1275_cell_t catch; > - grub_ieee1275_cell_t result; > - } > - args; > - INIT_IEEE1275_COMMON (&args.common, "interpret", 2, 2); > - args.len = card->txbufsize; > - args.method = (grub_ieee1275_cell_t) "alloc-mem"; > - > - if (IEEE1275_CALL_ENTRY_FN (&args) == -1 > - || args.catch) > - { > - card->txbuf = 0; > - grub_error (GRUB_ERR_OUT_OF_MEMORY, N_("out of memory")); > - } > - else > - card->txbuf = (void *) args.result; > - } > - else > - card->txbuf = grub_zalloc (card->txbufsize); > + card->txbuf = ofnet_alloc_netbuf (card->txbufsize); > if (!card->txbuf) > + goto fail; > + > + card->rcvbuf = ofnet_alloc_netbuf (card->rcvbufsize); > + if (!card->rcvbuf) > { > - grub_free (ofdata->path); > - grub_free (ofdata); > - grub_free (card); > - grub_print_error (); > - return 0; > + grub_error_push (); > + ofnet_free_netbuf(card->txbuf, card->txbufsize); > + grub_error_pop (); > + goto fail; > } > + > card->driver = NULL; > card->data = ofdata; > card->flags = 0; > @@ -455,6 +464,13 @@ search_net_devices (struct grub_ieee1275_devalias *alias) > card->driver = &ofdriver; > grub_net_card_register (card); > return 0; > + > + fail: > + grub_free (ofdata->path); > + grub_free (ofdata); > + grub_free (card); > + grub_print_error (); > + return 1; > } > > static void >