The Design and Implementation of the FreeBSD Operating System, Second Edition
Now available: The Design and Implementation of the FreeBSD Operating System (Second Edition)


[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ] [ list types ] [ track identifier ]

FreeBSD/Linux Kernel Cross Reference
sys/contrib/openzfs/include/sys/rrwlock.h

Version: -  FREEBSD  -  FREEBSD-13-STABLE  -  FREEBSD-13-0  -  FREEBSD-12-STABLE  -  FREEBSD-12-0  -  FREEBSD-11-STABLE  -  FREEBSD-11-0  -  FREEBSD-10-STABLE  -  FREEBSD-10-0  -  FREEBSD-9-STABLE  -  FREEBSD-9-0  -  FREEBSD-8-STABLE  -  FREEBSD-8-0  -  FREEBSD-7-STABLE  -  FREEBSD-7-0  -  FREEBSD-6-STABLE  -  FREEBSD-6-0  -  FREEBSD-5-STABLE  -  FREEBSD-5-0  -  FREEBSD-4-STABLE  -  FREEBSD-3-STABLE  -  FREEBSD22  -  l41  -  OPENBSD  -  linux-2.6  -  MK84  -  PLAN9  -  xnu-8792 
SearchContext: -  none  -  3  -  10 

    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 https://opensource.org/licenses/CDDL-1.0.
   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  * Copyright 2007 Sun Microsystems, Inc.  All rights reserved.
   23  * Use is subject to license terms.
   24  */
   25 /*
   26  * Copyright (c) 2012 by Delphix. All rights reserved.
   27  */
   28 
   29 #ifndef _SYS_RR_RW_LOCK_H
   30 #define _SYS_RR_RW_LOCK_H
   31 
   32 
   33 
   34 #ifdef  __cplusplus
   35 extern "C" {
   36 #endif
   37 
   38 #include <sys/inttypes.h>
   39 #include <sys/zfs_context.h>
   40 #include <sys/zfs_refcount.h>
   41 
   42 extern uint_t rrw_tsd_key;
   43 
   44 /*
   45  * A reader-writer lock implementation that allows re-entrant reads, but
   46  * still gives writers priority on "new" reads.
   47  *
   48  * See rrwlock.c for more details about the implementation.
   49  *
   50  * Fields of the rrwlock_t structure:
   51  * - rr_lock: protects modification and reading of rrwlock_t fields
   52  * - rr_cv: cv for waking up readers or waiting writers
   53  * - rr_writer: thread id of the current writer
   54  * - rr_anon_rount: number of active anonymous readers
   55  * - rr_linked_rcount: total number of non-anonymous active readers
   56  * - rr_writer_wanted: a writer wants the lock
   57  */
   58 typedef struct rrwlock {
   59         kmutex_t        rr_lock;
   60         kcondvar_t      rr_cv;
   61         kthread_t       *rr_writer;
   62         zfs_refcount_t  rr_anon_rcount;
   63         zfs_refcount_t  rr_linked_rcount;
   64         boolean_t       rr_writer_wanted;
   65         boolean_t       rr_track_all;
   66 } rrwlock_t;
   67 
   68 /*
   69  * 'tag' is used in reference counting tracking.  The
   70  * 'tag' must be the same in a rrw_enter() as in its
   71  * corresponding rrw_exit().
   72  */
   73 void rrw_init(rrwlock_t *rrl, boolean_t track_all);
   74 void rrw_destroy(rrwlock_t *rrl);
   75 void rrw_enter(rrwlock_t *rrl, krw_t rw, const void *tag);
   76 void rrw_enter_read(rrwlock_t *rrl, const void *tag);
   77 void rrw_enter_read_prio(rrwlock_t *rrl, const void *tag);
   78 void rrw_enter_write(rrwlock_t *rrl);
   79 void rrw_exit(rrwlock_t *rrl, const void *tag);
   80 boolean_t rrw_held(rrwlock_t *rrl, krw_t rw);
   81 void rrw_tsd_destroy(void *arg);
   82 
   83 #define RRW_READ_HELD(x)        rrw_held(x, RW_READER)
   84 #define RRW_WRITE_HELD(x)       rrw_held(x, RW_WRITER)
   85 #define RRW_LOCK_HELD(x) \
   86         (rrw_held(x, RW_WRITER) || rrw_held(x, RW_READER))
   87 
   88 /*
   89  * A reader-mostly lock implementation, tuning above reader-writer locks
   90  * for hightly parallel read acquisitions, pessimizing write acquisitions.
   91  *
   92  * This should be a prime number.  See comment in rrwlock.c near
   93  * RRM_TD_LOCK() for details.
   94  */
   95 #define RRM_NUM_LOCKS           17
   96 typedef struct rrmlock {
   97         rrwlock_t       locks[RRM_NUM_LOCKS];
   98 } rrmlock_t;
   99 
  100 void rrm_init(rrmlock_t *rrl, boolean_t track_all);
  101 void rrm_destroy(rrmlock_t *rrl);
  102 void rrm_enter(rrmlock_t *rrl, krw_t rw, const void *tag);
  103 void rrm_enter_read(rrmlock_t *rrl, const void *tag);
  104 void rrm_enter_write(rrmlock_t *rrl);
  105 void rrm_exit(rrmlock_t *rrl, const void *tag);
  106 boolean_t rrm_held(rrmlock_t *rrl, krw_t rw);
  107 
  108 #define RRM_READ_HELD(x)        rrm_held(x, RW_READER)
  109 #define RRM_WRITE_HELD(x)       rrm_held(x, RW_WRITER)
  110 #define RRM_LOCK_HELD(x) \
  111         (rrm_held(x, RW_WRITER) || rrm_held(x, RW_READER))
  112 
  113 #ifdef  __cplusplus
  114 }
  115 #endif
  116 
  117 #endif  /* _SYS_RR_RW_LOCK_H */

Cache object: 1fe812554d920266355d1c0eb1dc2eba


[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ] [ list types ] [ track identifier ]


This page is part of the FreeBSD/Linux Linux Kernel Cross-Reference, and was automatically generated using a modified version of the LXR engine.