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

Add ioctls for load-recheck-timeout

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

 steve.cxx  | 51 +++++++++++++++++++++++++++++++++++++--------------
 steve.h    |  3 +++
 stevie.cxx | 27 +++++++++++++++++++--------
 3 files changed, 59 insertions(+), 22 deletions(-)

diff --git a/steve.cxx b/steve.cxx
index 32b0a94..2b32315 100644
--- a/steve.cxx
+++ b/steve.cxx
@@ -550,6 +550,11 @@ static void steve_poll(
        fuse_reply_poll(req, events);
 }
 
+static void steve_timeout_to_timeval(struct timeval *out, double timeout) {
+       out->tv_sec = trunc(timeout);
+       out->tv_usec = (timeout - out->tv_sec) * 1000000;
+}
+
 static void steve_ioctl(
        fuse_req_t req, int cmd, void *, fuse_file_info *fi,
        unsigned flags, const void *in_buf, size_t, size_t)
@@ -570,17 +575,21 @@ static void steve_ioctl(
        int64_t val;
        double dval;
        if (STEVE_IOC_IS_SET(ioctl_num)) {
-               if (ioctl_num == STEVE_IOC_SET_LOAD_AVG) {
-                       const double *in_val = static_cast<const double 
*>(in_buf);
-                       dval = *in_val;
-               } else {
-                       const int64_t *in_val = static_cast<const int64_t 
*>(in_buf);
-                       if (*in_val < 0 || *in_val >= INT_MAX) {
-                               fuse_reply_err(req, EINVAL);
-                               return;
+               switch (ioctl_num) {
+                       case STEVE_IOC_SET_LOAD_AVG:
+                       case STEVE_IOC_SET_LOAD_RECHECK_TIMEOUT: {
+                               const double *in_val = static_cast<const double 
*>(in_buf);
+                               dval = *in_val;
+                               break;
+                       }
+                       default: {
+                               const int64_t *in_val = static_cast<const 
int64_t *>(in_buf);
+                               if (*in_val < 0 || *in_val >= INT_MAX) {
+                                       fuse_reply_err(req, EINVAL);
+                                       return;
+                               }
+                               val = *in_val;
                        }
-
-                       val = *in_val;
                }
        }
 
@@ -601,6 +610,12 @@ static void steve_ioctl(
                        val = state->min_jobs;
                        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.
+                       );
+                       fuse_reply_ioctl(req, 0, &dval, sizeof(dval));
+                       break;
                case STEVE_IOC_SET_JOBS:
                        if (val == 0)
                                val = sysconf(_SC_NPROCESSORS_ONLN);
@@ -637,6 +652,17 @@ static void steve_ioctl(
                        fuse_reply_ioctl(req, 0, nullptr, 0);
                        steve_wake_waiters(state);
                        break;
+               case STEVE_IOC_SET_LOAD_RECHECK_TIMEOUT:
+                       if (dval < 0.000001 || dval > INT_MAX) {
+                               fuse_reply_err(req, EINVAL);
+                               return;
+                       }
+                       steve_timeout_to_timeval(&state->recheck_timeout, dval);
+                       std::print(stderr, "PID {} set load-recheck-timeout to 
{} s {} us\n",
+                                       fi->fh, state->recheck_timeout.tv_sec, 
state->recheck_timeout.tv_usec);
+                       fuse_reply_ioctl(req, 0, nullptr, 0);
+                       /* TODO: reset the event? */
+                       break;
                default:
                        fuse_reply_err(req, ENOTTY);
        }
@@ -779,10 +805,7 @@ int main(int argc, char **argv)
                                        std::print(stderr, "invalid timeout 
value (must be >=1 us): {}\n", optarg);
                                        return 1;
                                }
-                               state.recheck_timeout.tv_sec = trunc(timeout);
-                               state.recheck_timeout.tv_usec = (
-                                       (timeout - 
state.recheck_timeout.tv_sec) * 1000000
-                               );
+                               
steve_timeout_to_timeval(&state.recheck_timeout, timeout);
                                break;
                        }
                        case 'u':

diff --git a/steve.h b/steve.h
index 8d47850..113bac2 100644
--- a/steve.h
+++ b/steve.h
@@ -21,6 +21,9 @@
 /* get/set load-average */
 #define STEVE_IOC_GET_LOAD_AVG _IOR(0x53, 0x03, double)
 #define STEVE_IOC_SET_LOAD_AVG _IOW(0x53, 0x03, double)
+/* 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)
 
 #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 12f6043..186f32d 100644
--- a/stevie.cxx
+++ b/stevie.cxx
@@ -139,9 +139,14 @@ static constexpr char stevie_usage[] =
 "    --get-jobs, -j         print total job number\n"
 "    --set-jobs JOBS, -J JOBS\n"
 "                           set total job number\n"
-"    --get-load-average, -l print max load-average\n"
+"    --get-load-average, -l\n"
+"                           print max load-average\n"
 "    --set-load-average LOAD_AVG, -L LOAD_AVG\n"
 "                           set max load-average\n"
+"    --get-load-recheck-timeout, -r\n"
+"                           print load-recheck-timeout\n"
+"    --set-load-recheck-timeout TIMEOUT, -R TIMEOUT\n"
+"                           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";
@@ -155,23 +160,19 @@ static const struct option stevie_long_opts[] = {
        {"set-jobs", required_argument, 0, 'J'},
        {"get-load-average", no_argument, 0, 'l'},
        {"set-load-average", required_argument, 0, 'L'},
+       {"get-load-recheck-timeout", no_argument, 0, 'r'},
+       {"set-load-recheck-timeout", required_argument, 0, 'R'},
        {"get-min-jobs", no_argument, 0, 'm'},
        {"set-min-jobs", required_argument, 0, 'M'},
        {},
 };
 
-static const char *stevie_short_opts = "+hVtjJ:lL:mM:";
+static const char *stevie_short_opts = "+hVtjJ:lL:rR:mM:";
 
 typedef std::vector<
        std::pair<unsigned long, std::variant<int64_t, double>>
 > stevie_action_vector;
 
-static bool stevie_add_set_long_action(
-       stevie_action_vector *actions,
-       unsigned long ioctl_num)
-{
-}
-
 int main(int argc, char **argv)
 {
        const char *jobserver_path = "/dev/steve";
@@ -226,6 +227,16 @@ int main(int argc, char **argv)
                        }
                        actions.emplace_back(STEVE_IOC_SET_MIN_JOBS, long_arg);
                        break;
+               case 'r':
+                       
actions.emplace_back(STEVE_IOC_GET_LOAD_RECHECK_TIMEOUT, 0.0);
+                       break;
+               case 'R':
+                       if (!arg_to_double(optarg, &double_arg) || double_arg < 
0.000001 || double_arg > INT_MAX) {
+                               std::print(stderr, "invalid 
--set-load-recheck-timeout value (must be >=1 us): {}\n", optarg);
+                               return 1;
+                       }
+                       
actions.emplace_back(STEVE_IOC_SET_LOAD_RECHECK_TIMEOUT, double_arg);
+                       break;
                default:
                        std::print(stderr, stevie_usage, argv[0]);
                        return 1;

Reply via email to