summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKeith Busch <keith.busch@intel.com>2019-04-18 10:25:56 -0600
committerJens Axboe <axboe@kernel.dk>2019-04-18 10:46:19 -0600
commitff547caad147b437f654881717fedc750c0c9b17 (patch)
treedd2f7cf864ae34fe2add0990f80adfaa44484712
parent96416da576d47c01dd3c9481b03e969908b3ff74 (diff)
fio: Add advise THP option to mmap engine
The Linux specific transparent hugepage memory advisory has potentially significant implications for how the memory management behaves. If the platform supports it, add a new mmap ioengine specific option that advises HUGEPAGE on an mmap'ed range. The option availability is detected during configure. If the option is set, fio can test THP when used with private anonymous memory (i.e. mmap /dev/zero). Signed-off-by: Keith Busch <keith.busch@intel.com> Signed-off-by: Jens Axboe <axboe@kernel.dk>
-rwxr-xr-xconfigure27
-rw-r--r--engines/mmap.c54
-rw-r--r--optgroup.h2
3 files changed, 81 insertions, 2 deletions
diff --git a/configure b/configure
index 6e549cd..3c882f0 100755
--- a/configure
+++ b/configure
@@ -2326,6 +2326,30 @@ if compile_prog "-Wimplicit-fallthrough" "" "-Wimplicit-fallthrough"; then
fi
print_config "-Wimplicit-fallthrough" "$fallthrough"
+##########################################
+# check for MADV_HUGEPAGE support
+if test "$thp" != "yes" ; then
+ thp="no"
+fi
+if test "$esx" != "yes" ; then
+ cat > $TMPC <<EOF
+#include <sys/mman.h>
+int main(void)
+{
+ return madvise(0, 0x1000, MADV_HUGEPAGE);
+}
+EOF
+ if compile_prog "" "" "thp" ; then
+ thp=yes
+ else
+ if test "$thp" = "yes" ; then
+ feature_not_found "Transparent Huge Page" ""
+ fi
+ thp=no
+ fi
+fi
+print_config "MADV_HUGEPAGE" "$thp"
+
#############################################################################
if test "$wordsize" = "64" ; then
@@ -2600,6 +2624,9 @@ fi
if test "$fallthrough" = "yes"; then
CFLAGS="$CFLAGS -Wimplicit-fallthrough"
fi
+if test "$thp" = "yes" ; then
+ output_sym "CONFIG_HAVE_THP"
+fi
echo "LIBS+=$LIBS" >> $config_host_mak
echo "GFIO_LIBS+=$GFIO_LIBS" >> $config_host_mak
diff --git a/engines/mmap.c b/engines/mmap.c
index 308b466..55ba1ab 100644
--- a/engines/mmap.c
+++ b/engines/mmap.c
@@ -11,6 +11,7 @@
#include <sys/mman.h>
#include "../fio.h"
+#include "../optgroup.h"
#include "../verify.h"
/*
@@ -26,11 +27,40 @@ struct fio_mmap_data {
off_t mmap_off;
};
+#ifdef CONFIG_HAVE_THP
+struct mmap_options {
+ void *pad;
+ unsigned int thp;
+};
+
+static struct fio_option options[] = {
+ {
+ .name = "thp",
+ .lname = "Transparent Huge Pages",
+ .type = FIO_OPT_INT,
+ .off1 = offsetof(struct mmap_options, thp),
+ .help = "Memory Advise Huge Page",
+ .category = FIO_OPT_C_ENGINE,
+ .group = FIO_OPT_G_MMAP,
+ },
+ {
+ .name = NULL,
+ },
+};
+#endif
+
static bool fio_madvise_file(struct thread_data *td, struct fio_file *f,
size_t length)
{
struct fio_mmap_data *fmd = FILE_ENG_DATA(f);
+#ifdef CONFIG_HAVE_THP
+ struct mmap_options *o = td->eo;
+
+ /* Ignore errors on this optional advisory */
+ if (o->thp)
+ madvise(fmd->mmap_ptr, length, MADV_HUGEPAGE);
+#endif
if (!td->o.fadvise_hint)
return true;
@@ -50,11 +80,27 @@ static bool fio_madvise_file(struct thread_data *td, struct fio_file *f,
return true;
}
+#ifdef CONFIG_HAVE_THP
+static int fio_mmap_get_shared(struct thread_data *td)
+{
+ struct mmap_options *o = td->eo;
+
+ if (o->thp)
+ return MAP_PRIVATE;
+ return MAP_SHARED;
+}
+#else
+static int fio_mmap_get_shared(struct thread_data *td)
+{
+ return MAP_SHARED;
+}
+#endif
+
static int fio_mmap_file(struct thread_data *td, struct fio_file *f,
size_t length, off_t off)
{
struct fio_mmap_data *fmd = FILE_ENG_DATA(f);
- int flags = 0;
+ int flags = 0, shared = fio_mmap_get_shared(td);
if (td_rw(td) && !td->o.verify_only)
flags = PROT_READ | PROT_WRITE;
@@ -66,7 +112,7 @@ static int fio_mmap_file(struct thread_data *td, struct fio_file *f,
} else
flags = PROT_READ;
- fmd->mmap_ptr = mmap(NULL, length, flags, MAP_SHARED, f->fd, off);
+ fmd->mmap_ptr = mmap(NULL, length, flags, shared, f->fd, off);
if (fmd->mmap_ptr == MAP_FAILED) {
fmd->mmap_ptr = NULL;
td_verror(td, errno, "mmap");
@@ -275,6 +321,10 @@ static struct ioengine_ops ioengine = {
.close_file = fio_mmapio_close_file,
.get_file_size = generic_get_file_size,
.flags = FIO_SYNCIO | FIO_NOEXTEND,
+#ifdef CONFIG_HAVE_THP
+ .options = options,
+ .option_struct_size = sizeof(struct mmap_options),
+#endif
};
static void fio_init fio_mmapio_register(void)
diff --git a/optgroup.h b/optgroup.h
index adf4d09..bf1bb03 100644
--- a/optgroup.h
+++ b/optgroup.h
@@ -61,6 +61,7 @@ enum opt_category_group {
__FIO_OPT_G_MTD,
__FIO_OPT_G_HDFS,
__FIO_OPT_G_SG,
+ __FIO_OPT_G_MMAP,
__FIO_OPT_G_NR,
FIO_OPT_G_RATE = (1ULL << __FIO_OPT_G_RATE),
@@ -97,6 +98,7 @@ enum opt_category_group {
FIO_OPT_G_MTD = (1ULL << __FIO_OPT_G_MTD),
FIO_OPT_G_HDFS = (1ULL << __FIO_OPT_G_HDFS),
FIO_OPT_G_SG = (1ULL << __FIO_OPT_G_SG),
+ FIO_OPT_G_MMAP = (1ULL << __FIO_OPT_G_MMAP),
FIO_OPT_G_INVALID = (1ULL << __FIO_OPT_G_NR),
};