openeuler-riscv / oerv-team

OERV 实习生工作中心
6 stars 35 forks source link

LTP: 调研time-schedule01失败问题 #779

Open laokz opened 2 months ago

laokz commented 2 months ago

https://github.com/openEuler-RISCV/QA/tree/main/testreport/24.03/round1/performance-test/ltp_function

<<<test_start>>>
tag=trace_sched01 stime=1714364833
cmdline="trace_sched -c 1"
contacts=""
analysis=exit
<<<test_output>>>
main(): sched_setscheduler(): Operation not permitted
main(): sched_setscheduler(): Operation not permitted
main(): sched_setscheduler(): Operation not permitted
...
Jvlegod commented 1 month ago

测试环境

测试环境测过两个系统版本

  1. openEuler release 22.03 (LTS-SP3) x86(下简称x86)
  2. openEuler release 24.03 (LTS) riscv64(下简称riscv64)

经过验证,x86下可以正常运行,而riscv64则运行错误

time-schedule的执行:

  1. riscv64

    • 非root权限下的效果如图,会提示执行程序时候的特权级不对 image
    • root权限下的效果如图,出现了错误的输出 image
  2. x86

    • 非root权限下的效果如图,会提示执行程序时候的特权级不对 image
    • root权限下的效果如图,成功通过 image

问题分析

调试发现,在riscv64下执行 sched_setscheduler() 的时候出现了错误,因此会将errno变量的数值置为1,并打印相关错误信息(函数详细见 https://www.man7.org/linux/man-pages/man2/sched_setscheduler.2.html).

image

为探究是否是函数本身的问题,在x86和riscv64下对函数单独进行了测试

image

结果riscv64下无法通过,会进入异常,而x86下则完美通过。

后面尝试修改函数的参数,发现riscv6在非即时调度策略的情况下可以通过。

  1. 非即时调度策略:

    SCHED_OTHER: the standard round-robin time-sharing policy;

    以下策略貌似openEuler不可用

    SCHED_BATCH and SCHED_IDLE are Linux-specific.

    SCHED_BATCH: for "batch" style execution of processes; and

    SCHED_IDLE: for running very low priority background jobs.

    对于上述每个策略,param->sched_priority必须为0。

  2. 实时调度策略

    SCHED_FIFO: a first-in, first-out policy; and

    SCHED_RR: a round-robin policy.

    对于上述每个策略,param->scheed_priority指定线程的调度优先级。 这是使用指定策略调用sched_get_priority_min()和sched_get_priority_max()返回的范围内的一个数字。在Linux上,这些系统调用分别返回1到99。

原因分析

初步分析,首先是该函数导致了样例无法通过,其次对于该函数的riscv64的架构可能不支持该函数的FIFO和RR这种RT策略,而其它策略则是可以使用,该函数可能需要完善一下.

References

laokz commented 1 month ago

调研的很仔细!

我用这个镜像试了下你写的程序,可以通过,是否镜像老旧原因?https://repo.tarsier-infra.isrc.ac.cn/openEuler-RISC-V/testing/20240519/v0.1/QEMU/

Jvlegod commented 1 month ago

是的,我换了您给的镜像,首先发现这个样例的程序和我写的这个可以运行了,如下 image 其次我使用

./runltp -s time-schedule01

发现可以通过样例了,可能这个问题就是存在于低版本镜像上

image

包括trace_sched01也可能是这个问题,更换成您的版本后通过

image