Ping.
I think this patch would ease cleaning up the Huge pages. If reviewed, it
is candidate for "next" and master.
Christophe.

On 6 December 2016 at 18:25, Christophe Milard <christophe.mil...@linaro.org
> wrote:

> _ishm now unlinks the created files as soon as possible, hence reducing
> the chance to see left-overs, if ODP terminates abnormaly.
> This does not provide 100% guaranty: if we are unlucky enough,
> ODP may be killed between open() and unlink().
> Also this method excludes exported files (flag _ODP_ISHM_EXPORT),
> whose names shall be seen in the file system.
>
> Signed-off-by: Christophe Milard <christophe.mil...@linaro.org>
> ---
>
>  Since V1:
>         -flag size reduced to 1 bit (maxim)
>         -typo fix (Maxim)
>
>  platform/linux-generic/_ishm.c | 14 ++++++++++++--
>  1 file changed, 12 insertions(+), 2 deletions(-)
>
> diff --git a/platform/linux-generic/_ishm.c b/platform/linux-generic/_
> ishm.c
> index 449e357..efdb7bc 100644
> --- a/platform/linux-generic/_ishm.c
> +++ b/platform/linux-generic/_ishm.c
> @@ -71,6 +71,7 @@
>  #include <sys/types.h>
>  #include <inttypes.h>
>  #include <sys/wait.h>
> +#include <libgen.h>
>
>  /*
>   * Maximum number of internal shared memory blocks.
> @@ -159,6 +160,7 @@ typedef struct ishm_block {
>         char exptname[ISHM_FILENAME_MAXLEN]; /* name of the export file
>    */
>         uint32_t user_flags;     /* any flags the user want to remember.
>   */
>         uint32_t flags;          /* block creation flags.
>  */
> +       uint32_t external_fd:1;  /* block FD was externally provided
>   */
>         uint64_t user_len;       /* length, as requested at reserve time.
>  */
>         void *start;             /* only valid if _ODP_ISHM_SINGLE_VA is
> set*/
>         uint64_t len;            /* length. multiple of page size. 0 if
> free*/
> @@ -452,15 +454,17 @@ static int create_file(int block_index, huge_flag_t
> huge, uint64_t len,
>                 ODP_ERR("ftruncate failed: fd=%d, err=%s.\n",
>                         fd, strerror(errno));
>                 close(fd);
> +               unlink(filename);
>                 return -1;
>         }
>
> -       strncpy(new_block->filename, filename, ISHM_FILENAME_MAXLEN - 1);
>
>         /* if _ODP_ISHM_EXPORT is set, create a description file for
>          * external ref:
>          */
>         if (flags & _ODP_ISHM_EXPORT) {
> +               strncpy(new_block->filename, filename,
> +                       ISHM_FILENAME_MAXLEN - 1);
>                 snprintf(new_block->exptname, ISHM_FILENAME_MAXLEN,
>                          ISHM_EXPTNAME_FORMAT,
>                          odp_global_data.main_pid,
> @@ -483,6 +487,8 @@ static int create_file(int block_index, huge_flag_t
> huge, uint64_t len,
>                 }
>         } else {
>                 new_block->exptname[0] = 0;
> +               /* remove the file from the filesystem, keeping its fd
> open */
> +               unlink(filename);
>         }
>
>         return fd;
> @@ -814,6 +820,9 @@ int _odp_ishm_reserve(const char *name, uint64_t size,
> int fd,
>                         return -1;
>                 }
>                 new_block->huge = EXTERNAL;
> +               new_block->external_fd = 1;
> +       } else {
> +               new_block->external_fd = 0;
>         }
>
>         /* Otherwise, Try first huge pages when possible and needed: */
> @@ -865,8 +874,9 @@ int _odp_ishm_reserve(const char *name, uint64_t size,
> int fd,
>
>         /* if neither huge pages or normal pages works, we cannot proceed:
> */
>         if ((fd < 0) || (addr == NULL) || (len == 0)) {
> -               if ((new_block->filename[0]) && (fd >= 0))
> +               if ((!new_block->external_fd) && (fd >= 0))
>                         close(fd);
> +               delete_file(new_block);
>                 odp_spinlock_unlock(&ishm_tbl->lock);
>                 ODP_ERR("_ishm_reserve failed.\n");
>                 return -1;
> --
> 2.7.4
>
>

Reply via email to