|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCHv9 0/9] Xen: extend kexec hypercall for use with pv-ops kernels
On 18/10/2013 19:40, Daniel Kiper wrote:
> On Tue, Oct 08, 2013 at 05:55:01PM +0100, David Vrabel wrote:
>> The series (for Xen 4.4) improves the kexec hypercall by making Xen
>> responsible for loading and relocating the image. This allows kexec
>> to be usable by pv-ops kernels and should allow kexec to be usable
>> from a HVM or PVH privileged domain.
>
> I could not load panic image because Xen crashes in following way:
>
> (XEN) ----[ Xen-4.4-unstable x86_64 debug=y Tainted: C ]----
[...]
> (XEN) Xen call trace:
> (XEN) [<ffff82d080114ef2>] kimage_free+0x67/0xd2
> (XEN) [<ffff82d0801151f9>] do_kimage_alloc+0x29c/0x2f0
> (XEN) [<ffff82d0801152fe>] kimage_alloc+0xb1/0xe6
> (XEN) [<ffff82d0801144c0>] do_kexec_op_internal+0x68e/0x789
> (XEN) [<ffff82d0801145c9>] do_kexec_op+0xe/0x12
> (XEN) [<ffff82d0802268cb>] syscall_enter+0xeb/0x145
The appended patch should fix this crash which only occurs if there's an
error in do_kimage_alloc().
> Normal kernel could be loaded but when it is executed something
> crashes very early. Following message is displayed
Both normal and panic images work fine for me. You're going to have to
provide more details.
David
8<---------------------------------
--- a/xen/common/kimage.c
+++ b/xen/common/kimage.c
@@ -179,7 +179,7 @@ static int do_kimage_alloc(struct kexec_image
**rimage, paddr_t entry,
page_to_maddr(image->control_code_page),
page_to_maddr(image->control_code_page));
if ( result < 0 )
- return result;
+ goto out;
/* Add an empty indirection page. */
image->entry_page = kimage_alloc_control_page(image, 0);
@@ -188,7 +188,7 @@ static int do_kimage_alloc(struct kexec_image
**rimage, paddr_t entry,
result = machine_kexec_add_page(image,
page_to_maddr(image->entry_page),
page_to_maddr(image->entry_page));
if ( result < 0 )
- return result;
+ goto out;
image->head = page_to_maddr(image->entry_page);
@@ -510,15 +510,14 @@ static void kimage_free_entry(kimage_entry_t entry)
free_domheap_page(page);
}
-void kimage_free(struct kexec_image *image)
+static void kimage_free_all_entries(struct kexec_image *image)
{
kimage_entry_t *ptr, entry;
kimage_entry_t ind = 0;
- if ( !image )
+ if ( !image->head )
return;
- kimage_free_extra_pages(image);
for_each_kimage_entry(image, ptr, entry)
{
if ( entry & IND_INDIRECTION )
@@ -537,8 +536,15 @@ void kimage_free(struct kexec_image *image)
/* Free the final indirection page. */
if ( ind & IND_INDIRECTION )
kimage_free_entry(ind);
+}
- /* Free the kexec control pages. */
+void kimage_free(struct kexec_image *image)
+{
+ if ( !image )
+ return;
+
+ kimage_free_extra_pages(image);
+ kimage_free_all_entries(image);
kimage_free_page_list(&image->control_pages);
xfree(image->segments);
xfree(image);
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
http://lists.xen.org/xen-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |