From: "Milan Svoboda" <milan.svoboda@centrum.cz>
To: <linux-kernel@vger.kernel.org>
Cc: <simlo@phys.au.dk>
Subject: Re: bug in Real-Time Preemption
Date: Fri, 10 Jun 2005 09:18:32 +0200 [thread overview]
Message-ID: <200506100918.3335@centrum.cz> (raw)
> 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/
> >
>
>
next reply other threads:[~2005-06-10 7:20 UTC|newest]
Thread overview: 8+ messages / expand[flat|nested] mbox.gz Atom feed top
2005-06-10 7:18 Milan Svoboda [this message]
2005-06-10 7:46 ` bug in Real-Time Preemption Esben Nielsen
2005-06-10 7:52 ` Michal Schmidt
-- strict thread matches above, loose matches on Subject: below --
2005-06-10 9:50 Milan Svoboda
2005-06-10 7:47 Milan Svoboda
2005-06-10 7:45 Milan Svoboda
2005-06-09 13:45 Milan Svoboda
2005-06-09 21:28 ` Esben Nielsen
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=200506100918.3335@centrum.cz \
--to=milan.svoboda@centrum.cz \
--cc=linux-kernel@vger.kernel.org \
--cc=simlo@phys.au.dk \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.