From: Julien Grall <julien.grall@citrix.com>
To: Stefano Stabellini <stefano.stabellini@eu.citrix.com>,
xen-devel@lists.xensource.com
Cc: ian.campbell@citrix.com
Subject: Re: [PATCH v3 2/2] xen/arm: support gzip compressed kernels
Date: Thu, 3 Sep 2015 12:39:52 +0100 [thread overview]
Message-ID: <55E83188.5050802@citrix.com> (raw)
In-Reply-To: <1441193587-5209-2-git-send-email-stefano.stabellini@eu.citrix.com>
Hi Stefano,
The code looks good to me. Only few coding style comment and request to
improve the comments.
On 02/09/15 12:33, Stefano Stabellini wrote:
> Free the memory used for the compressed kernel and update the relative
> mod->start and mod->size parameters with the uncompressed ones.
>
> Signed-off-by: Stefano Stabellini <stefano.stabellini@eu.citrix.com>
> CC: julien.grall@citrix.com
> CC: ian.campbell@citrix.com
>
> ---
>
> 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 | 66 +++++++++++++++++++++++++++++++++++++++++++
> xen/arch/arm/setup.c | 2 +-
> xen/include/asm-arm/setup.h | 2 ++
> 3 files changed, 69 insertions(+), 1 deletion(-)
>
> diff --git a/xen/arch/arm/kernel.c b/xen/arch/arm/kernel.c
> index f641b12..f6da7c1 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,61 @@ static int kernel_uimage_probe(struct kernel_info *info,
> return 0;
> }
>
> +static __init unsigned long output_length(char *image, unsigned long image_len)
> +{
Should not you return a uint32_t rather than an unsigned long?
> + return *(uint32_t *)&image[image_len - 4];
> +}
> +
> +static int kernel_decompress(struct kernel_info *info,
> + paddr_t *addr, paddr_t *size)
static __init as you call a function which live in init section (i.e
output_lenght)
> +{
> + char *output, *input, *end;
> + char magic[2];
> + int rc;
> + unsigned kernel_order_out;
> + paddr_t output_size;
> + struct page_info *pages;
> +
> + if (*size < 2)
if ( ... ) as for all the "if" and "for" within this function. AFAICT,
only kernel_probe is using the wrong coding style within this file.
> + 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;
> + }
> + output = page_to_virt(pages);
> +
> +
NIT: I think you can drop only line here.
> + rc = perform_gunzip(output, input, *size);
> + clean_dcache_va_range(output, output_size);
> + iounmap(input);
> +
> + *addr = virt_to_maddr(output);
> + *size = output_size;
> +
> + end = output + (1 << (kernel_order_out + PAGE_SHIFT));
> + output += (output_size + PAGE_SIZE - 1) & PAGE_MASK;
> + for (; output < end; output += PAGE_SIZE)
Can you add a comment to explain why you need to free pages that are unused?
> + {
> + free_domheap_page(virt_to_page(output));
> + }
The brace are not necessary and it's missing a newline before the return.
> + return 0;
> +}
> +
> #ifdef CONFIG_ARM_64
> /*
> * Check if the image is a 64-bit Image.
> @@ -463,6 +520,15 @@ int kernel_probe(struct kernel_info *info)
> printk("Loading ramdisk from boot module @ %"PRIpaddr"\n",
> info->initrd_bootmodule->start);
>
> + if (!kernel_decompress(info, &start, &size))
NIT: Maybe a comment to explain that we need to do it for everyone?
> + {
> + /* Free the original kernel, update the pointers to the
> + * decompressed kernel */
> + dt_unreserved_regions(mod->start, mod->start + mod->size,
> + init_domheap_pages, 0);
The indentation looks wrong here. I think it should be
dt_unreserved_regions(....
init_domheap_pages, 0);
> + mod->start = start;
> + mod->size = size;
> + }
NIT: I would add a newline here to make clear.
> #ifdef CONFIG_ARM_64
> rc = kernel_zimage64_probe(info, start, size);
> if (rc < 0)
Regards,
--
Julien Grall
next prev parent reply other threads:[~2015-09-03 11:39 UTC|newest]
Thread overview: 6+ messages / expand[flat|nested] mbox.gz Atom feed top
2015-09-02 11:30 [PATCH v3 0/2] support gzipped kernels on arm Stefano Stabellini
2015-09-02 11:33 ` [PATCH v3 1/2] xen: move perform_gunzip to common Stefano Stabellini
2015-09-02 13:57 ` Jan Beulich
2015-09-02 11:33 ` [PATCH v3 2/2] xen/arm: support gzip compressed kernels Stefano Stabellini
2015-09-03 11:39 ` Julien Grall [this message]
2015-09-03 12:47 ` Julien Grall
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=55E83188.5050802@citrix.com \
--to=julien.grall@citrix.com \
--cc=ian.campbell@citrix.com \
--cc=stefano.stabellini@eu.citrix.com \
--cc=xen-devel@lists.xensource.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).