commit:     b9b15620c7b62627e913623ce2a0fc84a17881a9
Author:     Michał Górny <mgorny <AT> gentoo <DOT> org>
AuthorDate: Thu Dec 25 16:34:23 2025 +0000
Commit:     Michał Górny <mgorny <AT> gentoo <DOT> org>
CommitDate: Thu Dec 25 16:34:23 2025 +0000
URL:        https://gitweb.gentoo.org/proj/steve.git/commit/?id=b9b15620

Support adjusting min-memory-avail via stevie

Signed-off-by: Michał Górny <mgorny <AT> gentoo.org>

 src/steve.cxx  | 24 +++++++++++++++++-------
 src/steve.h    |  3 +++
 src/stevie.cxx | 18 +++++++++++++++++-
 3 files changed, 37 insertions(+), 8 deletions(-)

diff --git a/src/steve.cxx b/src/steve.cxx
index b357ba0..952f72e 100644
--- a/src/steve.cxx
+++ b/src/steve.cxx
@@ -843,6 +843,10 @@ static void steve_ioctl(
                        val = state->min_jobs;
                        fuse_reply_ioctl(req, 0, &val, sizeof(val));
                        break;
+               case STEVE_IOC_GET_MIN_MEMORY_AVAIL:
+                       val = state->min_memory_avail;
+                       fuse_reply_ioctl(req, 0, &val, sizeof(val));
+                       break;
                case STEVE_IOC_GET_LOAD_RECHECK_TIMEOUT:
                        dval = state->recheck_timeout.tv_sec + (
                                state->recheck_timeout.tv_usec / 1000000.
@@ -879,6 +883,12 @@ static void steve_ioctl(
                        fuse_reply_ioctl(req, 0, nullptr, 0);
                        steve_wake_waiters(state);
                        break;
+               case STEVE_IOC_SET_MIN_MEMORY_AVAIL:
+                       state->min_memory_avail = val;
+                       std::print(stderr, "{} set min. available memory to {} 
MiB\n", steve_process_id(fi->fh, process), state->min_memory_avail);
+                       fuse_reply_ioctl(req, 0, nullptr, 0);
+                       steve_wake_waiters(state);
+                       break;
                case STEVE_IOC_SET_PER_PROCESS_LIMIT:
                        state->per_process_limit = val;
                        std::print(stderr, "{} set per-process limit to {}\n", 
steve_process_id(fi->fh, process), state->per_process_limit);
@@ -1025,9 +1035,9 @@ static constexpr char steve_usage[] =
 "    --load-recheck-timeout=TIMEOUT, -r TIMEOUT\n"
 "                           timeout for throttling due to exceeded load, in 
sec\n"
 "                           (fractional down to usec, default: 0.5)\n"
-"    --min-memory=MIN_MEM, -M MIN_MEM\n"
-"                           do not serve tokens available memory is above\n"
-"                           MIN_MEM, in MiB\n"
+"    --min-memory-avail=MIN_MEM_AVAIL, -a MIN_MEM_AVAIL\n"
+"                           do not serve tokens unless available memory\n"
+"                           is above MIN_MEM_AVAIL, in MiB\n"
 "    --min-jobs=MIN_JOBS, -m MIN_JOBS\n"
 "                           min. jobs to serve even if load average is 
exceeded\n"
 "                           (default: 1)\n"
@@ -1050,7 +1060,7 @@ static const struct option steve_long_opts[] = {
        { "jobs", required_argument, 0, 'j' },
        { "load-average", required_argument, 0, 'l' },
        { "load-recheck-timeout", required_argument, 0, 'r' },
-       { "min-memory", required_argument, 0, 'M' },
+       { "min-memory-avail", required_argument, 0, 'a' },
        { "min-jobs", required_argument, 0, 'm' },
        { "per-process-limit", required_argument, 0, 'p' },
        { "dev-name", required_argument, 0, steve_long_option::dev_name },
@@ -1060,7 +1070,7 @@ static const struct option steve_long_opts[] = {
        {},
 };
 
-static const char *steve_short_opts = "hVj:l:r:m:M:p:u:vd";
+static const char *steve_short_opts = "hVj:l:r:m:a:p:u:vd";
 
 int main(int argc, char **argv)
 {
@@ -1079,7 +1089,7 @@ int main(int argc, char **argv)
                                return 0;
                        case 'j':
                        case 'm':
-                       case 'M':
+                       case 'a':
                        case 'p':
                                {
                                        long jobs_arg;
@@ -1091,7 +1101,7 @@ int main(int argc, char **argv)
                                                state.jobs = jobs_arg;
                                        else if (opt == 'm')
                                                state.min_jobs = jobs_arg;
-                                       else if (opt == 'M')
+                                       else if (opt == 'a')
                                                state.min_memory_avail = 
jobs_arg;
                                        else if (opt == 'p')
                                                state.per_process_limit = 
jobs_arg;

diff --git a/src/steve.h b/src/steve.h
index 4d10cc2..ad520fa 100644
--- a/src/steve.h
+++ b/src/steve.h
@@ -28,6 +28,9 @@
 /* get/set per-process limit */
 #define STEVE_IOC_GET_PER_PROCESS_LIMIT _IOR(0x53, 0x05, int64_t)
 #define STEVE_IOC_SET_PER_PROCESS_LIMIT _IOW(0x53, 0x05, int64_t)
+/* get/set min. memory available (in MiB) */
+#define STEVE_IOC_GET_MIN_MEMORY_AVAIL _IOR(0x53, 0x06, int64_t)
+#define STEVE_IOC_SET_MIN_MEMORY_AVAIL _IOW(0x53, 0x06, int64_t)
 
 #define STEVE_IOC_MASK_GET _IOR(0x53, 0, int64_t)
 #define STEVE_IOC_MASK_SET _IOW(0x53, 0, int64_t)

diff --git a/src/stevie.cxx b/src/stevie.cxx
index 2fadf8f..f58cad8 100644
--- a/src/stevie.cxx
+++ b/src/stevie.cxx
@@ -151,6 +151,10 @@ static constexpr char stevie_usage[] =
 "    --get-min-jobs, -m     print min-job number\n"
 "    --set-min-jobs JOBS, -M JOBS\n"
 "                           set min-job number\n"
+"    --get-min-memory-avail, -a\n"
+"                           print min. required available memory (in MIB)\n"
+"    --set-min-memory-avail MIN_MEM_AVAIL, -A MIN_MEM_AVAIL\n"
+"                           set min. required available memory (in MiB)\n"
 "    --get-per-process-limit, -p\n"
 "                           print per-process limit\n"
 "    --set-per-process-limit LIMIT, -P LIMIT\n"
@@ -169,12 +173,14 @@ static const struct option stevie_long_opts[] = {
        {"set-load-recheck-timeout", required_argument, 0, 'R'},
        {"get-min-jobs", no_argument, 0, 'm'},
        {"set-min-jobs", required_argument, 0, 'M'},
+       {"get-min-memory-avail", no_argument, 0, 'a'},
+       {"set-min-memory-avail", required_argument, 0, 'A'},
        {"get-per-process-limit", no_argument, 0, 'p'},
        {"set-per-process-limit", required_argument, 0, 'P'},
        {},
 };
 
-static const char *stevie_short_opts = "+hVs:tjJ:lL:rR:mM:pP:";
+static const char *stevie_short_opts = "+hVs:tjJ:lL:rR:mM:aA:pP:";
 
 typedef std::vector<
        std::pair<unsigned long, std::variant<int64_t, double>>
@@ -234,6 +240,16 @@ int main(int argc, char **argv)
                        }
                        actions.emplace_back(STEVE_IOC_SET_MIN_JOBS, long_arg);
                        break;
+               case 'a':
+                       actions.emplace_back(STEVE_IOC_GET_MIN_MEMORY_AVAIL, 0);
+                       break;
+               case 'A':
+                       if (!arg_to_long(optarg, &long_arg)) {
+                               std::print(stderr, "invalid 
--set-min-memory-avail value: {}\n", optarg);
+                               return 1;
+                       }
+                       actions.emplace_back(STEVE_IOC_SET_MIN_MEMORY_AVAIL, 
long_arg);
+                       break;
                case 'p':
                        actions.emplace_back(STEVE_IOC_GET_PER_PROCESS_LIMIT, 
0);
                        break;

Reply via email to