Skip to contentSkip to conversation

posix: aio_cancel: 3-1, 4-1: prepare aiocb structures in advance

PATCH New Stanislav Kholmanskikh 2 participants 8 messages Dec 12, 2017 – Dec 14, 2017

lore
Share & tools
lore
#0 lore raw

PATCH 1/3 posix: aio_cancel: 3-1, 4-1: prepare aiocb structures in advance

The tests work this way. They sequentially issue a number of aio_write() operations and then cancel them all. They expect that at least one of the operations has not been completed when they issue the cancel request. However, while preparing a request two calls to malloc() are made, one of them is for a 1 MB block. This is a relatively time-expensive operation, so on some systems it may (and does) happen that all AIO writes are completed before aio_cancel() is called.

Preparing all aiocb structures in advance eliminates this problem.

---
 .../conformance/interfaces/aio_cancel/3-1.c        |    7 ++++++-
 .../conformance/interfaces/aio_cancel/4-1.c        |    2 ++
 2 files changed, 8 insertions(+), 1 deletions(-)
testcases/open_posix_testsuite/conformance/interfaces/aio_cancel/3-1.c +6 -1
index ccb85e5..ead3be1 100644
@@ -65,6 +65,7 @@ int main(void)
 {
 	char tmpfname[256];
 	int fd;
+	struct aiocb *aiocb_list[BUF_NB];
 	struct aiocb *aiocb;
 	struct sigaction action;
 	int i;
@@ -121,7 +122,11 @@ int main(void)
 		aiocb->aio_sigevent.sigev_value.sival_ptr = aiocb;
 		aiocb->aio_reqprio = 0;
 
-		if (aio_write(aiocb) == -1) {
+		aiocb_list[i] = aiocb;
+	}
+
+	for (i = 0; i < BUF_NB; i++) {
+		if (aio_write(aiocb_list[i]) == -1) {
 			printf(TNAME " loop %d: Error@aio_write(): %s\n",
 			       i, strerror(errno));
 			return PTS_FAIL;
testcases/open_posix_testsuite/conformance/interfaces/aio_cancel/4-1.c +2 -0
index 76a45a1..7304857 100644
@@ -86,7 +86,9 @@ int main(void)
 		aiocb[i]->aio_nbytes = BUF_SIZE;
 		aiocb[i]->aio_offset = 0;
 		aiocb[i]->aio_sigevent.sigev_notify = SIGEV_NONE;
+	}
 
+	for (i = 0; i < BUF_NB; i++) {
 		if (aio_write(aiocb[i]) == -1) {
 			printf(TNAME " loop %d: Error@aio_write(): %s\n",
 			       i, strerror(errno));
Signature · 1 line
1.7.1
#1 lore raw

PATCH 2/3 posix: aio_cancel: 5-1, 6-1, 7-1: initialize aio_reqprio

aiocb is allocated via malloc(), which does not clear the memory. aio_write() may fail with EINVAL if aio_reqprio is not properly initialized.

---
 .../conformance/interfaces/aio_cancel/5-1.c        |    1 +
 .../conformance/interfaces/aio_cancel/6-1.c        |    1 +
 .../conformance/interfaces/aio_cancel/7-1.c        |    1 +
 3 files changed, 3 insertions(+), 0 deletions(-)
testcases/open_posix_testsuite/conformance/interfaces/aio_cancel/5-1.c +1 -0
index ece29ac..de0a9e8 100644
@@ -86,6 +86,7 @@ int main(void)
 		aiocb[i]->aio_nbytes = BUF_SIZE;
 		aiocb[i]->aio_offset = 0;
 		aiocb[i]->aio_sigevent.sigev_notify = SIGEV_NONE;
+		aiocb[i]->aio_reqprio = 0;
 
 		if (aio_write(aiocb[i]) == -1) {
 			printf(TNAME " loop %d: Error at aio_write(): %s\n",
testcases/open_posix_testsuite/conformance/interfaces/aio_cancel/6-1.c +1 -0
index 280ac15..765db2c 100644
@@ -87,6 +87,7 @@ int main(void)
 		aiocb[i]->aio_nbytes = BUF_SIZE;
 		aiocb[i]->aio_offset = 0;
 		aiocb[i]->aio_sigevent.sigev_notify = SIGEV_NONE;
+		aiocb[i]->aio_reqprio = 0;
 
 		if (aio_write(aiocb[i]) == -1) {
 			printf(TNAME " loop %d: Error at aio_write(): %s\n",
testcases/open_posix_testsuite/conformance/interfaces/aio_cancel/7-1.c +1 -0
index c205d27..79d6b03 100644
@@ -90,6 +90,7 @@ int main(void)
 		aiocb[i]->aio_nbytes = BUF_SIZE;
 		aiocb[i]->aio_offset = 0;
 		aiocb[i]->aio_sigevent.sigev_notify = SIGEV_NONE;
+		aiocb[i]->aio_reqprio = 0;
 
 		if (aio_write(aiocb[i]) == -1) {
 			printf(TNAME " loop %d: Error at aio_write(): %s\n",
Signature · 1 line
1.7.1
#2 lore raw

PATCH 2/3 posix: aio_cancel: 5-1, 6-1, 7-1: initialize aio_reqprio

Hi!

Quoted 3 lines

aiocb is allocated via malloc(), which does not clear the memory. aio_write() may fail with EINVAL if aio_reqprio is not properly initialized.

The manual pages suggests to zero the whole structure before use either by using calloc() or with memset(), can we do that instead please?

Signature · 2 lines
Cyril Hrubis
[email protected]
#3 lore raw

PATCH 3/3 posix: aio_error: 2-1: initialize aio_reqprio

In reply to Stanislav Kholmanskikh

aio_write() may fail if aio_reqprio is not properly initialized.

---
 .../conformance/interfaces/aio_error/2-1.c         |    1 +
 1 files changed, 1 insertions(+), 0 deletions(-)
testcases/open_posix_testsuite/conformance/interfaces/aio_error/2-1.c +1 -0
index 12319dc..f7116ef 100644
@@ -79,6 +79,7 @@ int main(void)
 		aiocb[i]->aio_nbytes = BUF_SIZE;
 		aiocb[i]->aio_offset = 0;
 		aiocb[i]->aio_sigevent.sigev_notify = SIGEV_NONE;
+		aiocb[i]->aio_reqprio = 0;
 
 		if (aio_write(aiocb[i]) == -1) {
 			printf(TNAME " loop %d: Error at aio_write(): %s\n",
Signature · 1 line
1.7.1
#4 lore raw

PATCH 3/3 posix: aio_error: 2-1: initialize aio_reqprio

Hi!

Quoted 1 line

aio_write() may fail if aio_reqprio is not properly initialized.

Here as well.

Signature · 2 lines
Cyril Hrubis
[email protected]
#5 lore raw

PATCH 3/3 posix: aio_error: 2-1: initialize aio_reqprio

Thank you. Will do this shortly.

Quoted 5 lines · Cyril Hrubis

Hi!

Quoted 1 line

aio_write() may fail if aio_reqprio is not properly initialized.

Here as well.

#7 lore raw

PATCH 1/3 posix: aio_cancel: 3-1, 4-1: prepare aiocb structures in advance

This particular patch was pushed.

Thank you.

Quoted 3 lines · Cyril Hrubis

Hi!
Looks good, acked.