* [PATCH v6 0/2] support gzipped kernels on arm
@ 2015-09-21 22:50 Stefano Stabellini
2015-09-21 22:51 ` [PATCH v6 1/2] xen: move perform_gunzip to common Stefano Stabellini
2015-09-21 22:51 ` [PATCH v6 2/2] xen/arm: support gzip compressed kernels Stefano Stabellini
0 siblings, 2 replies; 9+ messages in thread
From: Stefano Stabellini @ 2015-09-21 22:50 UTC (permalink / raw)
To: xen-devel; +Cc: Ian Campbell, Stefano Stabellini
Hi all,
this patch series introduces support for gzipped kernels, such as the
standard Image.gz format used by Linux on arm64 by default, in Xen on
arm. Without it, Xen cannot load the default kernel shipped by distros,
such as CentOS 7.
Stefano Stabellini (2):
xen: move perform_gunzip to common
xen/arm: support gzip compressed kernels
xen/arch/arm/kernel.c | 89 +++++++++++++++++++++++++---
xen/arch/arm/setup.c | 2 +-
xen/arch/x86/bzimage.c | 134 +-----------------------------------------
xen/common/Makefile | 1 +
xen/common/gunzip.c | 137 +++++++++++++++++++++++++++++++++++++++++++
xen/include/asm-arm/setup.h | 2 +
xen/include/xen/gunzip.h | 7 +++
7 files changed, 229 insertions(+), 143 deletions(-)
create mode 100644 xen/common/gunzip.c
create mode 100644 xen/include/xen/gunzip.h
Cheers,
Stefano
^ permalink raw reply [flat|nested] 9+ messages in thread
* [PATCH v6 1/2] xen: move perform_gunzip to common
2015-09-21 22:50 [PATCH v6 0/2] support gzipped kernels on arm Stefano Stabellini
@ 2015-09-21 22:51 ` Stefano Stabellini
2015-09-21 22:51 ` [PATCH v6 2/2] xen/arm: support gzip compressed kernels Stefano Stabellini
1 sibling, 0 replies; 9+ messages in thread
From: Stefano Stabellini @ 2015-09-21 22:51 UTC (permalink / raw)
To: xen-devel; +Cc: andrew.cooper3, Ian.Campbell, Jan Beulich, Stefano Stabellini
The current gunzip code to decompress the Dom0 kernel is implemented in
inflate.c which is included by bzimage.c.
I am looking to doing the same on ARM64 but there is quite a bit of
boilerplate definitions that I would need to import in order for
inflate.c to work correctly.
Instead of copying/pasting the code from x86/bzimage.c, move those
definitions to a new common file, gunzip.c. Export only perform_gunzip
and gzip_check. Leave output_length where it is.
Signed-off-by: Stefano Stabellini <stefano.stabellini@eu.citrix.com>
Acked-by: Jan Beulich <jbeulich@suse.com>
CC: andrew.cooper3@citrix.com
---
Changes in v4:
- move gunzip.init.o to its alphabetically correct place
Changes in v3:
- build gunzip.c as gunzip.init.o
- remove #include <xen/config.h>
- remove __init from declarations
Changes in v2:
- the patch has been reworked from scratch
---
xen/arch/x86/bzimage.c | 134 +--------------------------------------------
xen/common/Makefile | 1 +
xen/common/gunzip.c | 137 ++++++++++++++++++++++++++++++++++++++++++++++
xen/include/xen/gunzip.h | 7 +++
4 files changed, 146 insertions(+), 133 deletions(-)
create mode 100644 xen/common/gunzip.c
create mode 100644 xen/include/xen/gunzip.h
diff --git a/xen/arch/x86/bzimage.c b/xen/arch/x86/bzimage.c
index c86c39e..50ebb84 100644
--- a/xen/arch/x86/bzimage.c
+++ b/xen/arch/x86/bzimage.c
@@ -4,148 +4,16 @@
#include <xen/mm.h>
#include <xen/string.h>
#include <xen/types.h>
+#include <xen/gunzip.h>
#include <xen/decompress.h>
#include <xen/libelf.h>
#include <asm/bzimage.h>
-#define HEAPORDER 3
-
-static unsigned char *__initdata window;
-#define memptr long
-static memptr __initdata free_mem_ptr;
-static memptr __initdata free_mem_end_ptr;
-
-#define WSIZE 0x80000000
-
-static unsigned char *__initdata inbuf;
-static unsigned __initdata insize;
-
-/* Index of next byte to be processed in inbuf: */
-static unsigned __initdata inptr;
-
-/* Bytes in output buffer: */
-static unsigned __initdata outcnt;
-
-#define OF(args) args
-#define STATIC static
-
-#define memzero(s, n) memset((s), 0, (n))
-
-typedef unsigned char uch;
-typedef unsigned short ush;
-typedef unsigned long ulg;
-
-#define INIT __init
-#define INITDATA __initdata
-
-#define get_byte() (inptr < insize ? inbuf[inptr++] : fill_inbuf())
-
-/* Diagnostic functions */
-#ifdef DEBUG
-# define Assert(cond, msg) do { if (!(cond)) error(msg); } while (0)
-# define Trace(x) do { fprintf x; } while (0)
-# define Tracev(x) do { if (verbose) fprintf x ; } while (0)
-# define Tracevv(x) do { if (verbose > 1) fprintf x ; } while (0)
-# define Tracec(c, x) do { if (verbose && (c)) fprintf x ; } while (0)
-# define Tracecv(c, x) do { if (verbose > 1 && (c)) fprintf x ; } while (0)
-#else
-# define Assert(cond, msg)
-# define Trace(x)
-# define Tracev(x)
-# define Tracevv(x)
-# define Tracec(c, x)
-# define Tracecv(c, x)
-#endif
-
-static long __initdata bytes_out;
-static void flush_window(void);
-
-static __init void error(char *x)
-{
- panic("%s", x);
-}
-
-static __init int fill_inbuf(void)
-{
- error("ran out of input data");
- return 0;
-}
-
-
-#include "../../common/inflate.c"
-
-static __init void flush_window(void)
-{
- /*
- * The window is equal to the output buffer therefore only need to
- * compute the crc.
- */
- unsigned long c = crc;
- unsigned n;
- unsigned char *in, ch;
-
- in = window;
- for ( n = 0; n < outcnt; n++ )
- {
- ch = *in++;
- c = crc_32_tab[((int)c ^ ch) & 0xff] ^ (c >> 8);
- }
- crc = c;
-
- bytes_out += (unsigned long)outcnt;
- outcnt = 0;
-}
-
static __init unsigned long output_length(char *image, unsigned long image_len)
{
return *(uint32_t *)&image[image_len - 4];
}
-static __init int gzip_check(char *image, unsigned long image_len)
-{
- unsigned char magic0, magic1;
-
- if ( image_len < 2 )
- return 0;
-
- magic0 = (unsigned char)image[0];
- magic1 = (unsigned char)image[1];
-
- return (magic0 == 0x1f) && ((magic1 == 0x8b) || (magic1 == 0x9e));
-}
-
-static __init int perform_gunzip(char *output, char *image, unsigned long image_len)
-{
- int rc;
-
- if ( !gzip_check(image, image_len) )
- return 1;
-
- window = (unsigned char *)output;
-
- free_mem_ptr = (unsigned long)alloc_xenheap_pages(HEAPORDER, 0);
- free_mem_end_ptr = free_mem_ptr + (PAGE_SIZE << HEAPORDER);
-
- inbuf = (unsigned char *)image;
- insize = image_len;
- inptr = 0;
-
- makecrc();
-
- if ( gunzip() < 0 )
- {
- rc = -EINVAL;
- }
- else
- {
- rc = 0;
- }
-
- free_xenheap_pages((void *)free_mem_ptr, HEAPORDER);
-
- return rc;
-}
-
struct __packed setup_header {
uint8_t _pad0[0x1f1]; /* skip uninteresting stuff */
uint8_t setup_sects;
diff --git a/xen/common/Makefile b/xen/common/Makefile
index 3fdf931..e681aaa 100644
--- a/xen/common/Makefile
+++ b/xen/common/Makefile
@@ -10,6 +10,7 @@ obj-y += event_channel.o
obj-y += event_fifo.o
obj-y += grant_table.o
obj-y += guestcopy.o
+obj-bin-y += gunzip.init.o
obj-y += irq.o
obj-y += kernel.o
obj-y += keyhandler.o
diff --git a/xen/common/gunzip.c b/xen/common/gunzip.c
new file mode 100644
index 0000000..41d71ef
--- /dev/null
+++ b/xen/common/gunzip.c
@@ -0,0 +1,137 @@
+#include <xen/errno.h>
+#include <xen/init.h>
+#include <xen/lib.h>
+#include <xen/mm.h>
+
+#define HEAPORDER 3
+
+static unsigned char *__initdata window;
+#define memptr long
+static memptr __initdata free_mem_ptr;
+static memptr __initdata free_mem_end_ptr;
+
+#define WSIZE 0x80000000
+
+static unsigned char *__initdata inbuf;
+static unsigned __initdata insize;
+
+/* Index of next byte to be processed in inbuf: */
+static unsigned __initdata inptr;
+
+/* Bytes in output buffer: */
+static unsigned __initdata outcnt;
+
+#define OF(args) args
+#define STATIC static
+
+#define memzero(s, n) memset((s), 0, (n))
+
+typedef unsigned char uch;
+typedef unsigned short ush;
+typedef unsigned long ulg;
+
+#define INIT __init
+#define INITDATA __initdata
+
+#define get_byte() (inptr < insize ? inbuf[inptr++] : fill_inbuf())
+
+/* Diagnostic functions */
+#ifdef DEBUG
+# define Assert(cond, msg) do { if (!(cond)) error(msg); } while (0)
+# define Trace(x) do { fprintf x; } while (0)
+# define Tracev(x) do { if (verbose) fprintf x ; } while (0)
+# define Tracevv(x) do { if (verbose > 1) fprintf x ; } while (0)
+# define Tracec(c, x) do { if (verbose && (c)) fprintf x ; } while (0)
+# define Tracecv(c, x) do { if (verbose > 1 && (c)) fprintf x ; } while (0)
+#else
+# define Assert(cond, msg)
+# define Trace(x)
+# define Tracev(x)
+# define Tracevv(x)
+# define Tracec(c, x)
+# define Tracecv(c, x)
+#endif
+
+static long __initdata bytes_out;
+static void flush_window(void);
+
+static __init void error(char *x)
+{
+ panic("%s", x);
+}
+
+static __init int fill_inbuf(void)
+{
+ error("ran out of input data");
+ return 0;
+}
+
+
+#include "inflate.c"
+
+static __init void flush_window(void)
+{
+ /*
+ * The window is equal to the output buffer therefore only need to
+ * compute the crc.
+ */
+ unsigned long c = crc;
+ unsigned n;
+ unsigned char *in, ch;
+
+ in = window;
+ for ( n = 0; n < outcnt; n++ )
+ {
+ ch = *in++;
+ c = crc_32_tab[((int)c ^ ch) & 0xff] ^ (c >> 8);
+ }
+ crc = c;
+
+ bytes_out += (unsigned long)outcnt;
+ outcnt = 0;
+}
+
+__init int gzip_check(char *image, unsigned long image_len)
+{
+ unsigned char magic0, magic1;
+
+ if ( image_len < 2 )
+ return 0;
+
+ magic0 = (unsigned char)image[0];
+ magic1 = (unsigned char)image[1];
+
+ return (magic0 == 0x1f) && ((magic1 == 0x8b) || (magic1 == 0x9e));
+}
+
+__init int perform_gunzip(char *output, char *image, unsigned long image_len)
+{
+ int rc;
+
+ if ( !gzip_check(image, image_len) )
+ return 1;
+
+ window = (unsigned char *)output;
+
+ free_mem_ptr = (unsigned long)alloc_xenheap_pages(HEAPORDER, 0);
+ free_mem_end_ptr = free_mem_ptr + (PAGE_SIZE << HEAPORDER);
+
+ inbuf = (unsigned char *)image;
+ insize = image_len;
+ inptr = 0;
+
+ makecrc();
+
+ if ( gunzip() < 0 )
+ {
+ rc = -EINVAL;
+ }
+ else
+ {
+ rc = 0;
+ }
+
+ free_xenheap_pages((void *)free_mem_ptr, HEAPORDER);
+
+ return rc;
+}
diff --git a/xen/include/xen/gunzip.h b/xen/include/xen/gunzip.h
new file mode 100644
index 0000000..8058331
--- /dev/null
+++ b/xen/include/xen/gunzip.h
@@ -0,0 +1,7 @@
+#ifndef __XEN_GUNZIP_H
+#define __XEN_GUNZIP_H
+
+int gzip_check(char *image, unsigned long image_len);
+int perform_gunzip(char *output, char *image, unsigned long image_len);
+
+#endif
--
1.7.10.4
^ permalink raw reply related [flat|nested] 9+ messages in thread
* [PATCH v6 2/2] xen/arm: support gzip compressed kernels
2015-09-21 22:50 [PATCH v6 0/2] support gzipped kernels on arm Stefano Stabellini
2015-09-21 22:51 ` [PATCH v6 1/2] xen: move perform_gunzip to common Stefano Stabellini
@ 2015-09-21 22:51 ` Stefano Stabellini
2015-09-21 23:03 ` Julien Grall
2015-09-22 9:08 ` Julien Grall
1 sibling, 2 replies; 9+ messages in thread
From: Stefano Stabellini @ 2015-09-21 22:51 UTC (permalink / raw)
To: xen-devel; +Cc: Julien Grall, ian.campbell, Stefano Stabellini
Free the memory used for the compressed kernel and update the relative
mod->start and mod->size parameters with the uncompressed ones.
To decompress the kernel, allocate memory from dommheap, because freeing
the modules is done by calling init_heap_pages, which frees to domheap.
Map these pages using vmap, because they might not be in the linear 1:1
map.
Signed-off-by: Stefano Stabellini <stefano.stabellini@eu.citrix.com>
Reviewed-by: Julien Grall <julien.grall@citrix.com>
CC: ian.campbell@citrix.com
---
Changes in v6:
- use vmap to map pages
- free old module and update mod->start and mod->size from
kernel_decompress
Changes in v5:
- code style
Changes in v4:
- return uint32_t from output_length
- __init kernel_decompress
- code style
- add comment
- if kernel_decompress fails with error, return
Changes in v3:
- better error checks in kernel_decompress
- free unneeded pages between output_size and kernel_order_out
- alloc pages from domheap
Changes in v2:
- use gzip_check
- avoid useless casts
- free original kernel image and update the mod with the new address and
size
- remove changes to common Makefile
- remove CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS
---
xen/arch/arm/kernel.c | 89 ++++++++++++++++++++++++++++++++++++++-----
xen/arch/arm/setup.c | 2 +-
xen/include/asm-arm/setup.h | 2 +
3 files changed, 83 insertions(+), 10 deletions(-)
diff --git a/xen/arch/arm/kernel.c b/xen/arch/arm/kernel.c
index f641b12..ad7e6bc 100644
--- a/xen/arch/arm/kernel.c
+++ b/xen/arch/arm/kernel.c
@@ -13,6 +13,8 @@
#include <asm/byteorder.h>
#include <asm/setup.h>
#include <xen/libfdt/libfdt.h>
+#include <xen/gunzip.h>
+#include <xen/vmap.h>
#include "kernel.h"
@@ -257,6 +259,74 @@ static int kernel_uimage_probe(struct kernel_info *info,
return 0;
}
+static __init uint32_t output_length(char *image, unsigned long image_len)
+{
+ return *(uint32_t *)&image[image_len - 4];
+}
+
+static __init int kernel_decompress(struct bootmodule *mod)
+{
+ char *output, *input;
+ char magic[2];
+ int rc;
+ unsigned kernel_order_out;
+ paddr_t output_size;
+ struct page_info *pages;
+ mfn_t mfn;
+ int i;
+ paddr_t addr = mod->start;
+ paddr_t size = mod->size;
+
+ if ( size < 2 )
+ return -EINVAL;
+
+ copy_from_paddr(magic, addr, sizeof(magic));
+
+ /* only gzip is supported */
+ if ( !gzip_check(magic, size) )
+ return -EINVAL;
+
+ input = ioremap_cache(addr, size);
+ if ( input == NULL )
+ return -EFAULT;
+
+ output_size = output_length(input, size);
+ kernel_order_out = get_order_from_bytes(output_size);
+ pages = alloc_domheap_pages(NULL, kernel_order_out, 0);
+ if ( pages == NULL )
+ {
+ iounmap(input);
+ return -ENOMEM;
+ }
+ mfn = _mfn(page_to_mfn(pages));
+ output = __vmap(&mfn, 1 << kernel_order_out, 1, 1, PAGE_HYPERVISOR);
+
+ rc = perform_gunzip(output, input, size);
+ clean_dcache_va_range(output, output_size);
+ iounmap(input);
+
+ /*
+ * Need to free pages after output_size here because they won't be
+ * freed by discard_initial_modules
+ */
+ i = (output_size + PAGE_SIZE - 1) >> PAGE_SHIFT;
+ for ( ; i < (1 << kernel_order_out); i++ )
+ free_domheap_page(pages + i);
+
+ vunmap(output);
+
+ /*
+ * Free the original kernel, update the pointers to the
+ * decompressed kernel
+ */
+ dt_unreserved_regions(mod->start, mod->start + mod->size,
+ init_domheap_pages, 0);
+ mod->start = page_to_maddr(pages);
+ mod->size = output_size;
+
+ return 0;
+}
+
#ifdef CONFIG_ARM_64
/*
* Check if the image is a 64-bit Image.
@@ -444,8 +514,6 @@ int kernel_probe(struct kernel_info *info)
struct bootmodule *mod = boot_module_find_by_kind(BOOTMOD_KERNEL);
int rc;
- paddr_t start, size;
-
if ( !mod || !mod->size )
{
printk(XENLOG_ERR "Missing kernel boot module?\n");
@@ -453,25 +521,28 @@ int kernel_probe(struct kernel_info *info)
}
info->kernel_bootmodule = mod;
- start = mod->start;
- size = mod->size;
- printk("Loading kernel from boot module @ %"PRIpaddr"\n", start);
+ printk("Loading kernel from boot module @ %"PRIpaddr"\n", mod->start);
info->initrd_bootmodule = boot_module_find_by_kind(BOOTMOD_RAMDISK);
if ( info->initrd_bootmodule )
printk("Loading ramdisk from boot module @ %"PRIpaddr"\n",
info->initrd_bootmodule->start);
+ /* if it is a gzip'ed image, 32bit or 64bit, uncompress it */
+ rc = kernel_decompress(mod);
+ if (rc < 0 && rc != -EINVAL)
+ return rc;
+
#ifdef CONFIG_ARM_64
- rc = kernel_zimage64_probe(info, start, size);
+ rc = kernel_zimage64_probe(info, mod->start, mod->size);
if (rc < 0)
#endif
- rc = kernel_uimage_probe(info, start, size);
+ rc = kernel_uimage_probe(info, mod->start, mod->size);
if (rc < 0)
- rc = kernel_zimage32_probe(info, start, size);
+ rc = kernel_zimage32_probe(info, mod->start, mod->size);
if (rc < 0)
- rc = kernel_elf_probe(info, start, size);
+ rc = kernel_elf_probe(info, mod->start, mod->size);
return rc;
}
diff --git a/xen/arch/arm/setup.c b/xen/arch/arm/setup.c
index 6626eba..109c71c 100644
--- a/xen/arch/arm/setup.c
+++ b/xen/arch/arm/setup.c
@@ -165,7 +165,7 @@ static void __init processor_id(void)
processor_setup();
}
-static void dt_unreserved_regions(paddr_t s, paddr_t e,
+void dt_unreserved_regions(paddr_t s, paddr_t e,
void (*cb)(paddr_t, paddr_t), int first)
{
int i, nr = fdt_num_mem_rsv(device_tree_flattened);
diff --git a/xen/include/asm-arm/setup.h b/xen/include/asm-arm/setup.h
index 81bb3da..30ac53b 100644
--- a/xen/include/asm-arm/setup.h
+++ b/xen/include/asm-arm/setup.h
@@ -54,6 +54,8 @@ void copy_from_paddr(void *dst, paddr_t paddr, unsigned long len);
int construct_dom0(struct domain *d);
void discard_initial_modules(void);
+void dt_unreserved_regions(paddr_t s, paddr_t e,
+ void (*cb)(paddr_t, paddr_t), int first);
size_t __init boot_fdt_info(const void *fdt, paddr_t paddr);
const char __init *boot_fdt_cmdline(const void *fdt);
--
1.7.10.4
^ permalink raw reply related [flat|nested] 9+ messages in thread
* Re: [PATCH v6 2/2] xen/arm: support gzip compressed kernels
2015-09-21 22:51 ` [PATCH v6 2/2] xen/arm: support gzip compressed kernels Stefano Stabellini
@ 2015-09-21 23:03 ` Julien Grall
2015-09-22 1:22 ` Stefano Stabellini
2015-09-22 9:08 ` Julien Grall
1 sibling, 1 reply; 9+ messages in thread
From: Julien Grall @ 2015-09-21 23:03 UTC (permalink / raw)
To: Stefano Stabellini, xen-devel; +Cc: Ian.Campbell
Hi Stefano,
On 21/09/2015 23:51, Stefano Stabellini wrote:
> Changes in v6:
> - use vmap to map pages
> - free old module and update mod->start and mod->size from
> kernel_decompress
I was expecting you to drop my Reviewed-by given those changes.
> diff --git a/xen/arch/arm/kernel.c b/xen/arch/arm/kernel.c
> index f641b12..ad7e6bc 100644
> --- a/xen/arch/arm/kernel.c
> +++ b/xen/arch/arm/kernel.c
[...]
> +static __init uint32_t output_length(char *image, unsigned long image_len)
> +{
> + return *(uint32_t *)&image[image_len - 4];
> +}
> +
> +static __init int kernel_decompress(struct bootmodule *mod)
> +{
[...]
> + mfn = _mfn(page_to_mfn(pages));
> + output = __vmap(&mfn, 1 << kernel_order_out, 1, 1, PAGE_HYPERVISOR);
You may want to use vmap here which is a wrapper to __vmap and will
setup the granularity, align, and flags automatically for you.
Regards,
--
Julien Grall
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [PATCH v6 2/2] xen/arm: support gzip compressed kernels
2015-09-21 23:03 ` Julien Grall
@ 2015-09-22 1:22 ` Stefano Stabellini
2015-09-22 1:35 ` Stefano Stabellini
0 siblings, 1 reply; 9+ messages in thread
From: Stefano Stabellini @ 2015-09-22 1:22 UTC (permalink / raw)
To: Julien Grall; +Cc: xen-devel, Ian.Campbell, Stefano Stabellini
On Tue, 22 Sep 2015, Julien Grall wrote:
> Hi Stefano,
>
> On 21/09/2015 23:51, Stefano Stabellini wrote:
> > Changes in v6:
> > - use vmap to map pages
> > - free old module and update mod->start and mod->size from
> > kernel_decompress
>
> I was expecting you to drop my Reviewed-by given those changes.
fair enough
> > diff --git a/xen/arch/arm/kernel.c b/xen/arch/arm/kernel.c
> > index f641b12..ad7e6bc 100644
> > --- a/xen/arch/arm/kernel.c
> > +++ b/xen/arch/arm/kernel.c
>
> [...]
>
>
> > +static __init uint32_t output_length(char *image, unsigned long image_len)
> > +{
> > + return *(uint32_t *)&image[image_len - 4];
> > +}
> > +
> > +static __init int kernel_decompress(struct bootmodule *mod)
> > +{
>
> [...]
>
> > + mfn = _mfn(page_to_mfn(pages));
> > + output = __vmap(&mfn, 1 << kernel_order_out, 1, 1, PAGE_HYPERVISOR);
>
> You may want to use vmap here which is a wrapper to __vmap and will setup the
> granularity, align, and flags automatically for you.
The arguments are different.
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [PATCH v6 2/2] xen/arm: support gzip compressed kernels
2015-09-22 1:22 ` Stefano Stabellini
@ 2015-09-22 1:35 ` Stefano Stabellini
2015-09-22 9:04 ` Julien Grall
0 siblings, 1 reply; 9+ messages in thread
From: Stefano Stabellini @ 2015-09-22 1:35 UTC (permalink / raw)
To: Stefano Stabellini; +Cc: Julien Grall, xen-devel, Ian.Campbell
On Tue, 22 Sep 2015, Stefano Stabellini wrote:
> On Tue, 22 Sep 2015, Julien Grall wrote:
> > Hi Stefano,
> >
> > On 21/09/2015 23:51, Stefano Stabellini wrote:
> > > Changes in v6:
> > > - use vmap to map pages
> > > - free old module and update mod->start and mod->size from
> > > kernel_decompress
> >
> > I was expecting you to drop my Reviewed-by given those changes.
>
> fair enough
>
>
> > > diff --git a/xen/arch/arm/kernel.c b/xen/arch/arm/kernel.c
> > > index f641b12..ad7e6bc 100644
> > > --- a/xen/arch/arm/kernel.c
> > > +++ b/xen/arch/arm/kernel.c
> >
> > [...]
> >
> >
> > > +static __init uint32_t output_length(char *image, unsigned long image_len)
> > > +{
> > > + return *(uint32_t *)&image[image_len - 4];
> > > +}
> > > +
> > > +static __init int kernel_decompress(struct bootmodule *mod)
> > > +{
> >
> > [...]
> >
> > > + mfn = _mfn(page_to_mfn(pages));
> > > + output = __vmap(&mfn, 1 << kernel_order_out, 1, 1, PAGE_HYPERVISOR);
> >
> > You may want to use vmap here which is a wrapper to __vmap and will setup the
> > granularity, align, and flags automatically for you.
>
> The arguments are different.
I meant to say that it makes more sense to pass one region of higher granularity,
than to map pages one by one.
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [PATCH v6 2/2] xen/arm: support gzip compressed kernels
2015-09-22 1:35 ` Stefano Stabellini
@ 2015-09-22 9:04 ` Julien Grall
0 siblings, 0 replies; 9+ messages in thread
From: Julien Grall @ 2015-09-22 9:04 UTC (permalink / raw)
To: Stefano Stabellini; +Cc: xen-devel, Ian.Campbell
Hi Stefano,
On 22/09/2015 02:35, Stefano Stabellini wrote:
>>> You may want to use vmap here which is a wrapper to __vmap and will setup the
>>> granularity, align, and flags automatically for you.
>>
>> The arguments are different.
Yes, sorry I inverted nr with granularity.
> I meant to say that it makes more sense to pass one region of higher granularity,
> than to map pages one by one.
Well, the page will still be mapped one by one in map_pages_to_xen one
by one because we don't support super-page mapping.
TBH if you care about performance, you would only map the strict
necessary because the smallest granularity to fit all the kernel may be
big compare to the real size.
For instance, if the decompress size is 65M, you would have to map 128M.
Anyway, it's only used during boot, so I don't much care if you use
__vmap. My suggestion was only for simplifying the code.
Regards,
--
Julien Grall
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [PATCH v6 2/2] xen/arm: support gzip compressed kernels
2015-09-21 22:51 ` [PATCH v6 2/2] xen/arm: support gzip compressed kernels Stefano Stabellini
2015-09-21 23:03 ` Julien Grall
@ 2015-09-22 9:08 ` Julien Grall
2015-09-22 22:18 ` Stefano Stabellini
1 sibling, 1 reply; 9+ messages in thread
From: Julien Grall @ 2015-09-22 9:08 UTC (permalink / raw)
To: Stefano Stabellini, xen-devel; +Cc: Ian.Campbell
On 21/09/2015 23:51, Stefano Stabellini wrote:
> + /*
> + * Need to free pages after output_size here because they won't be
> + * freed by discard_initial_modules
> + */
> + i = (output_size + PAGE_SIZE - 1) >> PAGE_SHIFT;
> + for ( ; i < (1 << kernel_order_out); i++ )
> + free_domheap_page(pages + i);
> +
> + vunmap(output);
> +
I forgot to mention that vunmap should be called before
free_domheap_pages to avoid mapping on unallocated pages.
Regards,
--
Julien Grall
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [PATCH v6 2/2] xen/arm: support gzip compressed kernels
2015-09-22 9:08 ` Julien Grall
@ 2015-09-22 22:18 ` Stefano Stabellini
0 siblings, 0 replies; 9+ messages in thread
From: Stefano Stabellini @ 2015-09-22 22:18 UTC (permalink / raw)
To: Julien Grall; +Cc: xen-devel, Ian.Campbell, Stefano Stabellini
On Tue, 22 Sep 2015, Julien Grall wrote:
> On 21/09/2015 23:51, Stefano Stabellini wrote:
> > + /*
> > + * Need to free pages after output_size here because they won't be
> > + * freed by discard_initial_modules
> > + */
> > + i = (output_size + PAGE_SIZE - 1) >> PAGE_SHIFT;
> > + for ( ; i < (1 << kernel_order_out); i++ )
> > + free_domheap_page(pages + i);
> > +
> > + vunmap(output);
> > +
>
> I forgot to mention that vunmap should be called before free_domheap_pages to
> avoid mapping on unallocated pages.
You are right, thanks
^ permalink raw reply [flat|nested] 9+ messages in thread
end of thread, other threads:[~2015-09-22 22:18 UTC | newest]
Thread overview: 9+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2015-09-21 22:50 [PATCH v6 0/2] support gzipped kernels on arm Stefano Stabellini
2015-09-21 22:51 ` [PATCH v6 1/2] xen: move perform_gunzip to common Stefano Stabellini
2015-09-21 22:51 ` [PATCH v6 2/2] xen/arm: support gzip compressed kernels Stefano Stabellini
2015-09-21 23:03 ` Julien Grall
2015-09-22 1:22 ` Stefano Stabellini
2015-09-22 1:35 ` Stefano Stabellini
2015-09-22 9:04 ` Julien Grall
2015-09-22 9:08 ` Julien Grall
2015-09-22 22:18 ` Stefano Stabellini
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.