X-Git-Url: http://git.linux-vserver.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=util-vserver%2Flib%2Fsyscall_setsched-v13.hc;h=83c2af7fac8928fdb8250bdd7c34f20cdd893dc1;hb=3eb1b2279739d0f16391a3724a9897c686f030d3;hp=7fa74aa549288e6e719e93c1bc02376bc54aa96a;hpb=77da47612f012229d26c689658028da83fe184a7;p=util-vserver.git diff --git a/util-vserver/lib/syscall_setsched-v13.hc b/util-vserver/lib/syscall_setsched-v13.hc index 7fa74aa..83c2af7 100644 --- a/util-vserver/lib/syscall_setsched-v13.hc +++ b/util-vserver/lib/syscall_setsched-v13.hc @@ -21,18 +21,49 @@ #endif #include "vserver.h" +#include + +#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_v2, 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); + return vserver(VCMD_set_sched, CTX_USER2KERNEL(xid), &k_data); + } }