From: joeyli <jlee-IBi9RG/b67k@public.gmane.org>
To: Matt Fleming <matt-HNK1S37rvNbeXh+fF434Mdi2O/JbrIOy@public.gmane.org>
Cc: Jan Beulich <JBeulich-IBi9RG/b67k@public.gmane.org>,
Zach Bobroff <zacharyb-gH/BEeFdNRQ@public.gmane.org>,
Matt Fleming
<matt.fleming-ral2JQCrhuEAvxtiuMwx3w@public.gmane.org>,
Matthew Garrett <mjg59-1xO5oi07KQx4cg9Nei1l7Q@public.gmane.org>,
linux-efi-u79uwXL29TY76Z2rM5mHXA@public.gmane.org,
linux-kernel-u79uwXL29TY76Z2rM5mHXA@public.gmane.org,
stable-u79uwXL29TY76Z2rM5mHXA@public.gmane.org
Subject: Re: [PATCH] x86, efi: retry ExitBootServices() on failure
Date: Mon, 17 Jun 2013 18:41:30 +0800 [thread overview]
Message-ID: <1371465690.6523.331.camel@linux-s257.site> (raw)
In-Reply-To: <20130617101745.GB8569-HNK1S37rvNbeXh+fF434Mdi2O/JbrIOy@public.gmane.org>
[-- Attachment #1: Type: text/plain, Size: 1322 bytes --]
於 一,2013-06-17 於 11:17 +0100,Matt Fleming 提到:
> On Mon, 17 Jun, at 10:46:28AM, Jan Beulich wrote:
> > To me, all this looks like it is being done on phenomenological basis,
> > taking a particular build of a particular firmware implementation as
> > the reference. Imo we shouldn't change the code in this way. This
> > also applies to the fact that the step is being doubled rather than
> > e.g. tripled: With it ending up a "again" anyway (see below), what's
> > the point of avoiding one more of the iterations?
> >
> > Generic considerations would result in the increment being at least
> > 3 * element size; twice the element size assumes that the allocator
> > would behave in certain ways (like returning the head or tail part of
> > a larger piece of memory).
>
> I have no issue with changing the multiplier. But let's get
> clarification from Zach as to what exactly is going on here.
>
> > I agree that there ought to be an upper limit. But a single retry here
> > again looks like a tailored solution to a particular observed (mis-)
> > behavior, rather than something resulting from general considerations.
>
> What value would you suggest for the retry?
>
Currently grub2 retry unlimited times like attached patch.
But, I also agree need have a upper limit.
Thanks a lot!
Joey Lee
[-- Attachment #2: bug-823386_grub-r4778.diff --]
[-- Type: text/x-patch, Size: 3279 bytes --]
------------------------------------------------------------
revno: 4778
committer: Vladimir 'phcoder' Serbinenko <phcoder-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
branch nick: grub
timestamp: Tue 2013-03-26 11:34:56 +0100
message:
* grub-core/kern/efi/mm.c (grub_efi_finish_boot_services):
Try terminating EFI services several times due to quirks in some
implementations.
diff:
=== modified file 'ChangeLog'
--- ChangeLog 2013-03-26 10:29:52 +0000
+++ ChangeLog 2013-03-26 10:34:56 +0000
@@ -1,3 +1,9 @@
+2013-03-26 Vladimir Serbinenko <phcoder-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
+
+ * grub-core/kern/efi/mm.c (grub_efi_finish_boot_services):
+ Try terminating EFI services several times due to quirks in some
+ implementations.
+
2013-03-26 Colin Watson <cjwatson-GeWIH/nMZzLQT0dZR+AlfA@public.gmane.org>
* grub-core/commands/acpihalt.c (skip_ext_op): Add support for
=== modified file 'grub-core/kern/efi/mm.c'
--- grub-core/kern/efi/mm.c 2013-01-13 01:10:41 +0000
+++ grub-core/kern/efi/mm.c 2013-03-26 10:34:56 +0000
@@ -160,27 +160,41 @@
apple, sizeof (apple)) == 0);
#endif
- if (grub_efi_get_memory_map (&finish_mmap_size, finish_mmap_buf, &finish_key,
- &finish_desc_size, &finish_desc_version) < 0)
- return grub_error (GRUB_ERR_IO, "couldn't retrieve memory map");
-
- if (outbuf && *outbuf_size < finish_mmap_size)
- return grub_error (GRUB_ERR_IO, "memory map buffer is too small");
-
- finish_mmap_buf = grub_malloc (finish_mmap_size);
- if (!finish_mmap_buf)
- return grub_errno;
-
- if (grub_efi_get_memory_map (&finish_mmap_size, finish_mmap_buf, &finish_key,
- &finish_desc_size, &finish_desc_version) <= 0)
- return grub_error (GRUB_ERR_IO, "couldn't retrieve memory map");
-
- b = grub_efi_system_table->boot_services;
- status = efi_call_2 (b->exit_boot_services, grub_efi_image_handle,
- finish_key);
- if (status != GRUB_EFI_SUCCESS)
- return grub_error (GRUB_ERR_IO, "couldn't terminate EFI services");
-
+ while (1)
+ {
+ if (grub_efi_get_memory_map (&finish_mmap_size, finish_mmap_buf, &finish_key,
+ &finish_desc_size, &finish_desc_version) < 0)
+ return grub_error (GRUB_ERR_IO, "couldn't retrieve memory map");
+
+ if (outbuf && *outbuf_size < finish_mmap_size)
+ return grub_error (GRUB_ERR_IO, "memory map buffer is too small");
+
+ finish_mmap_buf = grub_malloc (finish_mmap_size);
+ if (!finish_mmap_buf)
+ return grub_errno;
+
+ if (grub_efi_get_memory_map (&finish_mmap_size, finish_mmap_buf, &finish_key,
+ &finish_desc_size, &finish_desc_version) <= 0)
+ {
+ grub_free (finish_mmap_buf);
+ return grub_error (GRUB_ERR_IO, "couldn't retrieve memory map");
+ }
+
+ b = grub_efi_system_table->boot_services;
+ status = efi_call_2 (b->exit_boot_services, grub_efi_image_handle,
+ finish_key);
+ if (status == GRUB_EFI_SUCCESS)
+ break;
+
+ if (status != GRUB_EFI_INVALID_PARAMETER)
+ {
+ grub_free (finish_mmap_buf);
+ return grub_error (GRUB_ERR_IO, "couldn't terminate EFI services");
+ }
+
+ grub_free (finish_mmap_buf);
+ grub_printf ("Trying to terminate EFI services again\n");
+ }
grub_efi_is_finished = 1;
if (outbuf_size)
*outbuf_size = finish_mmap_size;
WARNING: multiple messages have this Message-ID (diff)
From: joeyli <jlee@suse.com>
To: Matt Fleming <matt@console-pimps.org>
Cc: Jan Beulich <JBeulich@suse.com>, Zach Bobroff <zacharyb@ami.com>,
Matt Fleming <matt.fleming@intel.com>,
Matthew Garrett <mjg59@srcf.ucam.org>,
linux-efi@vger.kernel.org, linux-kernel@vger.kernel.org,
stable@vger.kernel.org
Subject: Re: [PATCH] x86, efi: retry ExitBootServices() on failure
Date: Mon, 17 Jun 2013 18:41:30 +0800 [thread overview]
Message-ID: <1371465690.6523.331.camel@linux-s257.site> (raw)
In-Reply-To: <20130617101745.GB8569@console-pimps.org>
[-- Attachment #1: Type: text/plain, Size: 1322 bytes --]
於 一,2013-06-17 於 11:17 +0100,Matt Fleming 提到:
> On Mon, 17 Jun, at 10:46:28AM, Jan Beulich wrote:
> > To me, all this looks like it is being done on phenomenological basis,
> > taking a particular build of a particular firmware implementation as
> > the reference. Imo we shouldn't change the code in this way. This
> > also applies to the fact that the step is being doubled rather than
> > e.g. tripled: With it ending up a "again" anyway (see below), what's
> > the point of avoiding one more of the iterations?
> >
> > Generic considerations would result in the increment being at least
> > 3 * element size; twice the element size assumes that the allocator
> > would behave in certain ways (like returning the head or tail part of
> > a larger piece of memory).
>
> I have no issue with changing the multiplier. But let's get
> clarification from Zach as to what exactly is going on here.
>
> > I agree that there ought to be an upper limit. But a single retry here
> > again looks like a tailored solution to a particular observed (mis-)
> > behavior, rather than something resulting from general considerations.
>
> What value would you suggest for the retry?
>
Currently grub2 retry unlimited times like attached patch.
But, I also agree need have a upper limit.
Thanks a lot!
Joey Lee
[-- Attachment #2: bug-823386_grub-r4778.diff --]
[-- Type: text/x-patch, Size: 3190 bytes --]
------------------------------------------------------------
revno: 4778
committer: Vladimir 'phcoder' Serbinenko <phcoder@gmail.com>
branch nick: grub
timestamp: Tue 2013-03-26 11:34:56 +0100
message:
* grub-core/kern/efi/mm.c (grub_efi_finish_boot_services):
Try terminating EFI services several times due to quirks in some
implementations.
diff:
=== modified file 'ChangeLog'
--- ChangeLog 2013-03-26 10:29:52 +0000
+++ ChangeLog 2013-03-26 10:34:56 +0000
@@ -1,3 +1,9 @@
+2013-03-26 Vladimir Serbinenko <phcoder@gmail.com>
+
+ * grub-core/kern/efi/mm.c (grub_efi_finish_boot_services):
+ Try terminating EFI services several times due to quirks in some
+ implementations.
+
2013-03-26 Colin Watson <cjwatson@ubuntu.com>
* grub-core/commands/acpihalt.c (skip_ext_op): Add support for
=== modified file 'grub-core/kern/efi/mm.c'
--- grub-core/kern/efi/mm.c 2013-01-13 01:10:41 +0000
+++ grub-core/kern/efi/mm.c 2013-03-26 10:34:56 +0000
@@ -160,27 +160,41 @@
apple, sizeof (apple)) == 0);
#endif
- if (grub_efi_get_memory_map (&finish_mmap_size, finish_mmap_buf, &finish_key,
- &finish_desc_size, &finish_desc_version) < 0)
- return grub_error (GRUB_ERR_IO, "couldn't retrieve memory map");
-
- if (outbuf && *outbuf_size < finish_mmap_size)
- return grub_error (GRUB_ERR_IO, "memory map buffer is too small");
-
- finish_mmap_buf = grub_malloc (finish_mmap_size);
- if (!finish_mmap_buf)
- return grub_errno;
-
- if (grub_efi_get_memory_map (&finish_mmap_size, finish_mmap_buf, &finish_key,
- &finish_desc_size, &finish_desc_version) <= 0)
- return grub_error (GRUB_ERR_IO, "couldn't retrieve memory map");
-
- b = grub_efi_system_table->boot_services;
- status = efi_call_2 (b->exit_boot_services, grub_efi_image_handle,
- finish_key);
- if (status != GRUB_EFI_SUCCESS)
- return grub_error (GRUB_ERR_IO, "couldn't terminate EFI services");
-
+ while (1)
+ {
+ if (grub_efi_get_memory_map (&finish_mmap_size, finish_mmap_buf, &finish_key,
+ &finish_desc_size, &finish_desc_version) < 0)
+ return grub_error (GRUB_ERR_IO, "couldn't retrieve memory map");
+
+ if (outbuf && *outbuf_size < finish_mmap_size)
+ return grub_error (GRUB_ERR_IO, "memory map buffer is too small");
+
+ finish_mmap_buf = grub_malloc (finish_mmap_size);
+ if (!finish_mmap_buf)
+ return grub_errno;
+
+ if (grub_efi_get_memory_map (&finish_mmap_size, finish_mmap_buf, &finish_key,
+ &finish_desc_size, &finish_desc_version) <= 0)
+ {
+ grub_free (finish_mmap_buf);
+ return grub_error (GRUB_ERR_IO, "couldn't retrieve memory map");
+ }
+
+ b = grub_efi_system_table->boot_services;
+ status = efi_call_2 (b->exit_boot_services, grub_efi_image_handle,
+ finish_key);
+ if (status == GRUB_EFI_SUCCESS)
+ break;
+
+ if (status != GRUB_EFI_INVALID_PARAMETER)
+ {
+ grub_free (finish_mmap_buf);
+ return grub_error (GRUB_ERR_IO, "couldn't terminate EFI services");
+ }
+
+ grub_free (finish_mmap_buf);
+ grub_printf ("Trying to terminate EFI services again\n");
+ }
grub_efi_is_finished = 1;
if (outbuf_size)
*outbuf_size = finish_mmap_size;
next prev parent reply other threads:[~2013-06-17 10:41 UTC|newest]
Thread overview: 30+ messages / expand[flat|nested] mbox.gz Atom feed top
2013-06-11 6:52 [PATCH] x86, efi: retry ExitBootServices() on failure Matt Fleming
2013-06-11 6:52 ` Matt Fleming
[not found] ` <1370933558-10128-1-git-send-email-matt-HNK1S37rvNbeXh+fF434Mdi2O/JbrIOy@public.gmane.org>
2013-06-11 7:22 ` Matt Fleming
2013-06-11 7:22 ` Matt Fleming
2013-06-13 16:00 ` joeyli
2013-06-13 16:00 ` joeyli
[not found] ` <1371139233.6523.272.camel-ONCj+Eqt86TasUa73XJKwA@public.gmane.org>
2013-06-17 9:21 ` Matt Fleming
2013-06-17 9:21 ` Matt Fleming
[not found] ` <20130617092107.GA5440-HNK1S37rvNbeXh+fF434Mdi2O/JbrIOy@public.gmane.org>
2013-06-17 9:46 ` Jan Beulich
2013-06-17 9:46 ` Jan Beulich
2013-06-17 10:17 ` Matt Fleming
[not found] ` <20130617101745.GB8569-HNK1S37rvNbeXh+fF434Mdi2O/JbrIOy@public.gmane.org>
2013-06-17 10:41 ` joeyli [this message]
2013-06-17 10:41 ` joeyli
2013-06-17 11:02 ` Jan Beulich
2013-06-17 11:02 ` Jan Beulich
2013-06-17 12:30 ` Matt Fleming
2013-06-18 0:18 ` Zachary Bobroff
2013-06-18 2:47 ` joeyli
2013-06-18 4:20 ` Zachary Bobroff
[not found] ` <B0277B82-F2C5-4BA9-B42C-F554E12F6961-gH/BEeFdNRQ@public.gmane.org>
2013-06-18 7:34 ` joeyli
2013-06-18 7:34 ` joeyli
2013-06-18 13:03 ` Jan Beulich
2013-06-18 13:03 ` Jan Beulich
2013-06-18 22:12 ` Zachary Bobroff
2013-06-19 8:43 ` matt
2013-06-19 8:53 ` H. Peter Anvin
2013-06-20 18:04 ` Zachary Bobroff
2013-06-26 13:12 ` matt
-- strict thread matches above, loose matches on Subject: below --
2013-05-22 14:15 Matt Fleming
2013-05-22 14:15 ` Matt Fleming
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=1371465690.6523.331.camel@linux-s257.site \
--to=jlee-ibi9rg/b67k@public.gmane.org \
--cc=JBeulich-IBi9RG/b67k@public.gmane.org \
--cc=linux-efi-u79uwXL29TY76Z2rM5mHXA@public.gmane.org \
--cc=linux-kernel-u79uwXL29TY76Z2rM5mHXA@public.gmane.org \
--cc=matt-HNK1S37rvNbeXh+fF434Mdi2O/JbrIOy@public.gmane.org \
--cc=matt.fleming-ral2JQCrhuEAvxtiuMwx3w@public.gmane.org \
--cc=mjg59-1xO5oi07KQx4cg9Nei1l7Q@public.gmane.org \
--cc=stable-u79uwXL29TY76Z2rM5mHXA@public.gmane.org \
--cc=zacharyb-gH/BEeFdNRQ@public.gmane.org \
/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 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.