1 /* 2 * CDDL HEADER START 3 * 4 * The contents of this file are subject to the terms of the 5 * Common Development and Distribution License (the "License"). 6 * You may not use this file except in compliance with the License. 7 * 8 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 9 * or http://www.opensolaris.org/os/licensing. 10 * See the License for the specific language governing permissions 11 * and limitations under the License. 12 * 13 * When distributing Covered Code, include this CDDL HEADER in each 14 * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 15 * If applicable, add the following below this CDDL HEADER, with the 16 * fields enclosed by brackets "[]" replaced with your own identifying 17 * information: Portions Copyright [yyyy] [name of copyright owner] 18 * 19 * CDDL HEADER END 20 */ 21 22 /* 23 * Copyright 2007 Sun Microsystems, Inc. All rights reserved. 24 * Use is subject to license terms. 25 */ 26 27 /* 28 * Copyright (c) 2012, Joyent, Inc. All rights reserved. 29 */ 30 31 #include <sys/timer.h> 32 #include <sys/systm.h> 33 #include <sys/param.h> 34 #include <sys/kmem.h> 35 #include <sys/debug.h> 36 #include <sys/policy.h> 37 #include <sys/port_impl.h> 38 #include <sys/port_kernel.h> 39 #include <sys/contract/process_impl.h> 40 41 static kmem_cache_t *clock_timer_cache; 42 static clock_backend_t *clock_backend[CLOCK_MAX]; 43 static int timer_port_callback(void *, int *, pid_t, int, void *); 44 static void timer_close_port(void *, int, pid_t, int); 45 46 #define CLOCK_BACKEND(clk) \ 47 ((clk) < CLOCK_MAX && (clk) >= 0 ? clock_backend[(clk)] : NULL) 48 49 /* 50 * Tunable to increase the maximum number of POSIX timers per-process. This 51 * may _only_ be tuned in /etc/system or by patching the kernel binary; it 52 * _cannot_ be tuned on a running system. 53 */ 54 int timer_max = _TIMER_MAX; 55 56 /* 57 * timer_lock() locks the specified interval timer. It doesn't look at the 58 * ITLK_REMOVE bit; it's up to callers to look at this if they need to 59 * care. p_lock must be held on entry; it may be dropped and reaquired, 60 * but timer_lock() will always return with p_lock held. 61 * 62 * Note that timer_create() doesn't call timer_lock(); it creates timers 63 * with the ITLK_LOCKED bit explictly set. 64 */ 65 static void 66 timer_lock(proc_t *p, itimer_t *it) 67 { 68 ASSERT(MUTEX_HELD(&p->p_lock)); 69 70 while (it->it_lock & ITLK_LOCKED) { 71 it->it_blockers++; 72 cv_wait(&it->it_cv, &p->p_lock); 73 it->it_blockers--; 74 } 75 76 it->it_lock |= ITLK_LOCKED; 77 } 78 79 /* 80 * timer_unlock() unlocks the specified interval timer, waking up any 81 * waiters. p_lock must be held on entry; it will not be dropped by 82 * timer_unlock(). 83 */ 84 static void 85 timer_unlock(proc_t *p, itimer_t *it) 86 { 87 ASSERT(MUTEX_HELD(&p->p_lock)); 88 ASSERT(it->it_lock & ITLK_LOCKED); 89 it->it_lock &= ~ITLK_LOCKED; 90 cv_signal(&it->it_cv); 91 } 92 93 /* 94 * timer_delete_locked() takes a proc pointer, timer ID and locked interval 95 * timer, and deletes the specified timer. It must be called with p_lock 96 * held, and cannot be called on a timer which already has ITLK_REMOVE set; 97 * the caller must check this. timer_delete_locked() will set the ITLK_REMOVE 98 * bit and will iteratively unlock and lock the interval timer until all 99 * blockers have seen the ITLK_REMOVE and cleared out. It will then zero 100 * out the specified entry in the p_itimer array, and call into the clock 101 * backend to complete the deletion. 102 * 103 * This function will always return with p_lock held. 104 */ 105 static void 106 timer_delete_locked(proc_t *p, timer_t tid, itimer_t *it) 107 { 108 ASSERT(MUTEX_HELD(&p->p_lock)); 109 ASSERT(!(it->it_lock & ITLK_REMOVE)); 110 ASSERT(it->it_lock & ITLK_LOCKED); 111 112 it->it_lock |= ITLK_REMOVE; 113 114 /* 115 * If there are threads waiting to lock this timer, we'll unlock 116 * the timer, and block on the cv. Threads blocking our removal will 117 * have the opportunity to run; when they see the ITLK_REMOVE flag 118 * set, they will immediately unlock the timer. 119 */ 120 while (it->it_blockers) { 121 timer_unlock(p, it); 122 cv_wait(&it->it_cv, &p->p_lock); 123 timer_lock(p, it); 124 } 125 126 ASSERT(p->p_itimer[tid] == it); 127 p->p_itimer[tid] = NULL; 128 129 /* 130 * No one is blocked on this timer, and no one will be (we've set 131 * p_itimer[tid] to be NULL; no one can find it). Now we call into 132 * the clock backend to delete the timer; it is up to the backend to 133 * guarantee that timer_fire() has completed (and will never again 134 * be called) for this timer. 135 */ 136 mutex_exit(&p->p_lock); 137 138 it->it_backend->clk_timer_delete(it); 139 140 if (it->it_portev) { 141 mutex_enter(&it->it_mutex); 142 if (it->it_portev) { 143 port_kevent_t *pev; 144 /* dissociate timer from the event port */ 145 (void) port_dissociate_ksource(it->it_portfd, 146 PORT_SOURCE_TIMER, (port_source_t *)it->it_portsrc); 147 pev = (port_kevent_t *)it->it_portev; 148 it->it_portev = NULL; 149 it->it_flags &= ~IT_PORT; 150 it->it_pending = 0; 151 mutex_exit(&it->it_mutex); 152 (void) port_remove_done_event(pev); 153 port_free_event(pev); 154 } else { 155 mutex_exit(&it->it_mutex); 156 } 157 } 158 159 mutex_enter(&p->p_lock); 160 161 /* 162 * We need to be careful freeing the sigqueue for this timer; 163 * if a signal is pending, the sigqueue needs to be freed 164 * synchronously in siginfofree(). The need to free the sigqueue 165 * in siginfofree() is indicated by setting sq_func to NULL. 166 */ 167 if (it->it_pending > 0) { 168 it->it_sigq->sq_func = NULL; 169 } else { 170 kmem_free(it->it_sigq, sizeof (sigqueue_t)); 171 } 172 173 ASSERT(it->it_blockers == 0); 174 kmem_cache_free(clock_timer_cache, it); 175 } 176 177 /* 178 * timer_grab() and its companion routine, timer_release(), are wrappers 179 * around timer_lock()/_unlock() which allow the timer_*(3R) routines to 180 * (a) share error handling code and (b) not grab p_lock themselves. Routines 181 * which are called with p_lock held (e.g. timer_lwpbind(), timer_lwpexit()) 182 * must call timer_lock()/_unlock() explictly. 183 * 184 * timer_grab() takes a proc and a timer ID, and returns a pointer to a 185 * locked interval timer. p_lock must _not_ be held on entry; timer_grab() 186 * may acquire p_lock, but will always return with p_lock dropped. 187 * 188 * If timer_grab() fails, it will return NULL. timer_grab() will fail if 189 * one or more of the following is true: 190 * 191 * (a) The specified timer ID is out of range. 192 * 193 * (b) The specified timer ID does not correspond to a timer ID returned 194 * from timer_create(3R). 195 * 196 * (c) The specified timer ID is currently being removed. 197 * 198 */ 199 static itimer_t * 200 timer_grab(proc_t *p, timer_t tid) 201 { 202 itimer_t **itp, *it; 203 204 if (tid >= timer_max || tid < 0) 205 return (NULL); 206 207 mutex_enter(&p->p_lock); 208 209 if ((itp = p->p_itimer) == NULL || (it = itp[tid]) == NULL) { 210 mutex_exit(&p->p_lock); 211 return (NULL); 212 } 213 214 timer_lock(p, it); 215 216 if (it->it_lock & ITLK_REMOVE) { 217 /* 218 * Someone is removing this timer; it will soon be invalid. 219 */ 220 timer_unlock(p, it); 221 mutex_exit(&p->p_lock); 222 return (NULL); 223 } 224 225 mutex_exit(&p->p_lock); 226 227 return (it); 228 } 229 230 /* 231 * timer_release() releases a timer acquired with timer_grab(). p_lock 232 * should not be held on entry; timer_release() will acquire p_lock but 233 * will drop it before returning. 234 */ 235 static void 236 timer_release(proc_t *p, itimer_t *it) 237 { 238 mutex_enter(&p->p_lock); 239 timer_unlock(p, it); 240 mutex_exit(&p->p_lock); 241 } 242 243 /* 244 * timer_delete_grabbed() deletes a timer acquired with timer_grab(). 245 * p_lock should not be held on entry; timer_delete_grabbed() will acquire 246 * p_lock, but will drop it before returning. 247 */ 248 static void 249 timer_delete_grabbed(proc_t *p, timer_t tid, itimer_t *it) 250 { 251 mutex_enter(&p->p_lock); 252 timer_delete_locked(p, tid, it); 253 mutex_exit(&p->p_lock); 254 } 255 256 void 257 clock_timer_init() 258 { 259 clock_timer_cache = kmem_cache_create("timer_cache", 260 sizeof (itimer_t), 0, NULL, NULL, NULL, NULL, NULL, 0); 261 } 262 263 void 264 clock_add_backend(clockid_t clock, clock_backend_t *backend) 265 { 266 ASSERT(clock >= 0 && clock < CLOCK_MAX); 267 ASSERT(clock_backend[clock] == NULL); 268 269 clock_backend[clock] = backend; 270 } 271 272 clock_backend_t * 273 clock_get_backend(clockid_t clock) 274 { 275 if (clock < 0 || clock >= CLOCK_MAX) 276 return (NULL); 277 278 return (clock_backend[clock]); 279 } 280 281 int 282 clock_settime(clockid_t clock, timespec_t *tp) 283 { 284 timespec_t t; 285 clock_backend_t *backend; 286 int error; 287 288 if ((backend = CLOCK_BACKEND(clock)) == NULL) 289 return (set_errno(EINVAL)); 290 291 if (secpolicy_settime(CRED()) != 0) 292 return (set_errno(EPERM)); 293 294 if (get_udatamodel() == DATAMODEL_NATIVE) { 295 if (copyin(tp, &t, sizeof (timespec_t)) != 0) 296 return (set_errno(EFAULT)); 297 } else { 298 timespec32_t t32; 299 300 if (copyin(tp, &t32, sizeof (timespec32_t)) != 0) 301 return (set_errno(EFAULT)); 302 303 TIMESPEC32_TO_TIMESPEC(&t, &t32); 304 } 305 306 if (itimerspecfix(&t)) 307 return (set_errno(EINVAL)); 308 309 error = backend->clk_clock_settime(&t); 310 311 if (error) 312 return (set_errno(error)); 313 314 return (0); 315 } 316 317 int 318 clock_gettime(clockid_t clock, timespec_t *tp) 319 { 320 timespec_t t; 321 clock_backend_t *backend; 322 int error; 323 324 if ((backend = CLOCK_BACKEND(clock)) == NULL) 325 return (set_errno(EINVAL)); 326 327 error = backend->clk_clock_gettime(&t); 328 329 if (error) 330 return (set_errno(error)); 331 332 if (get_udatamodel() == DATAMODEL_NATIVE) { 333 if (copyout(&t, tp, sizeof (timespec_t)) != 0) 334 return (set_errno(EFAULT)); 335 } else { 336 timespec32_t t32; 337 338 if (TIMESPEC_OVERFLOW(&t)) 339 return (set_errno(EOVERFLOW)); 340 TIMESPEC_TO_TIMESPEC32(&t32, &t); 341 342 if (copyout(&t32, tp, sizeof (timespec32_t)) != 0) 343 return (set_errno(EFAULT)); 344 } 345 346 return (0); 347 } 348 349 int 350 clock_getres(clockid_t clock, timespec_t *tp) 351 { 352 timespec_t t; 353 clock_backend_t *backend; 354 int error; 355 356 /* 357 * Strangely, the standard defines clock_getres() with a NULL tp 358 * to do nothing (regardless of the validity of the specified 359 * clock_id). Go figure. 360 */ 361 if (tp == NULL) 362 return (0); 363 364 if ((backend = CLOCK_BACKEND(clock)) == NULL) 365 return (set_errno(EINVAL)); 366 367 error = backend->clk_clock_getres(&t); 368 369 if (error) 370 return (set_errno(error)); 371 372 if (get_udatamodel() == DATAMODEL_NATIVE) { 373 if (copyout(&t, tp, sizeof (timespec_t)) != 0) 374 return (set_errno(EFAULT)); 375 } else { 376 timespec32_t t32; 377 378 if (TIMESPEC_OVERFLOW(&t)) 379 return (set_errno(EOVERFLOW)); 380 TIMESPEC_TO_TIMESPEC32(&t32, &t); 381 382 if (copyout(&t32, tp, sizeof (timespec32_t)) != 0) 383 return (set_errno(EFAULT)); 384 } 385 386 return (0); 387 } 388 389 void 390 timer_signal(sigqueue_t *sigq) 391 { 392 itimer_t *it = (itimer_t *)sigq->sq_backptr; 393 394 /* 395 * There are some conditions during a fork or an exit when we can 396 * call siginfofree() without p_lock held. To prevent a race 397 * between timer_signal() and timer_fire() with regard to it_pending, 398 * we therefore acquire it_mutex in both paths. 399 */ 400 mutex_enter(&it->it_mutex); 401 ASSERT(it->it_pending > 0); 402 it->it_overrun = it->it_pending - 1; 403 it->it_pending = 0; 404 mutex_exit(&it->it_mutex); 405 } 406 407 /* 408 * This routine is called from the clock backend. 409 */ 410 static void 411 timer_fire(itimer_t *it) 412 { 413 proc_t *p = NULL; 414 int proc_lock_held; 415 416 if (it->it_flags & IT_SIGNAL) { 417 /* 418 * See the comment in timer_signal() for why it is not 419 * sufficient to only grab p_lock here. Because p_lock can be 420 * held on entry to timer_signal(), the lock ordering is 421 * necessarily p_lock before it_mutex. 422 */ 423 424 p = it->it_proc; 425 proc_lock_held = 1; 426 mutex_enter(&p->p_lock); 427 } else { 428 /* 429 * IT_PORT: 430 * If a timer was ever programmed to send events to a port, 431 * the IT_PORT flag will remain set until: 432 * a) the timer is deleted (see timer_delete_locked()) or 433 * b) the port is being closed (see timer_close_port()). 434 * Both cases are synchronized with the it_mutex. 435 * We don't need to use the p_lock because it is only 436 * required in the IT_SIGNAL case. 437 * If IT_PORT was set and the port is being closed then 438 * the timer notification is set to NONE. In such a case 439 * the timer itself and the it_pending counter remain active 440 * until the application deletes the counter or the process 441 * exits. 442 */ 443 proc_lock_held = 0; 444 } 445 mutex_enter(&it->it_mutex); 446 447 if (it->it_pending > 0) { 448 if (it->it_pending < INT_MAX) 449 it->it_pending++; 450 mutex_exit(&it->it_mutex); 451 } else { 452 if (it->it_flags & IT_PORT) { 453 it->it_pending = 1; 454 port_send_event((port_kevent_t *)it->it_portev); 455 mutex_exit(&it->it_mutex); 456 } else if (it->it_flags & IT_SIGNAL) { 457 it->it_pending = 1; 458 mutex_exit(&it->it_mutex); 459 sigaddqa(p, NULL, it->it_sigq); 460 } else { 461 mutex_exit(&it->it_mutex); 462 } 463 } 464 465 if (proc_lock_held) 466 mutex_exit(&p->p_lock); 467 } 468 469 int 470 timer_create(clockid_t clock, struct sigevent *evp, timer_t *tid) 471 { 472 struct sigevent ev; 473 proc_t *p = curproc; 474 clock_backend_t *backend; 475 itimer_t *it, **itp; 476 sigqueue_t *sigq; 477 cred_t *cr = CRED(); 478 int error = 0; 479 timer_t i; 480 port_notify_t tim_pnevp; 481 port_kevent_t *pkevp = NULL; 482 483 if ((backend = CLOCK_BACKEND(clock)) == NULL) 484 return (set_errno(EINVAL)); 485 486 if (evp != NULL) { 487 /* 488 * short copyin() for binary compatibility 489 * fetch oldsigevent to determine how much to copy in. 490 */ 491 if (get_udatamodel() == DATAMODEL_NATIVE) { 492 if (copyin(evp, &ev, sizeof (struct oldsigevent))) 493 return (set_errno(EFAULT)); 494 495 if (ev.sigev_notify == SIGEV_PORT || 496 ev.sigev_notify == SIGEV_THREAD) { 497 if (copyin(ev.sigev_value.sival_ptr, &tim_pnevp, 498 sizeof (port_notify_t))) 499 return (set_errno(EFAULT)); 500 } 501 #ifdef _SYSCALL32_IMPL 502 } else { 503 struct sigevent32 ev32; 504 port_notify32_t tim_pnevp32; 505 506 if (copyin(evp, &ev32, sizeof (struct oldsigevent32))) 507 return (set_errno(EFAULT)); 508 ev.sigev_notify = ev32.sigev_notify; 509 ev.sigev_signo = ev32.sigev_signo; 510 /* 511 * See comment in sigqueue32() on handling of 32-bit 512 * sigvals in a 64-bit kernel. 513 */ 514 ev.sigev_value.sival_int = ev32.sigev_value.sival_int; 515 if (ev.sigev_notify == SIGEV_PORT || 516 ev.sigev_notify == SIGEV_THREAD) { 517 if (copyin((void *)(uintptr_t) 518 ev32.sigev_value.sival_ptr, 519 (void *)&tim_pnevp32, 520 sizeof (port_notify32_t))) 521 return (set_errno(EFAULT)); 522 tim_pnevp.portnfy_port = 523 tim_pnevp32.portnfy_port; 524 tim_pnevp.portnfy_user = 525 (void *)(uintptr_t)tim_pnevp32.portnfy_user; 526 } 527 #endif 528 } 529 switch (ev.sigev_notify) { 530 case SIGEV_NONE: 531 break; 532 case SIGEV_SIGNAL: 533 if (ev.sigev_signo < 1 || ev.sigev_signo >= NSIG) 534 return (set_errno(EINVAL)); 535 break; 536 case SIGEV_THREAD: 537 case SIGEV_PORT: 538 break; 539 default: 540 return (set_errno(EINVAL)); 541 } 542 } else { 543 /* 544 * Use the clock's default sigevent (this is a structure copy). 545 */ 546 ev = backend->clk_default; 547 } 548 549 /* 550 * We'll allocate our timer and sigqueue now, before we grab p_lock. 551 * If we can't find an empty slot, we'll free them before returning. 552 */ 553 it = kmem_cache_alloc(clock_timer_cache, KM_SLEEP); 554 bzero(it, sizeof (itimer_t)); 555 mutex_init(&it->it_mutex, NULL, MUTEX_DEFAULT, NULL); 556 sigq = kmem_zalloc(sizeof (sigqueue_t), KM_SLEEP); 557 558 mutex_enter(&p->p_lock); 559 560 /* 561 * If this is this process' first timer, we need to attempt to allocate 562 * an array of timerstr_t pointers. We drop p_lock to perform the 563 * allocation; if we return to discover that p_itimer is non-NULL, 564 * we will free our allocation and drive on. 565 */ 566 if ((itp = p->p_itimer) == NULL) { 567 mutex_exit(&p->p_lock); 568 itp = kmem_zalloc(timer_max * sizeof (itimer_t *), KM_SLEEP); 569 mutex_enter(&p->p_lock); 570 571 if (p->p_itimer == NULL) 572 p->p_itimer = itp; 573 else { 574 kmem_free(itp, timer_max * sizeof (itimer_t *)); 575 itp = p->p_itimer; 576 } 577 } 578 579 for (i = 0; i < timer_max && itp[i] != NULL; i++) 580 continue; 581 582 if (i == timer_max) { 583 /* 584 * We couldn't find a slot. Drop p_lock, free the preallocated 585 * timer and sigqueue, and return an error. 586 */ 587 mutex_exit(&p->p_lock); 588 kmem_cache_free(clock_timer_cache, it); 589 kmem_free(sigq, sizeof (sigqueue_t)); 590 591 return (set_errno(EAGAIN)); 592 } 593 594 ASSERT(i < timer_max && itp[i] == NULL); 595 596 /* 597 * If we develop other notification mechanisms, this will need 598 * to call into (yet another) backend. 599 */ 600 sigq->sq_info.si_signo = ev.sigev_signo; 601 if (evp == NULL) 602 sigq->sq_info.si_value.sival_int = i; 603 else 604 sigq->sq_info.si_value = ev.sigev_value; 605 sigq->sq_info.si_code = SI_TIMER; 606 sigq->sq_info.si_pid = p->p_pid; 607 sigq->sq_info.si_ctid = PRCTID(p); 608 sigq->sq_info.si_zoneid = getzoneid(); 609 sigq->sq_info.si_uid = crgetruid(cr); 610 sigq->sq_func = timer_signal; 611 sigq->sq_next = NULL; 612 sigq->sq_backptr = it; 613 it->it_sigq = sigq; 614 it->it_backend = backend; 615 it->it_lock = ITLK_LOCKED; 616 itp[i] = it; 617 618 619 if (ev.sigev_notify == SIGEV_THREAD || 620 ev.sigev_notify == SIGEV_PORT) { 621 int port; 622 623 /* 624 * This timer is programmed to use event port notification when 625 * the timer fires: 626 * - allocate a port event structure and prepare it to be sent 627 * to the port as soon as the timer fires. 628 * - when the timer fires : 629 * - if event structure was already sent to the port then this 630 * is a timer fire overflow => increment overflow counter. 631 * - otherwise send pre-allocated event structure to the port. 632 * - the events field of the port_event_t structure counts the 633 * number of timer fired events. 634 * - The event structured is allocated using the 635 * PORT_ALLOC_CACHED flag. 636 * This flag indicates that the timer itself will manage and 637 * free the event structure when required. 638 */ 639 640 it->it_flags |= IT_PORT; 641 port = tim_pnevp.portnfy_port; 642 643 /* associate timer as event source with the port */ 644 error = port_associate_ksource(port, PORT_SOURCE_TIMER, 645 (port_source_t **)&it->it_portsrc, timer_close_port, 646 (void *)it, NULL); 647 if (error) { 648 itp[i] = NULL; /* clear slot */ 649 mutex_exit(&p->p_lock); 650 kmem_cache_free(clock_timer_cache, it); 651 kmem_free(sigq, sizeof (sigqueue_t)); 652 return (set_errno(error)); 653 } 654 655 /* allocate an event structure/slot */ 656 error = port_alloc_event(port, PORT_ALLOC_SCACHED, 657 PORT_SOURCE_TIMER, &pkevp); 658 if (error) { 659 (void) port_dissociate_ksource(port, PORT_SOURCE_TIMER, 660 (port_source_t *)it->it_portsrc); 661 itp[i] = NULL; /* clear slot */ 662 mutex_exit(&p->p_lock); 663 kmem_cache_free(clock_timer_cache, it); 664 kmem_free(sigq, sizeof (sigqueue_t)); 665 return (set_errno(error)); 666 } 667 668 /* initialize event data */ 669 port_init_event(pkevp, i, tim_pnevp.portnfy_user, 670 timer_port_callback, it); 671 it->it_portev = pkevp; 672 it->it_portfd = port; 673 } else { 674 if (ev.sigev_notify == SIGEV_SIGNAL) 675 it->it_flags |= IT_SIGNAL; 676 } 677 678 mutex_exit(&p->p_lock); 679 680 /* 681 * Call on the backend to verify the event argument (or return 682 * EINVAL if this clock type does not support timers). 683 */ 684 if ((error = backend->clk_timer_create(it, timer_fire)) != 0) 685 goto err; 686 687 it->it_lwp = ttolwp(curthread); 688 it->it_proc = p; 689 690 if (copyout(&i, tid, sizeof (timer_t)) != 0) { 691 error = EFAULT; 692 goto err; 693 } 694 695 /* 696 * If we're here, then we have successfully created the timer; we 697 * just need to release the timer and return. 698 */ 699 timer_release(p, it); 700 701 return (0); 702 703 err: 704 /* 705 * If we're here, an error has occurred late in the timer creation 706 * process. We need to regrab p_lock, and delete the incipient timer. 707 * Since we never unlocked the timer (it was born locked), it's 708 * impossible for a removal to be pending. 709 */ 710 ASSERT(!(it->it_lock & ITLK_REMOVE)); 711 timer_delete_grabbed(p, i, it); 712 713 return (set_errno(error)); 714 } 715 716 int 717 timer_gettime(timer_t tid, itimerspec_t *val) 718 { 719 proc_t *p = curproc; 720 itimer_t *it; 721 itimerspec_t when; 722 int error; 723 724 if ((it = timer_grab(p, tid)) == NULL) 725 return (set_errno(EINVAL)); 726 727 error = it->it_backend->clk_timer_gettime(it, &when); 728 729 timer_release(p, it); 730 731 if (error == 0) { 732 if (get_udatamodel() == DATAMODEL_NATIVE) { 733 if (copyout(&when, val, sizeof (itimerspec_t))) 734 error = EFAULT; 735 } else { 736 if (ITIMERSPEC_OVERFLOW(&when)) 737 error = EOVERFLOW; 738 else { 739 itimerspec32_t w32; 740 741 ITIMERSPEC_TO_ITIMERSPEC32(&w32, &when) 742 if (copyout(&w32, val, sizeof (itimerspec32_t))) 743 error = EFAULT; 744 } 745 } 746 } 747 748 return (error ? set_errno(error) : 0); 749 } 750 751 int 752 timer_settime(timer_t tid, int flags, itimerspec_t *val, itimerspec_t *oval) 753 { 754 itimerspec_t when; 755 itimer_t *it; 756 proc_t *p = curproc; 757 int error; 758 759 if (oval != NULL) { 760 if ((error = timer_gettime(tid, oval)) != 0) 761 return (error); 762 } 763 764 if (get_udatamodel() == DATAMODEL_NATIVE) { 765 if (copyin(val, &when, sizeof (itimerspec_t))) 766 return (set_errno(EFAULT)); 767 } else { 768 itimerspec32_t w32; 769 770 if (copyin(val, &w32, sizeof (itimerspec32_t))) 771 return (set_errno(EFAULT)); 772 773 ITIMERSPEC32_TO_ITIMERSPEC(&when, &w32); 774 } 775 776 if (itimerspecfix(&when.it_value) || 777 (itimerspecfix(&when.it_interval) && 778 timerspecisset(&when.it_value))) { 779 return (set_errno(EINVAL)); 780 } 781 782 if ((it = timer_grab(p, tid)) == NULL) 783 return (set_errno(EINVAL)); 784 785 error = it->it_backend->clk_timer_settime(it, flags, &when); 786 787 timer_release(p, it); 788 789 return (error ? set_errno(error) : 0); 790 } 791 792 int 793 timer_delete(timer_t tid) 794 { 795 proc_t *p = curproc; 796 itimer_t *it; 797 798 if ((it = timer_grab(p, tid)) == NULL) 799 return (set_errno(EINVAL)); 800 801 timer_delete_grabbed(p, tid, it); 802 803 return (0); 804 } 805 806 int 807 timer_getoverrun(timer_t tid) 808 { 809 int overrun; 810 proc_t *p = curproc; 811 itimer_t *it; 812 813 if ((it = timer_grab(p, tid)) == NULL) 814 return (set_errno(EINVAL)); 815 816 /* 817 * The it_overrun field is protected by p_lock; we need to acquire 818 * it before looking at the value. 819 */ 820 mutex_enter(&p->p_lock); 821 overrun = it->it_overrun; 822 mutex_exit(&p->p_lock); 823 824 timer_release(p, it); 825 826 return (overrun); 827 } 828 829 /* 830 * Entered/exited with p_lock held, but will repeatedly drop and regrab p_lock. 831 */ 832 void 833 timer_lwpexit(void) 834 { 835 timer_t i; 836 proc_t *p = curproc; 837 klwp_t *lwp = ttolwp(curthread); 838 itimer_t *it, **itp; 839 840 ASSERT(MUTEX_HELD(&p->p_lock)); 841 842 if ((itp = p->p_itimer) == NULL) 843 return; 844 845 for (i = 0; i < timer_max; i++) { 846 if ((it = itp[i]) == NULL) 847 continue; 848 849 timer_lock(p, it); 850 851 if ((it->it_lock & ITLK_REMOVE) || it->it_lwp != lwp) { 852 /* 853 * This timer is either being removed or it isn't 854 * associated with this lwp. 855 */ 856 timer_unlock(p, it); 857 continue; 858 } 859 860 /* 861 * The LWP that created this timer is going away. To the user, 862 * our behavior here is explicitly undefined. We will simply 863 * null out the it_lwp field; if the LWP was bound to a CPU, 864 * the cyclic will stay bound to that CPU until the process 865 * exits. 866 */ 867 it->it_lwp = NULL; 868 timer_unlock(p, it); 869 } 870 } 871 872 /* 873 * Called to notify of an LWP binding change. Entered/exited with p_lock 874 * held, but will repeatedly drop and regrab p_lock. 875 */ 876 void 877 timer_lwpbind() 878 { 879 timer_t i; 880 proc_t *p = curproc; 881 klwp_t *lwp = ttolwp(curthread); 882 itimer_t *it, **itp; 883 884 ASSERT(MUTEX_HELD(&p->p_lock)); 885 886 if ((itp = p->p_itimer) == NULL) 887 return; 888 889 for (i = 0; i < timer_max; i++) { 890 if ((it = itp[i]) == NULL) 891 continue; 892 893 timer_lock(p, it); 894 895 if (!(it->it_lock & ITLK_REMOVE) && it->it_lwp == lwp) { 896 /* 897 * Drop p_lock and jump into the backend. 898 */ 899 mutex_exit(&p->p_lock); 900 it->it_backend->clk_timer_lwpbind(it); 901 mutex_enter(&p->p_lock); 902 } 903 904 timer_unlock(p, it); 905 } 906 } 907 908 /* 909 * This function should only be called if p_itimer is non-NULL. 910 */ 911 void 912 timer_exit(void) 913 { 914 timer_t i; 915 proc_t *p = curproc; 916 917 ASSERT(p->p_itimer != NULL); 918 919 for (i = 0; i < timer_max; i++) 920 (void) timer_delete(i); 921 922 kmem_free(p->p_itimer, timer_max * sizeof (itimer_t *)); 923 p->p_itimer = NULL; 924 } 925 926 /* 927 * timer_port_callback() is a callback function which is associated with the 928 * timer event and is activated just before the event is delivered to the user. 929 * The timer uses this function to update/set the overflow counter and 930 * to reenable the use of the event structure. 931 */ 932 933 /* ARGSUSED */ 934 static int 935 timer_port_callback(void *arg, int *events, pid_t pid, int flag, void *evp) 936 { 937 itimer_t *it = arg; 938 939 mutex_enter(&it->it_mutex); 940 if (curproc != it->it_proc) { 941 /* can not deliver timer events to another proc */ 942 mutex_exit(&it->it_mutex); 943 return (EACCES); 944 } 945 *events = it->it_pending; /* 1 = 1 event, >1 # of overflows */ 946 it->it_pending = 0; /* reinit overflow counter */ 947 /* 948 * This function can also be activated when the port is being closed 949 * and a timer event is already submitted to the port. 950 * In such a case the event port framework will use the 951 * close-callback function to notify the events sources. 952 * The timer close-callback function is timer_close_port() which 953 * will free all allocated resources (including the allocated 954 * port event structure). 955 * For that reason we don't need to check the value of flag here. 956 */ 957 mutex_exit(&it->it_mutex); 958 return (0); 959 } 960 961 /* 962 * port is being closed ... free all allocated port event structures 963 * The delivered arg currently correspond to the first timer associated with 964 * the port and it is not useable in this case. 965 * We have to scan the list of activated timers in the current proc and 966 * compare them with the delivered port id. 967 */ 968 969 /* ARGSUSED */ 970 static void 971 timer_close_port(void *arg, int port, pid_t pid, int lastclose) 972 { 973 proc_t *p = curproc; 974 timer_t tid; 975 itimer_t *it; 976 977 for (tid = 0; tid < timer_max; tid++) { 978 if ((it = timer_grab(p, tid)) == NULL) 979 continue; 980 if (it->it_portev) { 981 mutex_enter(&it->it_mutex); 982 if (it->it_portfd == port) { 983 port_kevent_t *pev; 984 pev = (port_kevent_t *)it->it_portev; 985 it->it_portev = NULL; 986 it->it_flags &= ~IT_PORT; 987 mutex_exit(&it->it_mutex); 988 (void) port_remove_done_event(pev); 989 port_free_event(pev); 990 } else { 991 mutex_exit(&it->it_mutex); 992 } 993 } 994 timer_release(p, it); 995 } 996 } 997