aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJeff Dike <jdike@addtoit.com>2006-09-26 02:33:05 -0400
committerLinus Torvalds <torvalds@g5.osdl.org>2006-09-26 11:49:08 -0400
commit537ae946e808d0f22d660f7a3500832fe0c07d14 (patch)
tree843f9adaa3c7de8b10c51d0059e2b567d81ff566
parent4b84c69b5f6c08a540e3683f1360a6cdef2806c7 (diff)
[PATCH] uml: timer cleanups
set_interval returns an error instead of panicing if setitimer fails. Some of its callers now check the return. enable_timer is largely tt-mode-specific, so it is marked as such, and the only skas-mode caller is made to call set-interval instead. user_time_init was a no-value-added wrapper around set_interval, so it is gone. Since set_interval is now called from kernel code, callers no longer pass ITIMER_* to it. Instead, they pass a flag which is converted into ITIMER_REAL or ITIMER_VIRTUAL. Signed-off-by: Jeff Dike <jdike@addtoit.com> Signed-off-by: Andrew Morton <akpm@osdl.org> Signed-off-by: Linus Torvalds <torvalds@osdl.org>
-rw-r--r--arch/um/include/os.h4
-rw-r--r--arch/um/kernel/time.c7
-rw-r--r--arch/um/os-Linux/skas/process.c6
-rw-r--r--arch/um/os-Linux/time.c18
4 files changed, 22 insertions, 13 deletions
diff --git a/arch/um/include/os.h b/arch/um/include/os.h
index c73dfa78f943..24fb6d8680e1 100644
--- a/arch/um/include/os.h
+++ b/arch/um/include/os.h
@@ -276,9 +276,11 @@ extern int setjmp_wrapper(void (*proc)(void *, void *), ...);
276 276
277extern void switch_timers(int to_real); 277extern void switch_timers(int to_real);
278extern void idle_sleep(int secs); 278extern void idle_sleep(int secs);
279extern int set_interval(int is_virtual);
280#ifdef CONFIG_MODE_TT
279extern void enable_timer(void); 281extern void enable_timer(void);
282#endif
280extern void disable_timer(void); 283extern void disable_timer(void);
281extern void user_time_init(void);
282extern void uml_idle_timer(void); 284extern void uml_idle_timer(void);
283extern unsigned long long os_nsecs(void); 285extern unsigned long long os_nsecs(void);
284 286
diff --git a/arch/um/kernel/time.c b/arch/um/kernel/time.c
index 552ca1cb9847..d1d799346e04 100644
--- a/arch/um/kernel/time.c
+++ b/arch/um/kernel/time.c
@@ -113,12 +113,15 @@ static void register_timer(void)
113 113
114 err = request_irq(TIMER_IRQ, um_timer, IRQF_DISABLED, "timer", NULL); 114 err = request_irq(TIMER_IRQ, um_timer, IRQF_DISABLED, "timer", NULL);
115 if(err != 0) 115 if(err != 0)
116 printk(KERN_ERR "timer_init : request_irq failed - " 116 printk(KERN_ERR "register_timer : request_irq failed - "
117 "errno = %d\n", -err); 117 "errno = %d\n", -err);
118 118
119 timer_irq_inited = 1; 119 timer_irq_inited = 1;
120 120
121 user_time_init(); 121 err = set_interval(1);
122 if(err != 0)
123 printk(KERN_ERR "register_timer : set_interval failed - "
124 "errno = %d\n", -err);
122} 125}
123 126
124extern void (*late_time_init)(void); 127extern void (*late_time_init)(void);
diff --git a/arch/um/os-Linux/skas/process.c b/arch/um/os-Linux/skas/process.c
index 88ff0de95cd3..42e3d1ed802c 100644
--- a/arch/um/os-Linux/skas/process.c
+++ b/arch/um/os-Linux/skas/process.c
@@ -155,11 +155,15 @@ extern int __syscall_stub_start;
155static int userspace_tramp(void *stack) 155static int userspace_tramp(void *stack)
156{ 156{
157 void *addr; 157 void *addr;
158 int err;
158 159
159 ptrace(PTRACE_TRACEME, 0, 0, 0); 160 ptrace(PTRACE_TRACEME, 0, 0, 0);
160 161
161 init_new_thread_signals(); 162 init_new_thread_signals();
162 enable_timer(); 163 err = set_interval(1);
164 if(err)
165 panic("userspace_tramp - setting timer failed, errno = %d\n",
166 err);
163 167
164 if(!proc_mm){ 168 if(!proc_mm){
165 /* This has a pte, but it can't be mapped in with the usual 169 /* This has a pte, but it can't be mapped in with the usual
diff --git a/arch/um/os-Linux/time.c b/arch/um/os-Linux/time.c
index 7f5ebbadca63..38be096e750f 100644
--- a/arch/um/os-Linux/time.c
+++ b/arch/um/os-Linux/time.c
@@ -17,20 +17,25 @@
17#include "kern_constants.h" 17#include "kern_constants.h"
18#include "os.h" 18#include "os.h"
19 19
20static void set_interval(int timer_type) 20int set_interval(int is_virtual)
21{ 21{
22 int usec = 1000000/hz(); 22 int usec = 1000000/hz();
23 int timer_type = is_virtual ? ITIMER_VIRTUAL : ITIMER_REAL;
23 struct itimerval interval = ((struct itimerval) { { 0, usec }, 24 struct itimerval interval = ((struct itimerval) { { 0, usec },
24 { 0, usec } }); 25 { 0, usec } });
25 26
26 if(setitimer(timer_type, &interval, NULL) == -1) 27 if(setitimer(timer_type, &interval, NULL) == -1)
27 panic("setitimer failed - errno = %d\n", errno); 28 return -errno;
29
30 return 0;
28} 31}
29 32
33#ifdef CONFIG_MODE_TT
30void enable_timer(void) 34void enable_timer(void)
31{ 35{
32 set_interval(ITIMER_VIRTUAL); 36 set_interval(1);
33} 37}
38#endif
34 39
35void disable_timer(void) 40void disable_timer(void)
36{ 41{
@@ -74,7 +79,7 @@ void uml_idle_timer(void)
74 79
75 set_handler(SIGALRM, (__sighandler_t) alarm_handler, 80 set_handler(SIGALRM, (__sighandler_t) alarm_handler,
76 SA_RESTART, SIGUSR1, SIGIO, SIGWINCH, SIGVTALRM, -1); 81 SA_RESTART, SIGUSR1, SIGIO, SIGWINCH, SIGVTALRM, -1);
77 set_interval(ITIMER_REAL); 82 set_interval(0);
78} 83}
79#endif 84#endif
80 85
@@ -94,8 +99,3 @@ void idle_sleep(int secs)
94 ts.tv_nsec = 0; 99 ts.tv_nsec = 0;
95 nanosleep(&ts, NULL); 100 nanosleep(&ts, NULL);
96} 101}
97
98void user_time_init(void)
99{
100 set_interval(ITIMER_VIRTUAL);
101}