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 --- 334 unchanged lines hidden (view full) --- 343 ASSERT(tc->tc_count[g] != 0); 344 if (--tc->tc_count[g] == 0) 345 cv_broadcast(&tc->tc_cv[g]); 346 mutex_exit(&tc->tc_lock); 347 348 th->th_cpu = NULL; /* defensive */ 349} 350 |
351/* 352 * Blocks until all transactions in the group are committed. 353 * 354 * On return, the transaction group has reached a stable state in which it can 355 * then be passed off to the syncing context. 356 */ |
357static void 358txg_quiesce(dsl_pool_t *dp, uint64_t txg) 359{ 360 tx_state_t *tx = &dp->dp_tx; 361 int g = txg & TXG_MASK; 362 int c; 363 364 /* --- 33 unchanged lines hidden (view full) --- 398 399 list_destroy(cb_list); 400 401 kmem_free(cb_list, sizeof (list_t)); 402} 403 404/* 405 * Dispatch the commit callbacks registered on this txg to worker threads. |
406 * 407 * If no callbacks are registered for a given TXG, nothing happens. 408 * This function creates a taskq for the associated pool, if needed. |
409 */ 410static void 411txg_dispatch_callbacks(dsl_pool_t *dp, uint64_t txg) 412{ 413 int c; 414 tx_state_t *tx = &dp->dp_tx; 415 list_t *cb_list; 416 417 for (c = 0; c < max_ncpus; c++) { 418 tx_cpu_t *tc = &tx->tx_cpu[c]; |
419 /* 420 * No need to lock tx_cpu_t at this point, since this can 421 * only be called once a txg has been synced. 422 */ |
423 424 int g = txg & TXG_MASK; 425 426 if (list_is_empty(&tc->tc_callbacks[g])) 427 continue; 428 429 if (tx->tx_commit_cb_taskq == NULL) { 430 /* --- 397 unchanged lines hidden --- |