Hi,

A Few queries from my side,

* ODP_SHM_PROC: In this case we need a mechanism to allow ODP process to be
able to do a lookup of shared memory created by process outside of ODP.
Current odp_shm_lookup only checks shm created by ODP process.

* one use case which I can think of for ODP_SHM_PROC is for IPC across ODP
and non-ODP process. if that is the case then we need to define a ODP
message structure which will be inherited by all process which wants to
communicate with ODP process.


Regards,
Bala


On 7 September 2014 02:14, Maxim Uvarov <[email protected]> wrote:

> Taras, Venky, Bala, Alex are you ok with that change?
>
> Maxim.
>
>
> On 09/05/2014 03:29 PM, Petri Savolainen wrote:
>
>> Add flags parameter to reserve call.
>> * SW_ONLY: optimize memory usage when HW accelerators are not
>>    involved.
>> * PROC: for communication with external (non-ODP) processes in the
>>    system
>>
>> Signed-off-by: Petri Savolainen <[email protected]>
>> ---
>>   .../linux-generic/include/api/odp_shared_memory.h  | 15 +++++++-
>>   platform/linux-generic/odp_shared_memory.c         | 45
>> +++++++++++++++++-----
>>   platform/linux-keystone2/odp_shared_memory.c       |  5 ++-
>>   3 files changed, 53 insertions(+), 12 deletions(-)
>>
>> diff --git a/platform/linux-generic/include/api/odp_shared_memory.h
>> b/platform/linux-generic/include/api/odp_shared_memory.h
>> index 8ac8847..7d9fedd 100644
>> --- a/platform/linux-generic/include/api/odp_shared_memory.h
>> +++ b/platform/linux-generic/include/api/odp_shared_memory.h
>> @@ -21,9 +21,18 @@ extern "C" {
>>     #include <odp_std_types.h>
>>   -/** Maximum shared memory block name lenght in chars */
>> +/** Maximum shared memory block name length in chars */
>>   #define ODP_SHM_NAME_LEN 32
>>   +/*
>> + * Shared memory flags
>> + */
>> +
>> +/* Share level */
>> +#define ODP_SHM_SW_ONLY 0x1 /**< Application SW only, no HW access */
>> +#define ODP_SHM_PROC    0x2 /**< Share with external processes */
>> +
>> +
>>     /**
>>    * Reserve a block of shared memory
>> @@ -31,10 +40,12 @@ extern "C" {
>>    * @param name   Name of the block (maximum ODP_SHM_NAME_LEN - 1 chars)
>>    * @param size   Block size in bytes
>>    * @param align  Block alignment in bytes
>> + * @param flags  Shared mem parameter flags (ODP_SHM_*). Default value
>> is 0.
>>    *
>>    * @return Pointer to the reserved block, or NULL
>>    */
>> -void *odp_shm_reserve(const char *name, uint64_t size, uint64_t align);
>> +void *odp_shm_reserve(const char *name, uint64_t size, uint64_t align,
>> +                     uint32_t flags);
>>     /**
>>    * Lookup for a block of shared memory
>> diff --git a/platform/linux-generic/odp_shared_memory.c
>> b/platform/linux-generic/odp_shared_memory.c
>> index 784f42b..3d1e12a 100644
>> --- a/platform/linux-generic/odp_shared_memory.c
>> +++ b/platform/linux-generic/odp_shared_memory.c
>> @@ -11,6 +11,7 @@
>>   #include <odp_system_info.h>
>>   #include <odp_debug.h>
>>   +#include <unistd.h>
>>   #include <sys/mman.h>
>>   #include <asm/mman.h>
>>   #include <fcntl.h>
>> @@ -44,8 +45,6 @@ typedef struct {
>>   #define MAP_ANONYMOUS MAP_ANON
>>   #endif
>>   -#define SHM_FLAGS (MAP_SHARED | MAP_ANONYMOUS)
>> -
>>     /* Global shared memory table */
>>   static odp_shm_table_t *odp_shm_tbl;
>> @@ -60,7 +59,7 @@ int odp_shm_init_global(void)
>>   #endif
>>         addr = mmap(NULL, sizeof(odp_shm_table_t),
>> -                   PROT_READ | PROT_WRITE, SHM_FLAGS, -1, 0);
>> +                   PROT_READ | PROT_WRITE, MAP_SHARED | MAP_ANONYMOUS,
>> -1, 0);
>>         if (addr == MAP_FAILED)
>>                 return -1;
>> @@ -95,11 +94,17 @@ static int find_block(const char *name)
>>   }
>>     -void *odp_shm_reserve(const char *name, uint64_t size, uint64_t
>> align)
>> +void *odp_shm_reserve(const char *name, uint64_t size, uint64_t align,
>> +                     uint32_t flags)
>>   {
>>         int i;
>>         odp_shm_block_t *block;
>>         void *addr;
>> +       int fd = -1;
>> +       int map_flag = MAP_SHARED;
>> +       /* If already exists: O_EXCL: error, O_TRUNC: truncate to zero */
>> +       int oflag = O_RDWR | O_CREAT | O_TRUNC;
>> +       uint64_t alloc_size = size + align;
>>   #ifdef MAP_HUGETLB
>>         uint64_t huge_sz, page_sz;
>>   @@ -107,11 +112,31 @@ void *odp_shm_reserve(const char *name, uint64_t
>> size, uint64_t align)
>>         page_sz = odp_sys_page_size();
>>   #endif
>>   +     if (flags & ODP_SHM_PROC) {
>> +               /* Creates a file to /dev/shm */
>> +               fd = shm_open(name, oflag,
>> +                             S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH);
>> +
>> +               if (fd == -1) {
>> +                       ODP_DBG("odp_shm_reserve: shm_open failed\n");
>> +                       return NULL;
>> +               }
>> +
>> +               if (ftruncate(fd, alloc_size) == -1) {
>> +                       ODP_DBG("odp_shm_reserve: ftruncate failed\n");
>> +                       return NULL;
>> +               }
>> +
>> +       } else {
>> +               map_flag |= MAP_ANONYMOUS;
>> +       }
>> +
>>         odp_spinlock_lock(&odp_shm_tbl->lock);
>>         if (find_block(name) >= 0) {
>>                 /* Found a block with the same name */
>>                 odp_spinlock_unlock(&odp_shm_tbl->lock);
>> +               ODP_DBG("odp_shm_reserve: name already used\n");
>>                 return NULL;
>>         }
>>   @@ -125,6 +150,7 @@ void *odp_shm_reserve(const char *name, uint64_t
>> size, uint64_t align)
>>         if (i > ODP_SHM_NUM_BLOCKS - 1) {
>>                 /* Table full */
>>                 odp_spinlock_unlock(&odp_shm_tbl->lock);
>> +               ODP_DBG("odp_shm_reserve: no more blocks\n");
>>                 return NULL;
>>         }
>>   @@ -135,16 +161,16 @@ void *odp_shm_reserve(const char *name, uint64_t
>> size, uint64_t align)
>>     #ifdef MAP_HUGETLB
>>         /* Try first huge pages */
>> -       if (huge_sz && (size + align) > page_sz) {
>> -               addr = mmap(NULL, size + align, PROT_READ | PROT_WRITE,
>> -                           SHM_FLAGS | MAP_HUGETLB, -1, 0);
>> +       if (huge_sz && alloc_size > page_sz) {
>> +               addr = mmap(NULL, alloc_size, PROT_READ | PROT_WRITE,
>> +                           map_flag | MAP_HUGETLB, fd, 0);
>>         }
>>   #endif
>>         /* Use normal pages for small or failed huge page allocations */
>>         if (addr == MAP_FAILED) {
>> -               addr = mmap(NULL, size + align, PROT_READ | PROT_WRITE,
>> -                           SHM_FLAGS, -1, 0);
>> +               addr = mmap(NULL, alloc_size, PROT_READ | PROT_WRITE,
>> +                           map_flag, fd, 0);
>>         } else {
>>                 block->huge = 1;
>> @@ -153,6 +179,7 @@ void *odp_shm_reserve(const char *name, uint64_t
>> size, uint64_t align)
>>         if (addr == MAP_FAILED) {
>>                 /* Alloc failed */
>>                 odp_spinlock_unlock(&odp_shm_tbl->lock);
>> +               ODP_DBG("odp_shm_reserve: mmap failed\n");
>>                 return NULL;
>>         }
>>   diff --git a/platform/linux-keystone2/odp_shared_memory.c
>> b/platform/linux-keystone2/odp_shared_memory.c
>> index e595111..69ac34e 100644
>> --- a/platform/linux-keystone2/odp_shared_memory.c
>> +++ b/platform/linux-keystone2/odp_shared_memory.c
>> @@ -208,8 +208,11 @@ void *_odp_shm_reserve(const char *name, uint64_t
>> size, uint64_t align,
>>         return block->addr;
>>   }
>>   -void *odp_shm_reserve(const char *name, uint64_t size, uint64_t align)
>> +void *odp_shm_reserve(const char *name, uint64_t size, uint64_t align,
>> +                     uint32_t flags)
>>   {
>> +       (void)flags;
>> +
>>         return _odp_shm_reserve(name, size, align, ODP_SHM_CMA);
>>   }
>>
>>
>
>
_______________________________________________
lng-odp mailing list
[email protected]
http://lists.linaro.org/mailman/listinfo/lng-odp

Reply via email to