commit:     80ca167324e3b8578db39fc2076594064cda7a95
Author:     Michał Górny <mgorny <AT> gentoo <DOT> org>
AuthorDate: Tue Dec  9 12:13:11 2025 +0000
Commit:     Michał Górny <mgorny <AT> gentoo <DOT> org>
CommitDate: Tue Dec  9 12:13:11 2025 +0000
URL:        https://gitweb.gentoo.org/proj/steve.git/commit/?id=80ca1673

Support adjusting per-process limit via ioctl()

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

 steve.cxx  | 10 ++++++++++
 steve.h    |  3 +++
 stevie.cxx | 26 +++++++++++++++++++++-----
 3 files changed, 34 insertions(+), 5 deletions(-)

diff --git a/steve.cxx b/steve.cxx
index 1e41fd7..27b7987 100644
--- a/steve.cxx
+++ b/steve.cxx
@@ -630,6 +630,10 @@ static void steve_ioctl(
                        );
                        fuse_reply_ioctl(req, 0, &dval, sizeof(dval));
                        break;
+               case STEVE_IOC_GET_PER_PROCESS_LIMIT:
+                       val = state->per_process_limit;
+                       fuse_reply_ioctl(req, 0, &val, sizeof(val));
+                       break;
                case STEVE_IOC_SET_JOBS:
                        if (val == 0)
                                val = sysconf(_SC_NPROCESSORS_ONLN);
@@ -656,6 +660,12 @@ static void steve_ioctl(
                        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, "PID {} set per-process limit to 
{}\n", fi->fh, state->per_process_limit);
+                       fuse_reply_ioctl(req, 0, nullptr, 0);
+                       steve_wake_waiters(state);
+                       break;
                case STEVE_IOC_SET_LOAD_AVG:
                        if (dval < 1) {
                                fuse_reply_err(req, EINVAL);

diff --git a/steve.h b/steve.h
index 113bac2..f1a2666 100644
--- a/steve.h
+++ b/steve.h
@@ -24,6 +24,9 @@
 /* get/set load-recheck-timeout */
 #define STEVE_IOC_GET_LOAD_RECHECK_TIMEOUT _IOR(0x53, 0x04, double)
 #define STEVE_IOC_SET_LOAD_RECHECK_TIMEOUT _IOW(0x53, 0x04, double)
+/* 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)
 
 #define STEVE_IOC_MASK_GET _IOR(0x53, 0, int64_t)
 #define STEVE_IOC_MASK_SET _IOW(0x53, 0, int64_t)

diff --git a/stevie.cxx b/stevie.cxx
index 186f32d..fd1301c 100644
--- a/stevie.cxx
+++ b/stevie.cxx
@@ -131,7 +131,7 @@ static constexpr char stevie_usage[] =
 "options:\n"
 "    --help, -h             print this help message\n"
 "    --version, -V          print version\n"
-"    --jobserver PATH, -j PATH\n"
+"    --jobserver PATH, -s PATH\n"
 "                           jobserver FIFO path (default: /dev/steve)\n"
 "\n"
 "other actions (executed before the command):\n"
@@ -149,12 +149,16 @@ static constexpr char stevie_usage[] =
 "                           set load-recheck-timeout\n"
 "    --get-min-jobs, -m     print min-job number\n"
 "    --set-min-jobs JOBS, -M JOBS\n"
-"                           set min-job number\n";
+"                           set min-job number\n"
+"    --get-per-process-limit, -p\n"
+"                           print per-process limit\n"
+"    --set-per-process-limit LIMIT, -P LIMIT\n"
+"                           set per-process limit\n";
 
 static const struct option stevie_long_opts[] = {
        {"help", no_argument, 0, 'h'},
        {"version", no_argument, 0, 'V'},
-       {"jobserver", required_argument, 0, 'p'},
+       {"jobserver", required_argument, 0, 's'},
        {"get-tokens", no_argument, 0, 't'},
        {"get-jobs", no_argument, 0, 'j'},
        {"set-jobs", required_argument, 0, 'J'},
@@ -164,10 +168,12 @@ 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-per-process-limit", no_argument, 0, 'p'},
+       {"set-per-process-limit", required_argument, 0, 'P'},
        {},
 };
 
-static const char *stevie_short_opts = "+hVtjJ:lL:rR:mM:";
+static const char *stevie_short_opts = "+hVtjJ:lL:rR:mM:pP:";
 
 typedef std::vector<
        std::pair<unsigned long, std::variant<int64_t, double>>
@@ -191,7 +197,7 @@ int main(int argc, char **argv)
                case 'V':
                        std::print("stevie {}\n", STEVE_VERSION);
                        return 0;
-               case 'p':
+               case 's':
                        jobserver_path = optarg;
                        break;
                case 't':
@@ -227,6 +233,16 @@ int main(int argc, char **argv)
                        }
                        actions.emplace_back(STEVE_IOC_SET_MIN_JOBS, long_arg);
                        break;
+               case 'p':
+                       actions.emplace_back(STEVE_IOC_GET_PER_PROCESS_LIMIT, 
0);
+                       break;
+               case 'P':
+                       if (!arg_to_long(optarg, &long_arg)) {
+                               std::print(stderr, "invalid 
--set-per-process-limit value: {}\n", optarg);
+                               return 1;
+                       }
+                       actions.emplace_back(STEVE_IOC_SET_PER_PROCESS_LIMIT, 
long_arg);
+                       break;
                case 'r':
                        
actions.emplace_back(STEVE_IOC_GET_LOAD_RECHECK_TIMEOUT, 0.0);
                        break;

Reply via email to