[Toybox] chrt.c cleanup
enh
enh at google.com
Mon May 22 09:12:07 PDT 2017
On Sun, May 21, 2017 at 11:15 AM, Rob Landley <rob at landley.net> wrote:
> On 05/09/2017 10:57 AM, enh wrote:
>> On Mon, May 8, 2017 at 4:38 PM, Rob Landley <rob at landley.net> wrote:
>>> On 05/08/2017 03:52 PM, enh wrote:
>> toys/pending/chrt.c \
>
> Ooh, it's <100 lines! Grab!
>
> Huh, Ubuntu 14.04's headers don't have SCHED_DEADLINE. I wonder why? Hmmm...
>
> http://retis.sssup.it/~jlelli/talks/rts-like14/SCHED_DEADLINE.pdf
>
> To use it I need two new system calls (sched_setattr() and
> sched_getattr()), so it's not just adding -d for type 6 is it? (I
> remember why this is still in pending!)
>
> Right, skip that for now.
>
> Option string has to start with ^ to stop at the first nonoption
> argument (otherwise if you go "chrt ls -l" it'll try to parse -l for chrt).
>
> Do you care if somebody does "chrt -m ls -l"? Right now -m happens and
> it ignores the rest of the command line.
seems like a bug.
> It's checking !*(toys.optargs+1) before checking *toys.optargs, meaning
> if they go "chrt -p 42" that could be a wild pointer.
>
> I hate the output strings (not unixy, hard to parse via script!) but
> that's what Ubuntu's doing so compatibility trumps sanity...
>
> Don't test !TT.pid, "chrt -p 0" queries the current PID. While we're at
> it, add bounds checking so you can't chrt -p -1.
>
> You're not outputting |SCHED_RESET_ON_FORK when querying via -p, the
> other one does that.
>
> Hmmm, given that other, batch, and idle are 0/0 in -m does it _need_ the
> 0? Yes it does. Can I do "chrt -b0 ls -l"? Nope, has to be separate.
>
> Except... ARGH! The man page says "-p [prio] pid". Really? REALLY? If I
> supply -p, then prio becomes optional (without it the thing queries
> instead of sets) but it's not "-p pid" doing normal #*%(&# option
> parsing, it's got pid _after_ the optional priority. That's not how
> option parsing works! (Can I do the sane thing instead of the compatible
> thing here? Pretty please?)
looks like ltp is the only thing in the tree using -p, but it seems to
always provide a priority.
> And... how do you indicate that in usage: syntax? Maybe...
>
> usage: chrt [-Rmofrbi] {-p PID [PRIORITY] | [PRIORITY COMMAND...]}
>
> Can I do curly brackets to indicate a non-optional grouping? (I think
> I've seen that. there isn't a spec here, and I don't do multiple usage:
> lines because the help parser wouldn't know what to do with that.)
(which i think is a shame. the seq(1) usage is, i think, easier to
read as three lines than one.)
> If you can printf("%ld", pid_t) then I can unwrap this bit of stupid
> from bits/sched.h:
>
> /* The official definition. */
> struct sched_param
> {
> int __sched_priority;
> };
>
> (P.S. That two space indent is out of glibc!)
>
> Except... glibc does that, bionic does that, the old uClibc I still have
> lying around does that, _klibc_ does that... but for some insane reason
> musl's include/sched.h has:
>
> struct sched_param {
> int sched_priority;
> int sched_ss_low_priority;
> struct timespec sched_ss_repl_period;
> struct timespec sched_ss_init_budget;
> int sched_ss_max_repl;
> };
>
> Where did they get THAT from?
POSIX mandates that, iirc. looks like everyone else favored reality over POSIX.
> Let's see... the kernel's
> include/uapi/linux/sched/types.h has the "one int" version everybody
> else has (that's where the got it from, I expect) and git annotate says
> it was last touched in commit b7b3c76a0a21 in april 2006. So it's been
> like that unchanged for 11 years.
>
> Meanwhile musl's sched_getparam() is a straight syscall wrapper, so it's
> _only_ setting the first field of this struct, meaning this is a musl
> bug and I can ignore it and just use "int" here.
>
> Why the toys.stacktop = 0 here? That forces xexec() to exec() rather
> than running the built-in toybox version, is there a reason to do that here?
haven't we had bugs in other tools that run commands that were fixed
by adding this?
> The ubuntu version is accepting "chrt -rp 12345" and ignoring the -r,
> which tells it to _set_ the policy. (Which would require priority.) I
> think I prefer to catch that and error instead...
>
> Hmmm, this failed:
>
> $ sudo ./chrt -r -p 24532 3
> $ ./chrt -p 24532
> pid 24532's current scheduling policy: SCHED_RR
> pid 24532's current scheduling priority: 3
> $ sudo ./chrt -rR -p 24532 3
> chrt: 3 > -1
>
> The report is from:
>
> atolx_range(*toys.optargs, sched_get_priority_min(policy),
> sched_get_priority_max(policy));
>
> And it's complaining that sched_get_priority_min(policy) is returning
> -1. Because even with the sudo, once the policy is set to SCHED_RR it
> can't query the min/max range anymore? Ah, no: the problem is that if
> you or in SCHED_RESET_ON_FORK _before_ calling the get_priorities(),
> they return invalid argument. Need to move the |= afterwards, then it
> works.
>
> I switched from linux/sched.h to bits/sched.h
bits/ is a glibc-ism. (bionic reuses the directory name "bits" for a
different purpose. seemed better than removing another directory name
from the global namespace.)
> which provides _almost_
> all the macros, except SCHED_RESET_ON_FORK. Which isn't there because I
> _categorically_ refuse to #define GNU_GNU_ALL_HAIL_STALLMAN for things
> the Linux kernel developers invented. (Dear glibc developers: up yours,
> you are wrong.) So that's 1<<30 and a comment. (I could add it to
> portability.h, but eh.)
if your files were C++ you'd have _GNU_SOURCE by default and be
oblivious to this :-)
> Rob
> _______________________________________________
> Toybox mailing list
> Toybox at lists.landley.net
> http://lists.landley.net/listinfo.cgi/toybox-landley.net
--
Elliott Hughes - http://who/enh - http://jessies.org/~enh/
Android native code/tools questions? Mail me/drop by/add me as a reviewer.
More information about the Toybox
mailing list