forked from openzfs/zfs
-
Notifications
You must be signed in to change notification settings - Fork 3
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Signed-off-by: Prakash Surya <surya1@llnl.gov> Signed-off-by: Ned Bass <bass6@llnl.gov> Signed-off-by: Brian Behlendorf <behlendorf1@llnl.gov> Closes openzfs#2874
- Loading branch information
Showing
22 changed files
with
1,530 additions
and
285 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,59 @@ | ||
dnl # | ||
dnl # Ensure the DECLARE_EVENT_CLASS macro is available to non-GPL modules. | ||
dnl # | ||
AC_DEFUN([ZFS_AC_KERNEL_DECLARE_EVENT_CLASS], [ | ||
tmp_flags="$EXTRA_KCFLAGS" | ||
EXTRA_KCFLAGS="-I\$(src)" | ||
AC_MSG_CHECKING([whether DECLARE_EVENT_CLASS() is available]) | ||
ZFS_LINUX_TRY_COMPILE_HEADER([ | ||
#include <linux/module.h> | ||
MODULE_LICENSE(ZFS_META_LICENSE); | ||
#define CREATE_TRACE_POINTS | ||
#include "conftest.h" | ||
],[ | ||
trace_zfs_autoconf_event_one(1UL); | ||
trace_zfs_autoconf_event_two(2UL); | ||
],[ | ||
AC_MSG_RESULT(yes) | ||
AC_DEFINE(HAVE_DECLARE_EVENT_CLASS, 1, | ||
[DECLARE_EVENT_CLASS() is available]) | ||
],[ | ||
AC_MSG_RESULT(no) | ||
],[ | ||
#if !defined(_CONFTEST_H) || defined(TRACE_HEADER_MULTI_READ) | ||
#define _CONFTEST_H | ||
#undef TRACE_SYSTEM | ||
#define TRACE_SYSTEM zfs | ||
#include <linux/tracepoint.h> | ||
DECLARE_EVENT_CLASS(zfs_autoconf_event_class, | ||
TP_PROTO(unsigned long i), | ||
TP_ARGS(i), | ||
TP_STRUCT__entry( | ||
__field(unsigned long, i) | ||
), | ||
TP_fast_assign( | ||
__entry->i = i; | ||
), | ||
TP_printk("i = %lu", __entry->i) | ||
); | ||
#define DEFINE_AUTOCONF_EVENT(name) \ | ||
DEFINE_EVENT(zfs_autoconf_event_class, name, \ | ||
TP_PROTO(unsigned long i), \ | ||
TP_ARGS(i)) | ||
DEFINE_AUTOCONF_EVENT(zfs_autoconf_event_one); | ||
DEFINE_AUTOCONF_EVENT(zfs_autoconf_event_two); | ||
#endif /* _CONFTEST_H */ | ||
#undef TRACE_INCLUDE_PATH | ||
#define TRACE_INCLUDE_PATH . | ||
#define TRACE_INCLUDE_FILE conftest | ||
#include <trace/define_trace.h> | ||
]) | ||
EXTRA_KCFLAGS="$tmp_flags" | ||
]) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,157 @@ | ||
/* | ||
* CDDL HEADER START | ||
* | ||
* The contents of this file are subject to the terms of the | ||
* Common Development and Distribution License (the "License"). | ||
* You may not use this file except in compliance with the License. | ||
* | ||
* You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE | ||
* or http://www.opensolaris.org/os/licensing. | ||
* See the License for the specific language governing permissions | ||
* and limitations under the License. | ||
* | ||
* When distributing Covered Code, include this CDDL HEADER in each | ||
* file and include the License file at usr/src/OPENSOLARIS.LICENSE. | ||
* If applicable, add the following below this CDDL HEADER, with the | ||
* fields enclosed by brackets "[]" replaced with your own identifying | ||
* information: Portions Copyright [yyyy] [name of copyright owner] | ||
* | ||
* CDDL HEADER END | ||
*/ | ||
/* | ||
* Copyright (c) 2005, 2010, Oracle and/or its affiliates. All rights reserved. | ||
* Copyright (c) 2013 by Delphix. All rights reserved. | ||
* Copyright (c) 2013 by Saso Kiselkov. All rights reserved. | ||
* Copyright 2013 Nexenta Systems, Inc. All rights reserved. | ||
*/ | ||
|
||
#ifndef _SYS_ARC_IMPL_H | ||
#define _SYS_ARC_IMPL_H | ||
|
||
#include <sys/arc.h> | ||
|
||
#ifdef __cplusplus | ||
extern "C" { | ||
#endif | ||
|
||
/* | ||
* Note that buffers can be in one of 6 states: | ||
* ARC_anon - anonymous (discussed below) | ||
* ARC_mru - recently used, currently cached | ||
* ARC_mru_ghost - recentely used, no longer in cache | ||
* ARC_mfu - frequently used, currently cached | ||
* ARC_mfu_ghost - frequently used, no longer in cache | ||
* ARC_l2c_only - exists in L2ARC but not other states | ||
* When there are no active references to the buffer, they are | ||
* are linked onto a list in one of these arc states. These are | ||
* the only buffers that can be evicted or deleted. Within each | ||
* state there are multiple lists, one for meta-data and one for | ||
* non-meta-data. Meta-data (indirect blocks, blocks of dnodes, | ||
* etc.) is tracked separately so that it can be managed more | ||
* explicitly: favored over data, limited explicitly. | ||
* | ||
* Anonymous buffers are buffers that are not associated with | ||
* a DVA. These are buffers that hold dirty block copies | ||
* before they are written to stable storage. By definition, | ||
* they are "ref'd" and are considered part of arc_mru | ||
* that cannot be freed. Generally, they will aquire a DVA | ||
* as they are written and migrate onto the arc_mru list. | ||
* | ||
* The ARC_l2c_only state is for buffers that are in the second | ||
* level ARC but no longer in any of the ARC_m* lists. The second | ||
* level ARC itself may also contain buffers that are in any of | ||
* the ARC_m* states - meaning that a buffer can exist in two | ||
* places. The reason for the ARC_l2c_only state is to keep the | ||
* buffer header in the hash table, so that reads that hit the | ||
* second level ARC benefit from these fast lookups. | ||
*/ | ||
|
||
typedef struct arc_state { | ||
list_t arcs_list[ARC_BUFC_NUMTYPES]; /* list of evictable buffers */ | ||
uint64_t arcs_lsize[ARC_BUFC_NUMTYPES]; /* amount of evictable data */ | ||
uint64_t arcs_size; /* total amount of data in this state */ | ||
kmutex_t arcs_mtx; | ||
arc_state_type_t arcs_state; | ||
} arc_state_t; | ||
|
||
typedef struct l2arc_buf_hdr l2arc_buf_hdr_t; | ||
|
||
typedef struct arc_callback arc_callback_t; | ||
|
||
struct arc_callback { | ||
void *acb_private; | ||
arc_done_func_t *acb_done; | ||
arc_buf_t *acb_buf; | ||
zio_t *acb_zio_dummy; | ||
arc_callback_t *acb_next; | ||
}; | ||
|
||
typedef struct arc_write_callback arc_write_callback_t; | ||
|
||
struct arc_write_callback { | ||
void *awcb_private; | ||
arc_done_func_t *awcb_ready; | ||
arc_done_func_t *awcb_physdone; | ||
arc_done_func_t *awcb_done; | ||
arc_buf_t *awcb_buf; | ||
}; | ||
|
||
struct arc_buf_hdr { | ||
/* protected by hash lock */ | ||
dva_t b_dva; | ||
uint64_t b_birth; | ||
uint64_t b_cksum0; | ||
|
||
kmutex_t b_freeze_lock; | ||
zio_cksum_t *b_freeze_cksum; | ||
|
||
arc_buf_hdr_t *b_hash_next; | ||
arc_buf_t *b_buf; | ||
uint32_t b_flags; | ||
uint32_t b_datacnt; | ||
|
||
arc_callback_t *b_acb; | ||
kcondvar_t b_cv; | ||
|
||
/* immutable */ | ||
arc_buf_contents_t b_type; | ||
uint64_t b_size; | ||
uint64_t b_spa; | ||
|
||
/* protected by arc state mutex */ | ||
arc_state_t *b_state; | ||
list_node_t b_arc_node; | ||
|
||
/* updated atomically */ | ||
clock_t b_arc_access; | ||
uint32_t b_mru_hits; | ||
uint32_t b_mru_ghost_hits; | ||
uint32_t b_mfu_hits; | ||
uint32_t b_mfu_ghost_hits; | ||
uint32_t b_l2_hits; | ||
|
||
/* self protecting */ | ||
refcount_t b_refcnt; | ||
|
||
l2arc_buf_hdr_t *b_l2hdr; | ||
list_node_t b_l2node; | ||
}; | ||
|
||
typedef struct l2arc_dev { | ||
vdev_t *l2ad_vdev; /* vdev */ | ||
spa_t *l2ad_spa; /* spa */ | ||
uint64_t l2ad_hand; /* next write location */ | ||
uint64_t l2ad_start; /* first addr on device */ | ||
uint64_t l2ad_end; /* last addr on device */ | ||
uint64_t l2ad_evict; /* last addr eviction reached */ | ||
boolean_t l2ad_first; /* first sweep through */ | ||
boolean_t l2ad_writing; /* currently writing */ | ||
list_t *l2ad_buflist; /* buffer list */ | ||
list_node_t l2ad_node; /* device list node */ | ||
} l2arc_dev_t; | ||
|
||
#ifdef __cplusplus | ||
} | ||
#endif | ||
|
||
#endif /* _SYS_ARC_IMPL_H */ |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,70 @@ | ||
/* | ||
* CDDL HEADER START | ||
* | ||
* The contents of this file are subject to the terms of the | ||
* Common Development and Distribution License, Version 1.0 only | ||
* (the "License"). You may not use this file except in compliance | ||
* with the License. | ||
* | ||
* You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE | ||
* or http://www.opensolaris.org/os/licensing. | ||
* See the License for the specific language governing permissions | ||
* and limitations under the License. | ||
* | ||
* When distributing Covered Code, include this CDDL HEADER in each | ||
* file and include the License file at usr/src/OPENSOLARIS.LICENSE. | ||
* If applicable, add the following below this CDDL HEADER, with the | ||
* fields enclosed by brackets "[]" replaced with your own identifying | ||
* information: Portions Copyright [yyyy] [name of copyright owner] | ||
* | ||
* CDDL HEADER END | ||
*/ | ||
/* | ||
* Copyright 2007 Sun Microsystems, Inc. All rights reserved. | ||
* Use is subject to license terms. | ||
*/ | ||
|
||
#ifndef _SYS_SDT_H | ||
#define _SYS_SDT_H | ||
|
||
#ifndef _KERNEL | ||
|
||
#define ZFS_PROBE(a) ((void) 0) | ||
#define ZFS_PROBE1(a, c) ((void) 0) | ||
#define ZFS_PROBE2(a, c, e) ((void) 0) | ||
#define ZFS_PROBE3(a, c, e, g) ((void) 0) | ||
#define ZFS_PROBE4(a, c, e, g, i) ((void) 0) | ||
#define ZFS_SET_ERROR(err) ((void) 0) | ||
|
||
#else | ||
|
||
#if defined(HAVE_DECLARE_EVENT_CLASS) | ||
|
||
#include <sys/trace.h> | ||
|
||
/* | ||
* The set-error SDT probe is extra static, in that we declare its fake | ||
* function literally, rather than with the DTRACE_PROBE1() macro. This is | ||
* necessary so that SET_ERROR() can evaluate to a value, which wouldn't | ||
* be possible if it required multiple statements (to declare the function | ||
* and then call it). | ||
* | ||
* SET_ERROR() uses the comma operator so that it can be used without much | ||
* additional code. For example, "return (EINVAL);" becomes | ||
* "return (SET_ERROR(EINVAL));". Note that the argument will be evaluated | ||
* twice, so it should not have side effects (e.g. something like: | ||
* "return (SET_ERROR(log_error(EINVAL, info)));" would log the error twice). | ||
*/ | ||
#define SET_ERROR(err) \ | ||
(trace_zfs_set__error(__FILE__, __func__, __LINE__, err), err) | ||
|
||
#else | ||
|
||
#undef SET_ERROR | ||
#define SET_ERROR(err) (err) | ||
|
||
#endif /* HAVE_DECLARE_EVENT_CLASS */ | ||
|
||
#endif /* _KERNEL */ | ||
|
||
#endif /* _SYS_SDT_H */ |
Oops, something went wrong.