From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from list by lists.gnu.org with archive (Exim 4.71) id 1bNLGT-0007mL-UV for mharc-grub-devel@gnu.org; Wed, 13 Jul 2016 10:35:53 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:48058) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1bNLGO-0007hd-Oa for grub-devel@gnu.org; Wed, 13 Jul 2016 10:35:52 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1bNLGJ-0004BI-Br for grub-devel@gnu.org; Wed, 13 Jul 2016 10:35:47 -0400 Received: from userp1040.oracle.com ([156.151.31.81]:48869) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1bNLGJ-0004Aa-1x for grub-devel@gnu.org; Wed, 13 Jul 2016 10:35:43 -0400 Received: from userv0022.oracle.com (userv0022.oracle.com [156.151.31.74]) by userp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id u6DEZeYN027154 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK) for ; Wed, 13 Jul 2016 14:35:40 GMT Received: from userv0121.oracle.com (userv0121.oracle.com [156.151.31.72]) by userv0022.oracle.com (8.14.4/8.13.8) with ESMTP id u6DEZdn2005355 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Wed, 13 Jul 2016 14:35:40 GMT Received: from abhmp0002.oracle.com (abhmp0002.oracle.com [141.146.116.8]) by userv0121.oracle.com (8.13.8/8.13.8) with ESMTP id u6DEZcDe030451 for ; Wed, 13 Jul 2016 14:35:39 GMT Received: from [10.162.81.53] (/10.162.81.53) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Wed, 13 Jul 2016 07:35:38 -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> <5731BBDC.1060906@oracle.com> To: grub-devel@gnu.org Cc: vasily.isaenko@oracle.com From: Stanislav Kholmanskikh Message-ID: <578651B8.8040608@oracle.com> Date: Wed, 13 Jul 2016 17:35:36 +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: <5731BBDC.1060906@oracle.com> Content-Type: text/plain; charset=windows-1252; format=flowed Content-Transfer-Encoding: 7bit X-Source-IP: userv0022.oracle.com [156.151.31.74] X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.4.x-2.6.x [generic] X-Received-From: 156.151.31.81 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: Wed, 13 Jul 2016 14:35:52 -0000 Hi. On 05/10/2016 01:45 PM, Stanislav Kholmanskikh wrote: > Hi. > > Could anybody have a look at this series, please? Ping. > > 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 >> > > _______________________________________________ > Grub-devel mailing list > Grub-devel@gnu.org > https://lists.gnu.org/mailman/listinfo/grub-devel