timer.c
上传用户:lgb322
上传日期:2013-02-24
资源大小:30529k
文件大小:21k
源码类别:

嵌入式Linux

开发平台:

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