diff mbox

[API-NEXT,1/2] linux-gen: _ishm: exporting/importing user len and flags

Message ID 1482318693-5086-1-git-send-email-christophe.milard@linaro.org
State Accepted
Commit 41febe9fe6ac762174579e86874d65ec8a2c5485
Headers show

Commit Message

Christophe Milard Dec. 21, 2016, 11:11 a.m. UTC
The size of the shared memory and its user flag set, as given at reserve
time, are exported and imported so that odp_shm_info() return proper
values on imported blocks

Signed-off-by: Christophe Milard <christophe.milard@linaro.org>

---
 platform/linux-generic/_ishm.c                     | 38 +++++++++++++++++-----
 .../validation/api/shmem/shmem_linux.c             | 14 ++++++--
 2 files changed, 42 insertions(+), 10 deletions(-)

-- 
2.7.4

Comments

Maxim Uvarov Dec. 27, 2016, 2:55 p.m. UTC | #1
Thanks,

that is what we discussed. I think that can go to 'next' also, right?

Maxim.

On 12/21/16 14:11, Christophe Milard wrote:
> The size of the shared memory and its user flag set, as given at reserve

> time, are exported and imported so that odp_shm_info() return proper

> values on imported blocks

> 

> Signed-off-by: Christophe Milard <christophe.milard@linaro.org>

> ---

>  platform/linux-generic/_ishm.c                     | 38 +++++++++++++++++-----

>  .../validation/api/shmem/shmem_linux.c             | 14 ++++++--

>  2 files changed, 42 insertions(+), 10 deletions(-)

> 

> diff --git a/platform/linux-generic/_ishm.c b/platform/linux-generic/_ishm.c

> index 449e357..8b32709 100644

> --- a/platform/linux-generic/_ishm.c

> +++ b/platform/linux-generic/_ishm.c

> @@ -124,7 +124,9 @@

>  #define EXPORT_FILE_LINE3_FMT "file: %s"

>  #define EXPORT_FILE_LINE4_FMT "length: %" PRIu64

>  #define EXPORT_FILE_LINE5_FMT "flags: %" PRIu32

> -#define EXPORT_FILE_LINE6_FMT "align: %" PRIu32

> +#define EXPORT_FILE_LINE6_FMT "user_length: %" PRIu64

> +#define EXPORT_FILE_LINE7_FMT "user_flags: %" PRIu32

> +#define EXPORT_FILE_LINE8_FMT "align: %" PRIu32

>  /*

>   * A fragment describes a piece of the shared virtual address space,

>   * and is allocated only when allocation is done with the _ODP_ISHM_SINGLE_VA

> @@ -477,7 +479,11 @@ static int create_file(int block_index, huge_flag_t huge, uint64_t len,

>  				new_block->filename);

>  			fprintf(export_file, EXPORT_FILE_LINE4_FMT "\n", len);

>  			fprintf(export_file, EXPORT_FILE_LINE5_FMT "\n", flags);

> -			fprintf(export_file, EXPORT_FILE_LINE6_FMT "\n", align);

> +			fprintf(export_file, EXPORT_FILE_LINE6_FMT "\n",

> +				new_block->user_len);

> +			fprintf(export_file, EXPORT_FILE_LINE7_FMT "\n",

> +				new_block->user_flags);

> +			fprintf(export_file, EXPORT_FILE_LINE8_FMT "\n", align);

>  

>  			fclose(export_file);

>  		}

> @@ -800,6 +806,10 @@ int _odp_ishm_reserve(const char *name, uint64_t size, int fd,

>  	else

>  		new_block->name[0] = 0;

>  

> +	/* save user data: */

> +	new_block->user_flags = user_flags;

> +	new_block->user_len = size;

> +

>  	/* If a file descriptor is provided, get the real size and map: */

>  	if (fd >= 0) {

>  		fstat(fd, &statbuf);

> @@ -911,9 +921,11 @@ int _odp_ishm_find_exported(const char *remote_name, pid_t external_odp_pid,

>  	FILE *export_file;

>  	uint64_t len;

>  	uint32_t flags;

> +	uint64_t user_len;

> +	uint32_t user_flags;

>  	uint32_t align;

>  	int fd;

> -	int ret;

> +	int block_index;

>  

>  	/* try to read the block description file: */

>  	snprintf(export_filename, ISHM_FILENAME_MAXLEN,

> @@ -943,7 +955,13 @@ int _odp_ishm_find_exported(const char *remote_name, pid_t external_odp_pid,

>  	if (fscanf(export_file, EXPORT_FILE_LINE5_FMT " ", &flags) != 1)

>  		goto error_exp_file;

>  

> -	if (fscanf(export_file, EXPORT_FILE_LINE6_FMT " ", &align) != 1)

> +	if (fscanf(export_file, EXPORT_FILE_LINE6_FMT " ", &user_len) != 1)

> +		goto error_exp_file;

> +

> +	if (fscanf(export_file, EXPORT_FILE_LINE7_FMT " ", &user_flags) != 1)

> +		goto error_exp_file;

> +

> +	if (fscanf(export_file, EXPORT_FILE_LINE8_FMT " ", &align) != 1)

>  		goto error_exp_file;

>  

>  	fclose(export_file);

> @@ -960,13 +978,17 @@ int _odp_ishm_find_exported(const char *remote_name, pid_t external_odp_pid,

>  	flags &= ~(uint32_t)_ODP_ISHM_EXPORT;

>  

>  	/* reserve the memory, providing the opened file descriptor: */

> -	ret = _odp_ishm_reserve(local_name, 0, fd, align, flags, 0);

> -	if (ret < 0) {

> +	block_index = _odp_ishm_reserve(local_name, 0, fd, align, flags, 0);

> +	if (block_index < 0) {

>  		close(fd);

> -		return ret;

> +		return block_index;

>  	}

>  

> -	return ret;

> +	/* set inherited info: */

> +	ishm_tbl->block[block_index].user_flags = user_flags;

> +	ishm_tbl->block[block_index].user_len = user_len;

> +

> +	return block_index;

>  

>  error_exp_file:

>  	fclose(export_file);

> diff --git a/test/linux-generic/validation/api/shmem/shmem_linux.c b/test/linux-generic/validation/api/shmem/shmem_linux.c

> index 39473f3..2f4c762 100644

> --- a/test/linux-generic/validation/api/shmem/shmem_linux.c

> +++ b/test/linux-generic/validation/api/shmem/shmem_linux.c

> @@ -102,7 +102,8 @@

>   */

>  static int read_shmem_attribues(uint64_t ext_odp_pid, const char *blockname,

>  				char *filename, uint64_t *len,

> -				uint32_t *flags, uint32_t *align)

> +				uint32_t *flags, uint64_t *user_len,

> +				uint32_t *user_flags, uint32_t *align)

>  {

>  	char shm_attr_filename[PATH_MAX];

>  	FILE *export_file;

> @@ -130,6 +131,12 @@ static int read_shmem_attribues(uint64_t ext_odp_pid, const char *blockname,

>  	if (fscanf(export_file, "flags: %" PRIu32 " ", flags) != 1)

>  		goto export_file_read_err;

>  

> +	if (fscanf(export_file, "user_length: %" PRIu64 " ", user_len) != 1)

> +		goto export_file_read_err;

> +

> +	if (fscanf(export_file, "user_flags: %" PRIu32 " ", user_flags) != 1)

> +		goto export_file_read_err;

> +

>  	if (fscanf(export_file, "align: %" PRIu32 " ", align) != 1)

>  		goto export_file_read_err;

>  

> @@ -192,6 +199,8 @@ int main(int argc __attribute__((unused)), char *argv[])

>  	char shm_filename[PATH_MAX];/* shared mem device name, under /dev/shm */

>  	uint64_t len;

>  	uint32_t flags;

> +	uint64_t user_len;

> +	uint32_t user_flags;

>  	uint32_t align;

>  	int shm_fd;

>  	test_shared_linux_data_t *addr;

> @@ -231,7 +240,8 @@ int main(int argc __attribute__((unused)), char *argv[])

>  

>  	/* read the shared memory attributes (includes the shm filename): */

>  	if (read_shmem_attribues(odp_app1, ODP_SHM_NAME,

> -				 shm_filename, &len, &flags, &align) != 0)

> +				 shm_filename, &len, &flags,

> +				 &user_len, &user_flags, &align) != 0)

>  		test_failure(fifo_name, fifo_fd, odp_app1);

>  

>  	/* open the shm filename (which is either on /tmp or on hugetlbfs)

>
Christophe Milard Dec. 27, 2016, 2:57 p.m. UTC | #2
It needs review, but yes: it is not driver related, i.e. it is
candidate for next.

Christophe.

On 27 December 2016 at 15:55, Maxim Uvarov <maxim.uvarov@linaro.org> wrote:
> Thanks,

>

> that is what we discussed. I think that can go to 'next' also, right?

>

> Maxim.

>

> On 12/21/16 14:11, Christophe Milard wrote:

>> The size of the shared memory and its user flag set, as given at reserve

>> time, are exported and imported so that odp_shm_info() return proper

>> values on imported blocks

>>

>> Signed-off-by: Christophe Milard <christophe.milard@linaro.org>

>> ---

>>  platform/linux-generic/_ishm.c                     | 38 +++++++++++++++++-----

>>  .../validation/api/shmem/shmem_linux.c             | 14 ++++++--

>>  2 files changed, 42 insertions(+), 10 deletions(-)

>>

>> diff --git a/platform/linux-generic/_ishm.c b/platform/linux-generic/_ishm.c

>> index 449e357..8b32709 100644

>> --- a/platform/linux-generic/_ishm.c

>> +++ b/platform/linux-generic/_ishm.c

>> @@ -124,7 +124,9 @@

>>  #define EXPORT_FILE_LINE3_FMT "file: %s"

>>  #define EXPORT_FILE_LINE4_FMT "length: %" PRIu64

>>  #define EXPORT_FILE_LINE5_FMT "flags: %" PRIu32

>> -#define EXPORT_FILE_LINE6_FMT "align: %" PRIu32

>> +#define EXPORT_FILE_LINE6_FMT "user_length: %" PRIu64

>> +#define EXPORT_FILE_LINE7_FMT "user_flags: %" PRIu32

>> +#define EXPORT_FILE_LINE8_FMT "align: %" PRIu32

>>  /*

>>   * A fragment describes a piece of the shared virtual address space,

>>   * and is allocated only when allocation is done with the _ODP_ISHM_SINGLE_VA

>> @@ -477,7 +479,11 @@ static int create_file(int block_index, huge_flag_t huge, uint64_t len,

>>                               new_block->filename);

>>                       fprintf(export_file, EXPORT_FILE_LINE4_FMT "\n", len);

>>                       fprintf(export_file, EXPORT_FILE_LINE5_FMT "\n", flags);

>> -                     fprintf(export_file, EXPORT_FILE_LINE6_FMT "\n", align);

>> +                     fprintf(export_file, EXPORT_FILE_LINE6_FMT "\n",

>> +                             new_block->user_len);

>> +                     fprintf(export_file, EXPORT_FILE_LINE7_FMT "\n",

>> +                             new_block->user_flags);

>> +                     fprintf(export_file, EXPORT_FILE_LINE8_FMT "\n", align);

>>

>>                       fclose(export_file);

>>               }

>> @@ -800,6 +806,10 @@ int _odp_ishm_reserve(const char *name, uint64_t size, int fd,

>>       else

>>               new_block->name[0] = 0;

>>

>> +     /* save user data: */

>> +     new_block->user_flags = user_flags;

>> +     new_block->user_len = size;

>> +

>>       /* If a file descriptor is provided, get the real size and map: */

>>       if (fd >= 0) {

>>               fstat(fd, &statbuf);

>> @@ -911,9 +921,11 @@ int _odp_ishm_find_exported(const char *remote_name, pid_t external_odp_pid,

>>       FILE *export_file;

>>       uint64_t len;

>>       uint32_t flags;

>> +     uint64_t user_len;

>> +     uint32_t user_flags;

>>       uint32_t align;

>>       int fd;

>> -     int ret;

>> +     int block_index;

>>

>>       /* try to read the block description file: */

>>       snprintf(export_filename, ISHM_FILENAME_MAXLEN,

>> @@ -943,7 +955,13 @@ int _odp_ishm_find_exported(const char *remote_name, pid_t external_odp_pid,

>>       if (fscanf(export_file, EXPORT_FILE_LINE5_FMT " ", &flags) != 1)

>>               goto error_exp_file;

>>

>> -     if (fscanf(export_file, EXPORT_FILE_LINE6_FMT " ", &align) != 1)

>> +     if (fscanf(export_file, EXPORT_FILE_LINE6_FMT " ", &user_len) != 1)

>> +             goto error_exp_file;

>> +

>> +     if (fscanf(export_file, EXPORT_FILE_LINE7_FMT " ", &user_flags) != 1)

>> +             goto error_exp_file;

>> +

>> +     if (fscanf(export_file, EXPORT_FILE_LINE8_FMT " ", &align) != 1)

>>               goto error_exp_file;

>>

>>       fclose(export_file);

>> @@ -960,13 +978,17 @@ int _odp_ishm_find_exported(const char *remote_name, pid_t external_odp_pid,

>>       flags &= ~(uint32_t)_ODP_ISHM_EXPORT;

>>

>>       /* reserve the memory, providing the opened file descriptor: */

>> -     ret = _odp_ishm_reserve(local_name, 0, fd, align, flags, 0);

>> -     if (ret < 0) {

>> +     block_index = _odp_ishm_reserve(local_name, 0, fd, align, flags, 0);

>> +     if (block_index < 0) {

>>               close(fd);

>> -             return ret;

>> +             return block_index;

>>       }

>>

>> -     return ret;

>> +     /* set inherited info: */

>> +     ishm_tbl->block[block_index].user_flags = user_flags;

>> +     ishm_tbl->block[block_index].user_len = user_len;

>> +

>> +     return block_index;

>>

>>  error_exp_file:

>>       fclose(export_file);

>> diff --git a/test/linux-generic/validation/api/shmem/shmem_linux.c b/test/linux-generic/validation/api/shmem/shmem_linux.c

>> index 39473f3..2f4c762 100644

>> --- a/test/linux-generic/validation/api/shmem/shmem_linux.c

>> +++ b/test/linux-generic/validation/api/shmem/shmem_linux.c

>> @@ -102,7 +102,8 @@

>>   */

>>  static int read_shmem_attribues(uint64_t ext_odp_pid, const char *blockname,

>>                               char *filename, uint64_t *len,

>> -                             uint32_t *flags, uint32_t *align)

>> +                             uint32_t *flags, uint64_t *user_len,

>> +                             uint32_t *user_flags, uint32_t *align)

>>  {

>>       char shm_attr_filename[PATH_MAX];

>>       FILE *export_file;

>> @@ -130,6 +131,12 @@ static int read_shmem_attribues(uint64_t ext_odp_pid, const char *blockname,

>>       if (fscanf(export_file, "flags: %" PRIu32 " ", flags) != 1)

>>               goto export_file_read_err;

>>

>> +     if (fscanf(export_file, "user_length: %" PRIu64 " ", user_len) != 1)

>> +             goto export_file_read_err;

>> +

>> +     if (fscanf(export_file, "user_flags: %" PRIu32 " ", user_flags) != 1)

>> +             goto export_file_read_err;

>> +

>>       if (fscanf(export_file, "align: %" PRIu32 " ", align) != 1)

>>               goto export_file_read_err;

>>

>> @@ -192,6 +199,8 @@ int main(int argc __attribute__((unused)), char *argv[])

>>       char shm_filename[PATH_MAX];/* shared mem device name, under /dev/shm */

>>       uint64_t len;

>>       uint32_t flags;

>> +     uint64_t user_len;

>> +     uint32_t user_flags;

>>       uint32_t align;

>>       int shm_fd;

>>       test_shared_linux_data_t *addr;

>> @@ -231,7 +240,8 @@ int main(int argc __attribute__((unused)), char *argv[])

>>

>>       /* read the shared memory attributes (includes the shm filename): */

>>       if (read_shmem_attribues(odp_app1, ODP_SHM_NAME,

>> -                              shm_filename, &len, &flags, &align) != 0)

>> +                              shm_filename, &len, &flags,

>> +                              &user_len, &user_flags, &align) != 0)

>>               test_failure(fifo_name, fifo_fd, odp_app1);

>>

>>       /* open the shm filename (which is either on /tmp or on hugetlbfs)

>>

>
Maxim Uvarov Dec. 27, 2016, 3:21 p.m. UTC | #3
I merged it with my review.

Maxim.

On 27 December 2016 at 17:57, Christophe Milard <
christophe.milard@linaro.org> wrote:

> It needs review, but yes: it is not driver related, i.e. it is

> candidate for next.

>

> Christophe.

>

> On 27 December 2016 at 15:55, Maxim Uvarov <maxim.uvarov@linaro.org>

> wrote:

> > Thanks,

> >

> > that is what we discussed. I think that can go to 'next' also, right?

> >

> > Maxim.

> >

> > On 12/21/16 14:11, Christophe Milard wrote:

> >> The size of the shared memory and its user flag set, as given at reserve

> >> time, are exported and imported so that odp_shm_info() return proper

> >> values on imported blocks

> >>

> >> Signed-off-by: Christophe Milard <christophe.milard@linaro.org>

> >> ---

> >>  platform/linux-generic/_ishm.c                     | 38

> +++++++++++++++++-----

> >>  .../validation/api/shmem/shmem_linux.c             | 14 ++++++--

> >>  2 files changed, 42 insertions(+), 10 deletions(-)

> >>

> >> diff --git a/platform/linux-generic/_ishm.c b/platform/linux-generic/_

> ishm.c

> >> index 449e357..8b32709 100644

> >> --- a/platform/linux-generic/_ishm.c

> >> +++ b/platform/linux-generic/_ishm.c

> >> @@ -124,7 +124,9 @@

> >>  #define EXPORT_FILE_LINE3_FMT "file: %s"

> >>  #define EXPORT_FILE_LINE4_FMT "length: %" PRIu64

> >>  #define EXPORT_FILE_LINE5_FMT "flags: %" PRIu32

> >> -#define EXPORT_FILE_LINE6_FMT "align: %" PRIu32

> >> +#define EXPORT_FILE_LINE6_FMT "user_length: %" PRIu64

> >> +#define EXPORT_FILE_LINE7_FMT "user_flags: %" PRIu32

> >> +#define EXPORT_FILE_LINE8_FMT "align: %" PRIu32

> >>  /*

> >>   * A fragment describes a piece of the shared virtual address space,

> >>   * and is allocated only when allocation is done with the

> _ODP_ISHM_SINGLE_VA

> >> @@ -477,7 +479,11 @@ static int create_file(int block_index,

> huge_flag_t huge, uint64_t len,

> >>                               new_block->filename);

> >>                       fprintf(export_file, EXPORT_FILE_LINE4_FMT "\n",

> len);

> >>                       fprintf(export_file, EXPORT_FILE_LINE5_FMT "\n",

> flags);

> >> -                     fprintf(export_file, EXPORT_FILE_LINE6_FMT "\n",

> align);

> >> +                     fprintf(export_file, EXPORT_FILE_LINE6_FMT "\n",

> >> +                             new_block->user_len);

> >> +                     fprintf(export_file, EXPORT_FILE_LINE7_FMT "\n",

> >> +                             new_block->user_flags);

> >> +                     fprintf(export_file, EXPORT_FILE_LINE8_FMT "\n",

> align);

> >>

> >>                       fclose(export_file);

> >>               }

> >> @@ -800,6 +806,10 @@ int _odp_ishm_reserve(const char *name, uint64_t

> size, int fd,

> >>       else

> >>               new_block->name[0] = 0;

> >>

> >> +     /* save user data: */

> >> +     new_block->user_flags = user_flags;

> >> +     new_block->user_len = size;

> >> +

> >>       /* If a file descriptor is provided, get the real size and map: */

> >>       if (fd >= 0) {

> >>               fstat(fd, &statbuf);

> >> @@ -911,9 +921,11 @@ int _odp_ishm_find_exported(const char

> *remote_name, pid_t external_odp_pid,

> >>       FILE *export_file;

> >>       uint64_t len;

> >>       uint32_t flags;

> >> +     uint64_t user_len;

> >> +     uint32_t user_flags;

> >>       uint32_t align;

> >>       int fd;

> >> -     int ret;

> >> +     int block_index;

> >>

> >>       /* try to read the block description file: */

> >>       snprintf(export_filename, ISHM_FILENAME_MAXLEN,

> >> @@ -943,7 +955,13 @@ int _odp_ishm_find_exported(const char

> *remote_name, pid_t external_odp_pid,

> >>       if (fscanf(export_file, EXPORT_FILE_LINE5_FMT " ", &flags) != 1)

> >>               goto error_exp_file;

> >>

> >> -     if (fscanf(export_file, EXPORT_FILE_LINE6_FMT " ", &align) != 1)

> >> +     if (fscanf(export_file, EXPORT_FILE_LINE6_FMT " ", &user_len) !=

> 1)

> >> +             goto error_exp_file;

> >> +

> >> +     if (fscanf(export_file, EXPORT_FILE_LINE7_FMT " ", &user_flags)

> != 1)

> >> +             goto error_exp_file;

> >> +

> >> +     if (fscanf(export_file, EXPORT_FILE_LINE8_FMT " ", &align) != 1)

> >>               goto error_exp_file;

> >>

> >>       fclose(export_file);

> >> @@ -960,13 +978,17 @@ int _odp_ishm_find_exported(const char

> *remote_name, pid_t external_odp_pid,

> >>       flags &= ~(uint32_t)_ODP_ISHM_EXPORT;

> >>

> >>       /* reserve the memory, providing the opened file descriptor: */

> >> -     ret = _odp_ishm_reserve(local_name, 0, fd, align, flags, 0);

> >> -     if (ret < 0) {

> >> +     block_index = _odp_ishm_reserve(local_name, 0, fd, align, flags,

> 0);

> >> +     if (block_index < 0) {

> >>               close(fd);

> >> -             return ret;

> >> +             return block_index;

> >>       }

> >>

> >> -     return ret;

> >> +     /* set inherited info: */

> >> +     ishm_tbl->block[block_index].user_flags = user_flags;

> >> +     ishm_tbl->block[block_index].user_len = user_len;

> >> +

> >> +     return block_index;

> >>

> >>  error_exp_file:

> >>       fclose(export_file);

> >> diff --git a/test/linux-generic/validation/api/shmem/shmem_linux.c

> b/test/linux-generic/validation/api/shmem/shmem_linux.c

> >> index 39473f3..2f4c762 100644

> >> --- a/test/linux-generic/validation/api/shmem/shmem_linux.c

> >> +++ b/test/linux-generic/validation/api/shmem/shmem_linux.c

> >> @@ -102,7 +102,8 @@

> >>   */

> >>  static int read_shmem_attribues(uint64_t ext_odp_pid, const char

> *blockname,

> >>                               char *filename, uint64_t *len,

> >> -                             uint32_t *flags, uint32_t *align)

> >> +                             uint32_t *flags, uint64_t *user_len,

> >> +                             uint32_t *user_flags, uint32_t *align)

> >>  {

> >>       char shm_attr_filename[PATH_MAX];

> >>       FILE *export_file;

> >> @@ -130,6 +131,12 @@ static int read_shmem_attribues(uint64_t

> ext_odp_pid, const char *blockname,

> >>       if (fscanf(export_file, "flags: %" PRIu32 " ", flags) != 1)

> >>               goto export_file_read_err;

> >>

> >> +     if (fscanf(export_file, "user_length: %" PRIu64 " ", user_len) !=

> 1)

> >> +             goto export_file_read_err;

> >> +

> >> +     if (fscanf(export_file, "user_flags: %" PRIu32 " ", user_flags)

> != 1)

> >> +             goto export_file_read_err;

> >> +

> >>       if (fscanf(export_file, "align: %" PRIu32 " ", align) != 1)

> >>               goto export_file_read_err;

> >>

> >> @@ -192,6 +199,8 @@ int main(int argc __attribute__((unused)), char

> *argv[])

> >>       char shm_filename[PATH_MAX];/* shared mem device name, under

> /dev/shm */

> >>       uint64_t len;

> >>       uint32_t flags;

> >> +     uint64_t user_len;

> >> +     uint32_t user_flags;

> >>       uint32_t align;

> >>       int shm_fd;

> >>       test_shared_linux_data_t *addr;

> >> @@ -231,7 +240,8 @@ int main(int argc __attribute__((unused)), char

> *argv[])

> >>

> >>       /* read the shared memory attributes (includes the shm filename):

> */

> >>       if (read_shmem_attribues(odp_app1, ODP_SHM_NAME,

> >> -                              shm_filename, &len, &flags, &align) != 0)

> >> +                              shm_filename, &len, &flags,

> >> +                              &user_len, &user_flags, &align) != 0)

> >>               test_failure(fifo_name, fifo_fd, odp_app1);

> >>

> >>       /* open the shm filename (which is either on /tmp or on hugetlbfs)

> >>

> >

>
Christophe Milard Dec. 27, 2016, 3:51 p.m. UTC | #4
Ok. thx

On 27 December 2016 at 16:21, Maxim Uvarov <maxim.uvarov@linaro.org> wrote:
> I merged it with my review.

>

> Maxim.

>

> On 27 December 2016 at 17:57, Christophe Milard

> <christophe.milard@linaro.org> wrote:

>>

>> It needs review, but yes: it is not driver related, i.e. it is

>> candidate for next.

>>

>> Christophe.

>>

>> On 27 December 2016 at 15:55, Maxim Uvarov <maxim.uvarov@linaro.org>

>> wrote:

>> > Thanks,

>> >

>> > that is what we discussed. I think that can go to 'next' also, right?

>> >

>> > Maxim.

>> >

>> > On 12/21/16 14:11, Christophe Milard wrote:

>> >> The size of the shared memory and its user flag set, as given at

>> >> reserve

>> >> time, are exported and imported so that odp_shm_info() return proper

>> >> values on imported blocks

>> >>

>> >> Signed-off-by: Christophe Milard <christophe.milard@linaro.org>

>> >> ---

>> >>  platform/linux-generic/_ishm.c                     | 38

>> >> +++++++++++++++++-----

>> >>  .../validation/api/shmem/shmem_linux.c             | 14 ++++++--

>> >>  2 files changed, 42 insertions(+), 10 deletions(-)

>> >>

>> >> diff --git a/platform/linux-generic/_ishm.c

>> >> b/platform/linux-generic/_ishm.c

>> >> index 449e357..8b32709 100644

>> >> --- a/platform/linux-generic/_ishm.c

>> >> +++ b/platform/linux-generic/_ishm.c

>> >> @@ -124,7 +124,9 @@

>> >>  #define EXPORT_FILE_LINE3_FMT "file: %s"

>> >>  #define EXPORT_FILE_LINE4_FMT "length: %" PRIu64

>> >>  #define EXPORT_FILE_LINE5_FMT "flags: %" PRIu32

>> >> -#define EXPORT_FILE_LINE6_FMT "align: %" PRIu32

>> >> +#define EXPORT_FILE_LINE6_FMT "user_length: %" PRIu64

>> >> +#define EXPORT_FILE_LINE7_FMT "user_flags: %" PRIu32

>> >> +#define EXPORT_FILE_LINE8_FMT "align: %" PRIu32

>> >>  /*

>> >>   * A fragment describes a piece of the shared virtual address space,

>> >>   * and is allocated only when allocation is done with the

>> >> _ODP_ISHM_SINGLE_VA

>> >> @@ -477,7 +479,11 @@ static int create_file(int block_index,

>> >> huge_flag_t huge, uint64_t len,

>> >>                               new_block->filename);

>> >>                       fprintf(export_file, EXPORT_FILE_LINE4_FMT "\n",

>> >> len);

>> >>                       fprintf(export_file, EXPORT_FILE_LINE5_FMT "\n",

>> >> flags);

>> >> -                     fprintf(export_file, EXPORT_FILE_LINE6_FMT "\n",

>> >> align);

>> >> +                     fprintf(export_file, EXPORT_FILE_LINE6_FMT "\n",

>> >> +                             new_block->user_len);

>> >> +                     fprintf(export_file, EXPORT_FILE_LINE7_FMT "\n",

>> >> +                             new_block->user_flags);

>> >> +                     fprintf(export_file, EXPORT_FILE_LINE8_FMT "\n",

>> >> align);

>> >>

>> >>                       fclose(export_file);

>> >>               }

>> >> @@ -800,6 +806,10 @@ int _odp_ishm_reserve(const char *name, uint64_t

>> >> size, int fd,

>> >>       else

>> >>               new_block->name[0] = 0;

>> >>

>> >> +     /* save user data: */

>> >> +     new_block->user_flags = user_flags;

>> >> +     new_block->user_len = size;

>> >> +

>> >>       /* If a file descriptor is provided, get the real size and map:

>> >> */

>> >>       if (fd >= 0) {

>> >>               fstat(fd, &statbuf);

>> >> @@ -911,9 +921,11 @@ int _odp_ishm_find_exported(const char

>> >> *remote_name, pid_t external_odp_pid,

>> >>       FILE *export_file;

>> >>       uint64_t len;

>> >>       uint32_t flags;

>> >> +     uint64_t user_len;

>> >> +     uint32_t user_flags;

>> >>       uint32_t align;

>> >>       int fd;

>> >> -     int ret;

>> >> +     int block_index;

>> >>

>> >>       /* try to read the block description file: */

>> >>       snprintf(export_filename, ISHM_FILENAME_MAXLEN,

>> >> @@ -943,7 +955,13 @@ int _odp_ishm_find_exported(const char

>> >> *remote_name, pid_t external_odp_pid,

>> >>       if (fscanf(export_file, EXPORT_FILE_LINE5_FMT " ", &flags) != 1)

>> >>               goto error_exp_file;

>> >>

>> >> -     if (fscanf(export_file, EXPORT_FILE_LINE6_FMT " ", &align) != 1)

>> >> +     if (fscanf(export_file, EXPORT_FILE_LINE6_FMT " ", &user_len) !=

>> >> 1)

>> >> +             goto error_exp_file;

>> >> +

>> >> +     if (fscanf(export_file, EXPORT_FILE_LINE7_FMT " ", &user_flags)

>> >> != 1)

>> >> +             goto error_exp_file;

>> >> +

>> >> +     if (fscanf(export_file, EXPORT_FILE_LINE8_FMT " ", &align) != 1)

>> >>               goto error_exp_file;

>> >>

>> >>       fclose(export_file);

>> >> @@ -960,13 +978,17 @@ int _odp_ishm_find_exported(const char

>> >> *remote_name, pid_t external_odp_pid,

>> >>       flags &= ~(uint32_t)_ODP_ISHM_EXPORT;

>> >>

>> >>       /* reserve the memory, providing the opened file descriptor: */

>> >> -     ret = _odp_ishm_reserve(local_name, 0, fd, align, flags, 0);

>> >> -     if (ret < 0) {

>> >> +     block_index = _odp_ishm_reserve(local_name, 0, fd, align, flags,

>> >> 0);

>> >> +     if (block_index < 0) {

>> >>               close(fd);

>> >> -             return ret;

>> >> +             return block_index;

>> >>       }

>> >>

>> >> -     return ret;

>> >> +     /* set inherited info: */

>> >> +     ishm_tbl->block[block_index].user_flags = user_flags;

>> >> +     ishm_tbl->block[block_index].user_len = user_len;

>> >> +

>> >> +     return block_index;

>> >>

>> >>  error_exp_file:

>> >>       fclose(export_file);

>> >> diff --git a/test/linux-generic/validation/api/shmem/shmem_linux.c

>> >> b/test/linux-generic/validation/api/shmem/shmem_linux.c

>> >> index 39473f3..2f4c762 100644

>> >> --- a/test/linux-generic/validation/api/shmem/shmem_linux.c

>> >> +++ b/test/linux-generic/validation/api/shmem/shmem_linux.c

>> >> @@ -102,7 +102,8 @@

>> >>   */

>> >>  static int read_shmem_attribues(uint64_t ext_odp_pid, const char

>> >> *blockname,

>> >>                               char *filename, uint64_t *len,

>> >> -                             uint32_t *flags, uint32_t *align)

>> >> +                             uint32_t *flags, uint64_t *user_len,

>> >> +                             uint32_t *user_flags, uint32_t *align)

>> >>  {

>> >>       char shm_attr_filename[PATH_MAX];

>> >>       FILE *export_file;

>> >> @@ -130,6 +131,12 @@ static int read_shmem_attribues(uint64_t

>> >> ext_odp_pid, const char *blockname,

>> >>       if (fscanf(export_file, "flags: %" PRIu32 " ", flags) != 1)

>> >>               goto export_file_read_err;

>> >>

>> >> +     if (fscanf(export_file, "user_length: %" PRIu64 " ", user_len) !=

>> >> 1)

>> >> +             goto export_file_read_err;

>> >> +

>> >> +     if (fscanf(export_file, "user_flags: %" PRIu32 " ", user_flags)

>> >> != 1)

>> >> +             goto export_file_read_err;

>> >> +

>> >>       if (fscanf(export_file, "align: %" PRIu32 " ", align) != 1)

>> >>               goto export_file_read_err;

>> >>

>> >> @@ -192,6 +199,8 @@ int main(int argc __attribute__((unused)), char

>> >> *argv[])

>> >>       char shm_filename[PATH_MAX];/* shared mem device name, under

>> >> /dev/shm */

>> >>       uint64_t len;

>> >>       uint32_t flags;

>> >> +     uint64_t user_len;

>> >> +     uint32_t user_flags;

>> >>       uint32_t align;

>> >>       int shm_fd;

>> >>       test_shared_linux_data_t *addr;

>> >> @@ -231,7 +240,8 @@ int main(int argc __attribute__((unused)), char

>> >> *argv[])

>> >>

>> >>       /* read the shared memory attributes (includes the shm filename):

>> >> */

>> >>       if (read_shmem_attribues(odp_app1, ODP_SHM_NAME,

>> >> -                              shm_filename, &len, &flags, &align) !=

>> >> 0)

>> >> +                              shm_filename, &len, &flags,

>> >> +                              &user_len, &user_flags, &align) != 0)

>> >>               test_failure(fifo_name, fifo_fd, odp_app1);

>> >>

>> >>       /* open the shm filename (which is either on /tmp or on

>> >> hugetlbfs)

>> >>

>> >

>

>
diff mbox

Patch

diff --git a/platform/linux-generic/_ishm.c b/platform/linux-generic/_ishm.c
index 449e357..8b32709 100644
--- a/platform/linux-generic/_ishm.c
+++ b/platform/linux-generic/_ishm.c
@@ -124,7 +124,9 @@ 
 #define EXPORT_FILE_LINE3_FMT "file: %s"
 #define EXPORT_FILE_LINE4_FMT "length: %" PRIu64
 #define EXPORT_FILE_LINE5_FMT "flags: %" PRIu32
-#define EXPORT_FILE_LINE6_FMT "align: %" PRIu32
+#define EXPORT_FILE_LINE6_FMT "user_length: %" PRIu64
+#define EXPORT_FILE_LINE7_FMT "user_flags: %" PRIu32
+#define EXPORT_FILE_LINE8_FMT "align: %" PRIu32
 /*
  * A fragment describes a piece of the shared virtual address space,
  * and is allocated only when allocation is done with the _ODP_ISHM_SINGLE_VA
@@ -477,7 +479,11 @@  static int create_file(int block_index, huge_flag_t huge, uint64_t len,
 				new_block->filename);
 			fprintf(export_file, EXPORT_FILE_LINE4_FMT "\n", len);
 			fprintf(export_file, EXPORT_FILE_LINE5_FMT "\n", flags);
-			fprintf(export_file, EXPORT_FILE_LINE6_FMT "\n", align);
+			fprintf(export_file, EXPORT_FILE_LINE6_FMT "\n",
+				new_block->user_len);
+			fprintf(export_file, EXPORT_FILE_LINE7_FMT "\n",
+				new_block->user_flags);
+			fprintf(export_file, EXPORT_FILE_LINE8_FMT "\n", align);
 
 			fclose(export_file);
 		}
@@ -800,6 +806,10 @@  int _odp_ishm_reserve(const char *name, uint64_t size, int fd,
 	else
 		new_block->name[0] = 0;
 
+	/* save user data: */
+	new_block->user_flags = user_flags;
+	new_block->user_len = size;
+
 	/* If a file descriptor is provided, get the real size and map: */
 	if (fd >= 0) {
 		fstat(fd, &statbuf);
@@ -911,9 +921,11 @@  int _odp_ishm_find_exported(const char *remote_name, pid_t external_odp_pid,
 	FILE *export_file;
 	uint64_t len;
 	uint32_t flags;
+	uint64_t user_len;
+	uint32_t user_flags;
 	uint32_t align;
 	int fd;
-	int ret;
+	int block_index;
 
 	/* try to read the block description file: */
 	snprintf(export_filename, ISHM_FILENAME_MAXLEN,
@@ -943,7 +955,13 @@  int _odp_ishm_find_exported(const char *remote_name, pid_t external_odp_pid,
 	if (fscanf(export_file, EXPORT_FILE_LINE5_FMT " ", &flags) != 1)
 		goto error_exp_file;
 
-	if (fscanf(export_file, EXPORT_FILE_LINE6_FMT " ", &align) != 1)
+	if (fscanf(export_file, EXPORT_FILE_LINE6_FMT " ", &user_len) != 1)
+		goto error_exp_file;
+
+	if (fscanf(export_file, EXPORT_FILE_LINE7_FMT " ", &user_flags) != 1)
+		goto error_exp_file;
+
+	if (fscanf(export_file, EXPORT_FILE_LINE8_FMT " ", &align) != 1)
 		goto error_exp_file;
 
 	fclose(export_file);
@@ -960,13 +978,17 @@  int _odp_ishm_find_exported(const char *remote_name, pid_t external_odp_pid,
 	flags &= ~(uint32_t)_ODP_ISHM_EXPORT;
 
 	/* reserve the memory, providing the opened file descriptor: */
-	ret = _odp_ishm_reserve(local_name, 0, fd, align, flags, 0);
-	if (ret < 0) {
+	block_index = _odp_ishm_reserve(local_name, 0, fd, align, flags, 0);
+	if (block_index < 0) {
 		close(fd);
-		return ret;
+		return block_index;
 	}
 
-	return ret;
+	/* set inherited info: */
+	ishm_tbl->block[block_index].user_flags = user_flags;
+	ishm_tbl->block[block_index].user_len = user_len;
+
+	return block_index;
 
 error_exp_file:
 	fclose(export_file);
diff --git a/test/linux-generic/validation/api/shmem/shmem_linux.c b/test/linux-generic/validation/api/shmem/shmem_linux.c
index 39473f3..2f4c762 100644
--- a/test/linux-generic/validation/api/shmem/shmem_linux.c
+++ b/test/linux-generic/validation/api/shmem/shmem_linux.c
@@ -102,7 +102,8 @@ 
  */
 static int read_shmem_attribues(uint64_t ext_odp_pid, const char *blockname,
 				char *filename, uint64_t *len,
-				uint32_t *flags, uint32_t *align)
+				uint32_t *flags, uint64_t *user_len,
+				uint32_t *user_flags, uint32_t *align)
 {
 	char shm_attr_filename[PATH_MAX];
 	FILE *export_file;
@@ -130,6 +131,12 @@  static int read_shmem_attribues(uint64_t ext_odp_pid, const char *blockname,
 	if (fscanf(export_file, "flags: %" PRIu32 " ", flags) != 1)
 		goto export_file_read_err;
 
+	if (fscanf(export_file, "user_length: %" PRIu64 " ", user_len) != 1)
+		goto export_file_read_err;
+
+	if (fscanf(export_file, "user_flags: %" PRIu32 " ", user_flags) != 1)
+		goto export_file_read_err;
+
 	if (fscanf(export_file, "align: %" PRIu32 " ", align) != 1)
 		goto export_file_read_err;
 
@@ -192,6 +199,8 @@  int main(int argc __attribute__((unused)), char *argv[])
 	char shm_filename[PATH_MAX];/* shared mem device name, under /dev/shm */
 	uint64_t len;
 	uint32_t flags;
+	uint64_t user_len;
+	uint32_t user_flags;
 	uint32_t align;
 	int shm_fd;
 	test_shared_linux_data_t *addr;
@@ -231,7 +240,8 @@  int main(int argc __attribute__((unused)), char *argv[])
 
 	/* read the shared memory attributes (includes the shm filename): */
 	if (read_shmem_attribues(odp_app1, ODP_SHM_NAME,
-				 shm_filename, &len, &flags, &align) != 0)
+				 shm_filename, &len, &flags,
+				 &user_len, &user_flags, &align) != 0)
 		test_failure(fifo_name, fifo_fd, odp_app1);
 
 	/* open the shm filename (which is either on /tmp or on hugetlbfs)