kern_time.c revision 1.156
1/* $NetBSD: kern_time.c,v 1.156 2009/01/11 02:45:52 christos Exp $ */ 2 3/*- 4 * Copyright (c) 2000, 2004, 2005, 2007, 2008 The NetBSD Foundation, Inc. 5 * All rights reserved. 6 * 7 * This code is derived from software contributed to The NetBSD Foundation 8 * by Christopher G. Demetriou. 9 * 10 * Redistribution and use in source and binary forms, with or without 11 * modification, are permitted provided that the following conditions 12 * are met: 13 * 1. Redistributions of source code must retain the above copyright 14 * notice, this list of conditions and the following disclaimer. 15 * 2. Redistributions in binary form must reproduce the above copyright 16 * notice, this list of conditions and the following disclaimer in the 17 * documentation and/or other materials provided with the distribution. 18 * 19 * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS 20 * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED 21 * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 22 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS 23 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 24 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 25 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 26 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 27 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 28 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 29 * POSSIBILITY OF SUCH DAMAGE. 30 */ 31 32/* 33 * Copyright (c) 1982, 1986, 1989, 1993 34 * The Regents of the University of California. All rights reserved. 35 * 36 * Redistribution and use in source and binary forms, with or without 37 * modification, are permitted provided that the following conditions 38 * are met: 39 * 1. Redistributions of source code must retain the above copyright 40 * notice, this list of conditions and the following disclaimer. 41 * 2. Redistributions in binary form must reproduce the above copyright 42 * notice, this list of conditions and the following disclaimer in the 43 * documentation and/or other materials provided with the distribution. 44 * 3. Neither the name of the University nor the names of its contributors 45 * may be used to endorse or promote products derived from this software 46 * without specific prior written permission. 47 * 48 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 49 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 50 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 51 * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 52 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 53 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 54 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 55 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 56 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 57 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 58 * SUCH DAMAGE. 59 * 60 * @(#)kern_time.c 8.4 (Berkeley) 5/26/95 61 */ 62 63#include <sys/cdefs.h> 64__KERNEL_RCSID(0, "$NetBSD: kern_time.c,v 1.156 2009/01/11 02:45:52 christos Exp $"); 65 66#include <sys/param.h> 67#include <sys/resourcevar.h> 68#include <sys/kernel.h> 69#include <sys/systm.h> 70#include <sys/proc.h> 71#include <sys/vnode.h> 72#include <sys/signalvar.h> 73#include <sys/syslog.h> 74#include <sys/timetc.h> 75#include <sys/timex.h> 76#include <sys/kauth.h> 77#include <sys/mount.h> 78#include <sys/sa.h> 79#include <sys/savar.h> 80#include <sys/syscallargs.h> 81#include <sys/cpu.h> 82 83#include <uvm/uvm_extern.h> 84 85#include "opt_sa.h" 86 87static void timer_intr(void *); 88static void itimerfire(struct ptimer *); 89static void itimerfree(struct ptimers *, int); 90 91kmutex_t timer_lock; 92 93static void *timer_sih; 94static TAILQ_HEAD(, ptimer) timer_queue; 95 96POOL_INIT(ptimer_pool, sizeof(struct ptimer), 0, 0, 0, "ptimerpl", 97 &pool_allocator_nointr, IPL_NONE); 98POOL_INIT(ptimers_pool, sizeof(struct ptimers), 0, 0, 0, "ptimerspl", 99 &pool_allocator_nointr, IPL_NONE); 100 101/* 102 * Initialize timekeeping. 103 */ 104void 105time_init(void) 106{ 107 108 /* nothing yet */ 109} 110 111void 112time_init2(void) 113{ 114 115 TAILQ_INIT(&timer_queue); 116 mutex_init(&timer_lock, MUTEX_DEFAULT, IPL_SCHED); 117 timer_sih = softint_establish(SOFTINT_CLOCK | SOFTINT_MPSAFE, 118 timer_intr, NULL); 119} 120 121/* Time of day and interval timer support. 122 * 123 * These routines provide the kernel entry points to get and set 124 * the time-of-day and per-process interval timers. Subroutines 125 * here provide support for adding and subtracting timeval structures 126 * and decrementing interval timers, optionally reloading the interval 127 * timers when they expire. 128 */ 129 130/* This function is used by clock_settime and settimeofday */ 131static int 132settime1(struct proc *p, const struct timespec *ts, bool check_kauth) 133{ 134 struct timespec delta, now; 135 struct bintime btdelta; 136 lwp_t *l; 137 int s; 138 139 /* WHAT DO WE DO ABOUT PENDING REAL-TIME TIMEOUTS??? */ 140 s = splclock(); 141 nanotime(&now); 142 timespecsub(ts, &now, &delta); 143 144 if (check_kauth && kauth_authorize_system(kauth_cred_get(), 145 KAUTH_SYSTEM_TIME, KAUTH_REQ_SYSTEM_TIME_SYSTEM, __UNCONST(ts), 146 &delta, KAUTH_ARG(check_kauth ? false : true)) != 0) { 147 splx(s); 148 return (EPERM); 149 } 150 151#ifdef notyet 152 if ((delta.tv_sec < 86400) && securelevel > 0) { /* XXX elad - notyet */ 153 splx(s); 154 return (EPERM); 155 } 156#endif 157 158 tc_setclock(ts); 159 160 timespecadd(&boottime, &delta, &boottime); 161 162 /* 163 * XXXSMP: There is a short race between setting the time above 164 * and adjusting LWP's run times. Fixing this properly means 165 * pausing all CPUs while we adjust the clock. 166 */ 167 timespec2bintime(&delta, &btdelta); 168 mutex_enter(proc_lock); 169 LIST_FOREACH(l, &alllwp, l_list) { 170 lwp_lock(l); 171 bintime_add(&l->l_stime, &btdelta); 172 lwp_unlock(l); 173 } 174 mutex_exit(proc_lock); 175 resettodr(); 176 splx(s); 177 178 return (0); 179} 180 181int 182settime(struct proc *p, struct timespec *ts) 183{ 184 return (settime1(p, ts, true)); 185} 186 187/* ARGSUSED */ 188int 189sys___clock_gettime50(struct lwp *l, 190 const struct sys___clock_gettime50_args *uap, register_t *retval) 191{ 192 /* { 193 syscallarg(clockid_t) clock_id; 194 syscallarg(struct timespec *) tp; 195 } */ 196 clockid_t clock_id; 197 struct timespec ats; 198 199 clock_id = SCARG(uap, clock_id); 200 switch (clock_id) { 201 case CLOCK_REALTIME: 202 nanotime(&ats); 203 break; 204 case CLOCK_MONOTONIC: 205 nanouptime(&ats); 206 break; 207 default: 208 return (EINVAL); 209 } 210 211 return copyout(&ats, SCARG(uap, tp), sizeof(ats)); 212} 213 214/* ARGSUSED */ 215int 216sys___clock_settime50(struct lwp *l, 217 const struct sys___clock_settime50_args *uap, register_t *retval) 218{ 219 /* { 220 syscallarg(clockid_t) clock_id; 221 syscallarg(const struct timespec *) tp; 222 } */ 223 int error; 224 struct timespec ats; 225 226 if ((error = copyin(SCARG(uap, tp), &ats, sizeof(ats))) != 0) 227 return error; 228 229 return clock_settime1(l->l_proc, SCARG(uap, clock_id), &ats, true); 230} 231 232 233int 234clock_settime1(struct proc *p, clockid_t clock_id, const struct timespec *tp, 235 bool check_kauth) 236{ 237 int error; 238 239 switch (clock_id) { 240 case CLOCK_REALTIME: 241 if ((error = settime1(p, tp, check_kauth)) != 0) 242 return (error); 243 break; 244 case CLOCK_MONOTONIC: 245 return (EINVAL); /* read-only clock */ 246 default: 247 return (EINVAL); 248 } 249 250 return 0; 251} 252 253int 254sys___clock_getres50(struct lwp *l, const struct sys___clock_getres50_args *uap, 255 register_t *retval) 256{ 257 /* { 258 syscallarg(clockid_t) clock_id; 259 syscallarg(struct timespec *) tp; 260 } */ 261 clockid_t clock_id; 262 struct timespec ts; 263 int error = 0; 264 265 clock_id = SCARG(uap, clock_id); 266 switch (clock_id) { 267 case CLOCK_REALTIME: 268 case CLOCK_MONOTONIC: 269 ts.tv_sec = 0; 270 if (tc_getfrequency() > 1000000000) 271 ts.tv_nsec = 1; 272 else 273 ts.tv_nsec = 1000000000 / tc_getfrequency(); 274 break; 275 default: 276 return (EINVAL); 277 } 278 279 if (SCARG(uap, tp)) 280 error = copyout(&ts, SCARG(uap, tp), sizeof(ts)); 281 282 return error; 283} 284 285/* ARGSUSED */ 286int 287sys___nanosleep50(struct lwp *l, const struct sys___nanosleep50_args *uap, 288 register_t *retval) 289{ 290 /* { 291 syscallarg(struct timespec *) rqtp; 292 syscallarg(struct timespec *) rmtp; 293 } */ 294 struct timespec rmt, rqt; 295 int error, error1; 296 297 error = copyin(SCARG(uap, rqtp), &rqt, sizeof(struct timespec)); 298 if (error) 299 return (error); 300 301 error = nanosleep1(l, &rqt, SCARG(uap, rmtp) ? &rmt : NULL); 302 if (SCARG(uap, rmtp) == NULL || (error != 0 && error != EINTR)) 303 return error; 304 305 error1 = copyout(&rmt, SCARG(uap, rmtp), sizeof(rmt)); 306 return error1 ? error1 : error; 307} 308 309int 310nanosleep1(struct lwp *l, struct timespec *rqt, struct timespec *rmt) 311{ 312 struct timespec rmtstart; 313 int error, timo; 314 315 if (itimespecfix(rqt)) 316 return (EINVAL); 317 318 timo = tstohz(rqt); 319 /* 320 * Avoid inadvertantly sleeping forever 321 */ 322 if (timo == 0) 323 timo = 1; 324 getnanouptime(&rmtstart); 325again: 326 error = kpause("nanoslp", true, timo, NULL); 327 if (rmt != NULL || error == 0) { 328 struct timespec rmtend; 329 struct timespec t0; 330 struct timespec *t; 331 332 getnanouptime(&rmtend); 333 t = (rmt != NULL) ? rmt : &t0; 334 timespecsub(&rmtend, &rmtstart, t); 335 timespecsub(rqt, t, t); 336 if (t->tv_sec < 0) 337 timespecclear(t); 338 if (error == 0) { 339 timo = tstohz(t); 340 if (timo > 0) 341 goto again; 342 } 343 } 344 345 if (error == ERESTART) 346 error = EINTR; 347 if (error == EWOULDBLOCK) 348 error = 0; 349 350 return error; 351} 352 353/* ARGSUSED */ 354int 355sys___gettimeofday50(struct lwp *l, const struct sys___gettimeofday50_args *uap, 356 register_t *retval) 357{ 358 /* { 359 syscallarg(struct timeval *) tp; 360 syscallarg(void *) tzp; really "struct timezone *"; 361 } */ 362 struct timeval atv; 363 int error = 0; 364 struct timezone tzfake; 365 366 if (SCARG(uap, tp)) { 367 microtime(&atv); 368 error = copyout(&atv, SCARG(uap, tp), sizeof(atv)); 369 if (error) 370 return (error); 371 } 372 if (SCARG(uap, tzp)) { 373 /* 374 * NetBSD has no kernel notion of time zone, so we just 375 * fake up a timezone struct and return it if demanded. 376 */ 377 tzfake.tz_minuteswest = 0; 378 tzfake.tz_dsttime = 0; 379 error = copyout(&tzfake, SCARG(uap, tzp), sizeof(tzfake)); 380 } 381 return (error); 382} 383 384/* ARGSUSED */ 385int 386sys___settimeofday50(struct lwp *l, const struct sys___settimeofday50_args *uap, 387 register_t *retval) 388{ 389 /* { 390 syscallarg(const struct timeval *) tv; 391 syscallarg(const void *) tzp; really "const struct timezone *"; 392 } */ 393 394 return settimeofday1(SCARG(uap, tv), true, SCARG(uap, tzp), l, true); 395} 396 397int 398settimeofday1(const struct timeval *utv, bool userspace, 399 const void *utzp, struct lwp *l, bool check_kauth) 400{ 401 struct timeval atv; 402 struct timespec ts; 403 int error; 404 405 /* Verify all parameters before changing time. */ 406 407 /* 408 * NetBSD has no kernel notion of time zone, and only an 409 * obsolete program would try to set it, so we log a warning. 410 */ 411 if (utzp) 412 log(LOG_WARNING, "pid %d attempted to set the " 413 "(obsolete) kernel time zone\n", l->l_proc->p_pid); 414 415 if (utv == NULL) 416 return 0; 417 418 if (userspace) { 419 if ((error = copyin(utv, &atv, sizeof(atv))) != 0) 420 return error; 421 utv = &atv; 422 } 423 424 TIMEVAL_TO_TIMESPEC(utv, &ts); 425 return settime1(l->l_proc, &ts, check_kauth); 426} 427 428int time_adjusted; /* set if an adjustment is made */ 429 430/* ARGSUSED */ 431int 432sys___adjtime50(struct lwp *l, const struct sys___adjtime50_args *uap, 433 register_t *retval) 434{ 435 /* { 436 syscallarg(const struct timeval *) delta; 437 syscallarg(struct timeval *) olddelta; 438 } */ 439 int error = 0; 440 struct timeval atv, oldatv; 441 442 if ((error = kauth_authorize_system(l->l_cred, KAUTH_SYSTEM_TIME, 443 KAUTH_REQ_SYSTEM_TIME_ADJTIME, NULL, NULL, NULL)) != 0) 444 return error; 445 446 if (SCARG(uap, delta)) { 447 error = copyin(SCARG(uap, delta), &atv, 448 sizeof(*SCARG(uap, delta))); 449 if (error) 450 return (error); 451 } 452 adjtime1(SCARG(uap, delta) ? &atv : NULL, 453 SCARG(uap, olddelta) ? &oldatv : NULL, l->l_proc); 454 if (SCARG(uap, olddelta)) 455 error = copyout(&oldatv, SCARG(uap, olddelta), 456 sizeof(*SCARG(uap, olddelta))); 457 return error; 458} 459 460void 461adjtime1(const struct timeval *delta, struct timeval *olddelta, struct proc *p) 462{ 463 extern int64_t time_adjtime; /* in kern_ntptime.c */ 464 465 if (olddelta) { 466 mutex_spin_enter(&timecounter_lock); 467 olddelta->tv_sec = time_adjtime / 1000000; 468 olddelta->tv_usec = time_adjtime % 1000000; 469 if (olddelta->tv_usec < 0) { 470 olddelta->tv_usec += 1000000; 471 olddelta->tv_sec--; 472 } 473 } 474 475 if (delta) { 476 mutex_spin_enter(&timecounter_lock); 477 time_adjtime = (int64_t)delta->tv_sec * 1000000 + delta->tv_usec; 478 479 if (time_adjtime) { 480 /* We need to save the system time during shutdown */ 481 time_adjusted |= 1; 482 } 483 mutex_spin_exit(&timecounter_lock); 484 } 485} 486 487/* 488 * Interval timer support. Both the BSD getitimer() family and the POSIX 489 * timer_*() family of routines are supported. 490 * 491 * All timers are kept in an array pointed to by p_timers, which is 492 * allocated on demand - many processes don't use timers at all. The 493 * first three elements in this array are reserved for the BSD timers: 494 * element 0 is ITIMER_REAL, element 1 is ITIMER_VIRTUAL, and element 495 * 2 is ITIMER_PROF. The rest may be allocated by the timer_create() 496 * syscall. 497 * 498 * Realtime timers are kept in the ptimer structure as an absolute 499 * time; virtual time timers are kept as a linked list of deltas. 500 * Virtual time timers are processed in the hardclock() routine of 501 * kern_clock.c. The real time timer is processed by a callout 502 * routine, called from the softclock() routine. Since a callout may 503 * be delayed in real time due to interrupt processing in the system, 504 * it is possible for the real time timeout routine (realtimeexpire, 505 * given below), to be delayed in real time past when it is supposed 506 * to occur. It does not suffice, therefore, to reload the real timer 507 * .it_value from the real time timers .it_interval. Rather, we 508 * compute the next time in absolute time the timer should go off. */ 509 510/* Allocate a POSIX realtime timer. */ 511int 512sys_timer_create(struct lwp *l, const struct sys_timer_create_args *uap, 513 register_t *retval) 514{ 515 /* { 516 syscallarg(clockid_t) clock_id; 517 syscallarg(struct sigevent *) evp; 518 syscallarg(timer_t *) timerid; 519 } */ 520 521 return timer_create1(SCARG(uap, timerid), SCARG(uap, clock_id), 522 SCARG(uap, evp), copyin, l); 523} 524 525int 526timer_create1(timer_t *tid, clockid_t id, struct sigevent *evp, 527 copyin_t fetch_event, struct lwp *l) 528{ 529 int error; 530 timer_t timerid; 531 struct ptimers *pts; 532 struct ptimer *pt; 533 struct proc *p; 534 535 p = l->l_proc; 536 537 if (id < CLOCK_REALTIME || id > CLOCK_PROF) 538 return (EINVAL); 539 540 if ((pts = p->p_timers) == NULL) 541 pts = timers_alloc(p); 542 543 pt = pool_get(&ptimer_pool, PR_WAITOK); 544 if (evp != NULL) { 545 if (((error = 546 (*fetch_event)(evp, &pt->pt_ev, sizeof(pt->pt_ev))) != 0) || 547 ((pt->pt_ev.sigev_notify < SIGEV_NONE) || 548 (pt->pt_ev.sigev_notify > SIGEV_SA))) { 549 pool_put(&ptimer_pool, pt); 550 return (error ? error : EINVAL); 551 } 552 } 553 554 /* Find a free timer slot, skipping those reserved for setitimer(). */ 555 mutex_spin_enter(&timer_lock); 556 for (timerid = 3; timerid < TIMER_MAX; timerid++) 557 if (pts->pts_timers[timerid] == NULL) 558 break; 559 if (timerid == TIMER_MAX) { 560 mutex_spin_exit(&timer_lock); 561 pool_put(&ptimer_pool, pt); 562 return EAGAIN; 563 } 564 if (evp == NULL) { 565 pt->pt_ev.sigev_notify = SIGEV_SIGNAL; 566 switch (id) { 567 case CLOCK_REALTIME: 568 pt->pt_ev.sigev_signo = SIGALRM; 569 break; 570 case CLOCK_VIRTUAL: 571 pt->pt_ev.sigev_signo = SIGVTALRM; 572 break; 573 case CLOCK_PROF: 574 pt->pt_ev.sigev_signo = SIGPROF; 575 break; 576 } 577 pt->pt_ev.sigev_value.sival_int = timerid; 578 } 579 pt->pt_info.ksi_signo = pt->pt_ev.sigev_signo; 580 pt->pt_info.ksi_errno = 0; 581 pt->pt_info.ksi_code = 0; 582 pt->pt_info.ksi_pid = p->p_pid; 583 pt->pt_info.ksi_uid = kauth_cred_getuid(l->l_cred); 584 pt->pt_info.ksi_value = pt->pt_ev.sigev_value; 585 pt->pt_type = id; 586 pt->pt_proc = p; 587 pt->pt_overruns = 0; 588 pt->pt_poverruns = 0; 589 pt->pt_entry = timerid; 590 pt->pt_queued = false; 591 timespecclear(&pt->pt_time.it_value); 592 if (id == CLOCK_REALTIME) 593 callout_init(&pt->pt_ch, 0); 594 else 595 pt->pt_active = 0; 596 597 pts->pts_timers[timerid] = pt; 598 mutex_spin_exit(&timer_lock); 599 600 return copyout(&timerid, tid, sizeof(timerid)); 601} 602 603/* Delete a POSIX realtime timer */ 604int 605sys_timer_delete(struct lwp *l, const struct sys_timer_delete_args *uap, 606 register_t *retval) 607{ 608 /* { 609 syscallarg(timer_t) timerid; 610 } */ 611 struct proc *p = l->l_proc; 612 timer_t timerid; 613 struct ptimers *pts; 614 struct ptimer *pt, *ptn; 615 616 timerid = SCARG(uap, timerid); 617 pts = p->p_timers; 618 619 if (pts == NULL || timerid < 2 || timerid >= TIMER_MAX) 620 return (EINVAL); 621 622 mutex_spin_enter(&timer_lock); 623 if ((pt = pts->pts_timers[timerid]) == NULL) { 624 mutex_spin_exit(&timer_lock); 625 return (EINVAL); 626 } 627 if (pt->pt_type != CLOCK_REALTIME) { 628 if (pt->pt_active) { 629 ptn = LIST_NEXT(pt, pt_list); 630 LIST_REMOVE(pt, pt_list); 631 for ( ; ptn; ptn = LIST_NEXT(ptn, pt_list)) 632 timespecadd(&pt->pt_time.it_value, 633 &ptn->pt_time.it_value, 634 &ptn->pt_time.it_value); 635 pt->pt_active = 0; 636 } 637 } 638 itimerfree(pts, timerid); 639 640 return (0); 641} 642 643/* 644 * Set up the given timer. The value in pt->pt_time.it_value is taken 645 * to be an absolute time for CLOCK_REALTIME timers and a relative 646 * time for virtual timers. 647 * Must be called at splclock(). 648 */ 649void 650timer_settime(struct ptimer *pt) 651{ 652 struct ptimer *ptn, *pptn; 653 struct ptlist *ptl; 654 655 KASSERT(mutex_owned(&timer_lock)); 656 657 if (pt->pt_type == CLOCK_REALTIME) { 658 callout_stop(&pt->pt_ch); 659 if (timespecisset(&pt->pt_time.it_value)) { 660 /* 661 * Don't need to check tshzto() return value, here. 662 * callout_reset() does it for us. 663 */ 664 callout_reset(&pt->pt_ch, tshzto(&pt->pt_time.it_value), 665 realtimerexpire, pt); 666 } 667 } else { 668 if (pt->pt_active) { 669 ptn = LIST_NEXT(pt, pt_list); 670 LIST_REMOVE(pt, pt_list); 671 for ( ; ptn; ptn = LIST_NEXT(ptn, pt_list)) 672 timespecadd(&pt->pt_time.it_value, 673 &ptn->pt_time.it_value, 674 &ptn->pt_time.it_value); 675 } 676 if (timespecisset(&pt->pt_time.it_value)) { 677 if (pt->pt_type == CLOCK_VIRTUAL) 678 ptl = &pt->pt_proc->p_timers->pts_virtual; 679 else 680 ptl = &pt->pt_proc->p_timers->pts_prof; 681 682 for (ptn = LIST_FIRST(ptl), pptn = NULL; 683 ptn && timespeccmp(&pt->pt_time.it_value, 684 &ptn->pt_time.it_value, >); 685 pptn = ptn, ptn = LIST_NEXT(ptn, pt_list)) 686 timespecsub(&pt->pt_time.it_value, 687 &ptn->pt_time.it_value, 688 &pt->pt_time.it_value); 689 690 if (pptn) 691 LIST_INSERT_AFTER(pptn, pt, pt_list); 692 else 693 LIST_INSERT_HEAD(ptl, pt, pt_list); 694 695 for ( ; ptn ; ptn = LIST_NEXT(ptn, pt_list)) 696 timespecsub(&ptn->pt_time.it_value, 697 &pt->pt_time.it_value, 698 &ptn->pt_time.it_value); 699 700 pt->pt_active = 1; 701 } else 702 pt->pt_active = 0; 703 } 704} 705 706void 707timer_gettime(struct ptimer *pt, struct itimerspec *aits) 708{ 709 struct timespec now; 710 struct ptimer *ptn; 711 712 KASSERT(mutex_owned(&timer_lock)); 713 714 *aits = pt->pt_time; 715 if (pt->pt_type == CLOCK_REALTIME) { 716 /* 717 * Convert from absolute to relative time in .it_value 718 * part of real time timer. If time for real time 719 * timer has passed return 0, else return difference 720 * between current time and time for the timer to go 721 * off. 722 */ 723 if (timespecisset(&aits->it_value)) { 724 getnanotime(&now); 725 if (timespeccmp(&aits->it_value, &now, <)) 726 timespecclear(&aits->it_value); 727 else 728 timespecsub(&aits->it_value, &now, 729 &aits->it_value); 730 } 731 } else if (pt->pt_active) { 732 if (pt->pt_type == CLOCK_VIRTUAL) 733 ptn = LIST_FIRST(&pt->pt_proc->p_timers->pts_virtual); 734 else 735 ptn = LIST_FIRST(&pt->pt_proc->p_timers->pts_prof); 736 for ( ; ptn && ptn != pt; ptn = LIST_NEXT(ptn, pt_list)) 737 timespecadd(&aits->it_value, 738 &ptn->pt_time.it_value, &aits->it_value); 739 KASSERT(ptn != NULL); /* pt should be findable on the list */ 740 } else 741 timespecclear(&aits->it_value); 742} 743 744 745 746/* Set and arm a POSIX realtime timer */ 747int 748sys___timer_settime50(struct lwp *l, 749 const struct sys___timer_settime50_args *uap, 750 register_t *retval) 751{ 752 /* { 753 syscallarg(timer_t) timerid; 754 syscallarg(int) flags; 755 syscallarg(const struct itimerspec *) value; 756 syscallarg(struct itimerspec *) ovalue; 757 } */ 758 int error; 759 struct itimerspec value, ovalue, *ovp = NULL; 760 761 if ((error = copyin(SCARG(uap, value), &value, 762 sizeof(struct itimerspec))) != 0) 763 return (error); 764 765 if (SCARG(uap, ovalue)) 766 ovp = &ovalue; 767 768 if ((error = dotimer_settime(SCARG(uap, timerid), &value, ovp, 769 SCARG(uap, flags), l->l_proc)) != 0) 770 return error; 771 772 if (ovp) 773 return copyout(&ovalue, SCARG(uap, ovalue), 774 sizeof(struct itimerspec)); 775 return 0; 776} 777 778int 779dotimer_settime(int timerid, struct itimerspec *value, 780 struct itimerspec *ovalue, int flags, struct proc *p) 781{ 782 struct timespec now; 783 struct itimerspec val, oval; 784 struct ptimers *pts; 785 struct ptimer *pt; 786 787 pts = p->p_timers; 788 789 if (pts == NULL || timerid < 2 || timerid >= TIMER_MAX) 790 return EINVAL; 791 val = *value; 792 if (itimespecfix(&val.it_value) || itimespecfix(&val.it_interval)) 793 return EINVAL; 794 795 mutex_spin_enter(&timer_lock); 796 if ((pt = pts->pts_timers[timerid]) == NULL) { 797 mutex_spin_exit(&timer_lock); 798 return EINVAL; 799 } 800 801 oval = pt->pt_time; 802 pt->pt_time = val; 803 804 /* 805 * If we've been passed a relative time for a realtime timer, 806 * convert it to absolute; if an absolute time for a virtual 807 * timer, convert it to relative and make sure we don't set it 808 * to zero, which would cancel the timer, or let it go 809 * negative, which would confuse the comparison tests. 810 */ 811 if (timespecisset(&pt->pt_time.it_value)) { 812 if (pt->pt_type == CLOCK_REALTIME) { 813 if ((flags & TIMER_ABSTIME) == 0) { 814 getnanotime(&now); 815 timespecadd(&pt->pt_time.it_value, &now, 816 &pt->pt_time.it_value); 817 } 818 } else { 819 if ((flags & TIMER_ABSTIME) != 0) { 820 getnanotime(&now); 821 timespecsub(&pt->pt_time.it_value, &now, 822 &pt->pt_time.it_value); 823 if (!timespecisset(&pt->pt_time.it_value) || 824 pt->pt_time.it_value.tv_sec < 0) { 825 pt->pt_time.it_value.tv_sec = 0; 826 pt->pt_time.it_value.tv_nsec = 1; 827 } 828 } 829 } 830 } 831 832 timer_settime(pt); 833 mutex_spin_exit(&timer_lock); 834 835 if (ovalue) 836 *ovalue = oval; 837 838 return (0); 839} 840 841/* Return the time remaining until a POSIX timer fires. */ 842int 843sys___timer_gettime50(struct lwp *l, 844 const struct sys___timer_gettime50_args *uap, register_t *retval) 845{ 846 /* { 847 syscallarg(timer_t) timerid; 848 syscallarg(struct itimerspec *) value; 849 } */ 850 struct itimerspec its; 851 int error; 852 853 if ((error = dotimer_gettime(SCARG(uap, timerid), l->l_proc, 854 &its)) != 0) 855 return error; 856 857 return copyout(&its, SCARG(uap, value), sizeof(its)); 858} 859 860int 861dotimer_gettime(int timerid, struct proc *p, struct itimerspec *its) 862{ 863 struct ptimer *pt; 864 struct ptimers *pts; 865 866 pts = p->p_timers; 867 if (pts == NULL || timerid < 2 || timerid >= TIMER_MAX) 868 return (EINVAL); 869 mutex_spin_enter(&timer_lock); 870 if ((pt = pts->pts_timers[timerid]) == NULL) { 871 mutex_spin_exit(&timer_lock); 872 return (EINVAL); 873 } 874 timer_gettime(pt, its); 875 mutex_spin_exit(&timer_lock); 876 877 return 0; 878} 879 880/* 881 * Return the count of the number of times a periodic timer expired 882 * while a notification was already pending. The counter is reset when 883 * a timer expires and a notification can be posted. 884 */ 885int 886sys_timer_getoverrun(struct lwp *l, const struct sys_timer_getoverrun_args *uap, 887 register_t *retval) 888{ 889 /* { 890 syscallarg(timer_t) timerid; 891 } */ 892 struct proc *p = l->l_proc; 893 struct ptimers *pts; 894 int timerid; 895 struct ptimer *pt; 896 897 timerid = SCARG(uap, timerid); 898 899 pts = p->p_timers; 900 if (pts == NULL || timerid < 2 || timerid >= TIMER_MAX) 901 return (EINVAL); 902 mutex_spin_enter(&timer_lock); 903 if ((pt = pts->pts_timers[timerid]) == NULL) { 904 mutex_spin_exit(&timer_lock); 905 return (EINVAL); 906 } 907 *retval = pt->pt_poverruns; 908 mutex_spin_exit(&timer_lock); 909 910 return (0); 911} 912 913#ifdef KERN_SA 914/* Glue function that triggers an upcall; called from userret(). */ 915void 916timerupcall(struct lwp *l) 917{ 918 struct ptimers *pt = l->l_proc->p_timers; 919 struct proc *p = l->l_proc; 920 unsigned int i, fired, done; 921 922 KDASSERT(l->l_proc->p_sa); 923 /* Bail out if we do not own the virtual processor */ 924 if (l->l_savp->savp_lwp != l) 925 return ; 926 927 mutex_enter(p->p_lock); 928 929 fired = pt->pts_fired; 930 done = 0; 931 while ((i = ffs(fired)) != 0) { 932 siginfo_t *si; 933 int mask = 1 << --i; 934 int f; 935 936 f = ~l->l_pflag & LP_SA_NOBLOCK; 937 l->l_pflag |= LP_SA_NOBLOCK; 938 si = siginfo_alloc(PR_WAITOK); 939 si->_info = pt->pts_timers[i]->pt_info.ksi_info; 940 if (sa_upcall(l, SA_UPCALL_SIGEV | SA_UPCALL_DEFER, NULL, l, 941 sizeof(*si), si, siginfo_free) != 0) { 942 siginfo_free(si); 943 /* XXX What do we do here?? */ 944 } else 945 done |= mask; 946 fired &= ~mask; 947 l->l_pflag ^= f; 948 } 949 pt->pts_fired &= ~done; 950 if (pt->pts_fired == 0) 951 l->l_proc->p_timerpend = 0; 952 953 mutex_exit(p->p_lock); 954} 955#endif /* KERN_SA */ 956 957/* 958 * Real interval timer expired: 959 * send process whose timer expired an alarm signal. 960 * If time is not set up to reload, then just return. 961 * Else compute next time timer should go off which is > current time. 962 * This is where delay in processing this timeout causes multiple 963 * SIGALRM calls to be compressed into one. 964 */ 965void 966realtimerexpire(void *arg) 967{ 968 uint64_t last_val, next_val, interval, now_ms; 969 struct timespec now, next; 970 struct ptimer *pt; 971 int backwards; 972 973 pt = arg; 974 975 mutex_spin_enter(&timer_lock); 976 itimerfire(pt); 977 978 if (!timespecisset(&pt->pt_time.it_interval)) { 979 timespecclear(&pt->pt_time.it_value); 980 mutex_spin_exit(&timer_lock); 981 return; 982 } 983 984 getnanotime(&now); 985 backwards = (timespeccmp(&pt->pt_time.it_value, &now, >)); 986 timespecadd(&pt->pt_time.it_value, &pt->pt_time.it_interval, &next); 987 /* Handle the easy case of non-overflown timers first. */ 988 if (!backwards && timespeccmp(&next, &now, >)) { 989 pt->pt_time.it_value = next; 990 } else { 991 now_ms = timespec2ns(&now); 992 last_val = timespec2ns(&pt->pt_time.it_value); 993 interval = timespec2ns(&pt->pt_time.it_interval); 994 995 next_val = now_ms + 996 (now_ms - last_val + interval - 1) % interval; 997 998 if (backwards) 999 next_val += interval; 1000 else 1001 pt->pt_overruns += (now_ms - last_val) / interval; 1002 1003 pt->pt_time.it_value.tv_sec = next_val / 1000000000; 1004 pt->pt_time.it_value.tv_nsec = next_val % 1000000000; 1005 } 1006 1007 /* 1008 * Don't need to check tshzto() return value, here. 1009 * callout_reset() does it for us. 1010 */ 1011 callout_reset(&pt->pt_ch, tshzto(&pt->pt_time.it_value), 1012 realtimerexpire, pt); 1013 mutex_spin_exit(&timer_lock); 1014} 1015 1016/* BSD routine to get the value of an interval timer. */ 1017/* ARGSUSED */ 1018int 1019sys___getitimer50(struct lwp *l, const struct sys___getitimer50_args *uap, 1020 register_t *retval) 1021{ 1022 /* { 1023 syscallarg(int) which; 1024 syscallarg(struct itimerval *) itv; 1025 } */ 1026 struct proc *p = l->l_proc; 1027 struct itimerval aitv; 1028 int error; 1029 1030 error = dogetitimer(p, SCARG(uap, which), &aitv); 1031 if (error) 1032 return error; 1033 return (copyout(&aitv, SCARG(uap, itv), sizeof(struct itimerval))); 1034} 1035 1036int 1037dogetitimer(struct proc *p, int which, struct itimerval *itvp) 1038{ 1039 struct ptimers *pts; 1040 struct ptimer *pt; 1041 struct itimerspec its; 1042 1043 if ((u_int)which > ITIMER_PROF) 1044 return (EINVAL); 1045 1046 mutex_spin_enter(&timer_lock); 1047 pts = p->p_timers; 1048 if (pts == NULL || (pt = pts->pts_timers[which]) == NULL) { 1049 timerclear(&itvp->it_value); 1050 timerclear(&itvp->it_interval); 1051 } else { 1052 timer_gettime(pt, &its); 1053 TIMESPEC_TO_TIMEVAL(&itvp->it_value, &its.it_value); 1054 TIMESPEC_TO_TIMEVAL(&itvp->it_interval, &its.it_interval); 1055 } 1056 mutex_spin_exit(&timer_lock); 1057 1058 return 0; 1059} 1060 1061/* BSD routine to set/arm an interval timer. */ 1062/* ARGSUSED */ 1063int 1064sys___setitimer50(struct lwp *l, const struct sys___setitimer50_args *uap, 1065 register_t *retval) 1066{ 1067 /* { 1068 syscallarg(int) which; 1069 syscallarg(const struct itimerval *) itv; 1070 syscallarg(struct itimerval *) oitv; 1071 } */ 1072 struct proc *p = l->l_proc; 1073 int which = SCARG(uap, which); 1074 struct sys___getitimer50_args getargs; 1075 const struct itimerval *itvp; 1076 struct itimerval aitv; 1077 int error; 1078 1079 if ((u_int)which > ITIMER_PROF) 1080 return (EINVAL); 1081 itvp = SCARG(uap, itv); 1082 if (itvp && 1083 (error = copyin(itvp, &aitv, sizeof(struct itimerval)) != 0)) 1084 return (error); 1085 if (SCARG(uap, oitv) != NULL) { 1086 SCARG(&getargs, which) = which; 1087 SCARG(&getargs, itv) = SCARG(uap, oitv); 1088 if ((error = sys___getitimer50(l, &getargs, retval)) != 0) 1089 return (error); 1090 } 1091 if (itvp == 0) 1092 return (0); 1093 1094 return dosetitimer(p, which, &aitv); 1095} 1096 1097int 1098dosetitimer(struct proc *p, int which, struct itimerval *itvp) 1099{ 1100 struct timespec now; 1101 struct ptimers *pts; 1102 struct ptimer *pt, *spare; 1103 1104 if (itimerfix(&itvp->it_value) || itimerfix(&itvp->it_interval)) 1105 return (EINVAL); 1106 1107 /* 1108 * Don't bother allocating data structures if the process just 1109 * wants to clear the timer. 1110 */ 1111 spare = NULL; 1112 pts = p->p_timers; 1113 retry: 1114 if (!timerisset(&itvp->it_value) && (pts == NULL || 1115 pts->pts_timers[which] == NULL)) 1116 return (0); 1117 if (pts == NULL) 1118 pts = timers_alloc(p); 1119 mutex_spin_enter(&timer_lock); 1120 pt = pts->pts_timers[which]; 1121 if (pt == NULL) { 1122 if (spare == NULL) { 1123 mutex_spin_exit(&timer_lock); 1124 spare = pool_get(&ptimer_pool, PR_WAITOK); 1125 goto retry; 1126 } 1127 pt = spare; 1128 spare = NULL; 1129 pt->pt_ev.sigev_notify = SIGEV_SIGNAL; 1130 pt->pt_ev.sigev_value.sival_int = which; 1131 pt->pt_overruns = 0; 1132 pt->pt_proc = p; 1133 pt->pt_type = which; 1134 pt->pt_entry = which; 1135 pt->pt_queued = false; 1136 if (pt->pt_type == CLOCK_REALTIME) 1137 callout_init(&pt->pt_ch, CALLOUT_MPSAFE); 1138 else 1139 pt->pt_active = 0; 1140 1141 switch (which) { 1142 case ITIMER_REAL: 1143 pt->pt_ev.sigev_signo = SIGALRM; 1144 break; 1145 case ITIMER_VIRTUAL: 1146 pt->pt_ev.sigev_signo = SIGVTALRM; 1147 break; 1148 case ITIMER_PROF: 1149 pt->pt_ev.sigev_signo = SIGPROF; 1150 break; 1151 } 1152 pts->pts_timers[which] = pt; 1153 } 1154 1155 TIMEVAL_TO_TIMESPEC(&itvp->it_value, &pt->pt_time.it_value); 1156 TIMEVAL_TO_TIMESPEC(&itvp->it_interval, &pt->pt_time.it_interval); 1157 1158 if ((which == ITIMER_REAL) && timespecisset(&pt->pt_time.it_value)) { 1159 /* Convert to absolute time */ 1160 /* XXX need to wrap in splclock for timecounters case? */ 1161 getnanotime(&now); 1162 timespecadd(&pt->pt_time.it_value, &now, &pt->pt_time.it_value); 1163 } 1164 timer_settime(pt); 1165 mutex_spin_exit(&timer_lock); 1166 if (spare != NULL) 1167 pool_put(&ptimer_pool, spare); 1168 1169 return (0); 1170} 1171 1172/* Utility routines to manage the array of pointers to timers. */ 1173struct ptimers * 1174timers_alloc(struct proc *p) 1175{ 1176 struct ptimers *pts; 1177 int i; 1178 1179 pts = pool_get(&ptimers_pool, PR_WAITOK); 1180 LIST_INIT(&pts->pts_virtual); 1181 LIST_INIT(&pts->pts_prof); 1182 for (i = 0; i < TIMER_MAX; i++) 1183 pts->pts_timers[i] = NULL; 1184 pts->pts_fired = 0; 1185 mutex_spin_enter(&timer_lock); 1186 if (p->p_timers == NULL) { 1187 p->p_timers = pts; 1188 mutex_spin_exit(&timer_lock); 1189 return pts; 1190 } 1191 mutex_spin_exit(&timer_lock); 1192 pool_put(&ptimers_pool, pts); 1193 return p->p_timers; 1194} 1195 1196/* 1197 * Clean up the per-process timers. If "which" is set to TIMERS_ALL, 1198 * then clean up all timers and free all the data structures. If 1199 * "which" is set to TIMERS_POSIX, only clean up the timers allocated 1200 * by timer_create(), not the BSD setitimer() timers, and only free the 1201 * structure if none of those remain. 1202 */ 1203void 1204timers_free(struct proc *p, int which) 1205{ 1206 struct ptimers *pts; 1207 struct ptimer *ptn; 1208 struct timespec ts; 1209 int i; 1210 1211 if (p->p_timers == NULL) 1212 return; 1213 1214 pts = p->p_timers; 1215 mutex_spin_enter(&timer_lock); 1216 if (which == TIMERS_ALL) { 1217 p->p_timers = NULL; 1218 i = 0; 1219 } else { 1220 timespecclear(&ts); 1221 for (ptn = LIST_FIRST(&pts->pts_virtual); 1222 ptn && ptn != pts->pts_timers[ITIMER_VIRTUAL]; 1223 ptn = LIST_NEXT(ptn, pt_list)) { 1224 KASSERT(ptn->pt_type != CLOCK_REALTIME); 1225 timespecadd(&ts, &ptn->pt_time.it_value, &ts); 1226 } 1227 LIST_FIRST(&pts->pts_virtual) = NULL; 1228 if (ptn) { 1229 KASSERT(ptn->pt_type != CLOCK_REALTIME); 1230 timespecadd(&ts, &ptn->pt_time.it_value, 1231 &ptn->pt_time.it_value); 1232 LIST_INSERT_HEAD(&pts->pts_virtual, ptn, pt_list); 1233 } 1234 timespecclear(&ts); 1235 for (ptn = LIST_FIRST(&pts->pts_prof); 1236 ptn && ptn != pts->pts_timers[ITIMER_PROF]; 1237 ptn = LIST_NEXT(ptn, pt_list)) { 1238 KASSERT(ptn->pt_type != CLOCK_REALTIME); 1239 timespecadd(&ts, &ptn->pt_time.it_value, &ts); 1240 } 1241 LIST_FIRST(&pts->pts_prof) = NULL; 1242 if (ptn) { 1243 KASSERT(ptn->pt_type != CLOCK_REALTIME); 1244 timespecadd(&ts, &ptn->pt_time.it_value, 1245 &ptn->pt_time.it_value); 1246 LIST_INSERT_HEAD(&pts->pts_prof, ptn, pt_list); 1247 } 1248 i = 3; 1249 } 1250 for ( ; i < TIMER_MAX; i++) { 1251 if (pts->pts_timers[i] != NULL) { 1252 itimerfree(pts, i); 1253 mutex_spin_enter(&timer_lock); 1254 } 1255 } 1256 if (pts->pts_timers[0] == NULL && pts->pts_timers[1] == NULL && 1257 pts->pts_timers[2] == NULL) { 1258 p->p_timers = NULL; 1259 mutex_spin_exit(&timer_lock); 1260 pool_put(&ptimers_pool, pts); 1261 } else 1262 mutex_spin_exit(&timer_lock); 1263} 1264 1265static void 1266itimerfree(struct ptimers *pts, int index) 1267{ 1268 struct ptimer *pt; 1269 1270 KASSERT(mutex_owned(&timer_lock)); 1271 1272 pt = pts->pts_timers[index]; 1273 pts->pts_timers[index] = NULL; 1274 if (pt->pt_type == CLOCK_REALTIME) 1275 callout_halt(&pt->pt_ch, &timer_lock); 1276 else if (pt->pt_queued) 1277 TAILQ_REMOVE(&timer_queue, pt, pt_chain); 1278 mutex_spin_exit(&timer_lock); 1279 if (pt->pt_type == CLOCK_REALTIME) 1280 callout_destroy(&pt->pt_ch); 1281 pool_put(&ptimer_pool, pt); 1282} 1283 1284/* 1285 * Decrement an interval timer by a specified number 1286 * of nanoseconds, which must be less than a second, 1287 * i.e. < 1000000000. If the timer expires, then reload 1288 * it. In this case, carry over (nsec - old value) to 1289 * reduce the value reloaded into the timer so that 1290 * the timer does not drift. This routine assumes 1291 * that it is called in a context where the timers 1292 * on which it is operating cannot change in value. 1293 */ 1294static int 1295itimerdecr(struct ptimer *pt, int nsec) 1296{ 1297 struct itimerspec *itp; 1298 1299 KASSERT(mutex_owned(&timer_lock)); 1300 1301 itp = &pt->pt_time; 1302 if (itp->it_value.tv_nsec < nsec) { 1303 if (itp->it_value.tv_sec == 0) { 1304 /* expired, and already in next interval */ 1305 nsec -= itp->it_value.tv_nsec; 1306 goto expire; 1307 } 1308 itp->it_value.tv_nsec += 1000000000; 1309 itp->it_value.tv_sec--; 1310 } 1311 itp->it_value.tv_nsec -= nsec; 1312 nsec = 0; 1313 if (timespecisset(&itp->it_value)) 1314 return (1); 1315 /* expired, exactly at end of interval */ 1316expire: 1317 if (timespecisset(&itp->it_interval)) { 1318 itp->it_value = itp->it_interval; 1319 itp->it_value.tv_nsec -= nsec; 1320 if (itp->it_value.tv_nsec < 0) { 1321 itp->it_value.tv_nsec += 1000000000; 1322 itp->it_value.tv_sec--; 1323 } 1324 timer_settime(pt); 1325 } else 1326 itp->it_value.tv_nsec = 0; /* sec is already 0 */ 1327 return (0); 1328} 1329 1330static void 1331itimerfire(struct ptimer *pt) 1332{ 1333 1334 KASSERT(mutex_owned(&timer_lock)); 1335 1336 /* 1337 * XXX Can overrun, but we don't do signal queueing yet, anyway. 1338 * XXX Relying on the clock interrupt is stupid. 1339 */ 1340 if ((pt->pt_ev.sigev_notify == SIGEV_SA && pt->pt_proc->p_sa == NULL) || 1341 (pt->pt_ev.sigev_notify != SIGEV_SIGNAL && 1342 pt->pt_ev.sigev_notify != SIGEV_SA) || pt->pt_queued) 1343 return; 1344 TAILQ_INSERT_TAIL(&timer_queue, pt, pt_chain); 1345 pt->pt_queued = true; 1346 softint_schedule(timer_sih); 1347} 1348 1349void 1350timer_tick(lwp_t *l, bool user) 1351{ 1352 struct ptimers *pts; 1353 struct ptimer *pt; 1354 proc_t *p; 1355 1356 p = l->l_proc; 1357 if (p->p_timers == NULL) 1358 return; 1359 1360 mutex_spin_enter(&timer_lock); 1361 if ((pts = l->l_proc->p_timers) != NULL) { 1362 /* 1363 * Run current process's virtual and profile time, as needed. 1364 */ 1365 if (user && (pt = LIST_FIRST(&pts->pts_virtual)) != NULL) 1366 if (itimerdecr(pt, tick * 1000) == 0) 1367 itimerfire(pt); 1368 if ((pt = LIST_FIRST(&pts->pts_prof)) != NULL) 1369 if (itimerdecr(pt, tick * 1000) == 0) 1370 itimerfire(pt); 1371 } 1372 mutex_spin_exit(&timer_lock); 1373} 1374 1375#ifdef KERN_SA 1376/* 1377 * timer_sa_intr: 1378 * 1379 * SIGEV_SA handling for timer_intr(). We are called (and return) 1380 * with the timer lock held. We know that the process had SA enabled 1381 * when this timer was enqueued. As timer_intr() is a soft interrupt 1382 * handler, SA should still be enabled by the time we get here. 1383 */ 1384static void 1385timer_sa_intr(struct ptimer *pt, proc_t *p) 1386{ 1387 unsigned int i; 1388 struct sadata *sa; 1389 struct sadata_vp *vp; 1390 1391 /* Cause the process to generate an upcall when it returns. */ 1392 if (!p->p_timerpend) { 1393 /* 1394 * XXX stop signals can be processed inside tsleep, 1395 * which can be inside sa_yield's inner loop, which 1396 * makes testing for sa_idle alone insuffucent to 1397 * determine if we really should call setrunnable. 1398 */ 1399 pt->pt_poverruns = pt->pt_overruns; 1400 pt->pt_overruns = 0; 1401 i = 1 << pt->pt_entry; 1402 p->p_timers->pts_fired = i; 1403 p->p_timerpend = 1; 1404 1405 sa = p->p_sa; 1406 mutex_enter(&sa->sa_mutex); 1407 SLIST_FOREACH(vp, &sa->sa_vps, savp_next) { 1408 struct lwp *vp_lwp = vp->savp_lwp; 1409 lwp_lock(vp_lwp); 1410 lwp_need_userret(vp_lwp); 1411 if (vp_lwp->l_flag & LW_SA_IDLE) { 1412 vp_lwp->l_flag &= ~LW_SA_IDLE; 1413 lwp_unsleep(vp_lwp, true); 1414 break; 1415 } 1416 lwp_unlock(vp_lwp); 1417 } 1418 mutex_exit(&sa->sa_mutex); 1419 } else { 1420 i = 1 << pt->pt_entry; 1421 if ((p->p_timers->pts_fired & i) == 0) { 1422 pt->pt_poverruns = pt->pt_overruns; 1423 pt->pt_overruns = 0; 1424 p->p_timers->pts_fired |= i; 1425 } else 1426 pt->pt_overruns++; 1427 } 1428} 1429#endif /* KERN_SA */ 1430 1431static void 1432timer_intr(void *cookie) 1433{ 1434 ksiginfo_t ksi; 1435 struct ptimer *pt; 1436 proc_t *p; 1437 1438 mutex_spin_enter(&timer_lock); 1439 while ((pt = TAILQ_FIRST(&timer_queue)) != NULL) { 1440 TAILQ_REMOVE(&timer_queue, pt, pt_chain); 1441 KASSERT(pt->pt_queued); 1442 pt->pt_queued = false; 1443 1444 if (pt->pt_proc->p_timers == NULL) { 1445 /* Process is dying. */ 1446 continue; 1447 } 1448 p = pt->pt_proc; 1449#ifdef KERN_SA 1450 if (pt->pt_ev.sigev_notify == SIGEV_SA) { 1451 timer_sa_intr(pt, p); 1452 continue; 1453 } 1454#endif /* KERN_SA */ 1455 if (pt->pt_ev.sigev_notify != SIGEV_SIGNAL) 1456 continue; 1457 if (sigismember(&p->p_sigpend.sp_set, pt->pt_ev.sigev_signo)) { 1458 pt->pt_overruns++; 1459 continue; 1460 } 1461 1462 KSI_INIT(&ksi); 1463 ksi.ksi_signo = pt->pt_ev.sigev_signo; 1464 ksi.ksi_code = SI_TIMER; 1465 ksi.ksi_value = pt->pt_ev.sigev_value; 1466 pt->pt_poverruns = pt->pt_overruns; 1467 pt->pt_overruns = 0; 1468 mutex_spin_exit(&timer_lock); 1469 1470 mutex_enter(proc_lock); 1471 kpsignal(p, &ksi, NULL); 1472 mutex_exit(proc_lock); 1473 1474 mutex_spin_enter(&timer_lock); 1475 } 1476 mutex_spin_exit(&timer_lock); 1477} 1478