updated to new 'struct vcmd_set_sched_v3'
authorEnrico Scholz <enrico.scholz@informatik.tu-chemnitz.de>
Wed, 22 Sep 2004 20:45:03 +0000 (20:45 +0000)
committerEnrico Scholz <enrico.scholz@informatik.tu-chemnitz.de>
Wed, 22 Sep 2004 20:45:03 +0000 (20:45 +0000)
added some optimizations

git-svn-id: http://svn.linux-vserver.org/svn/util-vserver/trunk@1694 94cd875c-1c1d-0410-91d2-eb244daf1a30

util-vserver/lib/syscall_setsched-v13.hc

index 7fa74aa..74cab17 100644 (file)
 #endif
 
 #include "vserver.h"
+#include <lib_internal/util.h>
+
+#define VCGET(MASK,VAL)                ((data->set_mask & (MASK)) ? (VAL) : SCHED_KEEP);
 
 static inline ALWAYSINLINE int
-vc_set_sched_v13(xid_t xid, struct vc_set_sched const *data)
+vc_set_sched_v13obs(xid_t xid, struct vc_set_sched const *data)
 {
+#warning vc_set_sched_v13() uses an obsolete interface; remove it in the final version
   struct vcmd_set_sched_v2     k_data;
 
-  k_data.fill_rate   = data->fill_rate;
-  k_data.interval    = data->interval;
-  k_data.tokens      = data->tokens;
-  k_data.tokens_min  = data->tokens_min;
-  k_data.tokens_max  = data->tokens_max;
-  k_data.cpu_mask    = data->cpu_mask;
+  
+  k_data.cpu_mask    = 0;
+  k_data.fill_rate   = VCGET(VC_VXSM_FILL_RATE,  data->fill_rate);
+  k_data.interval    = VCGET(VC_VXSM_INTERVAL,   data->interval);
+  k_data.tokens      = VCGET(VC_VXSM_TOKENS,     data->tokens);
+  k_data.tokens_min  = VCGET(VC_VXSM_TOKENS_MIN, data->tokens_min);
+  k_data.tokens_max  = VCGET(VC_VXSM_TOKENS_MAX, data->tokens_max);
 
   return vserver(VCMD_set_sched, CTX_USER2KERNEL(xid), &k_data);
 }
+
+#define X(ATTR)                ENSC_SAME_STRUCT_IDX(k_data, *data, ATTR)
+
+static inline ALWAYSINLINE int
+vc_set_sched_v13b(xid_t xid, struct vc_set_sched const *data)
+{
+  struct vcmd_set_sched_v3     k_data;
+
+    // This expression will be evaluated at compile-time
+  if (sizeof(struct vcmd_set_sched_v3)==sizeof(struct vc_set_sched) &&
+      X(set_mask)   && X(fill_rate)  && X(interval)   && X(tokens) &&
+      X(tokens_min) && X(tokens_max) && X(priority_bias))
+    return vserver(VCMD_set_sched, CTX_USER2KERNEL(xid),
+                  const_cast(struct vc_set_sched *)(data));
+  else {
+    k_data.set_mask      = data->set_mask;
+    k_data.fill_rate     = data->fill_rate;
+    k_data.interval      = data->interval;
+    k_data.tokens        = data->tokens;
+    k_data.tokens_min    = data->tokens_min;
+    k_data.tokens_max   = data->tokens_max;
+    k_data.priority_bias = data->priority_bias;
+
+    return vserver(VCMD_set_sched, CTX_USER2KERNEL(xid), &k_data);
+  }
+}