timer.c
上传用户:jlfgdled
上传日期:2013-04-10
资源大小:33168k
文件大小:22k
源码类别:

Linux/Unix编程

开发平台:

Unix_Linux

  1. /*
  2.  *  linux/kernel/timer.c
  3.  *
  4.  *  Kernel internal timers, kernel timekeeping, basic process system calls
  5.  *
  6.  *  Copyright (C) 1991, 1992  Linus Torvalds
  7.  *
  8.  *  1997-01-28  Modified by Finn Arne Gangstad to make timers scale better.
  9.  *
  10.  *  1997-09-10  Updated NTP code according to technical memorandum Jan '96
  11.  *              "A Kernel Model for Precision Timekeeping" by Dave Mills
  12.  *  1998-12-24  Fixed a xtime SMP race (we need the xtime_lock rw spinlock to
  13.  *              serialize accesses to xtime/lost_ticks).
  14.  *                              Copyright (C) 1998  Andrea Arcangeli
  15.  *  1999-03-10  Improved NTP compatibility by Ulrich Windl
  16.  */
  17. #include <linux/config.h>
  18. #include <linux/mm.h>
  19. #include <linux/timex.h>
  20. #include <linux/delay.h>
  21. #include <linux/smp_lock.h>
  22. #include <linux/interrupt.h>
  23. #include <linux/kernel_stat.h>
  24. #include <asm/uaccess.h>
  25. /*
  26.  * Timekeeping variables
  27.  */
  28. long tick = (1000000 + HZ/2) / HZ; /* timer interrupt period */
  29. /* The current time */
  30. struct timeval xtime __attribute__ ((aligned (16)));
  31. /* Don't completely fail for HZ > 500.  */
  32. int tickadj = 500/HZ ? : 1; /* microsecs */
  33. DECLARE_TASK_QUEUE(tq_timer);
  34. DECLARE_TASK_QUEUE(tq_immediate);
  35. /*
  36.  * phase-lock loop variables
  37.  */
  38. /* TIME_ERROR prevents overwriting the CMOS clock */
  39. int time_state = TIME_OK; /* clock synchronization status */
  40. int time_status = STA_UNSYNC; /* clock status bits */
  41. long time_offset; /* time adjustment (us) */
  42. long time_constant = 2; /* pll time constant */
  43. long time_tolerance = MAXFREQ; /* frequency tolerance (ppm) */
  44. long time_precision = 1; /* clock precision (us) */
  45. long time_maxerror = NTP_PHASE_LIMIT; /* maximum error (us) */
  46. long time_esterror = NTP_PHASE_LIMIT; /* estimated error (us) */
  47. long time_phase; /* phase offset (scaled us) */
  48. long time_freq = ((1000000 + HZ/2) % HZ - HZ/2) << SHIFT_USEC;
  49. /* frequency offset (scaled ppm)*/
  50. long time_adj; /* tick adjust (scaled 1 / HZ) */
  51. long time_reftime; /* time at last adjustment (s) */
  52. long time_adjust;
  53. long time_adjust_step;
  54. unsigned long event;
  55. extern int do_setitimer(int, struct itimerval *, struct itimerval *);
  56. unsigned long volatile jiffies;
  57. unsigned int * prof_buffer;
  58. unsigned long prof_len;
  59. unsigned long prof_shift;
  60. /*
  61.  * Event timer code
  62.  */
  63. #define TVN_BITS 6
  64. #define TVR_BITS 8
  65. #define TVN_SIZE (1 << TVN_BITS)
  66. #define TVR_SIZE (1 << TVR_BITS)
  67. #define TVN_MASK (TVN_SIZE - 1)
  68. #define TVR_MASK (TVR_SIZE - 1)
  69. struct timer_vec {
  70. int index;
  71. struct list_head vec[TVN_SIZE];
  72. };
  73. struct timer_vec_root {
  74. int index;
  75. struct list_head vec[TVR_SIZE];
  76. };
  77. static struct timer_vec tv5;
  78. static struct timer_vec tv4;
  79. static struct timer_vec tv3;
  80. static struct timer_vec tv2;
  81. static struct timer_vec_root tv1;
  82. static struct timer_vec * const tvecs[] = {
  83. (struct timer_vec *)&tv1, &tv2, &tv3, &tv4, &tv5
  84. };
  85. static struct list_head * run_timer_list_running;
  86. #define NOOF_TVECS (sizeof(tvecs) / sizeof(tvecs[0]))
  87. void init_timervecs (void)
  88. {
  89. int i;
  90. for (i = 0; i < TVN_SIZE; i++) {
  91. INIT_LIST_HEAD(tv5.vec + i);
  92. INIT_LIST_HEAD(tv4.vec + i);
  93. INIT_LIST_HEAD(tv3.vec + i);
  94. INIT_LIST_HEAD(tv2.vec + i);
  95. }
  96. for (i = 0; i < TVR_SIZE; i++)
  97. INIT_LIST_HEAD(tv1.vec + i);
  98. }
  99. static unsigned long timer_jiffies;
  100. static inline void internal_add_timer(struct timer_list *timer)
  101. {
  102. /*
  103.  * must be cli-ed when calling this
  104.  */
  105. unsigned long expires = timer->expires;
  106. unsigned long idx = expires - timer_jiffies;
  107. struct list_head * vec;
  108. if (run_timer_list_running)
  109. vec = run_timer_list_running;
  110. else if (idx < TVR_SIZE) {
  111. int i = expires & TVR_MASK;
  112. vec = tv1.vec + i;
  113. } else if (idx < 1 << (TVR_BITS + TVN_BITS)) {
  114. int i = (expires >> TVR_BITS) & TVN_MASK;
  115. vec = tv2.vec + i;
  116. } else if (idx < 1 << (TVR_BITS + 2 * TVN_BITS)) {
  117. int i = (expires >> (TVR_BITS + TVN_BITS)) & TVN_MASK;
  118. vec =  tv3.vec + i;
  119. } else if (idx < 1 << (TVR_BITS + 3 * TVN_BITS)) {
  120. int i = (expires >> (TVR_BITS + 2 * TVN_BITS)) & TVN_MASK;
  121. vec = tv4.vec + i;
  122. } else if ((signed long) idx < 0) {
  123. /* can happen if you add a timer with expires == jiffies,
  124.  * or you set a timer to go off in the past
  125.  */
  126. vec = tv1.vec + tv1.index;
  127. } else if (idx <= 0xffffffffUL) {
  128. int i = (expires >> (TVR_BITS + 3 * TVN_BITS)) & TVN_MASK;
  129. vec = tv5.vec + i;
  130. } else {
  131. /* Can only get here on architectures with 64-bit jiffies */
  132. INIT_LIST_HEAD(&timer->list);
  133. return;
  134. }
  135. /*
  136.  * Timers are FIFO!
  137.  */
  138. list_add(&timer->list, vec->prev);
  139. }
  140. /* Initialize both explicitly - let's try to have them in the same cache line */
  141. spinlock_t timerlist_lock = SPIN_LOCK_UNLOCKED;
  142. #ifdef CONFIG_SMP
  143. volatile struct timer_list * volatile running_timer;
  144. #define timer_enter(t) do { running_timer = t; mb(); } while (0)
  145. #define timer_exit() do { running_timer = NULL; } while (0)
  146. #define timer_is_running(t) (running_timer == t)
  147. #define timer_synchronize(t) while (timer_is_running(t)) barrier()
  148. #else
  149. #define timer_enter(t) do { } while (0)
  150. #define timer_exit() do { } while (0)
  151. #endif
  152. void add_timer(struct timer_list *timer)
  153. {
  154. unsigned long flags;
  155. spin_lock_irqsave(&timerlist_lock, flags);
  156. if (timer_pending(timer))
  157. goto bug;
  158. internal_add_timer(timer);
  159. spin_unlock_irqrestore(&timerlist_lock, flags);
  160. return;
  161. bug:
  162. spin_unlock_irqrestore(&timerlist_lock, flags);
  163. printk("bug: kernel timer added twice at %p.n",
  164. __builtin_return_address(0));
  165. }
  166. static inline int detach_timer (struct timer_list *timer)
  167. {
  168. if (!timer_pending(timer))
  169. return 0;
  170. list_del(&timer->list);
  171. return 1;
  172. }
  173. int mod_timer(struct timer_list *timer, unsigned long expires)
  174. {
  175. int ret;
  176. unsigned long flags;
  177. spin_lock_irqsave(&timerlist_lock, flags);
  178. timer->expires = expires;
  179. ret = detach_timer(timer);
  180. internal_add_timer(timer);
  181. spin_unlock_irqrestore(&timerlist_lock, flags);
  182. return ret;
  183. }
  184. int del_timer(struct timer_list * timer)
  185. {
  186. int ret;
  187. unsigned long flags;
  188. spin_lock_irqsave(&timerlist_lock, flags);
  189. ret = detach_timer(timer);
  190. timer->list.next = timer->list.prev = NULL;
  191. spin_unlock_irqrestore(&timerlist_lock, flags);
  192. return ret;
  193. }
  194. #ifdef CONFIG_SMP
  195. void sync_timers(void)
  196. {
  197. spin_unlock_wait(&global_bh_lock);
  198. }
  199. /*
  200.  * SMP specific function to delete periodic timer.
  201.  * Caller must disable by some means restarting the timer
  202.  * for new. Upon exit the timer is not queued and handler is not running
  203.  * on any CPU. It returns number of times, which timer was deleted
  204.  * (for reference counting).
  205.  */
  206. int del_timer_sync(struct timer_list * timer)
  207. {
  208. int ret = 0;
  209. for (;;) {
  210. unsigned long flags;
  211. int running;
  212. spin_lock_irqsave(&timerlist_lock, flags);
  213. ret += detach_timer(timer);
  214. timer->list.next = timer->list.prev = 0;
  215. running = timer_is_running(timer);
  216. spin_unlock_irqrestore(&timerlist_lock, flags);
  217. if (!running)
  218. break;
  219. timer_synchronize(timer);
  220. }
  221. return ret;
  222. }
  223. #endif
  224. static inline void cascade_timers(struct timer_vec *tv)
  225. {
  226. /* cascade all the timers from tv up one level */
  227. struct list_head *head, *curr, *next;
  228. head = tv->vec + tv->index;
  229. curr = head->next;
  230. /*
  231.  * We are removing _all_ timers from the list, so we don't  have to
  232.  * detach them individually, just clear the list afterwards.
  233.  */
  234. while (curr != head) {
  235. struct timer_list *tmp;
  236. tmp = list_entry(curr, struct timer_list, list);
  237. next = curr->next;
  238. list_del(curr); // not needed
  239. internal_add_timer(tmp);
  240. curr = next;
  241. }
  242. INIT_LIST_HEAD(head);
  243. tv->index = (tv->index + 1) & TVN_MASK;
  244. }
  245. static inline void run_timer_list(void)
  246. {
  247. spin_lock_irq(&timerlist_lock);
  248. while ((long)(jiffies - timer_jiffies) >= 0) {
  249. LIST_HEAD(queued);
  250. struct list_head *head, *curr;
  251. if (!tv1.index) {
  252. int n = 1;
  253. do {
  254. cascade_timers(tvecs[n]);
  255. } while (tvecs[n]->index == 1 && ++n < NOOF_TVECS);
  256. }
  257. run_timer_list_running = &queued;
  258. repeat:
  259. head = tv1.vec + tv1.index;
  260. curr = head->next;
  261. if (curr != head) {
  262. struct timer_list *timer;
  263. void (*fn)(unsigned long);
  264. unsigned long data;
  265. timer = list_entry(curr, struct timer_list, list);
  266.   fn = timer->function;
  267.   data= timer->data;
  268. detach_timer(timer);
  269. timer->list.next = timer->list.prev = NULL;
  270. timer_enter(timer);
  271. spin_unlock_irq(&timerlist_lock);
  272. fn(data);
  273. spin_lock_irq(&timerlist_lock);
  274. timer_exit();
  275. goto repeat;
  276. }
  277. run_timer_list_running = NULL;
  278. ++timer_jiffies; 
  279. tv1.index = (tv1.index + 1) & TVR_MASK;
  280. curr = queued.next;
  281. while (curr != &queued) {
  282. struct timer_list *timer;
  283. timer = list_entry(curr, struct timer_list, list);
  284. curr = curr->next;
  285. internal_add_timer(timer);
  286. }
  287. }
  288. spin_unlock_irq(&timerlist_lock);
  289. }
  290. spinlock_t tqueue_lock = SPIN_LOCK_UNLOCKED;
  291. void tqueue_bh(void)
  292. {
  293. run_task_queue(&tq_timer);
  294. }
  295. void immediate_bh(void)
  296. {
  297. run_task_queue(&tq_immediate);
  298. }
  299. /*
  300.  * this routine handles the overflow of the microsecond field
  301.  *
  302.  * The tricky bits of code to handle the accurate clock support
  303.  * were provided by Dave Mills (Mills@UDEL.EDU) of NTP fame.
  304.  * They were originally developed for SUN and DEC kernels.
  305.  * All the kudos should go to Dave for this stuff.
  306.  *
  307.  */
  308. static void second_overflow(void)
  309. {
  310.     long ltemp;
  311.     /* Bump the maxerror field */
  312.     time_maxerror += time_tolerance >> SHIFT_USEC;
  313.     if ( time_maxerror > NTP_PHASE_LIMIT ) {
  314. time_maxerror = NTP_PHASE_LIMIT;
  315. time_status |= STA_UNSYNC;
  316.     }
  317.     /*
  318.      * Leap second processing. If in leap-insert state at
  319.      * the end of the day, the system clock is set back one
  320.      * second; if in leap-delete state, the system clock is
  321.      * set ahead one second. The microtime() routine or
  322.      * external clock driver will insure that reported time
  323.      * is always monotonic. The ugly divides should be
  324.      * replaced.
  325.      */
  326.     switch (time_state) {
  327.     case TIME_OK:
  328. if (time_status & STA_INS)
  329.     time_state = TIME_INS;
  330. else if (time_status & STA_DEL)
  331.     time_state = TIME_DEL;
  332. break;
  333.     case TIME_INS:
  334. if (xtime.tv_sec % 86400 == 0) {
  335.     xtime.tv_sec--;
  336.     time_state = TIME_OOP;
  337.     printk(KERN_NOTICE "Clock: inserting leap second 23:59:60 UTCn");
  338. }
  339. break;
  340.     case TIME_DEL:
  341. if ((xtime.tv_sec + 1) % 86400 == 0) {
  342.     xtime.tv_sec++;
  343.     time_state = TIME_WAIT;
  344.     printk(KERN_NOTICE "Clock: deleting leap second 23:59:59 UTCn");
  345. }
  346. break;
  347.     case TIME_OOP:
  348. time_state = TIME_WAIT;
  349. break;
  350.     case TIME_WAIT:
  351. if (!(time_status & (STA_INS | STA_DEL)))
  352.     time_state = TIME_OK;
  353.     }
  354.     /*
  355.      * Compute the phase adjustment for the next second. In
  356.      * PLL mode, the offset is reduced by a fixed factor
  357.      * times the time constant. In FLL mode the offset is
  358.      * used directly. In either mode, the maximum phase
  359.      * adjustment for each second is clamped so as to spread
  360.      * the adjustment over not more than the number of
  361.      * seconds between updates.
  362.      */
  363.     if (time_offset < 0) {
  364. ltemp = -time_offset;
  365. if (!(time_status & STA_FLL))
  366.     ltemp >>= SHIFT_KG + time_constant;
  367. if (ltemp > (MAXPHASE / MINSEC) << SHIFT_UPDATE)
  368.     ltemp = (MAXPHASE / MINSEC) << SHIFT_UPDATE;
  369. time_offset += ltemp;
  370. time_adj = -ltemp << (SHIFT_SCALE - SHIFT_HZ - SHIFT_UPDATE);
  371.     } else {
  372. ltemp = time_offset;
  373. if (!(time_status & STA_FLL))
  374.     ltemp >>= SHIFT_KG + time_constant;
  375. if (ltemp > (MAXPHASE / MINSEC) << SHIFT_UPDATE)
  376.     ltemp = (MAXPHASE / MINSEC) << SHIFT_UPDATE;
  377. time_offset -= ltemp;
  378. time_adj = ltemp << (SHIFT_SCALE - SHIFT_HZ - SHIFT_UPDATE);
  379.     }
  380.     /*
  381.      * Compute the frequency estimate and additional phase
  382.      * adjustment due to frequency error for the next
  383.      * second. When the PPS signal is engaged, gnaw on the
  384.      * watchdog counter and update the frequency computed by
  385.      * the pll and the PPS signal.
  386.      */
  387.     pps_valid++;
  388.     if (pps_valid == PPS_VALID) { /* PPS signal lost */
  389. pps_jitter = MAXTIME;
  390. pps_stabil = MAXFREQ;
  391. time_status &= ~(STA_PPSSIGNAL | STA_PPSJITTER |
  392.  STA_PPSWANDER | STA_PPSERROR);
  393.     }
  394.     ltemp = time_freq + pps_freq;
  395.     if (ltemp < 0)
  396. time_adj -= -ltemp >>
  397.     (SHIFT_USEC + SHIFT_HZ - SHIFT_SCALE);
  398.     else
  399. time_adj += ltemp >>
  400.     (SHIFT_USEC + SHIFT_HZ - SHIFT_SCALE);
  401. #if HZ == 100
  402.     /* Compensate for (HZ==100) != (1 << SHIFT_HZ).
  403.      * Add 25% and 3.125% to get 128.125; => only 0.125% error (p. 14)
  404.      */
  405.     if (time_adj < 0)
  406. time_adj -= (-time_adj >> 2) + (-time_adj >> 5);
  407.     else
  408. time_adj += (time_adj >> 2) + (time_adj >> 5);
  409. #endif
  410. }
  411. /* in the NTP reference this is called "hardclock()" */
  412. static void update_wall_time_one_tick(void)
  413. {
  414. if ( (time_adjust_step = time_adjust) != 0 ) {
  415.     /* We are doing an adjtime thing. 
  416.      *
  417.      * Prepare time_adjust_step to be within bounds.
  418.      * Note that a positive time_adjust means we want the clock
  419.      * to run faster.
  420.      *
  421.      * Limit the amount of the step to be in the range
  422.      * -tickadj .. +tickadj
  423.      */
  424.      if (time_adjust > tickadj)
  425. time_adjust_step = tickadj;
  426.      else if (time_adjust < -tickadj)
  427. time_adjust_step = -tickadj;
  428.      
  429.     /* Reduce by this step the amount of time left  */
  430.     time_adjust -= time_adjust_step;
  431. }
  432. xtime.tv_usec += tick + time_adjust_step;
  433. /*
  434.  * Advance the phase, once it gets to one microsecond, then
  435.  * advance the tick more.
  436.  */
  437. time_phase += time_adj;
  438. if (time_phase <= -FINEUSEC) {
  439. long ltemp = -time_phase >> SHIFT_SCALE;
  440. time_phase += ltemp << SHIFT_SCALE;
  441. xtime.tv_usec -= ltemp;
  442. }
  443. else if (time_phase >= FINEUSEC) {
  444. long ltemp = time_phase >> SHIFT_SCALE;
  445. time_phase -= ltemp << SHIFT_SCALE;
  446. xtime.tv_usec += ltemp;
  447. }
  448. }
  449. /*
  450.  * Using a loop looks inefficient, but "ticks" is
  451.  * usually just one (we shouldn't be losing ticks,
  452.  * we're doing this this way mainly for interrupt
  453.  * latency reasons, not because we think we'll
  454.  * have lots of lost timer ticks
  455.  */
  456. static void update_wall_time(unsigned long ticks)
  457. {
  458. do {
  459. ticks--;
  460. update_wall_time_one_tick();
  461. } while (ticks);
  462. if (xtime.tv_usec >= 1000000) {
  463.     xtime.tv_usec -= 1000000;
  464.     xtime.tv_sec++;
  465.     second_overflow();
  466. }
  467. }
  468. static inline void do_process_times(struct task_struct *p,
  469. unsigned long user, unsigned long system)
  470. {
  471. unsigned long psecs;
  472. psecs = (p->times.tms_utime += user);
  473. psecs += (p->times.tms_stime += system);
  474. if (psecs / HZ > p->rlim[RLIMIT_CPU].rlim_cur) {
  475. /* Send SIGXCPU every second.. */
  476. if (!(psecs % HZ))
  477. send_sig(SIGXCPU, p, 1);
  478. /* and SIGKILL when we go over max.. */
  479. if (psecs / HZ > p->rlim[RLIMIT_CPU].rlim_max)
  480. send_sig(SIGKILL, p, 1);
  481. }
  482. }
  483. static inline void do_it_virt(struct task_struct * p, unsigned long ticks)
  484. {
  485. unsigned long it_virt = p->it_virt_value;
  486. if (it_virt) {
  487. it_virt -= ticks;
  488. if (!it_virt) {
  489. it_virt = p->it_virt_incr;
  490. send_sig(SIGVTALRM, p, 1);
  491. }
  492. p->it_virt_value = it_virt;
  493. }
  494. }
  495. static inline void do_it_prof(struct task_struct *p)
  496. {
  497. unsigned long it_prof = p->it_prof_value;
  498. if (it_prof) {
  499. if (--it_prof == 0) {
  500. it_prof = p->it_prof_incr;
  501. send_sig(SIGPROF, p, 1);
  502. }
  503. p->it_prof_value = it_prof;
  504. }
  505. }
  506. void update_one_process(struct task_struct *p, unsigned long user,
  507. unsigned long system, int cpu)
  508. {
  509. p->per_cpu_utime[cpu] += user;
  510. p->per_cpu_stime[cpu] += system;
  511. do_process_times(p, user, system);
  512. do_it_virt(p, user);
  513. do_it_prof(p);
  514. }
  515. /*
  516.  * Called from the timer interrupt handler to charge one tick to the current 
  517.  * process.  user_tick is 1 if the tick is user time, 0 for system.
  518.  */
  519. void update_process_times(int user_tick)
  520. {
  521. struct task_struct *p = current;
  522. int cpu = smp_processor_id(), system = user_tick ^ 1;
  523. update_one_process(p, user_tick, system, cpu);
  524. if (p->pid) {
  525. if (--p->counter <= 0) {
  526. p->counter = 0;
  527. /*
  528.  * SCHED_FIFO is priority preemption, so this is 
  529.  * not the place to decide whether to reschedule a
  530.  * SCHED_FIFO task or not - Bhavesh Davda
  531.  */
  532. if (p->policy != SCHED_FIFO) {
  533. p->need_resched = 1;
  534. }
  535. }
  536. if (p->nice > 0)
  537. kstat.per_cpu_nice[cpu] += user_tick;
  538. else
  539. kstat.per_cpu_user[cpu] += user_tick;
  540. kstat.per_cpu_system[cpu] += system;
  541. } else if (local_bh_count(cpu) || local_irq_count(cpu) > 1)
  542. kstat.per_cpu_system[cpu] += system;
  543. }
  544. /*
  545.  * Nr of active tasks - counted in fixed-point numbers
  546.  */
  547. static unsigned long count_active_tasks(void)
  548. {
  549. struct task_struct *p;
  550. unsigned long nr = 0;
  551. read_lock(&tasklist_lock);
  552. for_each_task(p) {
  553. if ((p->state == TASK_RUNNING ||
  554.      (p->state & TASK_UNINTERRUPTIBLE)))
  555. nr += FIXED_1;
  556. }
  557. read_unlock(&tasklist_lock);
  558. return nr;
  559. }
  560. /*
  561.  * Hmm.. Changed this, as the GNU make sources (load.c) seems to
  562.  * imply that avenrun[] is the standard name for this kind of thing.
  563.  * Nothing else seems to be standardized: the fractional size etc
  564.  * all seem to differ on different machines.
  565.  */
  566. unsigned long avenrun[3];
  567. static inline void calc_load(unsigned long ticks)
  568. {
  569. unsigned long active_tasks; /* fixed-point */
  570. static int count = LOAD_FREQ;
  571. count -= ticks;
  572. if (count < 0) {
  573. count += LOAD_FREQ;
  574. active_tasks = count_active_tasks();
  575. CALC_LOAD(avenrun[0], EXP_1, active_tasks);
  576. CALC_LOAD(avenrun[1], EXP_5, active_tasks);
  577. CALC_LOAD(avenrun[2], EXP_15, active_tasks);
  578. }
  579. }
  580. /* jiffies at the most recent update of wall time */
  581. unsigned long wall_jiffies;
  582. /*
  583.  * This spinlock protect us from races in SMP while playing with xtime. -arca
  584.  */
  585. rwlock_t xtime_lock = RW_LOCK_UNLOCKED;
  586. static inline void update_times(void)
  587. {
  588. unsigned long ticks;
  589. /*
  590.  * update_times() is run from the raw timer_bh handler so we
  591.  * just know that the irqs are locally enabled and so we don't
  592.  * need to save/restore the flags of the local CPU here. -arca
  593.  */
  594. write_lock_irq(&xtime_lock);
  595. vxtime_lock();
  596. ticks = jiffies - wall_jiffies;
  597. if (ticks) {
  598. wall_jiffies += ticks;
  599. update_wall_time(ticks);
  600. }
  601. vxtime_unlock();
  602. write_unlock_irq(&xtime_lock);
  603. calc_load(ticks);
  604. }
  605. void timer_bh(void)
  606. {
  607. update_times();
  608. run_timer_list();
  609. }
  610. void do_timer(struct pt_regs *regs)
  611. {
  612. (*(unsigned long *)&jiffies)++;
  613. #ifndef CONFIG_SMP
  614. /* SMP process accounting uses the local APIC timer */
  615. update_process_times(user_mode(regs));
  616. #endif
  617. mark_bh(TIMER_BH);
  618. if (TQ_ACTIVE(tq_timer))
  619. mark_bh(TQUEUE_BH);
  620. }
  621. #if !defined(__alpha__) && !defined(__ia64__)
  622. /*
  623.  * For backwards compatibility?  This can be done in libc so Alpha
  624.  * and all newer ports shouldn't need it.
  625.  */
  626. asmlinkage unsigned long sys_alarm(unsigned int seconds)
  627. {
  628. struct itimerval it_new, it_old;
  629. unsigned int oldalarm;
  630. it_new.it_interval.tv_sec = it_new.it_interval.tv_usec = 0;
  631. it_new.it_value.tv_sec = seconds;
  632. it_new.it_value.tv_usec = 0;
  633. do_setitimer(ITIMER_REAL, &it_new, &it_old);
  634. oldalarm = it_old.it_value.tv_sec;
  635. /* ehhh.. We can't return 0 if we have an alarm pending.. */
  636. /* And we'd better return too much than too little anyway */
  637. if (it_old.it_value.tv_usec)
  638. oldalarm++;
  639. return oldalarm;
  640. }
  641. #endif
  642. #ifndef __alpha__
  643. /*
  644.  * The Alpha uses getxpid, getxuid, and getxgid instead.  Maybe this
  645.  * should be moved into arch/i386 instead?
  646.  */
  647. /**
  648.  * sys_getpid - return the thread group id of the current process
  649.  *
  650.  * Note, despite the name, this returns the tgid not the pid.  The tgid and
  651.  * the pid are identical unless CLONE_THREAD was specified on clone() in
  652.  * which case the tgid is the same in all threads of the same group.
  653.  *
  654.  * This is SMP safe as current->tgid does not change.
  655.  */
  656. asmlinkage long sys_getpid(void)
  657. {
  658. return current->tgid;
  659. }
  660. /*
  661.  * This is not strictly SMP safe: p_opptr could change
  662.  * from under us. However, rather than getting any lock
  663.  * we can use an optimistic algorithm: get the parent
  664.  * pid, and go back and check that the parent is still
  665.  * the same. If it has changed (which is extremely unlikely
  666.  * indeed), we just try again..
  667.  *
  668.  * NOTE! This depends on the fact that even if we _do_
  669.  * get an old value of "parent", we can happily dereference
  670.  * the pointer: we just can't necessarily trust the result
  671.  * until we know that the parent pointer is valid.
  672.  *
  673.  * The "mb()" macro is a memory barrier - a synchronizing
  674.  * event. It also makes sure that gcc doesn't optimize
  675.  * away the necessary memory references.. The barrier doesn't
  676.  * have to have all that strong semantics: on x86 we don't
  677.  * really require a synchronizing instruction, for example.
  678.  * The barrier is more important for code generation than
  679.  * for any real memory ordering semantics (even if there is
  680.  * a small window for a race, using the old pointer is
  681.  * harmless for a while).
  682.  */
  683. asmlinkage long sys_getppid(void)
  684. {
  685. int pid;
  686. struct task_struct * me = current;
  687. struct task_struct * parent;
  688. parent = me->p_opptr;
  689. for (;;) {
  690. pid = parent->pid;
  691. #if CONFIG_SMP
  692. {
  693. struct task_struct *old = parent;
  694. mb();
  695. parent = me->p_opptr;
  696. if (old != parent)
  697. continue;
  698. }
  699. #endif
  700. break;
  701. }
  702. return pid;
  703. }
  704. asmlinkage long sys_getuid(void)
  705. {
  706. /* Only we change this so SMP safe */
  707. return current->uid;
  708. }
  709. asmlinkage long sys_geteuid(void)
  710. {
  711. /* Only we change this so SMP safe */
  712. return current->euid;
  713. }
  714. asmlinkage long sys_getgid(void)
  715. {
  716. /* Only we change this so SMP safe */
  717. return current->gid;
  718. }
  719. asmlinkage long sys_getegid(void)
  720. {
  721. /* Only we change this so SMP safe */
  722. return  current->egid;
  723. }
  724. #endif
  725. /* Thread ID - the internal kernel "pid" */
  726. asmlinkage long sys_gettid(void)
  727. {
  728. return current->pid;
  729. }
  730. asmlinkage long sys_nanosleep(struct timespec *rqtp, struct timespec *rmtp)
  731. {
  732. struct timespec t;
  733. unsigned long expire;
  734. if(copy_from_user(&t, rqtp, sizeof(struct timespec)))
  735. return -EFAULT;
  736. if (t.tv_nsec >= 1000000000L || t.tv_nsec < 0 || t.tv_sec < 0)
  737. return -EINVAL;
  738. if (t.tv_sec == 0 && t.tv_nsec <= 2000000L &&
  739.     current->policy != SCHED_OTHER)
  740. {
  741. /*
  742.  * Short delay requests up to 2 ms will be handled with
  743.  * high precision by a busy wait for all real-time processes.
  744.  *
  745.  * Its important on SMP not to do this holding locks.
  746.  */
  747. udelay((t.tv_nsec + 999) / 1000);
  748. return 0;
  749. }
  750. expire = timespec_to_jiffies(&t) + (t.tv_sec || t.tv_nsec);
  751. current->state = TASK_INTERRUPTIBLE;
  752. expire = schedule_timeout(expire);
  753. if (expire) {
  754. if (rmtp) {
  755. jiffies_to_timespec(expire, &t);
  756. if (copy_to_user(rmtp, &t, sizeof(struct timespec)))
  757. return -EFAULT;
  758. }
  759. return -EINTR;
  760. }
  761. return 0;
  762. }