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.

I use that flags in IPC. I do look up for queue by it's name. It looks like subject for other patch.

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


I agree with Petri here that no need to mix names and odp and non odp process. At least for now when we do not have real test case for that. In general what is reasonable it have some magic + memory size structure for each shm_opened memory block.

I upped this patch to the latest ODP (added zeros to crypto app). And ready to merge it. If no objections.

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