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
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
_
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 */
_
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) {
_
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)
_
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().
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;
_
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) {
_
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
--
[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
--
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) {
_