<html><head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
  </head>
  <body>
    <div class="moz-cite-prefix">Hi!</div>
    <div class="moz-cite-prefix"><br>
    </div>
    <div class="moz-cite-prefix">On 11/4/22 07:48, Li Wang wrote:<br>
    </div>
    <blockquote type="cite" cite="mid:CAEemH2ePDmJf-Mq=gk8MX+J7tP-qkGrvqxRL-Ri_k8QjZd842g@mail.gmail.com">
      
      <div dir="ltr">
        <div dir="ltr">
          <div class="gmail_default" style="font-size:small">Hi Andrea,</div>
        </div>
        <br>
        <div class="gmail_quote">
          <div dir="ltr" class="gmail_attr">Andrea Cervesato via ltp
            <<a href="mailto:ltp@lists.linux.it" target="_blank" moz-do-not-send="true" class="moz-txt-link-freetext">ltp@lists.linux.it</a>>
            wrote:<br>
          </div>
          <div dir="ltr" class="gmail_attr"><br>
          </div>
          <blockquote class="gmail_quote" style="margin:0px 0px 0px
            0.8ex;border-left:1px solid
            rgb(204,204,204);padding-left:1ex">Last test rewrite didn't
            consider the right expected boundaries when<br>
            setitimer syscall was tested. We also introduced counter
            times as<br>
            multiple of clock resolution, to avoid kernel rounding
            during setitimer<br>
            counter increase.<br>
          </blockquote>
          <div><br>
          </div>
          <div>
            <div class="gmail_default" style="font-size:small">Good
              catch, but I'm afraid this can not solve the problem
              thoroughly.</div>
            <div class="gmail_default" style="font-size:small">According
              failure log on "ITIMER_VIRTUAL/PROF" with running this
              patch.:</div>
            <div class="gmail_default" style="font-size:small"><br>
            </div>
            <div class="gmail_default" style="font-size:small">setitimer01.c:64:
              TINFO: tc->which = ITIMER_VIRTUAL<br>
              setitimer01.c:69: TPASS: sys_setitimer(tc->which,
              value, NULL) passed<br>
              setitimer01.c:72: TPASS: sys_setitimer(tc->which,
              value, ovalue) passed<br>
              setitimer01.c:76: TINFO: tv_sec=0, tv_usec=31000<br>
              setitimer01.c:79: TFAIL: Ending counters are out of range</div>
            <div class="gmail_default" style="font-size:small">setitimer01.c:88:
              TPASS: Child received signal: SIGVTALRM</div>
            <div class="gmail_default" style="font-size:small"><br>
              setitimer01.c:64: TINFO: tc->which = ITIMER_PROF<br>
              setitimer01.c:69: TPASS: sys_setitimer(tc->which,
              value, NULL) passed<br>
              setitimer01.c:72: TPASS: sys_setitimer(tc->which,
              value, ovalue) passed<br>
              setitimer01.c:76: TINFO: tv_sec=0, tv_usec=31000<br>
              setitimer01.c:79: TFAIL: Ending counters are out of range</div>
            <div class="gmail_default" style="font-size:small">setitimer01.c:88:
              TPASS: Child received signal: SIGPROF<br>
            </div>
            <div class="gmail_default" style="font-size:small"><br>
            </div>
            <div class="gmail_default" style="font-size:small">It seems
              the tv_usec always increase 1000us, I highly suspect</div>
            <div class="gmail_default" style="font-size:small">this
              increase comes from kernel function set_cpu_itimer() that</div>
            <div class="gmail_default" style="font-size:small">explicitly
              add TICK_NSEC when 'nval' is larger than zero:</div>
            <br>
          </div>
          <div>
            <div class="gmail_default" style="font-size:small">$ cat
              kernel/time/itimer.c -n</div>
            <div class="gmail_default" style="font-size:small">   ...</div>
            <div class="gmail_default" style="font-size:small">   168
              static void set_cpu_itimer(struct task_struct *tsk,
              unsigned int clock_id,<br>
                 169                 const struct itimerspec64 *const
              value,<br>
                 170                 struct itimerspec64 *const ovalue)<br>
                 171 {<br>
                                 ...<br>
                 182          if (oval || nval) {<br>
                 183                  if (nval > 0)<br>
                 184                          nval += TICK_NSEC;<br>
                 185                  set_process_cpu_timer(tsk,
              clock_id, &nval, &oval);<br>
                 186          }<br>
                 187          ...<br>
                 198 }<br>
            </div>
            <div class="gmail_default" style="font-size:small"><br>
            </div>
          </div>
        </div>
      </div>
    </blockquote>
    <p>Yes, you caught the reason why VIRTUAL/PROF tests are not
      passing. CLOCK_MONOTONIC_COARSE is probably used because setitimer
      takes in consideration context switch from kernel to user space
      while counting. To use CLOCK_MONOTONIC_COARSE for VIRTUAL/PROF is
      probably the way to go.<br>
    </p>
    <blockquote type="cite" cite="mid:CAEemH2ePDmJf-Mq=gk8MX+J7tP-qkGrvqxRL-Ri_k8QjZd842g@mail.gmail.com">
      <div dir="ltr">
        <div class="gmail_quote">
          <div class="gmail_default" style="font-size:small">To verify
            my guess, I do a modification based on your patch and</div>
          <div class="gmail_default" style="font-size:small">then easily
            get the result in pass.</div>
          <div class="gmail_default" style="font-size:small"><br>
          </div>
          <div class="gmail_default" style="font-size:small">---
            a/testcases/kernel/syscalls/setitimer/setitimer01.c<br>
            +++ b/testcases/kernel/syscalls/setitimer/setitimer01.c<br>
            @@ -76,7 +76,7 @@ static void verify_setitimer(unsigned int
            i)<br>
                                    ovalue->it_value.tv_sec,<br>
                                    ovalue->it_value.tv_usec);<br>
             <br>
            -               if (ovalue->it_value.tv_sec != 0 ||
            ovalue->it_value.tv_usec > usec)<br>
            +               if (ovalue->it_value.tv_sec != 0 ||
            ovalue->it_value.tv_usec - time_step > usec)<br>
                                    tst_res(TFAIL, "Ending counters are
            out of range");<br>
             <br>
                            for (;;)<br>
            @@ -98,8 +98,8 @@ static void setup(void)<br>
                    SAFE_CLOCK_GETRES(CLOCK_MONOTONIC, &res);<br>
             <br>
                    time_step = res.tv_nsec / 1000;<br>
            -       if (time_step < 10000)<br>
            -               time_step = 10000;<br>
            +       if (time_step < 1000)<br>
            +               time_step = 1000;<br>
             <br>
                    tst_res(TINFO, "clock resolution: %luns, time step:
            %luus",<br>
                            res.tv_nsec,<br>
          </div>
          <div> </div>
        </div>
        <div><br>
        </div>
        <div>
          <div class="gmail_default" style="font-size:small">But after
            trying this with my RasberryPi4, it fails again with an
            increase</div>
          <div class="gmail_default" style="font-size:small">4000us each
            time. So it might related to the system use different time</div>
          <div class="gmail_default" style="font-size:small">resolutions.
            When I shift to use `CLOCK_MONOTONIC_COARSE`</div>
        </div>
        <div class="gmail_default" style="font-size:small">then test
          gets passed on all my platforms.</div>
        <div class="gmail_default" style="font-size:small"><br>
        </div>
        <div class="gmail_default" style="font-size:small">Any comments?</div>
        <div class="gmail_default" style="font-size:small"><br>
        </div>
        <div><br>
        </div>
        <div>
          <div class="gmail_default" style="font-size:small">----------CLOCK_MONOTONIC-------------</div>
        </div>
        <div>
          <div class="gmail_default" style="font-size:small">setitimer01.c:65:
            TINFO: tc->which = ITIMER_VIRTUAL<br>
            setitimer01.c:70: TPASS: sys_setitimer(tc->which, value,
            NULL) passed<br>
            setitimer01.c:73: TPASS: sys_setitimer(tc->which, value,
            ovalue) passed<br>
            setitimer01.c:77: TINFO: tv_sec=0, tv_usec=7000<br>
            setitimer01.c:80: TFAIL: Ending counters are out of range</div>
          <br>
          <div class="gmail_default" style="font-size:small">-----------CLOCK_MONOTONIC_COARSE-------</div>
        </div>
        <div>
          <div class="gmail_default" style="font-size:small">setitimer01.c:65:
            TINFO: tc->which = ITIMER_VIRTUAL<br>
            setitimer01.c:70: TPASS: sys_setitimer(tc->which, value,
            NULL) passed<br>
            setitimer01.c:73: TPASS: sys_setitimer(tc->which, value,
            ovalue) passed<br>
            setitimer01.c:77: TINFO: tv_sec=0, tv_usec=16000<br>
            setitimer01.c:89: TPASS: Child received signal: SIGVTALRM<br>
          </div>
          <div class="gmail_default" style="font-size:small"><br>
          </div>
          <div class="gmail_default" style="font-size:small"># lscpu <br>
            Architecture:        aarch64<br>
            Byte Order:          Little Endian<br>
            CPU(s):              4<br>
            On-line CPU(s) list: 0-3<br>
            Thread(s) per core:  1<br>
            Core(s) per cluster: 4<br>
            Socket(s):           -<br>
            Cluster(s):          1<br>
            Vendor ID:           ARM<br>
            Model:               3<br>
            Model name:          Cortex-A72<br>
            Stepping:            r0p3<br>
            CPU max MHz:         1500.0000<br>
            CPU min MHz:         600.0000<br>
            BogoMIPS:            108.00<br>
            Flags:               fp asimd evtstrm crc32 cpuid<br>
          </div>
          <br>
        </div>
        -- <br>
        <div dir="ltr">
          <div dir="ltr">
            <div>Regards,<br>
            </div>
            <div>Li Wang<br>
            </div>
          </div>
        </div>
      </div>
    </blockquote>
    <p>Andrea<br>
    </p>
  </body>
</html>