Re: bug in Real-Time Preemption

Milan Svoboda
2005-06-10T07:20:17Z

> I tried to your program: I couldn't make it fail under PREEMPT_RT. No
> matter what the termination value for the while loop in the priority 10
> thread I put in the priority 50 thread printed the same "Dif:".
> I also put in a global variable, thread_done, which I set in the priority
> 10 thread after the loop and printed it out along with "Dif:". It was not
> set. I also tried to add exit(1) at the end of the priority 10 thread...
>
> I see no odd behaviour.
>
> Esben
>

Look at my results:

I added a flag too.

under non RT preempt:
(these results are expected)

./a.out
Flag: 0, Dif:11714
./a.out
Flag: 0, Dif:11678

under full RT preempt:
./a.out
Flag: 1, Dif:582536
./a.out
Flag: 1, Dif:579791

This shows that thread with bigger priority was
blocked by the thread with lower priority!

Please, try it again with 'while (1) {' (or some
much bigger number) instead of original 'while (i < 10000) {'.

Thanks,
Milan

> On Thu, 9 Jun 2005, Milan Svoboda wrote:
>
> > Hello all,
> >
> > I have a test program which creates one thread with SCHED_RR and
> priority 50. This
> > thread creates another thread witch SCHED_RR and priority 10 and then
> waits some time
> > until it exits. Thread with priority of 10 only counts, it should be a
> cpu-hog and calls sched_yield.
> >
> > Problem is that the parent thread (with priority 50) sleeps as long as
> the thread with priority 10 is
> > runnig when runnig on realtime-preempt-2.6.12-rc6-V0.7.48-01 with full
> preemption enabled.
> >
> > I tested this program on 2.4.21-xxx and on 2.6.12-rc6 with
> realtime-preempt-2.6.12-rc6-V0.7.48-01 with RT preemption
> > disabled and results were as expected - parent thread sleeps shorter
> time then counting thread so program is
> > terminated before counting thread could finished it's work.
> >
> > #include <pthread.h>
> > #include <unistd.h>
> > #include <sys/time.h>
> >
> > void* thread(void *thread) {
> > int i;
> >
> > while (i < 10000) {
> > sched_yield();
> > i++;
> > }
> > }
> >
> > void* thread_main(void *arg) {
> > pthread_attr_t attr;
> > pthread_t p;
> > struct sched_param sch;
> > struct timeval tv1, tv2;
> > unsigned int dif;
> >
> > pthread_attr_init(&attr);
> > pthread_attr_setschedpolicy(&attr, SCHED_RR);
> >
> > sch.sched_priority = 10;
> > pthread_attr_setschedparam(&attr, &sch);
> > pthread_create(&p, &attr, thread, NULL);
> > pthread_attr_destroy(&attr);
> >
> > gettimeofday(&tv1, NULL);
> > usleep(10000);
> > gettimeofday(&tv2, NULL);
> >
> > dif = (tv2.tv_sec - tv1.tv_sec) * 1000000 + tv2.tv_usec - tv1.tv_usec;
> > printf("Dif: %d\n", dif);
> >
> > exit(0);
> > }
> >
> > int main(int argc, char** argv) {
> > pthread_attr_t attr;
> > pthread_t p;
> > struct sched_param sch;
> >
> > pthread_attr_init(&attr);
> > pthread_attr_setschedpolicy(&attr, SCHED_RR);
> >
> > sch.sched_priority = 50;
> > pthread_attr_setschedparam(&attr, &sch);
> > pthread_create(&p, &attr, thread_main, NULL);
> > pthread_attr_destroy(&attr);
> >
> > while (1) {
> > sleep(500);
> > }
> >
> > return 0;
> > }
> >
> > Follows important parts from .config:
> >
> > .config with RT preemption disabled
> >
> > #
> > # General setup
> > #
> > CONFIG_LOCALVERSION=""
> > CONFIG_SWAP=y
> > CONFIG_SYSVIPC=y
> > CONFIG_POSIX_MQUEUE=y
> > CONFIG_BSD_PROCESS_ACCT=y
> > # CONFIG_BSD_PROCESS_ACCT_V3 is not set
> > CONFIG_SYSCTL=y
> > # CONFIG_AUDIT is not set
> > CONFIG_HOTPLUG=y
> > CONFIG_KOBJECT_UEVENT=y
> > # CONFIG_IKCONFIG is not set
> > # CONFIG_EMBEDDED is not set
> > CONFIG_KALLSYMS=y
> > CONFIG_KALLSYMS_ALL=y
> > # CONFIG_KALLSYMS_EXTRA_PASS is not set
> > CONFIG_PRINTK=y
> > CONFIG_BUG=y
> > CONFIG_BASE_FULL=y
> > CONFIG_FUTEX=y
> > CONFIG_EPOLL=y
> > CONFIG_SHMEM=y
> > CONFIG_CC_ALIGN_FUNCTIONS=0
> > CONFIG_CC_ALIGN_LABELS=0
> > CONFIG_CC_ALIGN_LOOPS=0
> > CONFIG_CC_ALIGN_JUMPS=0
> > # CONFIG_TINY_SHMEM is not set
> > CONFIG_BASE_SMALL=0
> >
> > #
> > # Loadable module support
> > #
> > CONFIG_MODULES=y
> > CONFIG_MODULE_UNLOAD=y
> > CONFIG_MODULE_FORCE_UNLOAD=y
> > CONFIG_OBSOLETE_MODPARM=y
> > CONFIG_MODVERSIONS=y
> > # CONFIG_MODULE_SRCVERSION_ALL is not set
> > CONFIG_KMOD=y
> >
> > #
> > # Processor type and features
> > #
> > CONFIG_X86_PC=y
> > # CONFIG_X86_ELAN is not set
> > # CONFIG_X86_VOYAGER is not set
> > # CONFIG_X86_NUMAQ is not set
> > # CONFIG_X86_SUMMIT is not set
> > # CONFIG_X86_BIGSMP is not set
> > # CONFIG_X86_VISWS is not set
> > # CONFIG_X86_GENERICARCH is not set
> > # CONFIG_X86_ES7000 is not set
> > # CONFIG_M386 is not set
> > # CONFIG_M486 is not set
> > # CONFIG_M586 is not set
> > # CONFIG_M586TSC is not set
> > # CONFIG_M586MMX is not set
> > CONFIG_M686=y
> > # CONFIG_MPENTIUMII is not set
> > # CONFIG_MPENTIUMIII is not set
> > # CONFIG_MPENTIUMM is not set
> > # CONFIG_MPENTIUM4 is not set
> > # CONFIG_MK6 is not set
> > # CONFIG_MK7 is not set
> > # CONFIG_MK8 is not set
> > # CONFIG_MCRUSOE is not set
> > # CONFIG_MEFFICEON is not set
> > # CONFIG_MWINCHIPC6 is not set
> > # CONFIG_MWINCHIP2 is not set
> > # CONFIG_MWINCHIP3D is not set
> > # CONFIG_MGEODEGX1 is not set
> > # CONFIG_MCYRIXIII is not set
> > # CONFIG_MVIAC3_2 is not set
> > CONFIG_X86_GENERIC=y
> > CONFIG_X86_CMPXCHG=y
> > CONFIG_X86_XADD=y
> > CONFIG_X86_L1_CACHE_SHIFT=7
> > CONFIG_GENERIC_CALIBRATE_DELAY=y
> > CONFIG_X86_PPRO_FENCE=y
> > CONFIG_X86_WP_WORKS_OK=y
> > CONFIG_X86_INVLPG=y
> > CONFIG_X86_BSWAP=y
> > CONFIG_X86_POPAD_OK=y
> > CONFIG_X86_GOOD_APIC=y
> > CONFIG_X86_INTEL_USERCOPY=y
> > CONFIG_X86_USE_PPRO_CHECKSUM=y
> > CONFIG_HPET_TIMER=y
> > CONFIG_HPET_EMULATE_RTC=y
> > # CONFIG_SMP is not set
> > CONFIG_PREEMPT_NONE=y
> > # CONFIG_PREEMPT_VOLUNTARY is not set
> > # CONFIG_PREEMPT_DESKTOP is not set
> > # CONFIG_PREEMPT_RT is not set
> > # CONFIG_PREEMPT_SOFTIRQS is not set
> > # CONFIG_PREEMPT_HARDIRQS is not set
> > # CONFIG_PREEMPT_BKL is not set
> > CONFIG_ASM_SEMAPHORES=y
> > CONFIG_RWSEM_XCHGADD_ALGORITHM=y
> > CONFIG_X86_UP_APIC=y
> > CONFIG_X86_UP_IOAPIC=y
> > CONFIG_X86_LOCAL_APIC=y
> > CONFIG_X86_IO_APIC=y
> > CONFIG_X86_TSC=y
> > CONFIG_X86_MCE=y
> > # CONFIG_X86_MCE_NONFATAL is not set
> > # CONFIG_X86_MCE_P4THERMAL is not set
> > # CONFIG_TOSHIBA is not set
> > # CONFIG_I8K is not set
> > # CONFIG_X86_REBOOTFIXUPS is not set
> > # CONFIG_MICROCODE is not set
> > # CONFIG_X86_MSR is not set
> > CONFIG_X86_CPUID=m
> >
> > #
> > # Profiling support
> > #
> > CONFIG_PROFILING=y
> > CONFIG_OPROFILE=y
> >
> > #
> > # Kernel hacking
> > #
> > CONFIG_PRINTK_TIME=y
> > CONFIG_DEBUG_KERNEL=y
> > CONFIG_MAGIC_SYSRQ=y
> > CONFIG_LOG_BUF_SHIFT=15
> > CONFIG_SCHEDSTATS=y
> > # CONFIG_DEBUG_SLAB is not set
> > # CONFIG_DEBUG_SPINLOCK_SLEEP is not set
> > CONFIG_WAKEUP_TIMING=y
> > CONFIG_CRITICAL_IRQSOFF_TIMING=y
> > CONFIG_CRITICAL_TIMING=y
> > CONFIG_LATENCY_TIMING=y
> > CONFIG_LATENCY_TRACE=y
> > CONFIG_MCOUNT=y
> > # CONFIG_DEBUG_KOBJECT is not set
> > CONFIG_DEBUG_BUGVERBOSE=y
> > # CONFIG_DEBUG_INFO is not set
> > # CONFIG_DEBUG_FS is not set
> > CONFIG_FRAME_POINTER=y
> > CONFIG_EARLY_PRINTK=y
> > CONFIG_DEBUG_STACKOVERFLOW=y
> > CONFIG_KPROBES=y
> > CONFIG_DEBUG_STACK_USAGE=y
> > # CONFIG_DEBUG_PAGEALLOC is not set
> > # CONFIG_4KSTACKS is not set
> > CONFIG_X86_FIND_SMP_CONFIG=y
> > CONFIG_X86_MPPARSE=y
> >
> > .config with RT preemption enabled
> > #
> > # General setup
> > #
> > CONFIG_LOCALVERSION=""
> > CONFIG_SWAP=y
> > CONFIG_SYSVIPC=y
> > CONFIG_POSIX_MQUEUE=y
> > CONFIG_BSD_PROCESS_ACCT=y
> > # CONFIG_BSD_PROCESS_ACCT_V3 is not set
> > CONFIG_SYSCTL=y
> > # CONFIG_AUDIT is not set
> > CONFIG_HOTPLUG=y
> > CONFIG_KOBJECT_UEVENT=y
> > # CONFIG_IKCONFIG is not set
> > # CONFIG_EMBEDDED is not set
> > CONFIG_KALLSYMS=y
> > CONFIG_KALLSYMS_ALL=y
> > # CONFIG_KALLSYMS_EXTRA_PASS is not set
> > CONFIG_PRINTK=y
> > CONFIG_BUG=y
> > CONFIG_BASE_FULL=y
> > CONFIG_FUTEX=y
> > CONFIG_EPOLL=y
> > CONFIG_SHMEM=y
> > CONFIG_CC_ALIGN_FUNCTIONS=0
> > CONFIG_CC_ALIGN_LABELS=0
> > CONFIG_CC_ALIGN_LOOPS=0
> > CONFIG_CC_ALIGN_JUMPS=0
> > # CONFIG_TINY_SHMEM is not set
> > CONFIG_BASE_SMALL=0
> >
> > #
> > # Loadable module support
> > #
> > CONFIG_MODULES=y
> > CONFIG_MODULE_UNLOAD=y
> > CONFIG_MODULE_FORCE_UNLOAD=y
> > CONFIG_OBSOLETE_MODPARM=y
> > CONFIG_MODVERSIONS=y
> > # CONFIG_MODULE_SRCVERSION_ALL is not set
> > CONFIG_KMOD=y
> >
> > #
> > # Processor type and features
> > #
> > CONFIG_X86_PC=y
> > # CONFIG_X86_ELAN is not set
> > # CONFIG_X86_VOYAGER is not set
> > # CONFIG_X86_NUMAQ is not set
> > # CONFIG_X86_SUMMIT is not set
> > # CONFIG_X86_BIGSMP is not set
> > # CONFIG_X86_VISWS is not set
> > # CONFIG_X86_GENERICARCH is not set
> > # CONFIG_X86_ES7000 is not set
> > # CONFIG_M386 is not set
> > # CONFIG_M486 is not set
> > # CONFIG_M586 is not set
> > # CONFIG_M586TSC is not set
> > # CONFIG_M586MMX is not set
> > CONFIG_M686=y
> > # CONFIG_MPENTIUMII is not set
> > # CONFIG_MPENTIUMIII is not set
> > # CONFIG_MPENTIUMM is not set
> > # CONFIG_MPENTIUM4 is not set
> > # CONFIG_MK6 is not set
> > # CONFIG_MK7 is not set
> > # CONFIG_MK8 is not set
> > # CONFIG_MCRUSOE is not set
> > # CONFIG_MEFFICEON is not set
> > # CONFIG_MWINCHIPC6 is not set
> > # CONFIG_MWINCHIP2 is not set
> > # CONFIG_MWINCHIP3D is not set
> > # CONFIG_MGEODEGX1 is not set
> > # CONFIG_MCYRIXIII is not set
> > # CONFIG_MVIAC3_2 is not set
> > CONFIG_X86_GENERIC=y
> > CONFIG_X86_CMPXCHG=y
> > CONFIG_X86_XADD=y
> > CONFIG_X86_L1_CACHE_SHIFT=7
> > CONFIG_GENERIC_CALIBRATE_DELAY=y
> > CONFIG_X86_PPRO_FENCE=y
> > CONFIG_X86_WP_WORKS_OK=y
> > CONFIG_X86_INVLPG=y
> > CONFIG_X86_BSWAP=y
> > CONFIG_X86_POPAD_OK=y
> > CONFIG_X86_GOOD_APIC=y
> > CONFIG_X86_INTEL_USERCOPY=y
> > CONFIG_X86_USE_PPRO_CHECKSUM=y
> > CONFIG_HPET_TIMER=y
> > CONFIG_HPET_EMULATE_RTC=y
> > # CONFIG_SMP is not set
> > # CONFIG_PREEMPT_NONE is not set
> > # CONFIG_PREEMPT_VOLUNTARY is not set
> > # CONFIG_PREEMPT_DESKTOP is not set
> > CONFIG_PREEMPT_RT=y
> > CONFIG_PREEMPT=y
> > CONFIG_PREEMPT_SOFTIRQS=y
> > CONFIG_PREEMPT_HARDIRQS=y
> > CONFIG_PREEMPT_RCU=y
> > CONFIG_PREEMPT_BKL=y
> > CONFIG_RWSEM_GENERIC_SPINLOCK=y
> > CONFIG_ASM_SEMAPHORES=y
> > CONFIG_X86_UP_APIC=y
> > CONFIG_X86_UP_IOAPIC=y
> > CONFIG_X86_LOCAL_APIC=y
> > CONFIG_X86_IO_APIC=y
> > CONFIG_X86_TSC=y
> > CONFIG_X86_MCE=y
> > # CONFIG_X86_MCE_NONFATAL is not set
> > # CONFIG_X86_MCE_P4THERMAL is not set
> > # CONFIG_TOSHIBA is not set
> > # CONFIG_I8K is not set
> > # CONFIG_X86_REBOOTFIXUPS is not set
> > # CONFIG_MICROCODE is not set
> > # CONFIG_X86_MSR is not set
> > CONFIG_X86_CPUID=m
> >
> > #
> > # Profiling support
> > #
> > CONFIG_PROFILING=y
> > CONFIG_OPROFILE=y
> >
> > #
> > # Kernel hacking
> > #
> > CONFIG_PRINTK_TIME=y
> > CONFIG_DEBUG_KERNEL=y
> > CONFIG_MAGIC_SYSRQ=y
> > CONFIG_LOG_BUF_SHIFT=15
> > CONFIG_SCHEDSTATS=y
> > # CONFIG_DEBUG_SLAB is not set
> > CONFIG_DEBUG_PREEMPT=y
> > CONFIG_WAKEUP_TIMING=y
> > CONFIG_PREEMPT_TRACE=y
> > CONFIG_CRITICAL_PREEMPT_TIMING=y
> > CONFIG_CRITICAL_IRQSOFF_TIMING=y
> > CONFIG_CRITICAL_TIMING=y
> > CONFIG_LATENCY_TIMING=y
> > CONFIG_LATENCY_TRACE=y
> > CONFIG_MCOUNT=y
> > CONFIG_RT_DEADLOCK_DETECT=y
> > CONFIG_DEBUG_RT_LOCKING_MODE=y
> > # CONFIG_DEBUG_KOBJECT is not set
> > CONFIG_DEBUG_BUGVERBOSE=y
> > # CONFIG_DEBUG_INFO is not set
> > # CONFIG_DEBUG_FS is not set
> > CONFIG_FRAME_POINTER=y
> > CONFIG_EARLY_PRINTK=y
> > CONFIG_DEBUG_STACKOVERFLOW=y
> > CONFIG_KPROBES=y
> > CONFIG_DEBUG_STACK_USAGE=y
> > # CONFIG_DEBUG_PAGEALLOC is not set
> > CONFIG_X86_MPPARSE=y
> >
> > -
> > To unsubscribe from this list: send the line "unsubscribe linux-kernel"
> in
> > the body of a message to majordomo@vger.kernel.org
> > More majordomo info at http://vger.kernel.org/majordomo-info.html
> > Please read the FAQ at http://www.tux.org/lkml/
> >
>
>