open_posix_testsuite/mmap24-2: Support mips
PATCH 1/1 open_posix_testsuite/mmap24-2: Support mips
Mips will return EINVAL instead of ENOMEM as expected if MAP_FIXED is set and the range of [addr + len) exceeds TASK_SIZE.
Linux kernel code: arch/mips/mm/mmap.c
if (flags & MAP_FIXED) {
/* Even MAP_FIXED mappings must reside within TASK_SIZE */
if (TASK_SIZE - len < addr)
return -EINVAL;The POSIX specification says:
"If MAP_FIXED is set, mmap() may return MAP_FAILED and set errno to [EINVAL]."
[http://pubs.opengroup.org/onlinepubs/9699919799/functions/mmap.html]
So I think the mips kernel remains POSIX compliant.
Relax the condition and accept both ENOMEM and EINVAL as expected outcome.
--- .../open_posix_testsuite/conformance/interfaces/mmap/24-2.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-)
testcases/open_posix_testsuite/conformance/interfaces/mmap/24-2.c +5 -5
@@ -7,7 +7,7 @@* source tree. * * The mmap() function shall fail if: -* [ENOMEM] MAP_FIXED was specified, +* [ENOMEM or EINVAL] MAP_FIXED was specified, * and the range [addr,addr+len) exceeds that allowed * for the address space of a process; or, if MAP_FIXED was not specified and * there is insufficient room in the address space to effect the mapping.
@@ -15,7 +15,7 @@* Test Step: * 1. Map a shared memory object, with size exceeding the value get from * rlim_cur of resource RLIMIT_AS, setting MAP_FIXED; -* 3. Should get ENOMEM. +* 3. Should get ENOMEM or EINVAL. */ #define _XOPEN_SOURCE 600
@@ -93,8 +93,8 @@ int main(void) (unsigned long)len); pa =mmap (addr, len,PROT_READ |PROT_WRITE ,MAP_FIXED |MAP_SHARED , fd,0 ); -if (pa ==MAP_FAILED && errno ==ENOMEM ) { -printf ("Got ENOMEM: %s\nTest PASSED\n" ,strerror (errno)); +if (pa ==MAP_FAILED && (errno ==ENOMEM || errno ==EINVAL )) { +printf ("Got ENOMEM or EINVAL: %s\nTest PASSED\n" ,strerror (errno));exit (PTS_PASS ); }
@@ -103,6 +103,6 @@ int main(void)else munmap (pa, len);close (fd); -printf ("Test Fail: Did not get ENOMEM as expected\n" ); +printf ("Test Failed: Did not get ENOMEM or EINVAL as expected\n" );return PTS_FAIL ; }
Signature · 1 line
2.8.1
Hongzhi
PATCH 1/1 open_posix_testsuite/mmap24-2: Support mips
Sorry, this is V2.
Kindly ping
--Hongzhi
Quoted 66 lines · Hongzhi.Song
Mips will return EINVAL instead of ENOMEM as expected if
MAP_FIXEDis set and the range of [addr + len) exceedsTASK_SIZE.Linux kernel code:
arch/mips/mm/mmap.cif (flags & MAP_FIXED) { /* Even MAP_FIXED mappings must reside within TASK_SIZE */ if (TASK_SIZE - len < addr) return -EINVAL;The POSIX specification says:
"IfMAP_FIXEDis set,mmap()may returnMAP_FAILEDand set errno to [EINVAL]."
[http://pubs.opengroup.org/onlinepubs/9699919799/functions/mmap.html]So I think the mips kernel remains POSIX compliant.
Relax the condition and accept both ENOMEM and EINVAL as expected outcome.
Signed-off-by Hongzhi.Song <[email protected]>--- .../open_posix_testsuite/conformance/interfaces/mmap/24-2.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-)testcases/open_posix_testsuite/conformance/interfaces/mmap/24-2.c +5
-5@@ -7,7 +7,7 @@* source tree. * * The mmap() function shall fail if: -* [ENOMEM] MAP_FIXED was specified, +* [ENOMEM or EINVAL] MAP_FIXED was specified, * and the range [addr,addr+len) exceeds that allowed * for the address space of a process; or, if MAP_FIXED was not specified and * there is insufficient room in the address space to effect the mapping. @@ -15,7 +15,7 @@* Test Step: * 1. Map a shared memory object, with size exceeding the value get from * rlim_cur of resource RLIMIT_AS, setting MAP_FIXED; -* 3. Should get ENOMEM. +* 3. Should get ENOMEM or EINVAL. */ #define _XOPEN_SOURCE 600@@ -93,8 +93,8 @@ int main(void) (unsigned long)len); pa =mmap (addr, len,PROT_READ |PROT_WRITE ,MAP_FIXED |MAP_SHARED , fd,0 ); -if (pa ==MAP_FAILED && errno ==ENOMEM ) { -printf ("Got ENOMEM: %s\nTest PASSED\n" ,strerror (errno)); +if (pa ==MAP_FAILED && (errno ==ENOMEM || errno ==EINVAL )) { +printf ("Got ENOMEM or EINVAL: %s\nTest PASSED\n" ,strerror (errno));exit (PTS_PASS ); }@@ -103,6 +103,6 @@ int main(void)else munmap (pa, len);close (fd); -printf ("Test Fail: Did not get ENOMEM as expected\n" ); +printf ("Test Failed: Did not get ENOMEM or EINVAL as expected\n" );return PTS_FAIL ; }
Hongzhi
PATCH 1/1 open_posix_testsuite/mmap24-2: Support mips
In reply to Hongzhi.SongHi guys,
Referring to POSIX spec, the return values, EINVAL and ENOMEM,
are all right if MAP_FIXED is set. So I think Mips also keep to POSIX.
Please review this patch.
--Hongzhi
Quoted 66 lines · Hongzhi.Song
Mips will return EINVAL instead of ENOMEM as expected if
MAP_FIXEDis set and the range of [addr + len) exceedsTASK_SIZE.Linux kernel code:
arch/mips/mm/mmap.cif (flags & MAP_FIXED) { /* Even MAP_FIXED mappings must reside within TASK_SIZE */ if (TASK_SIZE - len < addr) return -EINVAL;The POSIX specification says:
"IfMAP_FIXEDis set,mmap()may returnMAP_FAILEDand set errno to [EINVAL]."
[http://pubs.opengroup.org/onlinepubs/9699919799/functions/mmap.html]So I think the mips kernel remains POSIX compliant.
Relax the condition and accept both ENOMEM and EINVAL as expected outcome.
Signed-off-by Hongzhi.Song <[email protected]>--- .../open_posix_testsuite/conformance/interfaces/mmap/24-2.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-)testcases/open_posix_testsuite/conformance/interfaces/mmap/24-2.c +5
-5@@ -7,7 +7,7 @@* source tree. * * The mmap() function shall fail if: -* [ENOMEM] MAP_FIXED was specified, +* [ENOMEM or EINVAL] MAP_FIXED was specified, * and the range [addr,addr+len) exceeds that allowed * for the address space of a process; or, if MAP_FIXED was not specified and * there is insufficient room in the address space to effect the mapping. @@ -15,7 +15,7 @@* Test Step: * 1. Map a shared memory object, with size exceeding the value get from * rlim_cur of resource RLIMIT_AS, setting MAP_FIXED; -* 3. Should get ENOMEM. +* 3. Should get ENOMEM or EINVAL. */ #define _XOPEN_SOURCE 600@@ -93,8 +93,8 @@ int main(void) (unsigned long)len); pa =mmap (addr, len,PROT_READ |PROT_WRITE ,MAP_FIXED |MAP_SHARED , fd,0 ); -if (pa ==MAP_FAILED && errno ==ENOMEM ) { -printf ("Got ENOMEM: %s\nTest PASSED\n" ,strerror (errno)); +if (pa ==MAP_FAILED && (errno ==ENOMEM || errno ==EINVAL )) { +printf ("Got ENOMEM or EINVAL: %s\nTest PASSED\n" ,strerror (errno));exit (PTS_PASS ); }@@ -103,6 +103,6 @@ int main(void)else munmap (pa, len);close (fd); -printf ("Test Fail: Did not get ENOMEM as expected\n" ); +printf ("Test Failed: Did not get ENOMEM or EINVAL as expected\n" );return PTS_FAIL ; }
Hongzhi
PATCH 1/1 open_posix_testsuite/mmap24-2: Support mips
Kindly ping
--Hongzhi
Quoted 88 lines · Song
Hi guys,
Referring to POSIX spec, the return values, EINVAL and ENOMEM,
are all right if
MAP_FIXEDis set. So I think Mips also keep to POSIX.Please review this patch.
--Hongzhi
Quoted 72 lines · Hongzhi.Song
Mips will return EINVAL instead of ENOMEM as expected if
MAP_FIXEDis set and the range of [addr + len) exceedsTASK_SIZE.Linux kernel code:
arch/mips/mm/mmap.c
if (flags &MAP_FIXED) {
/* EvenMAP_FIXEDmappings must reside withinTASK_SIZE*/ if (TASK_SIZE- len < addr)
return-EINVAL;The POSIX specification says:
"IfMAP_FIXEDis set,mmap()may returnMAP_FAILEDand set errno to [EINVAL]."
[http://pubs.opengroup.org/onlinepubs/9699919799/functions/mmap.html]So I think the mips kernel remains POSIX compliant.
Relax the condition and accept both ENOMEM and EINVAL as expected outcome.
Signed-off-by Hongzhi.Song <[email protected]>---
.../open_posix_testsuite/conformance/interfaces/mmap/24-2.c | 10
+++++-----1 file changed, 5 insertions(+), 5 deletions(-)(quoted diff) +0
-0a/testcases/open_posix_testsuite/conformance/interfaces/mmap/24-2.c b/testcases/open_posix_testsuite/conformance/interfaces/mmap/24-2.c index de51d43..810e5c8 100644
testcases/open_posix_testsuite/conformance/interfaces/mmap/24-2.c +1
-1@@ -7,7 +7,7 @@ * source tree. * * The mmap() function shall fail if: - * [ENOMEM] MAP_FIXED was specified, + * [ENOMEM or EINVAL] MAP_FIXED was specified, * and the range [addr,addr+len) exceeds that allowed * for the address space of a process; or, if MAP_FIXED was notspecified and
* there is insufficient room in the address space to effect the mapping.testcases/open_posix_testsuite/conformance/interfaces/mmap/24-2.c +0
-0@@ -15,7 +15,7 @@ * Test Step: * 1. Map a shared memory object, with size exceeding the value getfrom
*rlim_curof resourceRLIMIT_AS, settingMAP_FIXED;
- * 3. Should get ENOMEM.
+ * 3. Should get ENOMEM or EINVAL.
*/
#define_XOPEN_SOURCE600testcases/open_posix_testsuite/conformance/interfaces/mmap/24-2.c +0
-0@@ -93,8 +93,8 @@ int main(void) (unsigned long)len);pa = mmap(addr, len,
PROT_READ|PROT_WRITE,MAP_FIXED|MAP_SHARED, fd,
0);
- if (pa ==MAP_FAILED&& errno == ENOMEM) {
-printf("Got ENOMEM: %s\nTest PASSED\n", strerror(errno)); + if (pa ==MAP_FAILED&& (errno == ENOMEM || errno == EINVAL)) { +printf("Got ENOMEM or EINVAL: %s\nTest PASSED\n", strerror(errno));
exit(PTS_PASS);
}
@@ -103,6 +103,6 @@ int main(void)
else
munmap(pa, len);
close(fd);
-printf("Test Fail: Did not get ENOMEM as expected\n"); +printf("Test Failed: Did not get ENOMEM or EINVAL as expected\n"); returnPTS_FAIL;
}
Hongzhi
PATCH 1/1 open_posix_testsuite/mmap24-2: Support mips
ping.
There are some discussion for patch-v1 :
https://lists.linux.it/pipermail/ltp/2018-October/009624.html
Thanks
--Hongzhi
Quoted 96 lines · Song
Kindly ping
--Hongzhi
Quoted 88 lines · Song
Hi guys,
Referring to POSIX spec, the return values, EINVAL and ENOMEM,
are all right if
MAP_FIXEDis set. So I think Mips also keep to POSIX.Please review this patch.
--Hongzhi
Quoted 72 lines · Hongzhi.Song
Mips will return EINVAL instead of ENOMEM as expected if
MAP_FIXEDis set and the range of [addr + len) exceedsTASK_SIZE.Linux kernel code:
arch/mips/mm/mmap.c
if (flags &MAP_FIXED) {
???? /* EvenMAP_FIXEDmappings must reside withinTASK_SIZE*/ ???? if (TASK_SIZE- len < addr)
???????? return-EINVAL;The POSIX specification says:
"IfMAP_FIXEDis set,mmap()may returnMAP_FAILEDand set errno to [EINVAL]."
[http://pubs.opengroup.org/onlinepubs/9699919799/functions/mmap.html]So I think the mips kernel remains POSIX compliant.
Relax the condition and accept both ENOMEM and EINVAL as expected outcome.
Signed-off-by Hongzhi.Song <[email protected]>---
? .../open_posix_testsuite/conformance/interfaces/mmap/24-2.c | 10
+++++-----
? 1 file changed, 5 insertions(+), 5 deletions(-)(quoted diff) +0
-0a/testcases/open_posix_testsuite/conformance/interfaces/mmap/24-2.c b/testcases/open_posix_testsuite/conformance/interfaces/mmap/24-2.c index de51d43..810e5c8 100644
testcases/open_posix_testsuite/conformance/interfaces/mmap/24-2.c +0
-0@@ -7,7 +7,7 @@?? * source tree.
?? *
?? * Themmap()function shall fail if:
- * [ENOMEM]MAP_FIXEDwas specified,
+ * [ENOMEM or EINVAL]MAP_FIXEDwas specified,
?? * and the range [addr,addr+len) exceeds that allowed ?? * for the address space of a process; or, ifMAP_FIXEDwas not specified and
?? * there is insufficient room in the address space to effect the mapping.testcases/open_posix_testsuite/conformance/interfaces/mmap/24-2.c +0
-0@@ -15,7 +15,7 @@?? * Test Step:
?? * 1. Map a shared memory object, with size exceeding the value get from
?? *???rlim_curof resourceRLIMIT_AS, settingMAP_FIXED;
- * 3. Should get ENOMEM.
+ * 3. Should get ENOMEM or EINVAL.
?? */
? ? #define_XOPEN_SOURCE600testcases/open_posix_testsuite/conformance/interfaces/mmap/24-2.c +0
-0@@ -93,8 +93,8 @@ int main(void) ???????????? (unsigned long)len);????? pa = mmap(addr, len,
PROT_READ|PROT_WRITE,MAP_FIXED|MAP_SHARED, fd,
??????????? 0);
-??? if (pa ==MAP_FAILED&& errno == ENOMEM) {
-???????printf("Got ENOMEM: %s\nTest PASSED\n", strerror(errno)); +??? if (pa ==MAP_FAILED&& (errno == ENOMEM || errno == EINVAL)) { +???????printf("Got ENOMEM or EINVAL: %s\nTest PASSED\n", strerror(errno));
?????????exit(PTS_PASS);
????? }
? @@ -103,6 +103,6 @@ int main(void)
????? else
?????????munmap(pa, len);
????? close(fd);
-???printf("Test Fail: Did not get ENOMEM as expected\n"); +???printf("Test Failed: Did not get ENOMEM or EINVAL as expected\n"); ????? returnPTS_FAIL;
? }
Hongzhi
PATCH 1/1 open_posix_testsuite/mmap24-2: Support mips
ping
--Hongzhi
Quoted 111 lines · Song
ping.
There are some discussion for patch-v1 :
https://lists.linux.it/pipermail/ltp/2018-October/009624.htmlThanks
--Hongzhi
Quoted 99 lines · Song
Kindly ping
--Hongzhi
Quoted 91 lines · Song
Hi guys,
Referring to POSIX spec, the return values, EINVAL and ENOMEM,
are all right if
MAP_FIXEDis set. So I think Mips also keep to POSIX.Please review this patch.
--Hongzhi
Quoted 75 lines · Hongzhi.Song
Mips will return EINVAL instead of ENOMEM as expected if
MAP_FIXEDis set and the range of [addr + len) exceedsTASK_SIZE.Linux kernel code:
arch/mips/mm/mmap.c
if (flags &MAP_FIXED) {
???? /* EvenMAP_FIXEDmappings must reside withinTASK_SIZE*/ ???? if (TASK_SIZE- len < addr)
???????? return-EINVAL;The POSIX specification says:
"IfMAP_FIXEDis set,mmap()may returnMAP_FAILEDand set errno to [EINVAL]."
[http://pubs.opengroup.org/onlinepubs/9699919799/functions/mmap.html]So I think the mips kernel remains POSIX compliant.
Relax the condition and accept both ENOMEM and EINVAL as expected outcome.
Signed-off-by Hongzhi.Song <[email protected]>---
.../open_posix_testsuite/conformance/interfaces/mmap/24-2.c | 10
+++++-----
? 1 file changed, 5 insertions(+), 5 deletions(-)(quoted diff) +0
-0a/testcases/open_posix_testsuite/conformance/interfaces/mmap/24-2.c b/testcases/open_posix_testsuite/conformance/interfaces/mmap/24-2.c index de51d43..810e5c8 100644
---
a/testcases/open_posix_testsuite/conformance/interfaces/mmap/24-2.c
+++
b/testcases/open_posix_testsuite/conformance/interfaces/mmap/24-2.c(quoted diff) +0
-0@@ -7,7 +7,7 @@?? * source tree.
?? *
?? * Themmap()function shall fail if:
- * [ENOMEM]MAP_FIXEDwas specified,
+ * [ENOMEM or EINVAL]MAP_FIXEDwas specified,
?? * and the range [addr,addr+len) exceeds that allowed ?? * for the address space of a process; or, ifMAP_FIXEDwas not specified and
?? * there is insufficient room in the address space to effect the mapping.(quoted diff) +0
-0@@ -15,7 +15,7 @@?? * Test Step:
?? * 1. Map a shared memory object, with size exceeding the value get from
?? *???rlim_curof resourceRLIMIT_AS, settingMAP_FIXED;
- * 3. Should get ENOMEM.
+ * 3. Should get ENOMEM or EINVAL.
?? */
? ? #define_XOPEN_SOURCE600(quoted diff) +0
-0@@ -93,8 +93,8 @@ int main(void) ???????????? (unsigned long)len);????? pa = mmap(addr, len,
PROT_READ|PROT_WRITE,MAP_FIXED|MAP_SHARED, fd,
??????????? 0);
-??? if (pa ==MAP_FAILED&& errno == ENOMEM) {
-???????printf("Got ENOMEM: %s\nTest PASSED\n", strerror(errno)); +??? if (pa ==MAP_FAILED&& (errno == ENOMEM || errno == EINVAL)) { +???????printf("Got ENOMEM or EINVAL: %s\nTest PASSED\n", strerror(errno));
?????????exit(PTS_PASS);
????? }
? @@ -103,6 +103,6 @@ int main(void)
????? else
?????????munmap(pa, len);
????? close(fd);
-???printf("Test Fail: Did not get ENOMEM as expected\n"); +???printf("Test Failed: Did not get ENOMEM or EINVAL as expected\n");
????? returnPTS_FAIL;
? }
PATCH 1/1 open_posix_testsuite/mmap24-2: Support mips
In reply to Hongzhi.SongHi!
First of all sorry for the late reply.
Quoted 10 lines
Mips will return EINVAL instead of ENOMEM as expected if
MAP_FIXEDis set and the range of [addr + len) exceedsTASK_SIZE.Linux kernel code:
arch/mips/mm/mmap.cif (flags & MAP_FIXED) { /* Even MAP_FIXED mappings must reside within TASK_SIZE */ if (TASK_SIZE - len < addr) return -EINVAL;
Quoted 6 lines
The POSIX specification says:
"IfMAP_FIXEDis set,mmap()may returnMAP_FAILEDand set errno to [EINVAL]."
[http://pubs.opengroup.org/onlinepubs/9699919799/functions/mmap.html]So I think the mips kernel remains POSIX compliant.
There is a subtle difference between the ENOMEM and EINVAL error for MAP_FIXED though.
If you look at POSIX specification terminology it says that 'shall' defines mandatory features while 'may' describes optional features.
Which means that the MAP_FIXED returning ENOMEM for addresses above TASK_SIZE is mandatory since it's defined in the shall fail list. And that EINVAL is recomended to be used for other unsuitable address that fit into the process address space but are not suitable for a different reasons which could be mostly translated to hardware limits.
To sum it up, as far as I can tell mips is not POSIX confirmant here and even if this is a very minor issue we shouldn't change the test here.
Signature · 2 lines
Cyril Hrubis [email protected]
Hongzhi
PATCH 1/1 open_posix_testsuite/mmap24-2: Support mips
Quoted 25 lines · Cyril Hrubis
Hi!
First of all sorry for the late reply.Quoted 10 lines
Mips will return EINVAL instead of ENOMEM as expected if
MAP_FIXEDis set and the range of [addr + len) exceedsTASK_SIZE.Linux kernel code:
arch/mips/mm/mmap.cif (flags & MAP_FIXED) { /* Even MAP_FIXED mappings must reside within TASK_SIZE */ if (TASK_SIZE - len < addr) return -EINVAL;Quoted 6 lines
The POSIX specification says:
"IfMAP_FIXEDis set,mmap()may returnMAP_FAILEDand set errno to [EINVAL]."
[http://pubs.opengroup.org/onlinepubs/9699919799/functions/mmap.html]So I think the mips kernel remains POSIX compliant.
There is a subtle difference between the ENOMEM and EINVAL error for
MAP_FIXEDthough.If you look at POSIX specification terminology it says that 'shall' defines mandatory features while 'may' describes optional features.
Quoted 9 lines
Which means that the
MAP_FIXEDreturning ENOMEM for addresses aboveTASK_SIZEis mandatory since it's defined in the shall fail list. And that EINVAL is recomended to be used for other unsuitable address that fit into the process address space but are not suitable for a different reasons which could be mostly translated to hardware limits.To sum it up, as far as I can tell mips is not POSIX confirmant here and even if this is a very minor issue we shouldn't change the test here.
Sorry for my recent ping-emails, because I missed your reply.
I follow your final above conclusion.
--Hongzhi