On 09/08/2014 09:30 AM, Bala Manoharan wrote:
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.

Yes. And this is process odp_shm_reserve(). You can take a look how I do it for IPC in ipc patches. You need to call odp_shm_reserve() in 2 process with the same "name" argument.


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


For IPC in my IPC patches. I do transfer odp_buffer_t buffers. Standard odp_queue_create()/odp_queue_lookup() is used to create queues. Then standard queue_enqueue/queue_dequeue is used to queue packet to IPC queue.

But this patch is related to shared memory between processes. And additional flags to odp_shm_reserve. It's not about IPC details. You can comment about IPC in "[PATCHv5 0/2] odp ipc implementation" thread.

Thanks,
Maxim.


Regards,
Bala


On 7 September 2014 02:14, Maxim Uvarov <[email protected] <mailto:[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]
        <mailto:[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