]> git.droids-corp.org - dpdk.git/commitdiff
eal: add option to delete hugepage backing files
authorShesha Sreenivasamurthy <shesha@cisco.com>
Wed, 28 Oct 2015 22:04:25 +0000 (15:04 -0700)
committerThomas Monjalon <thomas.monjalon@6wind.com>
Wed, 4 Nov 2015 01:00:28 +0000 (02:00 +0100)
When an application using huge-pages crash or exists, the hugetlbfs
backing files are not cleaned up. This is a patch to clean those files.
There are multi-process DPDK applications that may be benefited by those
backing files. Therefore, I have made that configurable so that the
application that does not need those backing files can remove them, thus
not changing the current default behavior. The application itself can
clean it up, however the rationale behind DPDK cleaning it up is, DPDK
created it and therefore, it is better it unlinks it.

Signed-off-by: Shesha Sreenivasamurthy <shesha@cisco.com>
Acked-by: Sergio Gonzalez Monroy <sergio.gonzalez.monroy@intel.com>
lib/librte_eal/common/eal_common_options.c
lib/librte_eal/common/eal_internal_cfg.h
lib/librte_eal/common/eal_options.h
lib/librte_eal/linuxapp/eal/eal_memory.c

index c614477bc1d689cec3595ed349c9d530e3f99067..79db608bb4552689b260ef2854d8a1b7c52a9916 100644 (file)
@@ -74,6 +74,7 @@ eal_long_options[] = {
        {OPT_FILE_PREFIX,       1, NULL, OPT_FILE_PREFIX_NUM      },
        {OPT_HELP,              0, NULL, OPT_HELP_NUM             },
        {OPT_HUGE_DIR,          1, NULL, OPT_HUGE_DIR_NUM         },
+       {OPT_HUGE_UNLINK,       0, NULL, OPT_HUGE_UNLINK_NUM      },
        {OPT_LCORES,            1, NULL, OPT_LCORES_NUM           },
        {OPT_LOG_LEVEL,         1, NULL, OPT_LOG_LEVEL_NUM        },
        {OPT_MASTER_LCORE,      1, NULL, OPT_MASTER_LCORE_NUM     },
@@ -714,6 +715,10 @@ eal_parse_common_option(int opt, const char *optarg,
                break;
 
        /* long options */
+       case OPT_HUGE_UNLINK_NUM:
+               conf->hugepage_unlink = 1;
+               break;
+
        case OPT_NO_HUGE_NUM:
                conf->no_hugetlbfs = 1;
                break;
@@ -841,6 +846,12 @@ eal_check_common_options(struct internal_config *internal_cfg)
                return -1;
        }
 
+       if (internal_cfg->no_hugetlbfs && internal_cfg->hugepage_unlink) {
+               RTE_LOG(ERR, EAL, "Option --"OPT_HUGE_UNLINK" cannot "
+                       "be specified together with --"OPT_NO_HUGE"\n");
+               return -1;
+       }
+
        if (rte_eal_devargs_type_count(RTE_DEVTYPE_WHITELISTED_PCI) != 0 &&
                rte_eal_devargs_type_count(RTE_DEVTYPE_BLACKLISTED_PCI) != 0) {
                RTE_LOG(ERR, EAL, "Options blacklist (-b) and whitelist (-w) "
@@ -890,6 +901,7 @@ eal_common_usage(void)
               "  -v                  Display version information on startup\n"
               "  -h, --help          This help\n"
               "\nEAL options for DEBUG use only:\n"
+              "  --"OPT_HUGE_UNLINK"       Unlink hugepage files after init\n"
               "  --"OPT_NO_HUGE"           Use malloc instead of hugetlbfs\n"
               "  --"OPT_NO_PCI"            Disable PCI\n"
               "  --"OPT_NO_HPET"           Disable HPET\n"
index e2ecb0d0f09caa08955f61181bf5427eaf6cc517..6d071c771e861b4aa78929164023ef0bac55735c 100644 (file)
@@ -64,6 +64,7 @@ struct internal_config {
        volatile unsigned force_nchannel; /**< force number of channels */
        volatile unsigned force_nrank;    /**< force number of ranks */
        volatile unsigned no_hugetlbfs;   /**< true to disable hugetlbfs */
+       unsigned hugepage_unlink;         /** < true to unlink backing files */
        volatile unsigned xen_dom0_support; /**< support app running on Xen Dom0*/
        volatile unsigned no_pci;         /**< true to disable PCI */
        volatile unsigned no_hpet;        /**< true to disable HPET */
index f6714d90c36364f05e9c7f339a888759307aaa8a..4245fd539847b8d6a11a303c61b43d987de0dc29 100644 (file)
@@ -53,6 +53,8 @@ enum {
        OPT_FILE_PREFIX_NUM,
 #define OPT_HUGE_DIR          "huge-dir"
        OPT_HUGE_DIR_NUM,
+#define OPT_HUGE_UNLINK       "huge-unlink"
+       OPT_HUGE_UNLINK_NUM,
 #define OPT_LCORES            "lcores"
        OPT_LCORES_NUM,
 #define OPT_LOG_LEVEL         "log-level"
index ac2745ec6b6e28b141d0cf804591cdc00a6473ba..657d19f12c5cc5b386b39eb3d218861aafaa1afc 100644 (file)
@@ -786,6 +786,30 @@ copy_hugepages_to_shared_mem(struct hugepage_file * dst, int dest_size,
        return 0;
 }
 
+static int
+unlink_hugepage_files(struct hugepage_file *hugepg_tbl,
+               unsigned num_hp_info)
+{
+       unsigned socket, size;
+       int page, nrpages = 0;
+
+       /* get total number of hugepages */
+       for (size = 0; size < num_hp_info; size++)
+               for (socket = 0; socket < RTE_MAX_NUMA_NODES; socket++)
+                       nrpages +=
+                       internal_config.hugepage_info[size].num_pages[socket];
+
+       for (page = 0; page < nrpages; page++) {
+               struct hugepage_file *hp = &hugepg_tbl[page];
+
+               if (hp->final_va != NULL && unlink(hp->filepath)) {
+                       RTE_LOG(WARNING, EAL, "%s(): Removing %s failed: %s\n",
+                               __func__, hp->filepath, strerror(errno));
+               }
+       }
+       return 0;
+}
+
 /*
  * unmaps hugepages that are not going to be used. since we originally allocate
  * ALL hugepages (not just those we need), additional unmapping needs to be done.
@@ -1289,6 +1313,13 @@ rte_eal_hugepage_init(void)
                goto fail;
        }
 
+       /* free the hugepage backing files */
+       if (internal_config.hugepage_unlink &&
+               unlink_hugepage_files(tmp_hp, internal_config.num_hugepage_sizes) < 0) {
+               RTE_LOG(ERR, EAL, "Unlinking hugepage files failed!\n");
+               goto fail;
+       }
+
        /* free the temporary hugepage table */
        free(tmp_hp);
        tmp_hp = NULL;