From: Alexander Graf <agraf@suse.de>
To: "Elliott, Robert (Persistent Memory)" <elliott@hpe.com>,
The development of GNU GRUB <grub-devel@gnu.org>
Cc: "mchang@suse.com" <mchang@suse.com>
Subject: Re: [PATCH] efi: Free malloc regions on exit
Date: Fri, 27 May 2016 16:16:08 +0200 [thread overview]
Message-ID: <574856A8.3030306@suse.de> (raw)
In-Reply-To: <94D0CD8314A33A4D9D801C0FE68B4029639B78D1@G9W0745.americas.hpqcorp.net>
On 05/24/2016 06:56 AM, Elliott, Robert (Persistent Memory) wrote:
>> -----Original Message-----
>> From: Grub-devel [mailto:grub-devel-bounces+elliott=hpe.com@gnu.org]
>> On Behalf Of Alexander Graf
>> Sent: Thursday, May 19, 2016 8:38 AM
>> Subject: [PATCH] efi: Free malloc regions on exit
> ...
>> +struct efi_allocation {
> If no other file is using this, mark it as static.
Good idea.
>
>> + grub_uint64_t start_addr;
> That should be grub_efi_physical_address_t.
>
>> + grub_uint64_t pages;
> That should be grub_efi_uint64_t (the parameter type
> for add_memory_regions) or grub_efi_uintn_t (the parameter
> type for grub_efi_allocate_pages and grub_efi_free_pages).
Yup for the type changes.
>
>> +} efi_allocated_memory[16];
> Why 16 and not some other number? Consider a #define and making
> the comment about 16 in add_memory_regions more generic.
I've added some helpful comment above and moved it into a #define.
>
>> +unsigned int efi_allocated_memory_idx = 0;
> The C language definition guarantees that global variables
> are initialized to 0.
Yes, but multiple other global variables in the file also initialize
with 0. Last time I checked gcc just puts those variables into bss
either way, so you don't really lose anything by explicitly saying = 0
here. It does increase readability imho though to have it.
>
>
>> @@ -408,6 +414,13 @@ add_memory_regions (grub_efi_memory_descriptor_t
>> *memory_map,
>> (void *) ((grub_addr_t) start),
>> (unsigned) pages);
>>
>> + /* Track up to 16 regions that we allocate from */
>> + if (efi_allocated_memory_idx <
>> ARRAY_SIZE(efi_allocated_memory)) {
>> + efi_allocated_memory[efi_allocated_memory_idx].start_addr =
>> start;
>> + efi_allocated_memory[efi_allocated_memory_idx].pages =
>> pages;
>> + efi_allocated_memory_idx++;
>> + }
>> +
> Consider printing if the magic number is exceeded, rather than
> silently changing the behavior.
Good idea. I don't think anyone really cares enough - there should still
be enough ram getting free'd on exit if memory is that heavily
segmented. But I suppose firmware authors want to be aware that their
memory map is a mess, and this could tell them :).
>
>> grub_mm_init_region (addr, PAGES_TO_BYTES (pages));
>>
>> required_pages -= pages;
>> @@ -419,6 +432,17 @@ add_memory_regions (grub_efi_memory_descriptor_t
>> *memory_map,
>> grub_fatal ("too little memory");
>> }
>>
>> +void
>> +grub_efi_memory_fini (void)
>> +{
>> + unsigned int i;
>> +
>> + for (i = 0; i < efi_allocated_memory_idx; i++) {
>> + grub_efi_free_pages (efi_allocated_memory[i].start_addr,
>> + efi_allocated_memory[i].pages);
>> + }
>> +}
> Consider clearing efi_allocated_memory_idx after that, since
> this function cannot be sure it's the last one to use a
> global variable.
I'm not sure it's incredibly helpful (since this is a _fini function
that basically denotes the end of grub's life), but sure.
>
> Clearing start_addr might help prevent stale pointer
> reference bugs. Pointers that are no longer valid are
> dangerous to leave around.
That one however I don't agree with. Array elements are only really
valid if their counter considers them as valid. If we initialize the
counter to 0 that means the whole array should automatically be
considered unused.
Thanks a lot for the review :).
Alex
prev parent reply other threads:[~2016-05-27 14:16 UTC|newest]
Thread overview: 6+ messages / expand[flat|nested] mbox.gz Atom feed top
2016-05-19 13:37 [PATCH] efi: Free malloc regions on exit Alexander Graf
2016-05-20 3:56 ` Andrei Borzenkov
2016-05-20 4:34 ` Michael Chang
2016-05-28 8:07 ` Andrei Borzenkov
2016-05-24 4:56 ` Elliott, Robert (Persistent Memory)
2016-05-27 14:16 ` Alexander Graf [this message]
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=574856A8.3030306@suse.de \
--to=agraf@suse.de \
--cc=elliott@hpe.com \
--cc=grub-devel@gnu.org \
--cc=mchang@suse.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: 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).