Andrew Morton wrote: > george anzinger wrote: > >>Ok, here is what I have. I changed nano sleep to use a local 64-bit >>value for the target expire time in jiffies. As much as MAX-INT/2-1 >>will be put in the timer at any one time. It loops till the target >>time is met or exceeded. The changes affect (clock)nanosleep only and >>not timers (they still error out for large values). > > > Seem sane. > > >>I now use the simple u64=(long long) a * b for the mpy so I have >>dropped the sc_math.h stuff (I will bring that round again :). > > > Resistance shall be unflagging! > > >>What do you think? > > > Sorry, but this little bit: > > while ((active = del_timer_sync(&new_timer) || > rq_time > get_jiffies_64()) && > !test_thread_flag(TIF_SIGPENDING)); > > > if (abs_struct.list.next) { > spin_lock_irq(&nanosleep_abs_list_lock); > list_del(&abs_struct.list); > spin_unlock_irq(&nanosleep_abs_list_lock); > } > if (active) { > > should be dragged out and mercifully shot. Is it possible to make that while > loop a little clearer? I hung it! It was less of a mess to clean up :) > > The abs_list exactly duplicates the kernel's existing waitqueue > functionality. You can use prepare_to_wait()/finish_wait() there. Well, almost. Wants to mess with the state, but, try the attached. > > posix_timers_id, posix_clocks[], nanosleep_abs_list_lock and > nanosleep_abs_list should be static to posix-timers.c. And a few more :) -- George Anzinger george@mvista.com High-res-timers: http://sourceforge.net/projects/high-res-timers/ Preemption patch: http://www.kernel.org/pub/linux/kernel/people/rml