mirror_zfs/include/sys
Brian Behlendorf e811949a57 Reimplement rwlocks for Linux lock profiling/analysis.
It turns out that the previous rwlock implementation worked well but
did not integrate properly with the upstream kernel lock profiling/
analysis tools.  This is a major problem since it would be awfully
nice to be able to use the automatic lock checker and profiler.

The problem is that the upstream lock tools use the pre-processor
to create a lock class for each uniquely named locked.  Since the
rwsem was embedded in a wrapper structure the name was always the
same.  The effect was that we only ended up with one lock class for
the entire SPL which caused the lock dependency checker to flag
nearly everything as a possible deadlock.

The solution was to directly map a krwlock to a Linux rwsem using
a typedef there by eliminating the wrapper structure.  This was not
done initially because the rwsem implementation is specific to the arch.
To fully implement the Solaris krwlock API using only the provided rwsem
API is not possible.  It can only be done by directly accessing some of
the internal data member of the rwsem structure.

For example, the Linux API provides a different function for dropping
a reader vs writer lock.  Whereas the Solaris API uses the same function
and the caller does not pass in what type of lock it is.  This means to
properly drop the lock we need to determine if the lock is currently a
reader or writer lock.  Then we need to call the proper Linux API function.
Unfortunately, there is no provided API for this so we must extracted this
information directly from arch specific lock implementation.  This is
all do able, and what I did, but it does complicate things considerably.

The good news is that in addition to the profiling benefits of this
change.  We may see performance improvements due to slightly reduced
overhead when creating rwlocks and manipulating them.

The only function I was forced to sacrafice was rw_owner() because this
information is simply not stored anywhere in the rwsem.  Luckily this
appears not to be a commonly used function on Solaris, and it is my
understanding it is mainly used for debugging anyway.

In addition to the core rwlock changes, extensive updates were made to
the rwlock regression tests.  Each class of test was extended to provide
more API coverage and to be more rigerous in checking for misbehavior.

This is a pretty significant change and with that in mind I have been
careful to validate it on several platforms before committing.  The full
SPLAT regression test suite was run numberous times on all of the following
platforms.  This includes various kernels ranging from 2.6.16 to 2.6.29.

- SLES10   (ppc64)
- SLES11   (x86_64)
- CHAOS4.2 (x86_64)
- RHEL5.3  (x86_64)
- RHEL6    (x86_64)
- FC11     (x86_64)
2009-09-18 16:09:47 -07:00
..
fm Build system and packaging (RPM support) 2009-03-09 15:56:55 -07:00
fs Build system and packaging (RPM support) 2009-03-09 15:56:55 -07:00
sysevent Build system and packaging (RPM support) 2009-03-09 15:56:55 -07:00
acl_impl.h Remove minor lingering CDDL tait of copied headers. Required 2008-03-27 23:40:09 +00:00
acl.h Define ACE_ALL_PERMS for use by ACLs 2009-07-09 15:00:25 -07:00
atomic.h Pull in initial 32-bit support patches. 2008-08-11 22:42:04 +00:00
attr.h Just filling in more of the env. 2008-03-08 00:58:32 +00:00
bitmap.h Add a few more missing header which the upstream stock kernel context expects 2008-12-23 13:03:09 -08:00
bootconf.h Add two new stub headers 2009-01-09 14:04:13 -08:00
buf.h SPL additions to increase support for updated ZFS build 2008-05-15 23:39:19 +00:00
byteorder.h - Add some more missing headers 2008-03-12 23:48:28 +00:00
callb.h - Properly fix the debug support for all the ASSERT's, VERIFIES, etc can be 2008-05-19 02:49:12 +00:00
cmn_err.h Add some typedefs to make it clearer when we passing a function, 2008-03-10 19:25:20 +00:00
compress.h Add include/sys/compress.h header 2009-01-06 09:47:00 -08:00
condvar.h Go through and add a header with the proper UCRL number. 2008-05-26 04:38:26 +00:00
conf.h Add a few more missing header which the upstream stock kernel context expects 2008-12-23 13:03:09 -08:00
cpuvar.h Add a few more missing header which the upstream stock kernel context expects 2008-12-23 13:03:09 -08:00
crc32.h Add missing stub headers 2009-01-09 16:04:44 -08:00
cred.h Add basic credential support and splat tests. 2009-07-27 17:18:59 -07:00
ctype.h Checkpoint for the night, 2008-03-05 00:58:54 +00:00
ddi.h Drop unicode support, provided in ZFS tree libport 2008-03-13 19:49:09 +00:00
debug.h Disable stack overflow checking by default. 2009-07-30 13:52:11 -07:00
dirent.h Add a few more missing header which the upstream stock kernel context expects 2008-12-23 13:03:09 -08:00
disp.h Add a few more missing header which the upstream stock kernel context expects 2008-12-23 13:03:09 -08:00
dkio.h Remove minor lingering CDDL tait of copied headers. Required 2008-03-27 23:40:09 +00:00
dklabel.h Remove minor lingering CDDL tait of copied headers. Required 2008-03-27 23:40:09 +00:00
dnlc.h Linux VM integration / device special files 2009-02-04 15:15:41 -08:00
dumphdr.h SPL additions to increase support for updated ZFS build 2008-05-15 23:39:19 +00:00
efi_partition.h Add missing stub headers 2009-01-09 16:04:44 -08:00
errno.h Stub out some missing headers which are expected. I'll fill 2008-03-01 18:30:12 +00:00
file.h Define FKIOCTL which is used on Solaris to mark an in-kernel ioctl. 2009-07-09 14:59:41 -07:00
int_limits.h Stub out some missing headers which are expected. I'll fill 2008-03-01 18:30:12 +00:00
int_types.h Checkpoint for the night, 2008-03-05 00:58:54 +00:00
inttypes.h Remove spl.h, just include the headers you need. 2008-03-04 20:06:29 +00:00
isa_defs.h Add a little paranoia here to ensure endianess is set correctly. 2009-07-14 14:28:04 -07:00
kidmap.h Apply fix from bug239 for rwlock deadlock. 2008-03-11 20:54:40 +00:00
kmem.h Linux VM Integration Cleanup 2009-03-04 10:04:15 -08:00
kobj.h Go through and add a header with the proper UCRL number. 2008-05-26 04:38:26 +00:00
kstat.h Go through and add a header with the proper UCRL number. 2008-05-26 04:38:26 +00:00
list.h Add list_move_tail() function. 2009-03-19 21:40:07 -07:00
Makefile.in Build system and packaging (RPM support) 2009-03-09 15:56:55 -07:00
mkdev.h Add missing headers 2008-03-14 00:04:01 +00:00
mntent.h Add missing headers 2008-03-14 00:04:01 +00:00
modctl.h Add stubs for three more includes 2009-01-09 09:47:27 -08:00
mode.h Add missing headers 2008-03-14 00:04:01 +00:00
mount.h Missing headers, more minor fixes 2008-03-15 00:05:38 +00:00
mutex.h Fixes: 2008-06-04 06:00:46 +00:00
note.h Add a few more missing header which the upstream stock kernel context expects 2008-12-23 13:03:09 -08:00
open.h Add stubs for three more includes 2009-01-09 09:47:27 -08:00
param.h Changed ptob()/btop() mult/div into bit shifts. 2009-02-25 15:50:58 -08:00
pathname.h Add missing headers 2008-03-14 00:04:01 +00:00
policy.h Add missing policy includes, add missing sun ddi bits 2009-01-09 10:49:47 -08:00
proc.h Add zone_get_hostid() function 2009-02-19 11:26:17 -08:00
random.h Coverity 9652, 9653: No Effect 2009-02-17 16:30:58 -08:00
refstr.h Add two new stub headers 2009-01-09 14:04:13 -08:00
resource.h Add two more missing headers 2008-03-13 20:41:29 +00:00
rwlock.h Reimplement rwlocks for Linux lock profiling/analysis. 2009-09-18 16:09:47 -07:00
sdt.h Missing headers, more minor fixes 2008-03-15 00:05:38 +00:00
sid.h Add basic ksid_lookupdomain and ksiddomain_rele support, just allocations 2009-01-09 15:30:53 -08:00
signal.h Go through and add a header with the proper UCRL number. 2008-05-26 04:38:26 +00:00
stat.h Add two more missing headers 2008-03-13 20:41:29 +00:00
stropts.h Stub out some missing headers which are expected. I'll fill 2008-03-01 18:30:12 +00:00
sunddi.h Add ddi_copyin/ddi_copyout support for fake kernel originated ioctls. 2009-07-10 10:56:32 -07:00
sunldi.h Pull the blkdev header in to the sunldi for some useful structure definitions and helper functions 2009-01-26 16:47:49 -08:00
sysevent.h - Add some more missing headers 2008-03-12 23:48:28 +00:00
sysmacros.h Powerpc Fixes (part 1): 2009-05-20 12:23:24 -07:00
systeminfo.h Add zone_get_hostid() function 2009-02-19 11:26:17 -08:00
systm.h Move sunddi include 2008-12-23 13:32:07 -08:00
t_lock.h Pull in lock types 2008-12-23 13:18:39 -08:00
taskq.h Add basic support for TASKQ_THREADS_CPU_PCT taskq flag which is 2009-07-09 10:07:52 -07:00
thread.h Go through and add a header with the proper UCRL number. 2008-05-26 04:38:26 +00:00
time.h Add timer.h header 2008-12-23 15:40:20 -08:00
timer.h Go through and add a header with the proper UCRL number. 2008-05-26 04:38:26 +00:00
types32.h Remove minor lingering CDDL tait of copied headers. Required 2008-03-27 23:40:09 +00:00
types.h SLES10 Fixes (part 3): 2009-05-20 11:00:39 -07:00
u8_textprep.h Stub u8_textprep.h for inclusion purposes 2009-01-05 15:37:07 -08:00
uio.h Move sunddi include 2008-12-23 13:32:07 -08:00
unistd.h Add missing headers 2008-03-14 00:04:01 +00:00
utsname.h Update utsname to use proper compatible interface to avoid API issues. 2008-06-03 21:20:18 +00:00
va_list.h Stub out some missing headers which are expected. I'll fill 2008-03-01 18:30:12 +00:00
varargs.h Add somre debugging support 2008-03-08 00:18:21 +00:00
vfs_opreg.h Add missing headers 2008-03-14 00:04:01 +00:00
vfs.h Add missing callback_context_t and fid_t types 2009-01-09 10:03:37 -08:00
vmsystm.h Update global_page_state() support for 2.6.29 kernels. 2009-07-28 15:06:42 -07:00
vnode.h Add VOP_SEEK 2009-01-09 13:59:39 -08:00
zmod.h Changed z_compress_level() and z_uncompress() prototypes to match the ones in Solaris. 2009-02-23 11:45:59 -08:00
zone.h - Add some more missing headers 2008-03-12 23:48:28 +00:00