| /***************************************************************************** |
| * |
| * Copyright (C) 2010 Lawrence Livermore National Security, LLC. |
| * Produced at Lawrence Livermore National Laboratory. |
| * Written by Morris Jette <jette1@llnl.gov>. |
| * |
| * UCRL-CODE-235358 |
| * |
| * This file is part of chaos-spankings, a set of spank plugins for SLURM. |
| * |
| * This is free software; you can redistribute it and/or modify it |
| * under the terms of the GNU General Public License as published by |
| * the Free Software Foundation; either version 2 of the License, or |
| * (at your option) any later version. |
| * |
| * This is distributed in the hope that it will be useful, but WITHOUT |
| * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or |
| * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License |
| * for more details. |
| * |
| * You should have received a copy of the GNU General Public License |
| * along with this program. If not, see <http://www.gnu.org/licenses/>. |
| **************************************************************************** |
| * Two options are added for salloc, sbatch, and srun: --cache-io and |
| * --direct-io. These options will set a SPANK_DIRECT_IO environment variable |
| * for the job's Prolog and Epilog scripts. If neither option (or their |
| * corresponding environment variables) are set, then SPANK_DIRECT_IO |
| * will not exist. NOTE: Command line options take precidence over the |
| * environment variables. |
| * |
| * --cache-io or SLURM_CACHE_IO env var will set SPANK_DIRECT_IO=0 |
| * --direct-io or SLURM_DIRECT_IO env var will set SPANK_DIRECT_IO=1 |
| ****************************************************************************/ |
| |
| #include <stdlib.h> |
| #include <string.h> |
| #include <stdio.h> |
| |
| #include <slurm/spank.h> |
| |
| /* |
| * All spank plugins must define this macro for the SLURM plugin loader. |
| */ |
| SPANK_PLUGIN(direct-io, 1) |
| |
| #define CACHE_IO 0x1 |
| #define DIRECT_IO 0x2 |
| |
| static int io_style = 0; |
| |
| static int _opt_process (int val, const char *optarg, int remote); |
| |
| /* |
| * Provide a --cache-io/--direct-io option for srun: |
| */ |
| struct spank_option spank_option_array[] = |
| { |
| { "cache-io", NULL, "Cache I/O", |
| 0, CACHE_IO, (spank_opt_cb_f) _opt_process }, |
| { "direct-io", NULL, "Write I/O directly to disk, without caching", |
| 0, DIRECT_IO, (spank_opt_cb_f) _opt_process }, |
| SPANK_OPTIONS_TABLE_END |
| }; |
| |
| int slurm_spank_init(spank_t sp, int ac, char **av) |
| { |
| int i, j, rc = ESPANK_SUCCESS; |
| |
| for (i=0; spank_option_array[i].name; i++) { |
| j = spank_option_register(sp, &spank_option_array[i]); |
| if (j != ESPANK_SUCCESS) { |
| slurm_error("Could not register Spank option %s", |
| spank_option_array[i].name); |
| rc = j; |
| } |
| } |
| |
| return rc; |
| } |
| |
| /* |
| * Called from both srun and slurmd. |
| */ |
| int slurm_spank_init_post_opt (spank_t sp, int ac, char **av) |
| { |
| int rc = ESPANK_SUCCESS; |
| |
| if (spank_remote (sp)) |
| return (0); |
| |
| if (io_style == CACHE_IO) { |
| slurm_debug("cache_io option"); |
| rc = spank_set_job_env("O_DIRECT", "0", 1); |
| } else if (io_style == DIRECT_IO) { |
| slurm_debug("direct_io option"); |
| rc = spank_set_job_env("O_DIRECT", "1", 1); |
| } else if (getenv("SLURM_CACHE_IO")) { |
| slurm_debug("cache_io env var"); |
| rc = spank_set_job_env("O_DIRECT", "0", 1); |
| } else if (getenv("SLURM_DIRECT_IO")) { |
| slurm_debug("direct_io env var"); |
| rc = spank_set_job_env("O_DIRECT", "1", 1); |
| } |
| if (rc != ESPANK_SUCCESS) |
| slurm_error("spank_setjob_env: %s", spank_strerror(rc)); |
| |
| return (0); |
| } |
| |
| static int _opt_process (int val, const char *optarg, int remote) |
| { |
| io_style = val; |
| return (0); |
| } |