2005-04-08 00:43:57

by Nick Wilson

[permalink] [raw]
Subject: [PATCH 0/6] add generic round_up_pow2() macro

Randy.Dunlap wrote:
> >+#define ALIGN_DATA_SIZE(size) ((size + PAGE_SIZE - 1) & ~(PAGE_SIZE - 1))
>
> ISTM that we need a generic round_up() function or macro in kernel.h.
>
> a.out.h, reiserfs_fs.h, and ufs_fs.h all have their own round-up
> macros.

I've found many more places in the kernel that use their own functions for
doing this. These patches are the beginning of an attempt to clean these
up.

The first patch adds a generic round_up_pow2() macro to kernel.h. The
remaining patches modify a few files to make use of the new macro.
Comments welcome.

Thanks,

Nick


2005-04-08 00:48:15

by Nick Wilson

[permalink] [raw]
Subject: [PATCH 1/6] include/linux/kernel.h: use generic round_up_pow2() macro

From: Nick Wilson <[email protected]>

Add a generic macro to kernel.h to round up to the next multiple of n.

Signed-off-by: Nick Wilson <[email protected]>
---


kernel.h | 5 +++++
1 files changed, 5 insertions(+)

Index: linux/include/linux/kernel.h
===================================================================
--- linux.orig/include/linux/kernel.h 2005-04-07 15:13:56.000000000 -0700
+++ linux/include/linux/kernel.h 2005-04-07 15:47:15.000000000 -0700
@@ -246,6 +246,11 @@ extern void dump_stack(void);
#define max_t(type,x,y) \
({ type __x = (x); type __y = (y); __x > __y ? __x: __y; })

+/*
+ * Round x up to the next multiple of n.
+ * n must be a power of 2.
+ */
+#define round_up_pow2(x,n) (((x) + (n) - 1) & ~((n) - 1))

/**
* container_of - cast a member of a structure out to the containing structure
_

2005-04-08 00:48:53

by Nick Wilson

[permalink] [raw]
Subject: [PATCH 2/6] include/linux/kernel.h: use generic round_up_pow2() macro

From: Nick Wilson <[email protected]>

Use the generic round_up_pow2() instead of a custom rounding method.

Signed-off-by: Nick Wilson <[email protected]>
---


kernel.h | 2 +-
1 files changed, 1 insertion(+), 1 deletion(-)

Index: linux/include/linux/kernel.h
===================================================================
--- linux.orig/include/linux/kernel.h 2005-04-07 15:44:05.000000000 -0700
+++ linux/include/linux/kernel.h 2005-04-07 15:44:53.000000000 -0700
@@ -28,7 +28,7 @@ extern const char linux_banner[];
#define STACK_MAGIC 0xdeadbeef

#define ARRAY_SIZE(x) (sizeof(x) / sizeof((x)[0]))
-#define ALIGN(x,a) (((x)+(a)-1)&~((a)-1))
+#define ALIGN round_up_pow2

#define KERN_EMERG "<0>" /* system is unusable */
#define KERN_ALERT "<1>" /* action must be taken immediately */
_

2005-04-08 00:51:26

by Nick Wilson

[permalink] [raw]
Subject: [PATCH 4/6] kernel/resource.c: use generic round_up_pow2() macro

From: Nick Wilson <[email protected]>

Use the generic round_up_pow2() instead of a custom rounding method.

Signed-off-by: Nick Wilson <[email protected]>
---


resource.c | 2 +-
1 files changed, 1 insertion(+), 1 deletion(-)

Index: linux/kernel/resource.c
===================================================================
--- linux.orig/kernel/resource.c 2005-04-07 15:13:56.000000000 -0700
+++ linux/kernel/resource.c 2005-04-07 15:45:57.000000000 -0700
@@ -263,7 +263,7 @@ static int find_resource(struct resource
new->start = min;
if (new->end > max)
new->end = max;
- new->start = (new->start + align - 1) & ~(align - 1);
+ new->start = round_up_pow2(new->start, align);
if (alignf)
alignf(alignf_data, new, size, align);
if (new->start < new->end && new->end - new->start + 1 >= size) {
_

2005-04-08 00:50:34

by Nick Wilson

[permalink] [raw]
Subject: [PATCH 3/6] include/linux/a.out.h: use generic round_up_pow2() macro

From: Nick Wilson <[email protected]>

Use the generic round_up_pow2() instead of a custom rounding method.

Signed-off-by: Nick Wilson <[email protected]>
---


a.out.h | 2 +-
1 files changed, 1 insertion(+), 1 deletion(-)

Index: linux/include/linux/a.out.h
===================================================================
--- linux.orig/include/linux/a.out.h 2005-04-07 15:37:22.000000000 -0700
+++ linux/include/linux/a.out.h 2005-04-07 15:45:34.000000000 -0700
@@ -138,7 +138,7 @@ enum machine_type {
#endif
#endif

-#define _N_SEGMENT_ROUND(x) (((x) + SEGMENT_SIZE - 1) & ~(SEGMENT_SIZE - 1))
+#define _N_SEGMENT_ROUND(x) round_up_pow2(x, SEGMENT_SIZE)

#define _N_TXTENDADDR(x) (N_TXTADDR(x)+(x).a_text)

_

2005-04-08 00:54:30

by Andrew Morton

[permalink] [raw]
Subject: Re: [PATCH 0/6] add generic round_up_pow2() macro

Nick Wilson <[email protected]> wrote:
>
> The first patch adds a generic round_up_pow2() macro to kernel.h. The
> remaining patches modify a few files to make use of the new macro.

We already have ALIGN() and roundup_pow_of_two().

2005-04-08 00:54:31

by Nick Wilson

[permalink] [raw]
Subject: [PATCH 5/6] lib/bitmap.c: use generic round_up_pow2() macro

From: Nick Wilson <[email protected]>

Use the generic round_up_pow2() instead of a custom rounding method.

Signed-off-by: Nick Wilson <[email protected]>
---


bitmap.c | 3 +--
1 files changed, 1 insertion(+), 2 deletions(-)

Index: linux/lib/bitmap.c
===================================================================
--- linux.orig/lib/bitmap.c 2005-04-07 15:13:56.000000000 -0700
+++ linux/lib/bitmap.c 2005-04-07 15:46:15.000000000 -0700
@@ -289,7 +289,6 @@ EXPORT_SYMBOL(__bitmap_weight);

#define CHUNKSZ 32
#define nbits_to_hold_value(val) fls(val)
-#define roundup_power2(val,modulus) (((val) + (modulus) - 1) & ~((modulus) - 1))
#define unhex(c) (isdigit(c) ? (c - '0') : (toupper(c) - 'A' + 10))
#define BASEDEC 10 /* fancier cpuset lists input in decimal */

@@ -316,7 +315,7 @@ int bitmap_scnprintf(char *buf, unsigned
if (chunksz == 0)
chunksz = CHUNKSZ;

- i = roundup_power2(nmaskbits, CHUNKSZ) - CHUNKSZ;
+ i = round_up_pow2(nmaskbits, CHUNKSZ) - CHUNKSZ;
for (; i >= 0; i -= CHUNKSZ) {
chunkmask = ((1ULL << chunksz) - 1);
word = i / BITS_PER_LONG;
_

2005-04-08 00:58:26

by Nick Wilson

[permalink] [raw]
Subject: [PATCH 6/6] mm/bootmem.c: use generic round_up_pow2() macro

From: Nick Wilson <[email protected]>

Use the generic round_up_pow2() instead of a custom rounding method.

Signed-off-by: Nick Wilson <[email protected]>
---


bootmem.c | 6 +++---
1 files changed, 3 insertions(+), 3 deletions(-)

Index: linux/mm/bootmem.c
===================================================================
--- linux.orig/mm/bootmem.c 2005-04-07 15:13:56.000000000 -0700
+++ linux/mm/bootmem.c 2005-04-07 15:46:41.000000000 -0700
@@ -57,7 +57,7 @@ static unsigned long __init init_bootmem
pgdat->pgdat_next = pgdat_list;
pgdat_list = pgdat;

- mapsize = (mapsize + (sizeof(long) - 1UL)) & ~(sizeof(long) - 1UL);
+ mapsize = round_up_pow2(mapsize, sizeof(long));
bdata->node_bootmem_map = phys_to_virt(mapstart << PAGE_SHIFT);
bdata->node_boot_start = (start << PAGE_SHIFT);
bdata->node_low_pfn = end;
@@ -178,7 +178,7 @@ __alloc_bootmem_core(struct bootmem_data
} else
preferred = 0;

- preferred = ((preferred + align - 1) & ~(align - 1)) >> PAGE_SHIFT;
+ preferred = round_up_pow2(preferred, align) >> PAGE_SHIFT;
preferred += offset;
areasize = (size+PAGE_SIZE-1)/PAGE_SIZE;
incr = align >> PAGE_SHIFT ? : 1;
@@ -219,7 +219,7 @@ found:
*/
if (align < PAGE_SIZE &&
bdata->last_offset && bdata->last_pos+1 == start) {
- offset = (bdata->last_offset+align-1) & ~(align-1);
+ offset = round_up_pow2(bdata->last_offset, align);
BUG_ON(offset > PAGE_SIZE);
remaining_size = PAGE_SIZE-offset;
if (size < remaining_size) {
_

2005-04-08 09:58:02

by Pádraig Brady

[permalink] [raw]
Subject: Re: [PATCH 0/6] add generic round_up_pow2() macro

Andrew Morton wrote:
> Nick Wilson <[email protected]> wrote:
>
>>The first patch adds a generic round_up_pow2() macro to kernel.h. The
>> remaining patches modify a few files to make use of the new macro.
>
>
> We already have ALIGN() and roundup_pow_of_two().

cool. It doesn't handle x={0,1} though.
Maybe we should have:

static inline unsigned long __attribute_const__
__roundup_pow_of_two(unsigned long x)
{
return (1UL << fls(x - 1));
}

static inline unsigned long __attribute_const__
roundup_pow_of_two(unsigned long x)
{
return (unlikely(x<2)?2:__roundup_pow_of_two(x));
}

--
P?draig Brady - http://www.pixelbeat.org
--

2005-04-08 10:36:25

by Pádraig Brady

[permalink] [raw]
Subject: Re: [PATCH 0/6] add generic round_up_pow2() macro

[email protected] wrote:
> Andrew Morton wrote:
>
>> Nick Wilson <[email protected]> wrote:
>>
>>> The first patch adds a generic round_up_pow2() macro to kernel.h. The
>>> remaining patches modify a few files to make use of the new macro.
>>
>>
>>
>> We already have ALIGN() and roundup_pow_of_two().
>
>
> cool. It doesn't handle x={0,1} though.

Well I should clarify.
2^0==1 is a special case that you probably
don't want as a result from the macro?

--
P?draig Brady - http://www.pixelbeat.org
--

2005-04-08 18:50:08

by Nick Wilson

[permalink] [raw]
Subject: [PATCH] Use ALIGN to remove duplicate code

On Thu, Apr 07, 2005 at 05:50:42PM -0700, Andrew Morton wrote:
> Nick Wilson <[email protected]> wrote:
> > The first patch adds a generic round_up_pow2() macro to kernel.h. The
> > remaining patches modify a few files to make use of the new macro.
>
> We already have ALIGN() and roundup_pow_of_two().

Andrew,

This patch makes use of ALIGN() to remove duplicate round-up code.

Signed-off-by: Nick Wilson <[email protected]>
---


include/linux/a.out.h | 2 +-
kernel/resource.c | 2 +-
lib/bitmap.c | 3 +--
mm/bootmem.c | 6 +++---
4 files changed, 6 insertions(+), 7 deletions(-)

Index: linux/include/linux/a.out.h
===================================================================
--- linux.orig/include/linux/a.out.h 2005-04-08 10:59:14.000000000 -0700
+++ linux/include/linux/a.out.h 2005-04-08 11:00:40.000000000 -0700
@@ -138,7 +138,7 @@ enum machine_type {
#endif
#endif

-#define _N_SEGMENT_ROUND(x) (((x) + SEGMENT_SIZE - 1) & ~(SEGMENT_SIZE - 1))
+#define _N_SEGMENT_ROUND(x) ALIGN(x, SEGMENT_SIZE)

#define _N_TXTENDADDR(x) (N_TXTADDR(x)+(x).a_text)

Index: linux/kernel/resource.c
===================================================================
--- linux.orig/kernel/resource.c 2005-04-08 10:59:36.000000000 -0700
+++ linux/kernel/resource.c 2005-04-08 11:00:50.000000000 -0700
@@ -263,7 +263,7 @@ static int find_resource(struct resource
new->start = min;
if (new->end > max)
new->end = max;
- new->start = (new->start + align - 1) & ~(align - 1);
+ new->start = ALIGN(new->start, align);
if (alignf)
alignf(alignf_data, new, size, align);
if (new->start < new->end && new->end - new->start + 1 >= size) {
Index: linux/lib/bitmap.c
===================================================================
--- linux.orig/lib/bitmap.c 2005-04-08 10:59:40.000000000 -0700
+++ linux/lib/bitmap.c 2005-04-08 11:00:59.000000000 -0700
@@ -289,7 +289,6 @@ EXPORT_SYMBOL(__bitmap_weight);

#define CHUNKSZ 32
#define nbits_to_hold_value(val) fls(val)
-#define roundup_power2(val,modulus) (((val) + (modulus) - 1) & ~((modulus) - 1))
#define unhex(c) (isdigit(c) ? (c - '0') : (toupper(c) - 'A' + 10))
#define BASEDEC 10 /* fancier cpuset lists input in decimal */

@@ -316,7 +315,7 @@ int bitmap_scnprintf(char *buf, unsigned
if (chunksz == 0)
chunksz = CHUNKSZ;

- i = roundup_power2(nmaskbits, CHUNKSZ) - CHUNKSZ;
+ i = ALIGN(nmaskbits, CHUNKSZ) - CHUNKSZ;
for (; i >= 0; i -= CHUNKSZ) {
chunkmask = ((1ULL << chunksz) - 1);
word = i / BITS_PER_LONG;
Index: linux/mm/bootmem.c
===================================================================
--- linux.orig/mm/bootmem.c 2005-04-08 10:59:43.000000000 -0700
+++ linux/mm/bootmem.c 2005-04-08 11:05:45.000000000 -0700
@@ -57,7 +57,7 @@ static unsigned long __init init_bootmem
pgdat->pgdat_next = pgdat_list;
pgdat_list = pgdat;

- mapsize = (mapsize + (sizeof(long) - 1UL)) & ~(sizeof(long) - 1UL);
+ mapsize = ALIGN(mapsize, sizeof(long));
bdata->node_bootmem_map = phys_to_virt(mapstart << PAGE_SHIFT);
bdata->node_boot_start = (start << PAGE_SHIFT);
bdata->node_low_pfn = end;
@@ -178,7 +178,7 @@ __alloc_bootmem_core(struct bootmem_data
} else
preferred = 0;

- preferred = ((preferred + align - 1) & ~(align - 1)) >> PAGE_SHIFT;
+ preferred = ALIGN(preferred, align) >> PAGE_SHIFT;
preferred += offset;
areasize = (size+PAGE_SIZE-1)/PAGE_SIZE;
incr = align >> PAGE_SHIFT ? : 1;
@@ -219,7 +219,7 @@ found:
*/
if (align < PAGE_SIZE &&
bdata->last_offset && bdata->last_pos+1 == start) {
- offset = (bdata->last_offset+align-1) & ~(align-1);
+ offset = ALIGN(bdata->last_offset, align);
BUG_ON(offset > PAGE_SIZE);
remaining_size = PAGE_SIZE-offset;
if (size < remaining_size) {
_