Skip to contentSkip to conversation

open_posix_testsuite/mmap24-2: Support mips

PATCH New Hongzhi.Song 3 participants 8 messages Oct 24, 2018 – Jul 24, 2019

lore
Share & tools
lore
#0 lore raw

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
index de51d43..810e5c8 100644
@@ -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
#1 lore raw

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_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
index de51d43..810e5c8 100644
@@ -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;
  }
#2 lore raw

PATCH 1/1 open_posix_testsuite/mmap24-2: Support mips

In reply to Hongzhi.Song

Hi 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_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
index de51d43..810e5c8 100644
@@ -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;
  }
#3 lore raw

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_FIXED is 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_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(-)
(quoted diff) +0 -0

a/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 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_cur of resource RLIMIT_AS, setting MAP_FIXED;
- * 3. Should get ENOMEM.
+ * 3. Should get ENOMEM or EINVAL.
   */
    #define _XOPEN_SOURCE 600

testcases/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"); return PTS_FAIL;
  }

#4 lore raw

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_FIXED is 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_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(-)

(quoted diff) +0 -0

a/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.
?? *
?? * 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.

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_cur of resource RLIMIT_AS, setting MAP_FIXED;
- * 3. Should get ENOMEM.
+ * 3. Should get ENOMEM or EINVAL.
?? */
? ? #define _XOPEN_SOURCE 600

testcases/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"); ????? return PTS_FAIL;
? }

#5 lore raw

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.html

Thanks

--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_FIXED is 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_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(-)

(quoted diff) +0 -0

a/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.
?? *
?? * 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.

(quoted diff) +0 -0
@@ -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

(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");
????? return PTS_FAIL;
? }

#6 lore raw

PATCH 1/1 open_posix_testsuite/mmap24-2: Support mips

In reply to Hongzhi.Song

Hi!
First of all sorry for the late reply.

Quoted 10 lines

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;
Quoted 6 lines

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.

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]
#7 lore raw

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_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;
Quoted 6 lines

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.

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.

Quoted 9 lines

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.

Sorry for my recent ping-emails, because I missed your reply.

I follow your final above conclusion.

--Hongzhi