[PATCH 04/13] kexec: use _ALIGN* to make the logic clear

Simon Horman horms at verge.net.au
Thu Mar 14 05:08:06 EDT 2013


On Thu, Mar 14, 2013 at 01:26:56AM +0800, Zhang Yanfei wrote:
> From: Zhang Yanfei <zhangyanfei at cn.fujitsu.com>
> 
> By replacing all the explicit align opertions with marco _ALIGN*,
> the code logic could be more clear.

Not a big deal, but I believe this patch needs to come after
the arm changes in the series in order to avoid breaking the build
on that architecture.

> 
> Signed-off-by: Zhang Yanfei <zhangyanfei at cn.fujitsu.com>
> ---
>  kexec/crashdump-elf.c          |    3 +--
>  kexec/fs2dt.c                  |    5 ++---
>  kexec/kexec-elf-boot.c         |    2 +-
>  kexec/kexec-elf-rel.c          |    8 ++++----
>  kexec/kexec-elf.c              |    8 ++++----
>  kexec/kexec.c                  |   15 +++++++--------
>  kexec/libfdt/libfdt_internal.h |    2 +-
>  7 files changed, 20 insertions(+), 23 deletions(-)
> 
> diff --git a/kexec/crashdump-elf.c b/kexec/crashdump-elf.c
> index ec66548..2baa357 100644
> --- a/kexec/crashdump-elf.c
> +++ b/kexec/crashdump-elf.c
> @@ -96,8 +96,7 @@ int FUNC(struct kexec_info *info,
>  		return -1;
>  	}
>  
> -	sz += align - 1;
> -	sz &= ~(align - 1);
> +	sz = _ALIGN(sz, align);
>  
>  	bufp = xmalloc(sz);
>  	memset(bufp, 0, sz);
> diff --git a/kexec/fs2dt.c b/kexec/fs2dt.c
> index 5d933c8..bd972ba 100644
> --- a/kexec/fs2dt.c
> +++ b/kexec/fs2dt.c
> @@ -697,8 +697,7 @@ static void add_boot_block(char **bufp, off_t *sizep)
>  	unsigned long tlen, toff;
>  	char *buf;
>  
> -	len = sizeof(bb[0]);
> -	len += 7; len &= ~7;
> +	len = _ALIGN(sizeof(bb[0], 8);
>  
>  	bb->off_mem_rsvmap = cpu_to_be32(len);
>  
> @@ -721,7 +720,7 @@ static void add_boot_block(char **bufp, off_t *sizep)
>  
>  	len = propnum("");
>  	bb->dt_strings_size = cpu_to_be32(len);
> -	len +=  3; len &= ~3;
> +	len = _ALIGN(len, 4);
>  	bb->totalsize = cpu_to_be32(be32_to_cpu(bb->off_dt_strings) + len);
>  
>  	bb->magic = cpu_to_be32(0xd00dfeed);
> diff --git a/kexec/kexec-elf-boot.c b/kexec/kexec-elf-boot.c
> index f082f8b..38f9056 100644
> --- a/kexec/kexec-elf-boot.c
> +++ b/kexec/kexec-elf-boot.c
> @@ -31,7 +31,7 @@
>  #include "kexec-elf-boot.h"
>  
>  
> -#define UPSZ(X) ((sizeof(X) + 3) &~3)
> +#define UPSZ(X) _ALIGN_UP(sizeof(X), 4)
>  
>  static struct boot_notes {
>  	Elf_Bhdr hdr;
> diff --git a/kexec/kexec-elf-rel.c b/kexec/kexec-elf-rel.c
> index 8880c8b..38e34ec 100644
> --- a/kexec/kexec-elf-rel.c
> +++ b/kexec/kexec-elf-rel.c
> @@ -225,7 +225,7 @@ int elf_rel_load(struct mem_ehdr *ehdr, struct kexec_info *info,
>  				buf_align = align;
>  			}
>  			/* Now align bufsz */
> -			bufsz = (bufsz + (align - 1)) & ~(align - 1);
> +			bufsz = _ALIGN(bufsz, align);
>  			/* And now add our buffer */
>  			bufsz += shdr->sh_size;
>  		}
> @@ -237,7 +237,7 @@ int elf_rel_load(struct mem_ehdr *ehdr, struct kexec_info *info,
>  				bss_align = align;
>  			}
>  			/* Now align bsssz */
> -			bsssz = (bsssz + (align - 1)) & ~(align -1);
> +			bsssz = _ALIGN(bsssz, align);
>  			/* And now add our buffer */
>  			bsssz += shdr->sh_size;
>  		}
> @@ -269,7 +269,7 @@ int elf_rel_load(struct mem_ehdr *ehdr, struct kexec_info *info,
>  		if (shdr->sh_type != SHT_NOBITS) {
>  			unsigned long off;
>  			/* Adjust the address */
> -			data_addr = (data_addr + (align - 1)) & ~(align -1);
> +			data_addr = _ALIGN(data_addr, align);
>  
>  			/* Update the section */
>  			off = data_addr - buf_addr;
> @@ -281,7 +281,7 @@ int elf_rel_load(struct mem_ehdr *ehdr, struct kexec_info *info,
>  			data_addr += shdr->sh_size;
>  		} else {
>  			/* Adjust the address */
> -			bss_addr = (bss_addr + (align - 1)) & ~(align -1);
> +			bss_addr = _ALIGN(bss_addr, align);
>  
>  			/* Update the section */
>  			shdr->sh_addr = bss_addr;
> diff --git a/kexec/kexec-elf.c b/kexec/kexec-elf.c
> index b88aced..3515203 100644
> --- a/kexec/kexec-elf.c
> +++ b/kexec/kexec-elf.c
> @@ -704,8 +704,8 @@ static int build_mem_notes(struct mem_ehdr *ehdr)
>  		ElfNN_Nhdr hdr;
>  		read_nhdr(ehdr, &hdr, note);
>  		note_size  = sizeof(hdr);
> -		note_size += (hdr.n_namesz + 3) & ~3;
> -		note_size += (hdr.n_descsz + 3) & ~3;
> +		note_size += _ALIGN(hdr.n_namesz, 4);
> +		note_size += _ALIGN(hdr.n_descsz, 4);
>  		ehdr->e_notenum += 1;
>  	}
>  	/* Now walk and normalize the notes */
> @@ -716,9 +716,9 @@ static int build_mem_notes(struct mem_ehdr *ehdr)
>  		read_nhdr(ehdr, &hdr, note);
>  		note_size  = sizeof(hdr);
>  		name       = note + note_size;
> -		note_size += (hdr.n_namesz + 3) & ~3;
> +		note_size += _ALIGN(hdr.n_namesz, 4);
>  		desc       = note + note_size;
> -		note_size += (hdr.n_descsz + 3) & ~3;
> +		note_size += _ALIGN(hdr.n_descsz, 4);
>  
>  		if ((hdr.n_namesz != 0) && (name[hdr.n_namesz -1] != '\0')) {
>  			/* If note name string is not null terminated, just
> diff --git a/kexec/kexec.c b/kexec/kexec.c
> index 494c5b3..f3928af 100644
> --- a/kexec/kexec.c
> +++ b/kexec/kexec.c
> @@ -257,8 +257,7 @@ unsigned long locate_hole(struct kexec_info *info,
>  		if (start < hole_min) {
>  			start = hole_min;
>  		}
> -		start = (start + hole_align - 1) &
> -			~((unsigned long long)hole_align - 1);
> +		start = _ALIGN(start, hole_align);
>  		if (end > mem_max) {
>  			end = mem_max;
>  		}
> @@ -276,8 +275,8 @@ unsigned long locate_hole(struct kexec_info *info,
>  				hole_base = start;
>  				break;
>  			} else {
> -				hole_base = (end - hole_size) &
> -					~((unsigned long long)hole_align - 1);
> +				hole_base = _ALIGN_DOWN(end - hole_size,
> +					hole_align);
>  			}
>  		}
>  	}
> @@ -313,7 +312,7 @@ void add_segment_phys_virt(struct kexec_info *info,
>  
>  	/* Round memsz up to a multiple of pagesize */
>  	pagesize = getpagesize();
> -	memsz = (memsz + (pagesize - 1)) & ~(pagesize - 1);
> +	memsz = _ALIGN(memsz, pagesize);
>  
>  	/* Verify base is pagesize aligned.
>  	 * Finding a way to cope with this problem
> @@ -363,7 +362,7 @@ unsigned long add_buffer_phys_virt(struct kexec_info *info,
>  
>  	/* Round memsz up to a multiple of pagesize */
>  	pagesize = getpagesize();
> -	memsz = (memsz + (pagesize - 1)) & ~(pagesize - 1);
> +	memsz = _ALIGN(memsz, pagesize);
>  
>  	base = locate_hole(info, memsz, buf_align, buf_min, buf_max, buf_end);
>  	if (base == ULONG_MAX) {
> @@ -457,8 +456,8 @@ int add_backup_segments(struct kexec_info *info, unsigned long backup_base,
>  				return -1;
>  			if (!find_segment_hole(info, &bkseg_base, &bkseg_size))
>  				break;
> -			start = (bkseg_base + pagesize - 1) & ~(pagesize - 1);
> -			end = (bkseg_base + bkseg_size) & ~(pagesize - 1);
> +			start = _ALIGN(bkseg_base, pagesize);
> +			end = _ALIGN_DOWN(bkseg_base + bkseg_size, pagesize);
>  			add_segment_phys_virt(info, NULL, 0,
>  					      start, end-start, 0);
>  			mem_size = mem_base + mem_size - \
> diff --git a/kexec/libfdt/libfdt_internal.h b/kexec/libfdt/libfdt_internal.h
> index 46eb93e..3635d98 100644
> --- a/kexec/libfdt/libfdt_internal.h
> +++ b/kexec/libfdt/libfdt_internal.h
> @@ -52,7 +52,7 @@
>   */
>  #include <fdt.h>
>  
> -#define FDT_ALIGN(x, a)		(((x) + (a) - 1) & ~((a) - 1))
> +#define FDT_ALIGN(x, a)		_ALIGN(x, a)
>  #define FDT_TAGALIGN(x)		(FDT_ALIGN((x), FDT_TAGSIZE))
>  
>  #define FDT_CHECK_HEADER(fdt) \
> -- 
> 1.7.1
> 



More information about the kexec mailing list