]> Gitweb @ Texas Instruments - Open Source Git Repositories - git.TI.com/gitweb - processor-sdk/libmetal.git/commitdiff
Allow to use shared memory without root permission
authorWendy Liang <jliang@xilinx.com>
Thu, 29 Sep 2016 18:33:11 +0000 (11:33 -0700)
committerWendy Liang <jliang@xilinx.com>
Thu, 13 Oct 2016 23:20:53 +0000 (16:20 -0700)
Without root permission, we cannot get the physical address
from the virtual address from shared memory, and cannot
lock unlimited size of shared memory. However, for communication
between processes, we don't need to know the physical address
nor lock the shared memory.

Signed-off-by: Wendy Liang <jliang@xilinx.com>
lib/system/linux/init.c
lib/system/linux/shmem.c

index 0cd8cc11d6af2dbcb3d7d207087a9efe66b570e0..9b0543511a5aef61ba62d164f6a04f2c1d9dd819 100644 (file)
@@ -104,15 +104,18 @@ static int metal_init_page_sizes(void)
                                    MAP_HUGETLB);
        }
 #else
-       /* System supports multiple huge page sizes. */
-       count = gethugepagesizes(sizes, max_sizes);
-       for (i = 0; i < count; i++) {
-               int shift = metal_log2(sizes[i]);
-               if ((shift & MAP_HUGE_MASK) != shift)
-                       continue;
-               metal_add_page_size(hugetlbfs_find_path_for_size(sizes[i]),
-                                   shift, (MAP_HUGETLB |
-                                           (shift << MAP_HUGE_SHIFT)));
+       if (gethugepagesize() >= 0) {
+               /* System supports multiple huge page sizes. */
+               count = gethugepagesizes(sizes, max_sizes);
+               for (i = 0; i < count; i++) {
+                       int shift = metal_log2(sizes[i]);
+                       if ((shift & MAP_HUGE_MASK) != shift)
+                               continue;
+                       metal_add_page_size(
+                               hugetlbfs_find_path_for_size(sizes[i]),
+                               shift, (MAP_HUGETLB |
+                               (shift << MAP_HUGE_SHIFT)));
+               }
        }
 #endif
 
index c98b5545c4069616ceb11a5654f51d52458b4e86..2b78ed4e04ae7e8aab691e870e661275a10a321d 100644 (file)
@@ -74,10 +74,8 @@ static int metal_shmem_try_map(struct metal_page_size *ps, int fd, size_t size,
 
        error = metal_mlock(mem, size);
        if (error) {
-               metal_log(LOG_ERROR, "failed to mlock shmem - %s\n",
+               metal_log(LOG_WARNING, "failed to mlock shmem - %s\n",
                          strerror(-error));
-               metal_unmap(mem, size);
-               return error;
        }
 
        phys_size = sizeof(*phys) * pages;
@@ -94,14 +92,21 @@ static int metal_shmem_try_map(struct metal_page_size *ps, int fd, size_t size,
                return -ENOMEM;
        }
 
-       for (virt = mem, page = 0; page < pages; page++) {
-               size_t offset = page * ps->page_size;
-               error = metal_virt2phys(virt + offset, &phys[page]);
-               if (error < 0)
-                       phys[page] = METAL_BAD_OFFSET;
+       if (_metal.pagemap_fd < 0) {
+               phys[0] = 0;
+               metal_log(LOG_WARNING,
+               "shmem - failed to get va2pa mapping. use offset as pa.\n");
+               metal_io_init(io, mem, phys, size, -1, 0, &metal_shmem_io_ops);
+       } else {
+               for (virt = mem, page = 0; page < pages; page++) {
+                       size_t offset = page * ps->page_size;
+                       error = metal_virt2phys(virt + offset, &phys[page]);
+                       if (error < 0)
+                               phys[page] = METAL_BAD_OFFSET;
+               }
+               metal_io_init(io, mem, phys, size, ps->page_shift, 0,
+                       &metal_shmem_io_ops);
        }
-
-       metal_io_init(io, mem, phys, size, ps->page_shift, 0, &metal_shmem_io_ops);
        *result = io;
 
        return 0;
@@ -118,8 +123,10 @@ int metal_shmem_open(const char *name, size_t size,
                return error;
 
        error = metal_open(name, 1);
-       if (error < 0)
+       if (error < 0) {
+               metal_log(LOG_ERROR, "Failed to open shmem file :%s\n", name);
                return error;
+       }
        fd = error;
 
        /* Iterate through page sizes in decreasing order. */