Added ALIGN, __ALIGN_MASK macroses
A message that is not in the archive (sent off-list or not yet received): [email protected]
PATCH v2 1/3 Added ALIGN, __ALIGN_MASK macroses
--- include/test.h | 6 ++++++ 1 files changed, 6 insertions(+), 0 deletions(-)
include/test.h +6 -0
@@ -105,6 +105,12 @@#define MAP_PRIVATE_EXCEPT_UCLINUX MAP_PRIVATE#endif +/* Round x to the next multiple of a. +* a should be a power of 2. +*/ +#define ALIGN (x, a) __ALIGN_MASK(x, (typeof(x))(a) - 1) +#define __ALIGN_MASK (x, mask) (((x) + (mask)) & ~(mask)) +/* * lib/forker.c */
Signature · 13 lines
1.7.1 ------------------------------------------------------------------------------ Introducing Performance Central, a new site from SourceForge and AppDynamics. Performance Central is your source for news, insights, analysis and resources for efficient Application Performance Management. Visit us today! http://pubads.g.doubleclick.net/gampad/clk?id=48897511&iu=/4140/ostg.clktrk _______________________________________________ Ltp-list mailing list [email protected] https://lists.sourceforge.net/lists/listinfo/ltp-list
PATCH v2 2/3 syscalls/migrate_pages: fix nodemask memory allocation
In reply to a message not in the archiveIn accordance to man migrate_pages(), mbind() the bit mask size should be rounded to next multiple of sizeof(unsigned long).
--- .../syscalls/migrate_pages/migrate_pages01.c | 2 +- .../syscalls/migrate_pages/migrate_pages02.c | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-)
testcases/kernel/syscalls/migrate_pages/migrate_pages01.c +1 -1
@@ -248,7 +248,7 @@ static void setup(void) ret); sane_max_node =get_max_node (); - sane_nodemask_size = sane_max_node /8 +1 ; + sane_nodemask_size =ALIGN (sane_max_node,sizeof (unsigned long )*8 ) /8 ; sane_old_nodes =SAFE_MALLOC (NULL , sane_nodemask_size); sane_new_nodes =SAFE_MALLOC (NULL , sane_nodemask_size);memset (sane_old_nodes,0 , sane_nodemask_size);
testcases/kernel/syscalls/migrate_pages/migrate_pages02.c +1 -1
@@ -110,7 +110,7 @@ static int migrate_to_node(pid_t pid, int node)tst_resm (TINFO ,"pid(%d) migrate pid %d to node -> %d" ,getpid (), pid, node); max_node =get_max_node (); - nodemask_size = max_node /8 +1 ; + nodemask_size =ALIGN (max_node,sizeof (unsigned long )*8 ) /8 ; old_nodes =SAFE_MALLOC (NULL , nodemask_size); new_nodes =SAFE_MALLOC (NULL , nodemask_size);
Signature · 13 lines
1.7.1 ------------------------------------------------------------------------------ Introducing Performance Central, a new site from SourceForge and AppDynamics. Performance Central is your source for news, insights, analysis and resources for efficient Application Performance Management. Visit us today! http://pubads.g.doubleclick.net/gampad/clk?id=48897511&iu=/4140/ostg.clktrk _______________________________________________ Ltp-list mailing list [email protected] https://lists.sourceforge.net/lists/listinfo/ltp-list
Re: [LTP] [PATCH V2 2/3] syscalls/migrate_pages: fix nodemask memory allocation
----- Original Message -----
Quoted 10 lines
From: "Stanislav Kholmanskikh" <[email protected]>
To: [email protected]
Cc: "vasily isaenko" <[email protected]>, [email protected]
Sent: Wednesday, 21 August, 2013 1:54:57 PM
Subject: [PATCH V2 2/3] syscalls/migrate_pages: fix nodemask memory allocationIn accordance to man
migrate_pages(),mbind()the bit mask size should be rounded to next multiple of sizeof(unsigned long).Signed-off-by Stanislav Kholmanskikh <[email protected]>
As noted in 3/3 we need to align on bits, looks good to me.
Quoted 34 lines
--- .../syscalls/migrate_pages/migrate_pages01.c | 2 +- .../syscalls/migrate_pages/migrate_pages02.c | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-)testcases/kernel/syscalls/migrate_pages/migrate_pages01.c +1
-1@@ -248,7 +248,7 @@ static void setup(void) ret); sane_max_node =get_max_node (); - sane_nodemask_size = sane_max_node /8 +1 ; + sane_nodemask_size =ALIGN (sane_max_node,sizeof (unsigned long )*8 ) /8 ; sane_old_nodes =SAFE_MALLOC (NULL , sane_nodemask_size); sane_new_nodes =SAFE_MALLOC (NULL , sane_nodemask_size);memset (sane_old_nodes,0 , sane_nodemask_size);testcases/kernel/syscalls/migrate_pages/migrate_pages02.c +1
-2@@ -110,7 +110,7 @@ static int migrate_to_node(pid_t pid, int node)tst_resm (TINFO ,"pid(%d) migrate pid %d to node -> %d" ,getpid (), pid, node); max_node =get_max_node (); - nodemask_size = max_node /8 +1 ; + nodemask_size =ALIGN (max_node,sizeof (unsigned long )*8 ) /8 ; old_nodes =SAFE_MALLOC (NULL , nodemask_size); new_nodes =SAFE_MALLOC (NULL , nodemask_size); --
Quoted 3 lines
1.7.1
------------------------------------------------------------------------------
Introducing Performance Central, a new site from SourceForge and AppDynamics. Performance Central is your source for news, insights, analysis and resources for efficient Application Performance Management. Visit us today!
http://pubads.g.doubleclick.net/gampad/clk?id=48897511&iu=/4140/ostg.clktrk
_______________________________________________
Ltp-list mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/ltp-list
PATCH v2 3/3 lib/numa_helper.c: fix nodemask_size
In reply to a message not in the archiveNow nodemask_size is rounded up to the next multiple of sizeof(nodemask_t).
--- testcases/kernel/lib/numa_helper.c | 6 +++--- 1 files changed, 3 insertions(+), 3 deletions(-)
testcases/kernel/lib/numa_helper.c +3 -3
@@ -60,7 +60,7 @@ unsigned long get_max_node(void)#if HAVE_NUMA_H static void get_nodemask_allnodes (nodemask_t * nodemask,unsigned long max_node) { -unsigned long nodemask_size = max_node /8 +1 ; +unsigned long nodemask_size =ALIGN (max_node,sizeof (nodemask_t)*8 ) /8 ;int i;char fn[64 ];struct stat st;
@@ -76,7 +76,7 @@ static void get_nodemask_allnodes(nodemask_t * nodemask, unsigned long max_node)static int filter_nodemask_mem (nodemask_t * nodemask,unsigned long max_node) {#if MPOL_F_MEMS_ALLOWED -unsigned long nodemask_size = max_node /8 +1 ; +unsigned long nodemask_size =ALIGN (max_node,sizeof (nodemask_t)*8 ) /8 ;memset (nodemask,0 , nodemask_size);/* * avoid numa_get_mems_allowed(), because of bug in getpol()
@@ -165,7 +165,7 @@ int get_allowed_nodes_arr(int flag, int *num_nodes, int **nodes)#if HAVE_NUMA_H unsigned long max_node =get_max_node (); -unsigned long nodemask_size = max_node /8 +1 ; +unsigned long nodemask_size =ALIGN (max_node,sizeof (nodemask_t)*8 ) /8 ; nodemask =malloc (nodemask_size);if (nodes)
Signature · 13 lines
1.7.1 ------------------------------------------------------------------------------ Introducing Performance Central, a new site from SourceForge and AppDynamics. Performance Central is your source for news, insights, analysis and resources for efficient Application Performance Management. Visit us today! http://pubads.g.doubleclick.net/gampad/clk?id=48897511&iu=/4140/ostg.clktrk _______________________________________________ Ltp-list mailing list [email protected] https://lists.sourceforge.net/lists/listinfo/ltp-list
Re: [LTP] [PATCH V2 3/3] lib/numa_helper.c: fix nodemask_size
----- Original Message -----
Quoted 8 lines
From: "Stanislav Kholmanskikh" <[email protected]>
To: [email protected]
Cc: "vasily isaenko" <[email protected]>, [email protected]
Sent: Wednesday, 21 August, 2013 1:54:58 PM
Subject: [PATCH V2 3/3]lib/numa_helper.c: fixnodemask_sizeNow
nodemask_sizeis rounded up to the next multiple ofsizeof(nodemask_t).
Hi,
Why multiple of nodemask_t? It can be quite large.
Quoted 12 lines
Signed-off-by Stanislav Kholmanskikh <[email protected]>--- testcases/kernel/lib/numa_helper.c | 6 +++--- 1 files changed, 3 insertions(+), 3 deletions(-)testcases/kernel/lib/numa_helper.c +0
-0
testcases/kernel/lib/numa_helper.c unsigned long get_max_node(void) · line 64
Quoted 6 lines
testcases/kernel/lib/numa_helper.c +1
-1@@ -60,7 +60,7 @@ unsigned long get_max_node(void)#if HAVE_NUMA_H static void get_nodemask_allnodes (nodemask_t * nodemask,unsigned long max_node) { -unsigned long nodemask_size = max_node /8 +1 ; +unsigned long nodemask_size =ALIGN (max_node,sizeof (nodemask_t)*8 ) /8 ;
Because mask is passed as parameter, we should respect max_node and clear only up to byte which holds max_node. So I think we should align to next byte only:
unsigned long nodemask_size = ALIGN(max_node, 8) / 8;
testcases/kernel/lib/numa_helper.c static void get_nodemask_allnodes(nodemask_t * nodemask, · line 81
Quoted 11 lines
testcases/kernel/lib/numa_helper.c +0
-0int i;char fn[64 ];testcases/kernel/lib/numa_helper.c +1
-1struct stat st;@@ -76,7 +76,7 @@ static void get_nodemask_allnodes(nodemask_t * nodemask, unsigned long max_node)static int filter_nodemask_mem (nodemask_t * nodemask,unsigned long max_node) {#if MPOL_F_MEMS_ALLOWED -unsigned long nodemask_size = max_node /8 +1 ; +unsigned long nodemask_size =ALIGN (max_node,sizeof (nodemask_t)*8 ) /8 ;
Same as above:
unsigned long nodemask_size = ALIGN(max_node, 8) / 8;
testcases/kernel/lib/numa_helper.c int get_allowed_nodes_arr(int flag, int *num_nodes, int · line 169
Quoted 10 lines
testcases/kernel/lib/numa_helper.c +0
-0memset (nodemask,0 , nodemask_size);testcases/kernel/lib/numa_helper.c +1
-1/* * avoid numa_get_mems_allowed(), because of bug in getpol() @@ -165,7 +165,7 @@ int get_allowed_nodes_arr(int flag, int *num_nodes, int **nodes)#if HAVE_NUMA_H unsigned long max_node =get_max_node (); -unsigned long nodemask_size = max_node /8 +1 ; +unsigned long nodemask_size =ALIGN (max_node,sizeof (nodemask_t)*8 ) /8 ;
This function allocates the nodemask, so we can align to as much as we need. I'd expect this to be same as in migrate_pages, align to next long:
unsigned long nodemask_size = ALIGN(max_node / 8, sizeof(long));
Regards,
Jan
Quoted 7 lines
testcases/kernel/lib/numa_helper.c +0
-1nodemask =malloc (nodemask_size);if (nodes) --1.7.1
------------------------------------------------------------------------------
Introducing Performance Central, a new site from SourceForge and AppDynamics. Performance Central is your source for news, insights, analysis and resources for efficient Application Performance Management. Visit us today!
http://pubads.g.doubleclick.net/gampad/clk?id=48897511&iu=/4140/ostg.clktrk
_______________________________________________
Ltp-list mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/ltp-list
Re: [LTP] [PATCH V2 3/3] lib/numa_helper.c: fix nodemask_size
Quoted 10 lines · Jan Stancek
----- Original Message -----
Quoted 6 lines
From: "Stanislav Kholmanskikh" <[email protected]>
To: [email protected]
Cc: "vasily isaenko" <[email protected]>, [email protected]
Sent: Wednesday, 21 August, 2013 1:54:58 PM
Subject: [PATCH V2 3/3]lib/numa_helper.c: fixnodemask_size
Quoted 5 lines
Quoted 2 lines
Now
nodemask_sizeis rounded up to the next multiple ofsizeof(nodemask_t).Hi,
Why multiple of
nodemask_t? It can be quite large.
Hi.
As nodemask is a pointer to nodemask_t type, so it should point to memory areas
multiple of sizeof(nodemask_t).
Isn't it?
Quoted 22 lines
Quoted 12 lines
Signed-off-by Stanislav Kholmanskikh <[email protected]>--- testcases/kernel/lib/numa_helper.c | 6 +++--- 1 files changed, 3 insertions(+), 3 deletions(-)testcases/kernel/lib/numa_helper.c +0
-0testcases/kernel/lib/numa_helper.c unsigned long get_max_node(void) · line 64
Quoted 6 lines
testcases/kernel/lib/numa_helper.c +1
-1@@ -60,7 +60,7 @@ unsigned long get_max_node(void)#if HAVE_NUMA_H static void get_nodemask_allnodes (nodemask_t * nodemask,unsigned long max_node) { -unsigned long nodemask_size = max_node /8 +1 ; +unsigned long nodemask_size =ALIGN (max_node,sizeof (nodemask_t)*8 ) /8 ;Because mask is passed as parameter, we should respect
max_nodeand clear only up to byte which holdsmax_node. So I think we should align to next byte only:
Quoted 1 line
unsigned long nodemask_size = ALIGN(max_node, 8) / 8;
I agree but I'm not sure how bytes comprising nodemask_t are handled. If they are handled in an endianness-dependant way then your approach will work only on little-endian systems.
So I decided to clear entire region. The same for filter_nodemask_mem.
Quoted 21 lines
testcases/kernel/lib/numa_helper.c static void get_nodemask_allnodes(nodemask_t * nodemask, · line 81
Quoted 12 lines
testcases/kernel/lib/numa_helper.c +0
-0int i;char fn[64 ];struct stat st;
testcases/kernel/lib/numa_helper.c +1
-1@@ -76,7 +76,7 @@ static void get_nodemask_allnodes(nodemask_t * nodemask, unsigned long max_node)static int filter_nodemask_mem (nodemask_t * nodemask,unsigned long max_node) {#if MPOL_F_MEMS_ALLOWED -unsigned long nodemask_size = max_node /8 +1 ; +unsigned long nodemask_size =ALIGN (max_node,sizeof (nodemask_t)*8 ) /8 ;Same as above:
unsigned long nodemask_size = ALIGN(max_node, 8) / 8;Quoted 6 lines
testcases/kernel/lib/numa_helper.c +0
-0memset (nodemask,0 , nodemask_size);/*
* avoidnuma_get_mems_allowed(), because of bug ingetpol()testcases/kernel/lib/numa_helper.c +0
-0@@ -165,7 +165,7 @@ int get_allowed_nodes_arr(int flag, int *num_nodes, int **nodes)
Quoted 8 lines
testcases/kernel/lib/numa_helper.c int get_allowed_nodes_arr(int flag, int *num_nodes, int **nodes) · line 168
Quoted 4 lines
testcases/kernel/lib/numa_helper.c +1
-1#if HAVE_NUMA_H unsigned long max_node =get_max_node (); -unsigned long nodemask_size = max_node /8 +1 ; +unsigned long nodemask_size =ALIGN (max_node,sizeof (nodemask_t)*8 ) /8 ;This function allocates the nodemask, so we can align to as much as we need. I'd expect this to be same as in
migrate_pages, align to next long:unsigned long nodemask_size = ALIGN(max_node / 8, sizeof(long));
This formula may give incorrect results. For example, if max_mode = 66 and sizeof(long) = 8, thenALIGN(max_node / 8, sizeof(long)) will output 8 and we will lost 2 bits. The correct output should be 16.
I think as max_node contains number of bits so we should align it on sizeof(long)*8 boundary and after that divide the final result by 8.
Quoted 10 lines
Regards,
JanQuoted 7 lines
testcases/kernel/lib/numa_helper.c +0
-1nodemask =malloc (nodemask_size);if (nodes) --1.7.1
------------------------------------------------------------------------------
Introducing Performance Central, a new site from SourceForge and AppDynamics. Performance Central is your source for news, insights, analysis and resources for efficient Application Performance Management. Visit us today!
http://pubads.g.doubleclick.net/gampad/clk?id=48897511&iu=/4140/ostg.clktrk
_______________________________________________
Ltp-list mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/ltp-list
Re: [LTP] [PATCH V2 3/3] lib/numa_helper.c: fix nodemask_size
----- Original Message -----
Quoted 22 lines
From: "Stanislav Kholmanskikh" <[email protected]>
To: "Jan Stancek" <[email protected]>
Cc: [email protected], "vasily isaenko" <[email protected]>
Sent: Wednesday, 21 August, 2013 3:22:04 PM
Subject: Re: [PATCH V2 3/3]lib/numa_helper.c: fixnodemask_sizeQuoted 14 lines · Jan Stancek
----- Original Message -----
Quoted 8 lines
From: "Stanislav Kholmanskikh" <[email protected]>
To: [email protected]
Cc: "vasily isaenko" <[email protected]>, [email protected]
Sent: Wednesday, 21 August, 2013 1:54:58 PM
Subject: [PATCH V2 3/3]lib/numa_helper.c: fixnodemask_sizeNow
nodemask_sizeis rounded up to the next multiple ofsizeof(nodemask_t).Hi,
Quoted 8 lines
Quoted 1 line
Why multiple of
nodemask_t? It can be quite large.Hi.
As nodemask is a pointer to
nodemask_ttype, so it should point to memory areas
multiple ofsizeof(nodemask_t).Isn't it?
typedef struct {
unsigned long n[NUMA_NUM_NODES/(sizeof(unsigned long)*8)];
} nodemask_t;It's used more like trailing array in this case, because NUMA_NUM_NODES is not always correct (I think it was version < 2.0 that had this issue).
I kept the type so I can reuse some trivial functions from numa.h and kernel gets 'n' field directly so it doesn't care about nodemask_t.
Quoted 59 lines
Quoted 22 lines
Quoted 12 lines
Signed-off-by Stanislav Kholmanskikh <[email protected]>--- testcases/kernel/lib/numa_helper.c | 6 +++--- 1 files changed, 3 insertions(+), 3 deletions(-)testcases/kernel/lib/numa_helper.c +0
-0testcases/kernel/lib/numa_helper.c unsigned long get_max_node(void) · line 64
Quoted 6 lines
testcases/kernel/lib/numa_helper.c +1
-1@@ -60,7 +60,7 @@ unsigned long get_max_node(void)#if HAVE_NUMA_H static void get_nodemask_allnodes (nodemask_t * nodemask,unsigned long max_node) { -unsigned long nodemask_size = max_node /8 +1 ; +unsigned long nodemask_size =ALIGN (max_node,sizeof (nodemask_t)*8 ) /8 ;Because mask is passed as parameter, we should respect
max_nodeand clear only up to byte which holdsmax_node. So I think we should align to next byte only:Quoted 1 line
unsigned long nodemask_size = ALIGN(max_node, 8) / 8;I agree but I'm not sure how bytes comprising
nodemask_tare handled. If they are handled in an endianness-dependant way then your approach will work only on little-endian systems.So I decided to clear entire region. The same for
filter_nodemask_mem.Quoted 30 lines
testcases/kernel/lib/numa_helper.c static void get_nodemask_allnodes(nodemask_t * nodemask, · line 81
Quoted 12 lines
testcases/kernel/lib/numa_helper.c +0
-0int i;char fn[64 ];struct stat st;
testcases/kernel/lib/numa_helper.c +1
-1@@ -76,7 +76,7 @@ static void get_nodemask_allnodes(nodemask_t * nodemask, unsigned long max_node)static int filter_nodemask_mem (nodemask_t * nodemask,unsigned long max_node) {#if MPOL_F_MEMS_ALLOWED -unsigned long nodemask_size = max_node /8 +1 ; +unsigned long nodemask_size =ALIGN (max_node,sizeof (nodemask_t)*8 ) /8 ;Same as above:
unsigned long nodemask_size = ALIGN(max_node, 8) / 8;testcases/kernel/lib/numa_helper.c
Quoted 11 lines
testcases/kernel/lib/numa_helper.c +0
-0memset (nodemask,0 , nodemask_size);/*
* avoidnuma_get_mems_allowed(), because of bug ingetpol()testcases/kernel/lib/numa_helper.c +0
-0@@ -165,7 +165,7 @@ int get_allowed_nodes_arr(int flag, int *num_nodes,int
**nodes)#if HAVE_NUMA_H unsigned long max_node = get_max_node();testcases/kernel/lib/numa_helper.c +1
-1-unsigned long nodemask_size = max_node /8 +1 ; +unsigned long nodemask_size =ALIGN (max_node,sizeof (nodemask_t)*8 ) /8 ;This function allocates the nodemask, so we can align to as much as we need.
I'd expect this to be same as inmigrate_pages, align to next long:
Quoted 8 lines
Quoted 1 line
unsigned long nodemask_size = ALIGN(max_node / 8, sizeof(long));This formula may give incorrect results. For example, if
max_mode= 66 and sizeof(long) = 8, thenALIGN(max_node / 8, sizeof(long))will output 8 and we will lost 2 bits. The correct output should be 16.I think as
max_nodecontains number of bits so we should align it on sizeof(long)*8 boundary and after that divide the final result by 8.
Agreed, we should align on bits then divide.
What if we align max_node? Then we can be sure that nodemask_size in all functions is also aligned:
testcases/kernel/lib/numa_helper.c +4 -4
@@ -60,7 +60,7 @@ unsigned long get_max_node(void)#if HAVE_NUMA_H static void get_nodemask_allnodes (nodemask_t * nodemask,unsigned long max_node) { -unsigned long nodemask_size = max_node /8 +1 ; +unsigned long nodemask_size = max_node /8 ;int i;char fn[64 ];struct stat st;
@@ -76,7 +76,7 @@ static void get_nodemask_allnodes(nodemask_t * nodemask, unsigned long max_node)static int filter_nodemask_mem (nodemask_t * nodemask,unsigned long max_node) {#if MPOL_F_MEMS_ALLOWED -unsigned long nodemask_size = max_node /8 +1 ; +unsigned long nodemask_size = max_node /8 ;memset (nodemask,0 , nodemask_size);/* * avoid numa_get_mems_allowed(), because of bug in getpol()
@@ -164,8 +164,8 @@ int get_allowed_nodes_arr(int flag, int *num_nodes, int **nodes) *nodes =NULL ;#if HAVE_NUMA_H -unsigned long max_node =get_max_node (); -unsigned long nodemask_size = max_node /8 +1 ; +unsigned long max_node =ALIGN (get_max_node (),sizeof (long )*8 ); +unsigned long nodemask_size = max_node /8 ; nodemask =malloc (nodemask_size);if (nodes)
Regards,
Jan
------------------------------------------------------------------------------
Introducing Performance Central, a new site from SourceForge and AppDynamics. Performance Central is your source for news, insights, analysis and resources for efficient Application Performance Management. Visit us today!
http://pubads.g.doubleclick.net/gampad/clk?id=48897511&iu=/4140/ostg.clktrk
_______________________________________________
Ltp-list mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/ltp-list
Re: [LTP] [PATCH V2 3/3] lib/numa_helper.c: fix nodemask_size
Quoted 35 lines · Jan Stancek
----- Original Message -----
Quoted 21 lines
From: "Stanislav Kholmanskikh" <[email protected]>
To: "Jan Stancek" <[email protected]>
Cc: [email protected], "vasily isaenko" <[email protected]>
Sent: Wednesday, 21 August, 2013 3:22:04 PM
Subject: Re: [PATCH V2 3/3]lib/numa_helper.c: fixnodemask_sizeQuoted 13 lines · Jan Stancek
----- Original Message -----
Quoted 8 lines
From: "Stanislav Kholmanskikh" <[email protected]>
To: [email protected]
Cc: "vasily isaenko" <[email protected]>, [email protected]
Sent: Wednesday, 21 August, 2013 1:54:58 PM
Subject: [PATCH V2 3/3]lib/numa_helper.c: fixnodemask_sizeNow
nodemask_sizeis rounded up to the next multiple ofsizeof(nodemask_t).Hi,
Quoted 8 lines
Quoted 1 line
Why multiple of
nodemask_t? It can be quite large.Hi.
As nodemask is a pointer to
nodemask_ttype, so it should point to memory areas
multiple ofsizeof(nodemask_t).Isn't it?
typedef struct { unsigned long n[NUMA_NUM_NODES/(sizeof(unsigned long)*8)]; } nodemask_t;
Quoted 5 lines
It's used more like trailing array in this case, because
NUMA_NUM_NODESis not always correct (I think it was version < 2.0 that had this issue).I kept the type so I can reuse some trivial functions from
numa.hand kernel gets 'n' field directly so it doesn't care aboutnodemask_t.
Thank you. Now it's clear.
Quoted 21 lines
Quoted 21 lines
Quoted 21 lines
Quoted 11 lines
Signed-off-by Stanislav Kholmanskikh <[email protected]>--- testcases/kernel/lib/numa_helper.c | 6 +++--- 1 files changed, 3 insertions(+), 3 deletions(-)testcases/kernel/lib/numa_helper.c +0
-0testcases/kernel/lib/numa_helper.c unsigned long get_max_node(void) · line 64
Quoted 6 lines
testcases/kernel/lib/numa_helper.c +1
-1@@ -60,7 +60,7 @@ unsigned long get_max_node(void)#if HAVE_NUMA_H static void get_nodemask_allnodes (nodemask_t * nodemask,unsigned long max_node) { -unsigned long nodemask_size = max_node /8 +1 ; +unsigned long nodemask_size =ALIGN (max_node,sizeof (nodemask_t)*8 ) /8 ;Because mask is passed as parameter, we should respect
max_nodeand clear only up to byte which holdsmax_node. So I think we should align to next byte only:
Quoted 6 lines
Quoted 6 lines
Quoted 1 line
unsigned long nodemask_size = ALIGN(max_node, 8) / 8;I agree but I'm not sure how bytes comprising
nodemask_tare handled. If they are handled in an endianness-dependant way then your approach will work only on little-endian systems.So I decided to clear entire region. The same for
filter_nodemask_mem.
Given a definition of _setbit, _getbit functions (from numactl-2.0.8/libnuma.c) used in nodemask_t (bitmask) handling functions:
static void_setbit(struct bitmask *bmp, unsigned int n, unsigned int v)
{
if (n < bmp->size) {
if (v)
bmp->maskp[n/bitsperlong] |= 1UL << (n %
bitsperlong);
else
bmp->maskp[n/bitsperlong] &= ~(1UL << (n %
bitsperlong));
}
}I think we cannot clear area by zeroing only few bytes of a long. Each byte of a long should
be zeroed.
Quoted 36 lines
Quoted 36 lines
Quoted 30 lines
testcases/kernel/lib/numa_helper.c static void get_nodemask_allnodes(nodemask_t * nodemask, · line 81
Quoted 12 lines
testcases/kernel/lib/numa_helper.c +0
-0int i;char fn[64 ];struct stat st;testcases/kernel/lib/numa_helper.c +1
-1@@ -76,7 +76,7 @@ static void get_nodemask_allnodes(nodemask_t * nodemask, unsigned long max_node)static int filter_nodemask_mem (nodemask_t * nodemask,unsigned long max_node) {#if MPOL_F_MEMS_ALLOWED -unsigned long nodemask_size = max_node /8 +1 ; +unsigned long nodemask_size =ALIGN (max_node,sizeof (nodemask_t)*8 ) /8 ;Same as above:
unsigned long nodemask_size = ALIGN(max_node, 8) / 8;testcases/kernel/lib/numa_helper.c
Quoted 11 lines
testcases/kernel/lib/numa_helper.c +0
-0memset (nodemask,0 , nodemask_size);/*
* avoidnuma_get_mems_allowed(), because of bug ingetpol()testcases/kernel/lib/numa_helper.c +0
-0@@ -165,7 +165,7 @@ int get_allowed_nodes_arr(int flag, int *num_nodes,int
**nodes)#if HAVE_NUMA_H unsigned long max_node = get_max_node();testcases/kernel/lib/numa_helper.c +1
-1-unsigned long nodemask_size = max_node /8 +1 ; +unsigned long nodemask_size =ALIGN (max_node,sizeof (nodemask_t)*8 ) /8 ;This function allocates the nodemask, so we can align to as much as we need.
I'd expect this to be same as inmigrate_pages, align to next long:Quoted 1 line
unsigned long nodemask_size = ALIGN(max_node / 8, sizeof(long));This formula may give incorrect results. For example, if
max_mode= 66 and sizeof(long) = 8, thenALIGN(max_node / 8, sizeof(long))will output 8 and we will lost 2 bits. The correct output should be 16.
Quoted 6 lines
Quoted 2 lines
I think as
max_nodecontains number of bits so we should align it on sizeof(long)*8 boundary and after that divide the final result by 8.Agreed, we should align on bits then divide.
What if we align
max_node? Then we can be sure thatnodemask_sizein all functions is also aligned:
Ok. And for convenience the same for migrate_pages fix ?
Quoted 35 lines
testcases/kernel/lib/numa_helper.c +4
-4@@ -60,7 +60,7 @@ unsigned long get_max_node(void)#if HAVE_NUMA_H static void get_nodemask_allnodes (nodemask_t * nodemask,unsigned long max_node) { -unsigned long nodemask_size = max_node /8 +1 ; +unsigned long nodemask_size = max_node /8 ;int i;char fn[64 ];struct stat st;@@ -76,7 +76,7 @@ static void get_nodemask_allnodes(nodemask_t * nodemask, unsigned long max_node)static int filter_nodemask_mem (nodemask_t * nodemask,unsigned long max_node) {#if MPOL_F_MEMS_ALLOWED -unsigned long nodemask_size = max_node /8 +1 ; +unsigned long nodemask_size = max_node /8 ;memset (nodemask,0 , nodemask_size);/* * avoid numa_get_mems_allowed(), because of bug in getpol() @@ -164,8 +164,8 @@ int get_allowed_nodes_arr(int flag, int *num_nodes, int **nodes) *nodes =NULL ;#if HAVE_NUMA_H -unsigned long max_node =get_max_node (); -unsigned long nodemask_size = max_node /8 +1 ; +unsigned long max_node =ALIGN (get_max_node (),sizeof (long )*8 ); +unsigned long nodemask_size = max_node /8 ; nodemask =malloc (nodemask_size);if (nodes)
Quoted 2 lines
Regards,
Jan
------------------------------------------------------------------------------
Introducing Performance Central, a new site from SourceForge and AppDynamics. Performance Central is your source for news, insights, analysis and resources for efficient Application Performance Management. Visit us today!
http://pubads.g.doubleclick.net/gampad/clk?id=48897511&iu=/4140/ostg.clktrk
_______________________________________________
Ltp-list mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/ltp-list
Re: [LTP] [PATCH V2 3/3] lib/numa_helper.c: fix nodemask_size
----- Original Message -----
Quoted 5 lines
From: "Stanislav Kholmanskikh" <[email protected]>
To: "Jan Stancek" <[email protected]>
Cc: [email protected], "vasily isaenko" <[email protected]>
Sent: Thursday, 22 August, 2013 8:13:34 AM
Subject: Re: [PATCH V2 3/3]lib/numa_helper.c: fixnodemask_size
<snip>
Quoted 3 lines
I think we cannot clear area by zeroing only few bytes of a long. Each byte of a long should
be zeroed.
Agreed, that was good point.
Quoted 5 lines
Quoted 5 lines
Quoted 5 lines
This formula may give incorrect results. For example, if
max_mode= 66 and sizeof(long) = 8, thenALIGN(max_node / 8, sizeof(long))will output 8 and we will lost 2 bits. The correct output should be 16.
Quoted 7 lines
Quoted 6 lines
Quoted 2 lines
I think as
max_nodecontains number of bits so we should align it on sizeof(long)*8 boundary and after that divide the final result by 8.Agreed, we should align on bits then divide.
What if we align
max_node? Then we can be sure thatnodemask_sizein all functions is also aligned:Ok. And for convenience the same for
migrate_pagesfix ?
I'll leave it up to you.
Man page says, that "bits beyond those specified by maxnode are ignored" so both ways should work equally well in those testcases.
Regards,
Jan
Quoted 39 lines
Quoted 39 lines
testcases/kernel/lib/numa_helper.c +1
-1@@ -60,7 +60,7 @@ unsigned long get_max_node(void)#if HAVE_NUMA_H static void get_nodemask_allnodes (nodemask_t * nodemask,unsigned long max_node) { -unsigned long nodemask_size = max_node /8 +1 ; +unsigned long nodemask_size = max_node /8 ;int i;char fn[64 ];struct stat st;testcases/kernel/lib/numa_helper.c +1
-1@@ -76,7 +76,7 @@ static void get_nodemask_allnodes(nodemask_t * nodemask, unsigned long max_node)static int filter_nodemask_mem (nodemask_t * nodemask,unsigned long max_node) {#if MPOL_F_MEMS_ALLOWED -unsigned long nodemask_size = max_node /8 +1 ; +unsigned long nodemask_size = max_node /8 ;memset (nodemask,0 , nodemask_size);/*
* avoidnuma_get_mems_allowed(), because of bug ingetpol()testcases/kernel/lib/numa_helper.c +2
-2@@ -164,8 +164,8 @@ int get_allowed_nodes_arr(int flag, int *num_nodes, int **nodes) *nodes =NULL ;#if HAVE_NUMA_H -unsigned long max_node =get_max_node (); -unsigned long nodemask_size = max_node /8 +1 ; +unsigned long max_node =ALIGN (get_max_node (),sizeof (long )*8 ); +unsigned long nodemask_size = max_node /8 ;
Quoted 7 lines
Quoted 5 lines
testcases/kernel/lib/numa_helper.c +0
-0nodemask =malloc (nodemask_size);if (nodes)
Regards,
Jan
------------------------------------------------------------------------------
Introducing Performance Central, a new site from SourceForge and AppDynamics. Performance Central is your source for news, insights, analysis and resources for efficient Application Performance Management. Visit us today!
http://pubads.g.doubleclick.net/gampad/clk?id=48897511&iu=/4140/ostg.clktrk
_______________________________________________
Ltp-list mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/ltp-list
PATCH v3 1/3 Added ALIGN, __ALIGN_MASK macroses
In reply to a message not in the archive--- include/test.h | 6 ++++++ 1 files changed, 6 insertions(+), 0 deletions(-)
include/test.h +6 -0
@@ -105,6 +105,12 @@#define MAP_PRIVATE_EXCEPT_UCLINUX MAP_PRIVATE#endif +/* Round x to the next multiple of a. +* a should be a power of 2. +*/ +#define ALIGN (x, a) __ALIGN_MASK(x, (typeof(x))(a) - 1) +#define __ALIGN_MASK (x, mask) (((x) + (mask)) & ~(mask)) +/* * lib/forker.c */
Signature · 13 lines
1.7.1 ------------------------------------------------------------------------------ Introducing Performance Central, a new site from SourceForge and AppDynamics. Performance Central is your source for news, insights, analysis and resources for efficient Application Performance Management. Visit us today! http://pubads.g.doubleclick.net/gampad/clk?id=48897511&iu=/4140/ostg.clktrk _______________________________________________ Ltp-list mailing list [email protected] https://lists.sourceforge.net/lists/listinfo/ltp-list
----- Original Message -----
Quoted 7 lines
From: "Stanislav Kholmanskikh" <[email protected]>
To: [email protected]
Cc: "vasily isaenko" <[email protected]>, [email protected]
Sent: Thursday, 22 August, 2013 9:41:47 AM
Subject: [PATCH V3 1/3] Added ALIGN,__ALIGN_MASKmacrosesSigned-off-by Stanislav Kholmanskikh <[email protected]>
The series looks good to me. I also ran it on small NUMA system, it worked fine. My only nit is this patch's subject, I believe plural of macro is macros :-).
Quoted 22 lines
--- include/test.h | 6 ++++++ 1 files changed, 6 insertions(+), 0 deletions(-)include/test.h +6
-1@@ -105,6 +105,12 @@#define MAP_PRIVATE_EXCEPT_UCLINUX MAP_PRIVATE#endif +/* Round x to the next multiple of a. +* a should be a power of 2. +*/ +#define ALIGN (x, a) __ALIGN_MASK(x, (typeof(x))(a) - 1) +#define __ALIGN_MASK (x, mask) (((x) + (mask)) & ~(mask)) +/* * lib/forker.c */ --
Quoted 3 lines
1.7.1
------------------------------------------------------------------------------
Introducing Performance Central, a new site from SourceForge and AppDynamics. Performance Central is your source for news, insights, analysis and resources for efficient Application Performance Management. Visit us today!
http://pubads.g.doubleclick.net/gampad/clk?id=48897511&iu=/4140/ostg.clktrk
_______________________________________________
Ltp-list mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/ltp-list
PATCH 1/3 Added ALIGN, __ALIGN_MASK macros
--- include/test.h | 6 ++++++ 1 files changed, 6 insertions(+), 0 deletions(-)
include/test.h +6 -0
@@ -105,6 +105,12 @@#define MAP_PRIVATE_EXCEPT_UCLINUX MAP_PRIVATE#endif +/* Round x to the next multiple of a. +* a should be a power of 2. +*/ +#define ALIGN (x, a) __ALIGN_MASK(x, (typeof(x))(a) - 1) +#define __ALIGN_MASK (x, mask) (((x) + (mask)) & ~(mask)) +/* * lib/forker.c */
Signature · 13 lines
1.7.1 ------------------------------------------------------------------------------ Introducing Performance Central, a new site from SourceForge and AppDynamics. Performance Central is your source for news, insights, analysis and resources for efficient Application Performance Management. Visit us today! http://pubads.g.doubleclick.net/gampad/clk?id=48897511&iu=/4140/ostg.clktrk _______________________________________________ Ltp-list mailing list [email protected] https://lists.sourceforge.net/lists/listinfo/ltp-list
Re: [LTP] [PATCH V3.1 1/3] Added ALIGN, __ALIGN_MASK macros
Hi!
Quoted 10 lines
Signed-off-by Stanislav Kholmanskikh <[email protected]>--- include/test.h | 6 ++++++ 1 files changed, 6 insertions(+), 0 deletions(-)include/test.h +0
-0
include/test.h line 113
Quoted 9 lines
include/test.h +6
-0@@ -105,6 +105,12 @@#define MAP_PRIVATE_EXCEPT_UCLINUX MAP_PRIVATE#endif +/* Round x to the next multiple of a. +* a should be a power of 2. +*/ +#define ALIGN (x, a) __ALIGN_MASK(x, (typeof(x))(a) - 1) +#define __ALIGN_MASK (x, mask) (((x) + (mask)) & ~(mask)) +
Generally looks good to me. I'm a bit concerned that macros named as ALIGN() and __ALING_MASK() may eventually collide with some system definiton. What about prefixing them with LTP_?
Also test.h is a bit crowded, what about adding them into compiler.h instead?
Signature · 13 lines
Cyril Hrubis [email protected] ------------------------------------------------------------------------------ Introducing Performance Central, a new site from SourceForge and AppDynamics. Performance Central is your source for news, insights, analysis and resources for efficient Application Performance Management. Visit us today! http://pubads.g.doubleclick.net/gampad/clk?id=48897511&iu=/4140/ostg.clktrk _______________________________________________ Ltp-list mailing list [email protected] https://lists.sourceforge.net/lists/listinfo/ltp-list
Quoted 11 lines · Jan Stancek
----- Original Message -----
Quoted 7 lines
From: "Stanislav Kholmanskikh" <[email protected]>
To: [email protected]
Cc: "vasily isaenko" <[email protected]>, [email protected]
Sent: Thursday, 22 August, 2013 9:41:47 AM
Subject: [PATCH V3 1/3] Added ALIGN,__ALIGN_MASKmacrosesSigned-off-by Stanislav Kholmanskikh <[email protected]>The series looks good to me. I also ran it on small NUMA system, it worked fine. My only nit is this patch's subject, I believe plural of macro is macros :-).
Shame on me :) Sent V3.1 of this patch.
Quoted 15 lines
Reviewed-by Jan Stancek <[email protected]>Quoted 12 lines
--- include/test.h | 6 ++++++ 1 files changed, 6 insertions(+), 0 deletions(-)include/test.h +0
-0@@ -105,6 +105,12 @@#define MAP_PRIVATE_EXCEPT_UCLINUX MAP_PRIVATE#endif
Quoted 13 lines
Quoted 10 lines
include/test.h +6
-1+/* Round x to the next multiple of a. +* a should be a power of 2. +*/ +#define ALIGN (x, a) __ALIGN_MASK(x, (typeof(x))(a) - 1) +#define __ALIGN_MASK (x, mask) (((x) + (mask)) & ~(mask)) +/* * lib/forker.c */ --Quoted 3 lines
1.7.1
------------------------------------------------------------------------------
Introducing Performance Central, a new site from SourceForge and AppDynamics. Performance Central is your source for news, insights, analysis and resources for efficient Application Performance Management. Visit us today!
http://pubads.g.doubleclick.net/gampad/clk?id=48897511&iu=/4140/ostg.clktrk
_______________________________________________
Ltp-list mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/ltp-list
PATCH v3 2/3 syscalls/migrate_pages: fix nodemask memory allocation
In reply to a message not in the archiveIn accordance to man migrate_pages(), mbind() the bit mask size should be rounded to the next multiple of sizeof(unsigned long).
--- .../syscalls/migrate_pages/migrate_pages01.c | 4 ++-- .../syscalls/migrate_pages/migrate_pages02.c | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-)
testcases/kernel/syscalls/migrate_pages/migrate_pages01.c +2 -2
@@ -247,8 +247,8 @@ static void setup(void)tst_brkm (TBROK |TERRNO ,NULL ,"get_allowed_nodes_arr: %d" , ret); - sane_max_node =get_max_node (); - sane_nodemask_size = sane_max_node /8 +1 ; + sane_max_node =ALIGN (get_max_node (),sizeof (unsigned long )*8 ); + sane_nodemask_size = sane_max_node /8 ; sane_old_nodes =SAFE_MALLOC (NULL , sane_nodemask_size); sane_new_nodes =SAFE_MALLOC (NULL , sane_nodemask_size);memset (sane_old_nodes,0 , sane_nodemask_size);
testcases/kernel/syscalls/migrate_pages/migrate_pages02.c +2 -2
@@ -109,8 +109,8 @@ static int migrate_to_node(pid_t pid, int node)tst_resm (TINFO ,"pid(%d) migrate pid %d to node -> %d" ,getpid (), pid, node); - max_node =get_max_node (); - nodemask_size = max_node /8 +1 ; + max_node =ALIGN (get_max_node (),sizeof (unsigned long )*8 ); + nodemask_size = max_node /8 ; old_nodes =SAFE_MALLOC (NULL , nodemask_size); new_nodes =SAFE_MALLOC (NULL , nodemask_size);
Signature · 13 lines
1.7.1 ------------------------------------------------------------------------------ Introducing Performance Central, a new site from SourceForge and AppDynamics. Performance Central is your source for news, insights, analysis and resources for efficient Application Performance Management. Visit us today! http://pubads.g.doubleclick.net/gampad/clk?id=48897511&iu=/4140/ostg.clktrk _______________________________________________ Ltp-list mailing list [email protected] https://lists.sourceforge.net/lists/listinfo/ltp-list
Re: [LTP] [PATCH V3 2/3] syscalls/migrate_pages: fix nodemask memory allocation
Hi!
Quoted 4 lines
In accordance to man
migrate_pages(),mbind()the bit mask size should be rounded to the next multiple of sizeof(unsigned long).Signed-off-by Stanislav Kholmanskikh <[email protected]>
The 2/3 and 3/3 looks good. Acked.
Signature · 13 lines
Cyril Hrubis [email protected] ------------------------------------------------------------------------------ Introducing Performance Central, a new site from SourceForge and AppDynamics. Performance Central is your source for news, insights, analysis and resources for efficient Application Performance Management. Visit us today! http://pubads.g.doubleclick.net/gampad/clk?id=48897511&iu=/4140/ostg.clktrk _______________________________________________ Ltp-list mailing list [email protected] https://lists.sourceforge.net/lists/listinfo/ltp-list
A message that is not in the archive (sent off-list or not yet received): 1377607792-5731-1-git-send-email-stanislav.kholmanskikh@oracle.com
Re: [LTP] [PATCH V4] syscalls/migrate_pages: fix nodemask_memory_allocation
Hi!
Quoted 3 lines
Changes since V3:
* Macros ALIGN,__ALIGN_MASKrenamed toLTP_ALIGN,__LTP_ALIGN_MASK
* Both macros are placed incompiler.h(instead oftest.h)
Pushed, thanks.
Signature · 13 lines
Cyril Hrubis [email protected] ------------------------------------------------------------------------------ Learn the latest--Visual Studio 2012, SharePoint 2013, SQL 2012, more! Discover the easy way to master current and previous Microsoft technologies and advance your career. Get an incredible 1,500+ hours of step-by-step tutorial videos with LearnDevNow. Subscribe today and save! http://pubads.g.doubleclick.net/gampad/clk?id=58040911&iu=/4140/ostg.clktrk _______________________________________________ Ltp-list mailing list [email protected] https://lists.sourceforge.net/lists/listinfo/ltp-list
PATCH v3 3/3 lib/numa_helper.c: fix nodemask_size
In reply to a message not in the archiveNow nodemask_size is rounded up to the next
multiple of sizeof(unsigned long).
--- testcases/kernel/lib/numa_helper.c | 8 ++++---- 1 files changed, 4 insertions(+), 4 deletions(-)
testcases/kernel/lib/numa_helper.c +4 -4
@@ -60,7 +60,7 @@ unsigned long get_max_node(void)#if HAVE_NUMA_H static void get_nodemask_allnodes (nodemask_t * nodemask,unsigned long max_node) { -unsigned long nodemask_size = max_node /8 +1 ; +unsigned long nodemask_size = max_node /8 ;int i;char fn[64 ];struct stat st;
@@ -76,7 +76,7 @@ static void get_nodemask_allnodes(nodemask_t * nodemask, unsigned long max_node)static int filter_nodemask_mem (nodemask_t * nodemask,unsigned long max_node) {#if MPOL_F_MEMS_ALLOWED -unsigned long nodemask_size = max_node /8 +1 ; +unsigned long nodemask_size = max_node /8 ;memset (nodemask,0 , nodemask_size);/* * avoid numa_get_mems_allowed(), because of bug in getpol()
@@ -164,8 +164,8 @@ int get_allowed_nodes_arr(int flag, int *num_nodes, int **nodes) *nodes =NULL ;#if HAVE_NUMA_H -unsigned long max_node =get_max_node (); -unsigned long nodemask_size = max_node /8 +1 ; +unsigned long max_node =ALIGN (get_max_node (),sizeof (unsigned long )*8 ); +unsigned long nodemask_size = max_node /8 ; nodemask =malloc (nodemask_size);if (nodes)
Signature · 13 lines
1.7.1 ------------------------------------------------------------------------------ Introducing Performance Central, a new site from SourceForge and AppDynamics. Performance Central is your source for news, insights, analysis and resources for efficient Application Performance Management. Visit us today! http://pubads.g.doubleclick.net/gampad/clk?id=48897511&iu=/4140/ostg.clktrk _______________________________________________ Ltp-list mailing list [email protected] https://lists.sourceforge.net/lists/listinfo/ltp-list