From a731fd0e86e16b2f6b989c770a750da20e5e1808 Mon Sep 17 00:00:00 2001 From: Matthew Ahrens Date: Fri, 21 Feb 2020 16:05:08 -0800 Subject: [PATCH 01/19] rename case-conflicting files to enable development on OSX (#182) --- ...ce_avl | print -R => addr spa_namespace_avl | print --RAW} | 0 ...eref | print -Rs => spa | head 1 | deref | print --RAW -s} | 0 tests/integration/test_core_generic.py | 4 ++-- 3 files changed, 2 insertions(+), 2 deletions(-) rename tests/integration/data/regression_output/core/{addr spa_namespace_avl | print -R => addr spa_namespace_avl | print --RAW} (100%) rename tests/integration/data/regression_output/core/{spa | head 1 | deref | print -Rs => spa | head 1 | deref | print --RAW -s} (100%) diff --git a/tests/integration/data/regression_output/core/addr spa_namespace_avl | print -R b/tests/integration/data/regression_output/core/addr spa_namespace_avl | print --RAW similarity index 100% rename from tests/integration/data/regression_output/core/addr spa_namespace_avl | print -R rename to tests/integration/data/regression_output/core/addr spa_namespace_avl | print --RAW diff --git a/tests/integration/data/regression_output/core/spa | head 1 | deref | print -Rs b/tests/integration/data/regression_output/core/spa | head 1 | deref | print --RAW -s similarity index 100% rename from tests/integration/data/regression_output/core/spa | head 1 | deref | print -Rs rename to tests/integration/data/regression_output/core/spa | head 1 | deref | print --RAW -s diff --git a/tests/integration/test_core_generic.py b/tests/integration/test_core_generic.py index e759cc1e..2fc6f31b 100644 --- a/tests/integration/test_core_generic.py +++ b/tests/integration/test_core_generic.py @@ -105,7 +105,7 @@ "addr spa_namespace_avl | print -n", "addr spa_namespace_avl | print -r", "addr spa_namespace_avl | print -nr", - "addr spa_namespace_avl | print -R", + "addr spa_namespace_avl | print --RAW", "addr spa_namespace_avl | deref | print", "addr spa_namespace_avl | print -d", "addr spa_namespace_avl zfs_dbgmsgs | print -d", @@ -113,7 +113,7 @@ "spa | head 1 | member spa_name[1] | print -c", "spa | head 1 | member spa_name[1] | print -cr", "spa | head 1 | deref | print -rs", - "spa | head 1 | deref | print -Rs", + "spa | head 1 | deref | print --RAW -s", # ptype "ptype spa_t", From 5b72240976e2f2162349e73866dfa8bc86cb9c99 Mon Sep 17 00:00:00 2001 From: sara hartse Date: Thu, 20 Feb 2020 13:16:58 -0800 Subject: [PATCH 02/19] Stacks should be a pretty printer and a locator --- sdb/commands/stacks.py | 410 ++++++++++-------- .../linux/echo 0xffffa089669edc00 | stack | 13 + .../linux/stacks -m bogus | count | 1 + .../linux/stacks -m zfs -c zthr_procedure | 25 ++ .../linux/stacks -m zfs | count | 1 + ...ads | filter obj.comm == \"java\" | stack" | 79 ++++ tests/integration/test_linux_generic.py | 5 + 7 files changed, 342 insertions(+), 192 deletions(-) create mode 100644 tests/integration/data/regression_output/linux/echo 0xffffa089669edc00 | stack create mode 100644 tests/integration/data/regression_output/linux/stacks -m bogus | count create mode 100644 tests/integration/data/regression_output/linux/stacks -m zfs -c zthr_procedure create mode 100644 tests/integration/data/regression_output/linux/stacks -m zfs | count create mode 100644 "tests/integration/data/regression_output/linux/threads | filter obj.comm == \"java\" | stack" diff --git a/sdb/commands/stacks.py b/sdb/commands/stacks.py index 7c4e61fc..63a4499e 100644 --- a/sdb/commands/stacks.py +++ b/sdb/commands/stacks.py @@ -17,7 +17,7 @@ # pylint: disable=missing-docstring import argparse -from typing import Any, Dict, Iterable, List, Tuple +from typing import Dict, Iterable, List, Tuple from collections import defaultdict import drgn @@ -27,34 +27,11 @@ import sdb -# -# Note: This is a rudimentary version of what the command could/should be. -# -# On the high-level, it could be a `Locator`, or something similar, where -# objects could be passed as input from the pipeline dispatching different -# methods depending on the type of object. E.g. input could be a namespace -# object and we print all the task structs within it, or it could be just -# a list of task structs passed from a previous command for filtering. -# Another option would be to decouple the stack listing, filtering, and -# pretty-printing functionality to independent SDB commands. -# -# There are also other lower-level usability improvements like supporting -# filtering by `function+offset` with the `-c` option, or by namespace ID -# using `-n `. -# -# Finally, the command lacks any support for userland targets. -# -# SDB is still in its early stages and hasn't been used enough for us to -# be clear which use cases really matter. In the meantime if we don't have -# anything that provides this functionality it won't be easy to do this -# exploration. The version below is a good enough for the time being -# providing some basic functionality and being our tracer bullet for -# future iterations. -# -class Stacks(sdb.Command): +class Stacks(sdb.Locator, sdb.PrettyPrinter): """ - Print the stack traces for the active tasks / threads + Print the stack traces for active threads (task_struct) + DESCRIPTION By default, the command will aggregate similar call stacks printing them in descending order of frequency. The output includes the `struct task_struct` address, thread state, and @@ -64,8 +41,11 @@ class Stacks(sdb.Command): those that match a given thread state, containing a given function, or belonging to a given kernel module. - EXAMPLES - Print the call stacks for all tasks + The command returns all task_stuct structs that matched the + filter. + + EXAMPLES + Print the call stacks for all tasks sdb> stacks TASK_STRUCT STATE COUNT @@ -85,47 +65,89 @@ class Stacks(sdb.Command): ret_from_fork+0x35 ... - Print stacks containing functions from the zfs module - - sdb> stacks -m zfs - TASK_STRUCT STATE COUNT - ========================================== - 0xffff952130515940 INTERRUPTIBLE 1 - __schedule+0x24e - schedule+0x2c - cv_wait_common+0x11f - __cv_wait_sig+0x15 - zthr_procedure+0x51 - thread_generic_wrapper+0x74 - kthread+0x121 - ret_from_fork+0x35 - ... - - Print stacks containing the l2arc_feed_thread function - - sdb> stacks -c l2arc_feed_thread - TASK_STRUCT STATE COUNT - ========================================== - 0xffff9521b3f43b80 INTERRUPTIBLE 1 - __schedule+0x24e - schedule+0x2c - schedule_timeout+0x15d - __cv_timedwait_common+0xdf - __cv_timedwait_sig+0x16 - l2arc_feed_thread+0x66 - thread_generic_wrapper+0x74 - kthread+0x121 - ret_from_fork+0x35 - - Print stacks of threads in the RUNNING state - - sdb> stacks -t RUNNING - TASK_STRUCT STATE COUNT - ========================================== - 0xffff95214ff31dc0 RUNNING 1 + Print stacks containing functions from the zfs module + + sdb> stacks -m zfs + TASK_STRUCT STATE COUNT + ========================================== + 0xffff952130515940 INTERRUPTIBLE 1 + __schedule+0x24e + schedule+0x2c + cv_wait_common+0x11f + __cv_wait_sig+0x15 + zthr_procedure+0x51 + thread_generic_wrapper+0x74 + kthread+0x121 + ret_from_fork+0x35 + ... + + Print stacks containing the l2arc_feed_thread function + + sdb> stacks -c l2arc_feed_thread + TASK_STRUCT STATE COUNT + ========================================== + 0xffff9521b3f43b80 INTERRUPTIBLE 1 + __schedule+0x24e + schedule+0x2c + schedule_timeout+0x15d + __cv_timedwait_common+0xdf + __cv_timedwait_sig+0x16 + l2arc_feed_thread+0x66 + thread_generic_wrapper+0x74 + kthread+0x121 + ret_from_fork+0x35 + + Print stacks of threads in the RUNNING state + + sdb> stacks -t RUNNING + TASK_STRUCT STATE COUNT + ========================================== + 0xffff95214ff31dc0 RUNNING 1 + + Count the number of stacks in the zfs module + + sdb> stacks -m zfs | count + (unsigned long long)12 + + Print stacks of the threads started by the zthr command + + sdb> threads | filter obj.comm == "zthr_procedure" | stack + TASK_STRUCT STATE COUNT + ========================================== + 0xffff9c7e6c268000 INTERRUPTIBLE 5 + __schedule+0x24e + schedule+0x2c + cv_wait_common+0x118 + __cv_wait_sig+0x15 + zthr_procedure+0x45 + thread_generic_wrapper+0x74 + kthread+0x121 + ret_from_fork+0x1f + + 0xffff9c7e6c1f8000 INTERRUPTIBLE 1 + __schedule+0x24e + schedule+0x2c + schedule_hrtimeout_range_clock+0xb9 + schedule_hrtimeout_range+0x13 + __cv_timedwait_hires+0x117 + cv_timedwait_hires_common+0x4b + cv_timedwait_sig_hires+0x14 + zthr_procedure+0x96 + thread_generic_wrapper+0x74 + kthread+0x121 + ret_from_fork+0x1f + """ - names = ["stacks"] + names = ["stacks", "stack"] + input_type = "struct task_struct *" + output_type = "struct task_struct *" + + def __init__(self, args: str = "", name: str = "_") -> None: + super().__init__(args, name) + self.mod_start, self.mod_end = 0, 0 + self.func_start, self.func_end = 0, 0 + self.match_state = "" @classmethod def _init_parser(cls, name: str) -> argparse.ArgumentParser: @@ -190,6 +212,40 @@ def task_struct_get_state(task: drgn.Object) -> str: exit_state = task.exit_state.value_() return Stacks.TASK_STATES[(state | exit_state) & 0x7f] + @staticmethod + def resolve_state(tstate: str) -> str: + tstate = tstate.upper() + if tstate in Stacks.TASK_STATE_SHORTCUTS: + return Stacks.TASK_STATES[Stacks.TASK_STATE_SHORTCUTS[tstate]] + return tstate + + @staticmethod + def get_frame_pcs(task: drgn.Object) -> List[int]: + frame_pcs = [] + try: + for frame in sdb.get_prog().stack_trace(task): + frame_pcs.append(frame.pc) + except ValueError: + # + # Unwinding the stack of a running/runnable task will + # result in an exception. Since we expect some tasks to + # be running, we silently ignore this case, and move on. + # + # Unfortunately, the exception thrown in this case is a + # generic "ValueError" exception, so we may wind up + # masking other "ValueError" exceptions that are not due + # to unwinding the stack of a running task. + # + # We can't check the state of the task here, and verify + # it's in the "R" state, since that state can change in + # between the point where the "ValueError" exception was + # originally raised, and here where we'd verify the + # state of the task; i.e. it could have concurrently + # transitioned from running to some other state. + # + pass + return frame_pcs + # # Unfortunately the drgn Symbol API does not specify the namelist # that a symbol came from. As a result, we created the following @@ -216,120 +272,107 @@ def find_module_memory_segment(mod_name: str) -> Tuple[int, int]: mod.core_layout.size.value_()) return (-1, 0) - def validate_args(self, args: argparse.Namespace) -> None: - if args.function: - try: - func = sdb.get_object(args.function) - except KeyError: - raise sdb.CommandError( - self.name, - "symbol '{:s}' does not exist".format(args.function)) - if func.type_.kind != drgn.TypeKind.FUNCTION: - raise sdb.CommandError( - self.name, "'{:s}' is not a function".format(args.function)) - - task_states = Stacks.TASK_STATES.values() - task_states_lowercase = list(map(lambda x: x.lower(), task_states)) - state_shortcuts = Stacks.TASK_STATE_SHORTCUTS - if args.tstate and not args.tstate.lower( - ) in task_states_lowercase and not args.tstate in state_shortcuts: - raise sdb.CommandError( - self.name, - "'{:s}' is not a valid task state (acceptable states: {:s})". - format(args.tstate, ", ".join(task_states))) - - if args.module and Stacks.find_module_memory_segment( - args.module)[0] == -1: - raise sdb.CommandError( - self.name, - "module '{:s}' doesn't exist or isn't currently loaded".format( - args.module)) - - def _call(self, objs: Iterable[drgn.Object]) -> Iterable[drgn.Object]: - # pylint: disable=too-many-locals - # pylint: disable=too-many-branches - # pylint: disable=too-many-statements - + def validate_context(self) -> None: # - # As the exception explains the code that follows this statement - # only works for linux kernel targets (crash dumps or live systems). - # When support for userland is added we can factor the kernel code - # that follows into its own function and switch to the correct + # This implementation only works for linux kernel targets + # (crash dumps or live systems). When support for userland is added we can + # refactor the kernel code into its own function and switch to the correct # codepath depending on the target. # if not sdb.get_target_flags() & drgn.ProgramFlags.IS_LINUX_KERNEL: raise sdb.CommandError(self.name, "userland targets are not supported yet") - self.validate_args(self.args) + self.validate_args() + + def validate_args(self) -> None: + if self.args.function: + try: + # + # It would be simpler to resolve the symbol from the function + # name directly but we use the address due to osandov/drgn#47. + # + func = sdb.get_object(self.args.function) + sym = sdb.get_symbol(func.address_of_()) + except KeyError: + raise sdb.CommandError( + self.name, f"symbol '{self.args.function}' does not exist") + if func.type_.kind != drgn.TypeKind.FUNCTION: + raise sdb.CommandError( + self.name, f"'{self.args.function}' is not a function") + self.func_start = sym.address + self.func_end = self.func_start + sym.size - # - # Resolve TSTATE shortcut and/or sanitize it to standard uppercase - # notation if it exists. - # if self.args.tstate: - if self.args.tstate in Stacks.TASK_STATE_SHORTCUTS: - self.args.tstate = Stacks.TASK_STATES[ - Stacks.TASK_STATE_SHORTCUTS[self.args.tstate]] - else: - self.args.tstate = self.args.tstate.upper() + self.match_state = Stacks.resolve_state(self.args.tstate) + task_states = Stacks.TASK_STATES.values() + if self.match_state not in task_states: + valid_states = ", ".join(task_states) + raise sdb.CommandError( + self.name, f"'{self.args.tstate}' is not a valid task state" + f" (acceptable states: {valid_states})") - mod_start, mod_end = -1, -1 if self.args.module: - mod_start, mod_size = Stacks.find_module_memory_segment( + if Stacks.find_module_memory_segment(self.args.module)[0] == -1: + raise sdb.CommandError( + self.name, + f"module '{self.args.module}' doesn't exist or isn't currently loaded" + ) + self.mod_start, mod_size = Stacks.find_module_memory_segment( self.args.module) - assert mod_start != -1 - mod_end = mod_start + mod_size + assert self.mod_start != -1 + self.mod_end = self.mod_start + mod_size + + def match_stack(self, task: drgn.Object) -> bool: + if self.args.tstate and self.match_state != Stacks.task_struct_get_state( + task): + return False + + if not (self.args.module or self.args.function): + return True + + mod_match, func_match = not self.args.module, not self.args.function + for frame_pc in Stacks.get_frame_pcs(task): + if not mod_match and self.mod_start <= frame_pc < self.mod_end: + mod_match = True + + if not func_match and self.func_start <= frame_pc < self.func_end: + func_match = True + if mod_match and func_match: + return True + return False + + def print_header(self): header = "{:<18} {:<16s}".format("TASK_STRUCT", "STATE") if not self.args.all: header += " {:>6s}".format("COUNT") print(header) print("=" * 42) - # - # We inspect and group the tasks by recording their state and - # stack frames once in the following loop. We do this because - # on live systems state can change under us, thus running - # something like sdb.get_prog().stack_trace(task) twice (once for - # grouping and once for printing) could yield different stack - # traces resulting into misleading output. - # - stack_aggr: Dict[Any, List[drgn.Object]] = defaultdict(list) - for task in for_each_task(sdb.get_prog()): - stack_key = [Stacks.task_struct_get_state(task)] - try: - for frame in sdb.get_prog().stack_trace(task): - stack_key.append(frame.pc) - except ValueError: - # - # Unwinding the stack of a running/runnable task will - # result in an exception. Since we expect some tasks to - # be running, we silently ignore this case, and move on. - # - # Unfortunately, the exception thrown in this case is a - # generic "ValueError" exception, so we may wind up - # masking other "ValueError" exceptions that are not due - # to unwinding the stack of a running task. - # - # We can't check the state of the task here, and verify - # it's in the "R" state, since that state can change in - # between the point where the "ValueError" exception was - # originally raised, and here where we'd verify the - # state of the task; i.e. it could have concurrently - # transitioned from running to some other state. - # - pass - - stack_aggr[tuple(stack_key)].append(task) - - for stack_key, tasks in sorted(stack_aggr.items(), - key=lambda x: len(x[1]), - reverse=True): + # + # De-duplicate the objs (task_structs) using a dictionary indexed by + # task state and program counters. Return a collection sorted by number + # of tasks per stack. + # + # Note: we disabled pyline C0330 due to https://github.com/PyCQA/pylint/issues/289 + @staticmethod + def aggregate_stacks( + objs: Iterable[drgn.Object] # pylint: disable=C0330 + ) -> List[Tuple[Tuple[str, Tuple[int, ...]], List[drgn.Object]]]: + stack_aggr: Dict[Tuple[str, Tuple[int, ...]], + List[drgn.Object]] = defaultdict(list) + for task in objs: + stack_key = (Stacks.task_struct_get_state(task), + tuple(Stacks.get_frame_pcs(task))) + stack_aggr[stack_key].append(task) + return sorted(stack_aggr.items(), key=lambda x: len(x[1]), reverse=True) + + def print_stacks(self, objs: Iterable[drgn.Object]) -> None: + self.print_header() + for stack_key, tasks in Stacks.aggregate_stacks(objs): + stacktrace_info = "" task_state = stack_key[0] - if self.args.tstate and self.args.tstate != task_state: - continue - stacktrace_info = "" if self.args.all: for task in tasks: stacktrace_info += "{:<18s} {:<16s}\n".format( @@ -338,39 +381,22 @@ def _call(self, objs: Iterable[drgn.Object]) -> Iterable[drgn.Object]: stacktrace_info += "{:<18s} {:<16s} {:6d}\n".format( hex(tasks[0].value_()), task_state, len(tasks)) - mod_match, func_match = False, False - - # - # Note on the type-check being ignored: - # The original `stack_key` type is a list where the first - # element is a string and the rest of them are integers - # but this is not easily expressed in mypy, thus we ignore - # the assignment error below. - # - frame_pcs: List[int] = stack_key[1:] #type: ignore[assignment] + frame_pcs: Tuple[int, ...] = stack_key[1] for frame_pc in frame_pcs: - if mod_start != -1 and mod_start <= frame_pc < mod_end: - mod_match = True - try: sym = sdb.get_symbol(frame_pc) - func, offset = sym.name, frame_pc - sym.address - if self.args.function and self.args.function == func: - func_match = True + func = sym.name + offset = frame_pc - sym.address except LookupError: - func, offset = hex(frame_pc), 0x0 - - # - # As a potential future item, we may want to print - # the frame with the module where the pc/function - # belongs to. For example: - # txg_sync_thread+0x15e [zfs] - # + func = hex(frame_pc) + offset = 0x0 stacktrace_info += "{:18s}{}+{}\n".format("", func, hex(offset)) - - if mod_start != -1 and not mod_match: - continue - if self.args.function and not func_match: - continue print(stacktrace_info) - return [] + + def pretty_print(self, objs: Iterable[drgn.Object]) -> None: + self.validate_context() + self.print_stacks(filter(self.match_stack, objs)) + + def no_input(self) -> Iterable[drgn.Object]: + self.validate_context() + yield from filter(self.match_stack, for_each_task(sdb.get_prog())) diff --git a/tests/integration/data/regression_output/linux/echo 0xffffa089669edc00 | stack b/tests/integration/data/regression_output/linux/echo 0xffffa089669edc00 | stack new file mode 100644 index 00000000..0e713d5b --- /dev/null +++ b/tests/integration/data/regression_output/linux/echo 0xffffa089669edc00 | stack @@ -0,0 +1,13 @@ +TASK_STRUCT STATE COUNT +========================================== +0xffffa089669edc00 INTERRUPTIBLE 1 + __schedule+0x2c0 + schedule+0x2c + schedule_hrtimeout_range_clock+0x181 + schedule_hrtimeout_range+0x13 + ep_poll+0x258 + do_epoll_wait+0xb0 + __x64_sys_epoll_wait+0x1e + do_syscall_64+0x5a + entry_SYSCALL_64+0x7c + diff --git a/tests/integration/data/regression_output/linux/stacks -m bogus | count b/tests/integration/data/regression_output/linux/stacks -m bogus | count new file mode 100644 index 00000000..5f410b10 --- /dev/null +++ b/tests/integration/data/regression_output/linux/stacks -m bogus | count @@ -0,0 +1 @@ +sdb: stacks: module 'bogus' doesn't exist or isn't currently loaded diff --git a/tests/integration/data/regression_output/linux/stacks -m zfs -c zthr_procedure b/tests/integration/data/regression_output/linux/stacks -m zfs -c zthr_procedure new file mode 100644 index 00000000..e03c0257 --- /dev/null +++ b/tests/integration/data/regression_output/linux/stacks -m zfs -c zthr_procedure @@ -0,0 +1,25 @@ +TASK_STRUCT STATE COUNT +========================================== +0xffffa0895684c500 INTERRUPTIBLE 13 + __schedule+0x2c0 + schedule+0x2c + cv_wait_common+0x11f + __cv_wait_sig+0x15 + zthr_procedure+0x51 + thread_generic_wrapper+0x74 + kthread+0x121 + ret_from_fork+0x1f + +0xffffa08956849700 INTERRUPTIBLE 1 + __schedule+0x2c0 + schedule+0x2c + schedule_hrtimeout_range_clock+0xb9 + schedule_hrtimeout_range+0x13 + __cv_timedwait_hires+0x11b + cv_timedwait_hires_common+0x4b + cv_timedwait_sig_hires+0x14 + zthr_procedure+0xa4 + thread_generic_wrapper+0x74 + kthread+0x121 + ret_from_fork+0x1f + diff --git a/tests/integration/data/regression_output/linux/stacks -m zfs | count b/tests/integration/data/regression_output/linux/stacks -m zfs | count new file mode 100644 index 00000000..ed054ed0 --- /dev/null +++ b/tests/integration/data/regression_output/linux/stacks -m zfs | count @@ -0,0 +1 @@ +(unsigned long long)26 diff --git "a/tests/integration/data/regression_output/linux/threads | filter obj.comm == \"java\" | stack" "b/tests/integration/data/regression_output/linux/threads | filter obj.comm == \"java\" | stack" new file mode 100644 index 00000000..f7f72d66 --- /dev/null +++ "b/tests/integration/data/regression_output/linux/threads | filter obj.comm == \"java\" | stack" @@ -0,0 +1,79 @@ +TASK_STRUCT STATE COUNT +========================================== +0xffffa08960a38000 INTERRUPTIBLE 57 + __schedule+0x2c0 + schedule+0x2c + futex_wait_queue_me+0xc4 + futex_wait+0x10a + do_futex+0x364 + __x64_sys_futex+0x13f + do_syscall_64+0x5a + entry_SYSCALL_64+0x7c + +0xffffa08960a24500 INTERRUPTIBLE 12 + __schedule+0x2c0 + schedule+0x2c + schedule_hrtimeout_range_clock+0xb9 + schedule_hrtimeout_range+0x13 + ep_poll+0x258 + do_epoll_wait+0xb0 + __x64_sys_epoll_wait+0x1e + do_syscall_64+0x5a + entry_SYSCALL_64+0x7c + +0xffffa088f740dc00 INTERRUPTIBLE 6 + __schedule+0x2c0 + schedule+0x2c + pipe_wait+0x70 + pipe_read+0x21f + new_sync_read+0x109 + __vfs_read+0x29 + vfs_read+0x8e + ksys_read+0x5c + __x64_sys_read+0x1a + do_syscall_64+0x5a + entry_SYSCALL_64+0x7c + +0xffffa088f740ae00 INTERRUPTIBLE 3 + __schedule+0x2c0 + schedule+0x2c + do_wait+0x1cb + kernel_wait4+0x89 + __do_sys_wait4+0x95 + __x64_sys_wait4+0x1e + do_syscall_64+0x5a + entry_SYSCALL_64+0x7c + +0xffffa088ef2d1700 INTERRUPTIBLE 2 + __schedule+0x2c0 + schedule+0x2c + schedule_timeout+0x1db + inet_csk_accept+0x246 + inet_accept+0x45 + __sys_accept4+0x104 + __x64_sys_accept+0x1c + do_syscall_64+0x5a + entry_SYSCALL_64+0x7c + +0xffffa0889cd4dc00 INTERRUPTIBLE 2 + __schedule+0x2c0 + schedule+0x2c + schedule_hrtimeout_range_clock+0x181 + schedule_hrtimeout_range+0x13 + ep_poll+0x258 + do_epoll_wait+0xb0 + __x64_sys_epoll_wait+0x1e + do_syscall_64+0x5a + entry_SYSCALL_64+0x7c + +0xffffa088f0979700 INTERRUPTIBLE 1 + __schedule+0x2c0 + schedule+0x2c + schedule_hrtimeout_range_clock+0x181 + schedule_hrtimeout_range+0x13 + poll_schedule_timeout.constprop.11+0x46 + do_sys_poll+0x3d6 + __x64_sys_poll+0x3b + do_syscall_64+0x5a + entry_SYSCALL_64+0x7c + diff --git a/tests/integration/test_linux_generic.py b/tests/integration/test_linux_generic.py index f732d1e8..b5a14da9 100644 --- a/tests/integration/test_linux_generic.py +++ b/tests/integration/test_linux_generic.py @@ -82,6 +82,10 @@ "stacks -m zfs", "stacks -c spa_sync", "stacks -m zfs -c spa_sync", + "stacks -m zfs -c zthr_procedure", + 'threads | filter obj.comm == "java" | stack', + "stacks -m zfs | count", + "echo 0xffffa089669edc00 | stack", # threads "threads", @@ -139,6 +143,7 @@ "stacks -m bogus", "stacks -c bogus", "stacks -t bogus", + "stacks -m bogus | count", ] CMD_TABLE = POS_CMDS + STRIPPED_POS_CMDS + NEG_CMDS From 53abfdbbe5ed9d73f8ad487adc394edb11f16bc8 Mon Sep 17 00:00:00 2001 From: Matthew Ahrens Date: Tue, 25 Feb 2020 11:00:42 -0800 Subject: [PATCH 03/19] dbuf command filtering does not work in all invocations (#184) The dbuf command can select dbufs that match certain parameters (e.g. '-l 1' for level-1 dbufs). This works when `dbuf` is the first command in the pipeline, and when it is used as a locator with a dnode_t* as input. But it doesn't work in other circumstances, for example when it's being used only as a pretty-printer (with the list of dbufs piped in), or when it's used in the middle of a pipeline. This change adds the filter calls to this use cases, and adds corresponding test cases --- sdb/commands/zfs/dbuf.py | 6 +- .../data/regression_output/zfs/dbuf -l 1 | 275 ++++++++++++++++++ .../regression_output/zfs/dbuf | dbuf -l 1 | 275 ++++++++++++++++++ .../zfs/dbuf | dbuf -l 1 | head | dbuf | 11 + tests/integration/test_zfs_generic.py | 5 +- 5 files changed, 570 insertions(+), 2 deletions(-) create mode 100644 tests/integration/data/regression_output/zfs/dbuf -l 1 create mode 100644 tests/integration/data/regression_output/zfs/dbuf | dbuf -l 1 create mode 100644 tests/integration/data/regression_output/zfs/dbuf | dbuf -l 1 | head | dbuf diff --git a/sdb/commands/zfs/dbuf.py b/sdb/commands/zfs/dbuf.py index f116e46d..1bd704dd 100644 --- a/sdb/commands/zfs/dbuf.py +++ b/sdb/commands/zfs/dbuf.py @@ -83,7 +83,7 @@ def ObjsetName(os: drgn.Object): def pretty_print(self, dbufs): print("{:>20} {:>8} {:>4} {:>8} {:>5} {}".format( "addr", "object", "lvl", "blkid", "holds", "os")) - for dbuf in dbufs: + for dbuf in filter(self.argfilter, dbufs): print("{:>20} {:>8d} {:>4d} {:>8d} {:>5d} {}".format( hex(dbuf), int(dbuf.db.db_object), int(dbuf.db_level), int(dbuf.db_blkid), int(dbuf.db_holds.rc_count), @@ -115,6 +115,10 @@ def all_dnode_dbufs(self, dn: drgn.Object) -> Iterable[drgn.Object]: def from_dnode(self, dn: drgn.Object) -> Iterable[drgn.Object]: yield from filter(self.argfilter, self.all_dnode_dbufs(dn)) + @sdb.InputHandler(input_type) + def from_dbuf(self, dbuf: drgn.Object) -> Iterable[drgn.Object]: + yield from filter(self.argfilter, [dbuf]) + @staticmethod def all_dbufs() -> Iterable[drgn.Object]: hash_map = sdb.get_object("dbuf_hash_table").address_of_() diff --git a/tests/integration/data/regression_output/zfs/dbuf -l 1 b/tests/integration/data/regression_output/zfs/dbuf -l 1 new file mode 100644 index 00000000..2d159896 --- /dev/null +++ b/tests/integration/data/regression_output/zfs/dbuf -l 1 @@ -0,0 +1,275 @@ + addr object lvl blkid holds os + 0xffffa08954f98e10 25955 1 0 0 rpool/ROOT/delphix.gX9jjSh/root + 0xffffa088c429f518 168157 1 0 0 rpool/ROOT/delphix.gX9jjSh/root + 0xffffa08888c60870 168239 1 0 0 rpool/ROOT/delphix.gX9jjSh/root + 0xffffa088d72262d0 168389 1 0 0 rpool/ROOT/delphix.gX9jjSh/root + 0xffffa088ca1162d0 1730 1 0 0 rpool/ROOT/delphix.gX9jjSh/data + 0xffffa088cdd51950 40457 1 0 0 rpool/ROOT/delphix.gX9jjSh/root + 0xffffa08937e58168 168443 1 2 89 rpool/ROOT/delphix.gX9jjSh/root + 0xffffa08937e593b0 166892 1 2 39 rpool/ROOT/delphix.gX9jjSh/root + 0xffffa08954d437e8 0 1 5 139 rpool/ROOT/delphix.gX9jjSh/root + 0xffffa088d346d3b0 168248 1 0 0 rpool/ROOT/delphix.gX9jjSh/root + 0xffffa0893991c870 168186 1 0 0 rpool/ROOT/delphix.gX9jjSh/root + 0xffffa089311c17e8 10951 1 0 0 rpool/ROOT/delphix.gX9jjSh/root + 0xffffa0896422bab8 168338 1 0 0 rpool/ROOT/delphix.gX9jjSh/root + 0xffffa088c5673c20 168137 1 0 0 rpool/ROOT/delphix.gX9jjSh/root + 0xffffa088c4c377e8 168319 1 0 0 rpool/ROOT/delphix.gX9jjSh/root + 0xffffa088c43209d8 19 1 0 0 rpool/_MOS + 0xffffa088a3dfe2d0 203 1 0 0 rpool/_MOS + 0xffffa0894e72c000 168160 1 0 0 rpool/ROOT/delphix.gX9jjSh/root + 0xffffa0889f554870 177 1 0 0 rpool/ROOT/delphix.gX9jjSh/data + 0xffffa088cae205a0 9032 1 0 0 rpool/ROOT/delphix.gX9jjSh/root + 0xffffa08937376000 168144 1 0 0 rpool/ROOT/delphix.gX9jjSh/root + 0xffffa0891f77f7e8 168243 1 0 0 rpool/ROOT/delphix.gX9jjSh/root + 0xffffa088ceb47950 9940 1 0 0 rpool/ROOT/delphix.gX9jjSh/root + 0xffffa088ebdae870 168176 1 0 0 rpool/ROOT/delphix.gX9jjSh/root + 0xffffa088c4320ca8 168322 1 0 0 rpool/ROOT/delphix.gX9jjSh/root + 0xffffa08939fb0b40 168256 1 0 0 rpool/ROOT/delphix.gX9jjSh/root + 0xffffa088ca11b950 9944 1 0 0 rpool/ROOT/delphix.gX9jjSh/root + 0xffffa0893a1382d0 10175 1 0 0 rpool/ROOT/delphix.gX9jjSh/root + 0xffffa088a65c82d0 168199 1 0 0 rpool/ROOT/delphix.gX9jjSh/root + 0xffffa08938d38000 10706 1 0 0 rpool/ROOT/delphix.gX9jjSh/root + 0xffffa0893f5e1950 0 1 0 1 rpool/public + 0xffffa08930dd5680 25936 1 0 0 rpool/ROOT/delphix.gX9jjSh/root + 0xffffa088c8b9b248 1075 1 0 0 rpool/ROOT/delphix.gX9jjSh/data + 0xffffa0894cf6a708 168213 1 0 0 rpool/ROOT/delphix.gX9jjSh/root + 0xffffa08933c8ae10 206 1 0 1 rpool/_MOS + 0xffffa088ca8f4f78 166893 1 7 0 rpool/ROOT/delphix.gX9jjSh/root + 0xffffa088a28c2e10 168436 1 0 0 rpool/ROOT/delphix.gX9jjSh/root + 0xffffa088831bc708 10713 1 0 0 rpool/ROOT/delphix.gX9jjSh/root + 0xffffa088a0119ab8 168147 1 0 0 rpool/ROOT/delphix.gX9jjSh/root + 0xffffa08941d2a438 168439 1 0 0 rpool/ROOT/delphix.gX9jjSh/root + 0xffffa08943e86e10 26105 1 0 0 rpool/ROOT/delphix.gX9jjSh/root + 0xffffa0894074eca8 5734 1 0 0 rpool/ROOT/delphix.gX9jjSh/root + 0xffffa088c4c66f78 168364 1 0 0 rpool/ROOT/delphix.gX9jjSh/root + 0xffffa08937e5a9d8 0 1 0 4 meta-domain/_MOS + 0xffffa0894e09c438 168277 1 0 0 rpool/ROOT/delphix.gX9jjSh/root + 0xffffa0889f8a0b40 168377 1 0 0 rpool/ROOT/delphix.gX9jjSh/root + 0xffffa0891ae569d8 25927 1 0 0 rpool/ROOT/delphix.gX9jjSh/root + 0xffffa089311f4870 26114 1 0 0 rpool/ROOT/delphix.gX9jjSh/root + 0xffffa0889c02b0e0 26831 1 0 0 rpool/ROOT/delphix.gX9jjSh/home + 0xffffa08945818870 0 1 0 4 rpool/ROOT/delphix.gX9jjSh/log + 0xffffa088a25ca168 125 1 0 1 rpool/_MOS + 0xffffa089455d93b0 26121 1 0 0 rpool/ROOT/delphix.gX9jjSh/root + 0xffffa08951214708 10400 1 0 0 rpool/ROOT/delphix.gX9jjSh/root + 0xffffa0894017b3b0 25943 1 0 0 rpool/ROOT/delphix.gX9jjSh/root + 0xffffa088c5b645a0 7421 1 0 0 rpool/ROOT/delphix.gX9jjSh/root + 0xffffa088c4c67680 168238 1 0 0 rpool/ROOT/delphix.gX9jjSh/root + 0xffffa088c68a1d88 168401 1 0 0 rpool/ROOT/delphix.gX9jjSh/root + 0xffffa088d346d7e8 168250 1 0 0 rpool/ROOT/delphix.gX9jjSh/root + 0xffffa0894952f518 26099 1 0 0 rpool/ROOT/delphix.gX9jjSh/root + 0xffffa088a2819c20 0 1 1 1 rpool/ROOT/delphix.gX9jjSh/home + 0xffffa089651025a0 26104 1 0 0 rpool/ROOT/delphix.gX9jjSh/root + 0xffffa088cdd517e8 4461 1 0 0 rpool/ROOT/delphix.gX9jjSh/root + 0xffffa0889e1a7c20 168301 1 0 0 rpool/ROOT/delphix.gX9jjSh/root + 0xffffa088a282bc20 168443 1 7 3 rpool/ROOT/delphix.gX9jjSh/root + 0xffffa088c6b65ab8 168138 1 0 0 rpool/ROOT/delphix.gX9jjSh/root + 0xffffa0889810d950 208 1 0 0 rpool/_MOS + 0xffffa08937e59950 166891 1 2 89 rpool/ROOT/delphix.gX9jjSh/root + 0xffffa088c7bc9518 8360 1 0 0 rpool/ROOT/delphix.gX9jjSh/root + 0xffffa088c8a3b0e0 40 1 0 0 rpool/ROOT/delphix.gX9jjSh/log + 0xffffa0891ae56708 25928 1 0 0 rpool/ROOT/delphix.gX9jjSh/root + 0xffffa08950331248 168152 1 0 0 rpool/ROOT/delphix.gX9jjSh/root + 0xffffa088cdd43d88 10382 1 0 0 rpool/ROOT/delphix.gX9jjSh/root + 0xffffa0894af51950 168417 1 0 0 rpool/ROOT/delphix.gX9jjSh/root + 0xffffa08882ac2e10 10871 1 0 0 rpool/ROOT/delphix.gX9jjSh/root + 0xffffa089561562d0 25944 1 0 0 rpool/ROOT/delphix.gX9jjSh/root + 0xffffa0894e097680 26111 1 0 0 rpool/ROOT/delphix.gX9jjSh/root + 0xffffa088a533c438 168353 1 0 0 rpool/ROOT/delphix.gX9jjSh/root + 0xffffa089455edd88 4463 1 0 0 rpool/ROOT/delphix.gX9jjSh/root + 0xffffa08885d42708 164085 1 0 0 rpool/ROOT/delphix.gX9jjSh/root + 0xffffa088cac169d8 9034 1 0 0 rpool/ROOT/delphix.gX9jjSh/root + 0xffffa08943322b40 25960 1 0 0 rpool/ROOT/delphix.gX9jjSh/root + 0xffffa088ef289ab8 10540 1 0 0 rpool/ROOT/delphix.gX9jjSh/root + 0xffffa0895012fab8 10847 1 0 0 rpool/ROOT/delphix.gX9jjSh/root + 0xffffa088c60b3c20 168443 1 3 2 rpool/ROOT/delphix.gX9jjSh/root + 0xffffa08888c60000 168210 1 0 0 rpool/ROOT/delphix.gX9jjSh/root + 0xffffa088cd345950 168267 1 0 0 rpool/ROOT/delphix.gX9jjSh/root + 0xffffa088ca116168 2171 1 0 0 rpool/ROOT/delphix.gX9jjSh/data + 0xffffa088d3f6bab8 168246 1 0 0 rpool/ROOT/delphix.gX9jjSh/root + 0xffffa08943a6fc20 10944 1 0 0 rpool/ROOT/delphix.gX9jjSh/root + 0xffffa08950a9f248 9897 1 0 0 rpool/ROOT/delphix.gX9jjSh/root + 0xffffa08960175c20 168352 1 0 0 rpool/ROOT/delphix.gX9jjSh/root + 0xffffa089373770e0 168266 1 0 0 rpool/ROOT/delphix.gX9jjSh/root + 0xffffa08930967950 10523 1 0 0 rpool/ROOT/delphix.gX9jjSh/root + 0xffffa088f09e22d0 168332 1 0 0 rpool/ROOT/delphix.gX9jjSh/root + 0xffffa088c6b60168 10521 1 0 0 rpool/ROOT/delphix.gX9jjSh/root + 0xffffa0889c5fe2d0 179 1 0 1 rpool/_MOS + 0xffffa088c4cd8e10 168365 1 0 0 rpool/ROOT/delphix.gX9jjSh/root + 0xffffa088ce7ecb40 2 1 0 579 meta-domain/fs-tmp + 0xffffa0893bf95950 25946 1 0 0 rpool/ROOT/delphix.gX9jjSh/root + 0xffffa08930ab4ca8 166891 1 3 2 rpool/ROOT/delphix.gX9jjSh/root + 0xffffa088cbfe8b40 168149 1 0 0 rpool/ROOT/delphix.gX9jjSh/root + 0xffffa088cc1117e8 168397 1 0 0 rpool/ROOT/delphix.gX9jjSh/root + 0xffffa08937e597e8 168443 1 1 34 rpool/ROOT/delphix.gX9jjSh/root + 0xffffa088ebc7a168 134 1 0 0 rpool/ROOT/delphix.gX9jjSh/data + 0xffffa089601757e8 168359 1 0 0 rpool/ROOT/delphix.gX9jjSh/root + 0xffffa089642e70e0 5742 1 0 0 rpool/ROOT/delphix.gX9jjSh/root + 0xffffa08885c69ab8 10679 1 0 0 rpool/ROOT/delphix.gX9jjSh/root + 0xffffa088caeee9d8 10869 1 0 0 rpool/ROOT/delphix.gX9jjSh/root + 0xffffa088d72265a0 168367 1 0 0 rpool/ROOT/delphix.gX9jjSh/root + 0xffffa0889c593518 168443 1 0 274 rpool/ROOT/delphix.gX9jjSh/root + 0xffffa0896422ae10 168398 1 0 0 rpool/ROOT/delphix.gX9jjSh/root + 0xffffa089503309d8 25950 1 0 0 rpool/ROOT/delphix.gX9jjSh/root + 0xffffa08949e62168 0 1 1 196 rpool/ROOT/delphix.gX9jjSh/root + 0xffffa08950331950 25949 1 0 0 rpool/ROOT/delphix.gX9jjSh/root + 0xffffa088caf8eca8 9028 1 0 0 rpool/ROOT/delphix.gX9jjSh/root + 0xffffa0889f1b9518 4460 1 0 0 rpool/ROOT/delphix.gX9jjSh/root + 0xffffa0896422bd88 168217 1 0 0 rpool/ROOT/delphix.gX9jjSh/root + 0xffffa088c43205a0 168295 1 0 0 rpool/ROOT/delphix.gX9jjSh/root + 0xffffa089553f9950 168273 1 0 0 rpool/ROOT/delphix.gX9jjSh/root + 0xffffa088a298d0e0 168269 1 0 0 rpool/ROOT/delphix.gX9jjSh/root + 0xffffa0889f684168 205 1 0 0 rpool/_MOS + 0xffffa088c746c5a0 168315 1 0 0 rpool/ROOT/delphix.gX9jjSh/root + 0xffffa08930801680 0 1 4 125 rpool/ROOT/delphix.gX9jjSh/root + 0xffffa0891ae56b40 25931 1 0 0 rpool/ROOT/delphix.gX9jjSh/root + 0xffffa0893c80d0e0 25953 1 0 0 rpool/ROOT/delphix.gX9jjSh/root + 0xffffa08949e617e8 9888 1 0 0 rpool/ROOT/delphix.gX9jjSh/root + 0xffffa0894953cb40 26126 1 0 0 rpool/ROOT/delphix.gX9jjSh/root + 0xffffa088c64c2870 168253 1 0 0 rpool/ROOT/delphix.gX9jjSh/root + 0xffffa088ca75e9d8 9063 1 0 0 rpool/ROOT/delphix.gX9jjSh/root + 0xffffa08954dd4b40 166891 1 0 312 rpool/ROOT/delphix.gX9jjSh/root + 0xffffa08937e59d88 166891 1 1 36 rpool/ROOT/delphix.gX9jjSh/root + 0xffffa088cabc37e8 11007 1 0 0 rpool/ROOT/delphix.gX9jjSh/root + 0xffffa089580c2b40 26113 1 0 0 rpool/ROOT/delphix.gX9jjSh/root + 0xffffa089598e7248 0 1 0 2 meta-domain + 0xffffa089413e45a0 24579 1 0 0 rpool/ROOT/delphix.gX9jjSh/home + 0xffffa088c5d470e0 168416 1 0 0 rpool/ROOT/delphix.gX9jjSh/root + 0xffffa089409baca8 25956 1 0 0 rpool/ROOT/delphix.gX9jjSh/root + 0xffffa088c9ff53b0 4459 1 0 0 rpool/ROOT/delphix.gX9jjSh/root + 0xffffa088df78a438 5744 1 0 0 rpool/ROOT/delphix.gX9jjSh/root + 0xffffa0894078a708 5740 1 0 0 rpool/ROOT/delphix.gX9jjSh/root + 0xffffa08940384000 0 1 0 1 rpool/upgrade-logs + 0xffffa08943322168 26108 1 0 0 rpool/ROOT/delphix.gX9jjSh/root + 0xffffa0889f685950 1372 1 0 0 rpool/ROOT/delphix.gX9jjSh/data + 0xffffa088c6fc0f78 168343 1 0 0 rpool/ROOT/delphix.gX9jjSh/root + 0xffffa08945818e10 0 1 0 147 rpool/ROOT/delphix.gX9jjSh/data + 0xffffa0889c3542d0 9889 1 0 0 rpool/ROOT/delphix.gX9jjSh/root + 0xffffa08933436f78 9894 1 0 0 rpool/ROOT/delphix.gX9jjSh/root + 0xffffa088c8a3a708 168360 1 0 0 rpool/ROOT/delphix.gX9jjSh/root + 0xffffa08937b83d88 9929 1 0 0 rpool/ROOT/delphix.gX9jjSh/root + 0xffffa089455d9c20 26122 1 0 0 rpool/ROOT/delphix.gX9jjSh/root + 0xffffa08949533518 26106 1 0 0 rpool/ROOT/delphix.gX9jjSh/root + 0xffffa0894cf6a000 168333 1 0 0 rpool/ROOT/delphix.gX9jjSh/root + 0xffffa0891bce0ca8 168135 1 0 0 rpool/ROOT/delphix.gX9jjSh/root + 0xffffa08882a32438 10870 1 0 0 rpool/ROOT/delphix.gX9jjSh/root + 0xffffa088ecd5bab8 168409 1 0 0 rpool/ROOT/delphix.gX9jjSh/root + 0xffffa08933c8b680 0 1 0 308 rpool/ROOT/delphix.gX9jjSh/root + 0xffffa08894b285a0 9022 1 0 0 rpool/ROOT/delphix.gX9jjSh/root + 0xffffa088d0da1ab8 166891 1 7 3 rpool/ROOT/delphix.gX9jjSh/root + 0xffffa088a29705a0 168363 1 0 0 rpool/ROOT/delphix.gX9jjSh/root + 0xffffa088cbfea2d0 168437 1 0 0 rpool/ROOT/delphix.gX9jjSh/root + 0xffffa089601753b0 168274 1 0 0 rpool/ROOT/delphix.gX9jjSh/root + 0xffffa0894a89d950 168294 1 0 0 rpool/ROOT/delphix.gX9jjSh/root + 0xffffa088c42b4b40 872 1 0 0 rpool/ROOT/delphix.gX9jjSh/data + 0xffffa08940567d88 26103 1 0 0 rpool/ROOT/delphix.gX9jjSh/root + 0xffffa0895012fc20 10811 1 0 0 rpool/ROOT/delphix.gX9jjSh/root + 0xffffa088cbfeb7e8 168326 1 0 0 rpool/ROOT/delphix.gX9jjSh/root + 0xffffa088c8a3a5a0 27 1 0 1 rpool/ROOT/delphix.gX9jjSh/log + 0xffffa088ceb46b40 11617 1 0 0 rpool/ROOT/delphix.gX9jjSh/root + 0xffffa0894d8977e8 10790 1 0 0 rpool/ROOT/delphix.gX9jjSh/root + 0xffffa08942ff3248 26102 1 0 0 rpool/ROOT/delphix.gX9jjSh/root + 0xffffa08943600b40 168183 1 0 0 rpool/ROOT/delphix.gX9jjSh/root + 0xffffa088cdd8eca8 10530 1 0 0 rpool/ROOT/delphix.gX9jjSh/root + 0xffffa088c8a3af78 168386 1 0 0 rpool/ROOT/delphix.gX9jjSh/root + 0xffffa0893c8022d0 168345 1 0 0 rpool/ROOT/delphix.gX9jjSh/root + 0xffffa088ce1cb3b0 168435 1 0 0 rpool/ROOT/delphix.gX9jjSh/root + 0xffffa089463a8708 26783 1 0 0 rpool/ROOT/delphix.gX9jjSh/home + 0xffffa08943a01248 4464 1 0 0 rpool/ROOT/delphix.gX9jjSh/root + 0xffffa0895351f0e0 0 1 0 9 rpool/_MOS + 0xffffa088c60bb950 168283 1 0 0 rpool/ROOT/delphix.gX9jjSh/root + 0xffffa088c42b5c20 2173 1 0 2 rpool/ROOT/delphix.gX9jjSh/data + 0xffffa08937e5bab8 166892 1 1 3 rpool/ROOT/delphix.gX9jjSh/root + 0xffffa08939703d88 2331 1 0 0 rpool/ROOT/delphix.gX9jjSh/root + 0xffffa088d344b248 168330 1 0 0 rpool/ROOT/delphix.gX9jjSh/root + 0xffffa088cabc2f78 164086 1 0 0 rpool/ROOT/delphix.gX9jjSh/root + 0xffffa088ebcc9ab8 168279 1 0 0 rpool/ROOT/delphix.gX9jjSh/root + 0xffffa0893dba3680 26818 1 0 0 rpool/ROOT/delphix.gX9jjSh/home + 0xffffa088a17745a0 10525 1 0 0 rpool/ROOT/delphix.gX9jjSh/root + 0xffffa088cbc0c870 2 1 1 1 meta-domain/fs-tmp + 0xffffa088c4321ab8 168264 1 0 0 rpool/ROOT/delphix.gX9jjSh/root + 0xffffa089373729d8 9821 1 0 0 rpool/ROOT/delphix.gX9jjSh/root + 0xffffa088c5672000 168341 1 0 0 rpool/ROOT/delphix.gX9jjSh/root + 0xffffa0894cf6b518 168211 1 0 0 rpool/ROOT/delphix.gX9jjSh/root + 0xffffa088c746c2d0 39612 1 0 1 rpool/ROOT/delphix.gX9jjSh/root + 0xffffa089436c2168 181 1 0 0 rpool/ROOT/delphix.gX9jjSh/data + 0xffffa088cac149d8 168324 1 0 0 rpool/ROOT/delphix.gX9jjSh/root + 0xffffa089403cf248 0 1 0 3 rpool/update + 0xffffa0893bf949d8 25947 1 0 0 rpool/ROOT/delphix.gX9jjSh/root + 0xffffa08951a70000 10764 1 0 0 rpool/ROOT/delphix.gX9jjSh/root + 0xffffa088d0c8f518 280 1 0 1 rpool/_MOS + 0xffffa08950c705a0 10415 1 0 0 rpool/ROOT/delphix.gX9jjSh/root + 0xffffa08940384ca8 0 1 0 1 data + 0xffffa088c9ff5c20 168285 1 0 0 rpool/ROOT/delphix.gX9jjSh/root + 0xffffa088c421e708 10528 1 0 0 rpool/ROOT/delphix.gX9jjSh/root + 0xffffa088ef25fd88 150 1 0 0 rpool/ROOT/delphix.gX9jjSh/root + 0xffffa088831bc000 10716 1 0 0 rpool/ROOT/delphix.gX9jjSh/root + 0xffffa088cc111518 168262 1 0 0 rpool/ROOT/delphix.gX9jjSh/root + 0xffffa088cf192438 168328 1 0 0 rpool/ROOT/delphix.gX9jjSh/root + 0xffffa08954d35680 23 1 0 2 rpool/ROOT/delphix.gX9jjSh/log + 0xffffa088ce7ec9d8 0 1 0 3 meta-domain/fs-tmp + 0xffffa088ecab97e8 168374 1 0 0 rpool/ROOT/delphix.gX9jjSh/root + 0xffffa0893bf9fc20 25948 1 0 0 rpool/ROOT/delphix.gX9jjSh/root + 0xffffa0894288e000 25951 1 0 0 rpool/ROOT/delphix.gX9jjSh/root + 0xffffa088c9ff5680 4458 1 0 0 rpool/ROOT/delphix.gX9jjSh/root + 0xffffa088d362a2d0 168318 1 0 0 rpool/ROOT/delphix.gX9jjSh/root + 0xffffa088c4d8b680 168276 1 0 0 rpool/ROOT/delphix.gX9jjSh/root + 0xffffa0889fc84b40 799 1 0 0 rpool/ROOT/delphix.gX9jjSh/root + 0xffffa088d08430e0 168308 1 0 0 rpool/ROOT/delphix.gX9jjSh/root + 0xffffa088ecab9518 166892 1 7 3 rpool/ROOT/delphix.gX9jjSh/root + 0xffffa08945828870 168281 1 0 0 rpool/ROOT/delphix.gX9jjSh/root + 0xffffa088c57a7518 9027 1 0 0 rpool/ROOT/delphix.gX9jjSh/root + 0xffffa088ca117c20 166892 1 0 97 rpool/ROOT/delphix.gX9jjSh/root + 0xffffa088c42b5d88 168434 1 0 0 rpool/ROOT/delphix.gX9jjSh/root + 0xffffa0891f77f3b0 168384 1 0 0 rpool/ROOT/delphix.gX9jjSh/root + 0xffffa089472df248 10407 1 0 0 rpool/ROOT/delphix.gX9jjSh/root + 0xffffa088ca11a708 10853 1 0 0 rpool/ROOT/delphix.gX9jjSh/root + 0xffffa088a2952000 168387 1 0 0 rpool/ROOT/delphix.gX9jjSh/root + 0xffffa0893c76d518 26123 1 0 0 rpool/ROOT/delphix.gX9jjSh/root + 0xffffa088a533d7e8 168271 1 0 0 rpool/ROOT/delphix.gX9jjSh/root + 0xffffa08944ddc438 168212 1 0 0 rpool/ROOT/delphix.gX9jjSh/root + 0xffffa0889f1b8000 4462 1 0 0 rpool/ROOT/delphix.gX9jjSh/root + 0xffffa08960174870 168306 1 0 0 rpool/ROOT/delphix.gX9jjSh/root + 0xffffa089533e0f78 18 1 0 1 rpool/_MOS + 0xffffa088c60b3518 168309 1 0 0 rpool/ROOT/delphix.gX9jjSh/root + 0xffffa088c6b61c20 168204 1 0 0 rpool/ROOT/delphix.gX9jjSh/root + 0xffffa088c70222d0 10945 1 0 0 rpool/ROOT/delphix.gX9jjSh/root + 0xffffa0894cf6ae10 168288 1 0 0 rpool/ROOT/delphix.gX9jjSh/root + 0xffffa0894b28e9d8 168148 1 0 0 rpool/ROOT/delphix.gX9jjSh/root + 0xffffa088d7226f78 168334 1 0 0 rpool/ROOT/delphix.gX9jjSh/root + 0xffffa088d1f25ab8 10420 1 0 0 rpool/ROOT/delphix.gX9jjSh/root + 0xffffa089408bfd88 168349 1 0 0 rpool/ROOT/delphix.gX9jjSh/root + 0xffffa089496cc5a0 6345 1 0 0 rpool/ROOT/delphix.gX9jjSh/root + 0xffffa0894a9f1950 26125 1 0 0 rpool/ROOT/delphix.gX9jjSh/root + 0xffffa0895012ee10 10844 1 0 0 rpool/ROOT/delphix.gX9jjSh/root + 0xffffa088cd345ab8 168314 1 0 0 rpool/ROOT/delphix.gX9jjSh/root + 0xffffa088a0505518 9832 1 0 0 rpool/ROOT/delphix.gX9jjSh/root + 0xffffa08954d43680 2172 1 0 2 rpool/ROOT/delphix.gX9jjSh/data + 0xffffa08943a6a000 166892 1 3 2 rpool/ROOT/delphix.gX9jjSh/root + 0xffffa088c57a7680 10169 1 0 0 rpool/ROOT/delphix.gX9jjSh/root + 0xffffa0889be0a168 9 1 0 3 rpool/ROOT/delphix.gX9jjSh/data + 0xffffa089455449d8 0 1 0 135 rpool/ROOT/delphix.gX9jjSh/home + 0xffffa08945544000 0 1 0 2 rpool/crashdump + 0xffffa088c8a3b248 52072 1 0 0 rpool/ROOT/delphix.gX9jjSh/root + 0xffffa08960174168 168321 1 0 0 rpool/ROOT/delphix.gX9jjSh/root + 0xffffa0893c76dab8 26124 1 0 0 rpool/ROOT/delphix.gX9jjSh/root + 0xffffa0894c3a9c20 0 1 0 3 data/_MOS + 0xffffa088d2814f78 168235 1 0 0 rpool/ROOT/delphix.gX9jjSh/root + 0xffffa0888952e870 10257 1 0 0 rpool/ROOT/delphix.gX9jjSh/root + 0xffffa08944dddc20 202 1 0 0 rpool/_MOS + 0xffffa08930d86438 0 1 3 31 rpool/ROOT/delphix.gX9jjSh/root + 0xffffa0889c5fef78 66 1 0 0 rpool/_MOS + 0xffffa08933c10438 168440 1 0 0 rpool/ROOT/delphix.gX9jjSh/root + 0xffffa08953aa3680 166893 1 0 2 rpool/ROOT/delphix.gX9jjSh/root + 0xffffa089522bf950 26109 1 0 0 rpool/ROOT/delphix.gX9jjSh/root + 0xffffa0894a895248 52491 1 0 0 rpool/ROOT/delphix.gX9jjSh/root + 0xffffa088ca7313b0 9060 1 0 0 rpool/ROOT/delphix.gX9jjSh/root + 0xffffa08947e80708 0 1 2 108 rpool/ROOT/delphix.gX9jjSh/root + 0xffffa0894ced4b40 207 1 0 0 rpool/_MOS + 0xffffa088a4544b40 10168 1 0 0 rpool/ROOT/delphix.gX9jjSh/root + 0xffffa08946a7fc20 168311 1 0 0 rpool/ROOT/delphix.gX9jjSh/root + 0xffffa089455513b0 168304 1 0 0 rpool/ROOT/delphix.gX9jjSh/root + 0xffffa089482f70e0 26100 1 0 0 rpool/ROOT/delphix.gX9jjSh/root + 0xffffa08937b83950 168241 1 0 0 rpool/ROOT/delphix.gX9jjSh/root + 0xffffa089448305a0 25932 1 0 0 rpool/ROOT/delphix.gX9jjSh/root + 0xffffa089642e6870 5741 1 0 0 rpool/ROOT/delphix.gX9jjSh/root diff --git a/tests/integration/data/regression_output/zfs/dbuf | dbuf -l 1 b/tests/integration/data/regression_output/zfs/dbuf | dbuf -l 1 new file mode 100644 index 00000000..2d159896 --- /dev/null +++ b/tests/integration/data/regression_output/zfs/dbuf | dbuf -l 1 @@ -0,0 +1,275 @@ + addr object lvl blkid holds os + 0xffffa08954f98e10 25955 1 0 0 rpool/ROOT/delphix.gX9jjSh/root + 0xffffa088c429f518 168157 1 0 0 rpool/ROOT/delphix.gX9jjSh/root + 0xffffa08888c60870 168239 1 0 0 rpool/ROOT/delphix.gX9jjSh/root + 0xffffa088d72262d0 168389 1 0 0 rpool/ROOT/delphix.gX9jjSh/root + 0xffffa088ca1162d0 1730 1 0 0 rpool/ROOT/delphix.gX9jjSh/data + 0xffffa088cdd51950 40457 1 0 0 rpool/ROOT/delphix.gX9jjSh/root + 0xffffa08937e58168 168443 1 2 89 rpool/ROOT/delphix.gX9jjSh/root + 0xffffa08937e593b0 166892 1 2 39 rpool/ROOT/delphix.gX9jjSh/root + 0xffffa08954d437e8 0 1 5 139 rpool/ROOT/delphix.gX9jjSh/root + 0xffffa088d346d3b0 168248 1 0 0 rpool/ROOT/delphix.gX9jjSh/root + 0xffffa0893991c870 168186 1 0 0 rpool/ROOT/delphix.gX9jjSh/root + 0xffffa089311c17e8 10951 1 0 0 rpool/ROOT/delphix.gX9jjSh/root + 0xffffa0896422bab8 168338 1 0 0 rpool/ROOT/delphix.gX9jjSh/root + 0xffffa088c5673c20 168137 1 0 0 rpool/ROOT/delphix.gX9jjSh/root + 0xffffa088c4c377e8 168319 1 0 0 rpool/ROOT/delphix.gX9jjSh/root + 0xffffa088c43209d8 19 1 0 0 rpool/_MOS + 0xffffa088a3dfe2d0 203 1 0 0 rpool/_MOS + 0xffffa0894e72c000 168160 1 0 0 rpool/ROOT/delphix.gX9jjSh/root + 0xffffa0889f554870 177 1 0 0 rpool/ROOT/delphix.gX9jjSh/data + 0xffffa088cae205a0 9032 1 0 0 rpool/ROOT/delphix.gX9jjSh/root + 0xffffa08937376000 168144 1 0 0 rpool/ROOT/delphix.gX9jjSh/root + 0xffffa0891f77f7e8 168243 1 0 0 rpool/ROOT/delphix.gX9jjSh/root + 0xffffa088ceb47950 9940 1 0 0 rpool/ROOT/delphix.gX9jjSh/root + 0xffffa088ebdae870 168176 1 0 0 rpool/ROOT/delphix.gX9jjSh/root + 0xffffa088c4320ca8 168322 1 0 0 rpool/ROOT/delphix.gX9jjSh/root + 0xffffa08939fb0b40 168256 1 0 0 rpool/ROOT/delphix.gX9jjSh/root + 0xffffa088ca11b950 9944 1 0 0 rpool/ROOT/delphix.gX9jjSh/root + 0xffffa0893a1382d0 10175 1 0 0 rpool/ROOT/delphix.gX9jjSh/root + 0xffffa088a65c82d0 168199 1 0 0 rpool/ROOT/delphix.gX9jjSh/root + 0xffffa08938d38000 10706 1 0 0 rpool/ROOT/delphix.gX9jjSh/root + 0xffffa0893f5e1950 0 1 0 1 rpool/public + 0xffffa08930dd5680 25936 1 0 0 rpool/ROOT/delphix.gX9jjSh/root + 0xffffa088c8b9b248 1075 1 0 0 rpool/ROOT/delphix.gX9jjSh/data + 0xffffa0894cf6a708 168213 1 0 0 rpool/ROOT/delphix.gX9jjSh/root + 0xffffa08933c8ae10 206 1 0 1 rpool/_MOS + 0xffffa088ca8f4f78 166893 1 7 0 rpool/ROOT/delphix.gX9jjSh/root + 0xffffa088a28c2e10 168436 1 0 0 rpool/ROOT/delphix.gX9jjSh/root + 0xffffa088831bc708 10713 1 0 0 rpool/ROOT/delphix.gX9jjSh/root + 0xffffa088a0119ab8 168147 1 0 0 rpool/ROOT/delphix.gX9jjSh/root + 0xffffa08941d2a438 168439 1 0 0 rpool/ROOT/delphix.gX9jjSh/root + 0xffffa08943e86e10 26105 1 0 0 rpool/ROOT/delphix.gX9jjSh/root + 0xffffa0894074eca8 5734 1 0 0 rpool/ROOT/delphix.gX9jjSh/root + 0xffffa088c4c66f78 168364 1 0 0 rpool/ROOT/delphix.gX9jjSh/root + 0xffffa08937e5a9d8 0 1 0 4 meta-domain/_MOS + 0xffffa0894e09c438 168277 1 0 0 rpool/ROOT/delphix.gX9jjSh/root + 0xffffa0889f8a0b40 168377 1 0 0 rpool/ROOT/delphix.gX9jjSh/root + 0xffffa0891ae569d8 25927 1 0 0 rpool/ROOT/delphix.gX9jjSh/root + 0xffffa089311f4870 26114 1 0 0 rpool/ROOT/delphix.gX9jjSh/root + 0xffffa0889c02b0e0 26831 1 0 0 rpool/ROOT/delphix.gX9jjSh/home + 0xffffa08945818870 0 1 0 4 rpool/ROOT/delphix.gX9jjSh/log + 0xffffa088a25ca168 125 1 0 1 rpool/_MOS + 0xffffa089455d93b0 26121 1 0 0 rpool/ROOT/delphix.gX9jjSh/root + 0xffffa08951214708 10400 1 0 0 rpool/ROOT/delphix.gX9jjSh/root + 0xffffa0894017b3b0 25943 1 0 0 rpool/ROOT/delphix.gX9jjSh/root + 0xffffa088c5b645a0 7421 1 0 0 rpool/ROOT/delphix.gX9jjSh/root + 0xffffa088c4c67680 168238 1 0 0 rpool/ROOT/delphix.gX9jjSh/root + 0xffffa088c68a1d88 168401 1 0 0 rpool/ROOT/delphix.gX9jjSh/root + 0xffffa088d346d7e8 168250 1 0 0 rpool/ROOT/delphix.gX9jjSh/root + 0xffffa0894952f518 26099 1 0 0 rpool/ROOT/delphix.gX9jjSh/root + 0xffffa088a2819c20 0 1 1 1 rpool/ROOT/delphix.gX9jjSh/home + 0xffffa089651025a0 26104 1 0 0 rpool/ROOT/delphix.gX9jjSh/root + 0xffffa088cdd517e8 4461 1 0 0 rpool/ROOT/delphix.gX9jjSh/root + 0xffffa0889e1a7c20 168301 1 0 0 rpool/ROOT/delphix.gX9jjSh/root + 0xffffa088a282bc20 168443 1 7 3 rpool/ROOT/delphix.gX9jjSh/root + 0xffffa088c6b65ab8 168138 1 0 0 rpool/ROOT/delphix.gX9jjSh/root + 0xffffa0889810d950 208 1 0 0 rpool/_MOS + 0xffffa08937e59950 166891 1 2 89 rpool/ROOT/delphix.gX9jjSh/root + 0xffffa088c7bc9518 8360 1 0 0 rpool/ROOT/delphix.gX9jjSh/root + 0xffffa088c8a3b0e0 40 1 0 0 rpool/ROOT/delphix.gX9jjSh/log + 0xffffa0891ae56708 25928 1 0 0 rpool/ROOT/delphix.gX9jjSh/root + 0xffffa08950331248 168152 1 0 0 rpool/ROOT/delphix.gX9jjSh/root + 0xffffa088cdd43d88 10382 1 0 0 rpool/ROOT/delphix.gX9jjSh/root + 0xffffa0894af51950 168417 1 0 0 rpool/ROOT/delphix.gX9jjSh/root + 0xffffa08882ac2e10 10871 1 0 0 rpool/ROOT/delphix.gX9jjSh/root + 0xffffa089561562d0 25944 1 0 0 rpool/ROOT/delphix.gX9jjSh/root + 0xffffa0894e097680 26111 1 0 0 rpool/ROOT/delphix.gX9jjSh/root + 0xffffa088a533c438 168353 1 0 0 rpool/ROOT/delphix.gX9jjSh/root + 0xffffa089455edd88 4463 1 0 0 rpool/ROOT/delphix.gX9jjSh/root + 0xffffa08885d42708 164085 1 0 0 rpool/ROOT/delphix.gX9jjSh/root + 0xffffa088cac169d8 9034 1 0 0 rpool/ROOT/delphix.gX9jjSh/root + 0xffffa08943322b40 25960 1 0 0 rpool/ROOT/delphix.gX9jjSh/root + 0xffffa088ef289ab8 10540 1 0 0 rpool/ROOT/delphix.gX9jjSh/root + 0xffffa0895012fab8 10847 1 0 0 rpool/ROOT/delphix.gX9jjSh/root + 0xffffa088c60b3c20 168443 1 3 2 rpool/ROOT/delphix.gX9jjSh/root + 0xffffa08888c60000 168210 1 0 0 rpool/ROOT/delphix.gX9jjSh/root + 0xffffa088cd345950 168267 1 0 0 rpool/ROOT/delphix.gX9jjSh/root + 0xffffa088ca116168 2171 1 0 0 rpool/ROOT/delphix.gX9jjSh/data + 0xffffa088d3f6bab8 168246 1 0 0 rpool/ROOT/delphix.gX9jjSh/root + 0xffffa08943a6fc20 10944 1 0 0 rpool/ROOT/delphix.gX9jjSh/root + 0xffffa08950a9f248 9897 1 0 0 rpool/ROOT/delphix.gX9jjSh/root + 0xffffa08960175c20 168352 1 0 0 rpool/ROOT/delphix.gX9jjSh/root + 0xffffa089373770e0 168266 1 0 0 rpool/ROOT/delphix.gX9jjSh/root + 0xffffa08930967950 10523 1 0 0 rpool/ROOT/delphix.gX9jjSh/root + 0xffffa088f09e22d0 168332 1 0 0 rpool/ROOT/delphix.gX9jjSh/root + 0xffffa088c6b60168 10521 1 0 0 rpool/ROOT/delphix.gX9jjSh/root + 0xffffa0889c5fe2d0 179 1 0 1 rpool/_MOS + 0xffffa088c4cd8e10 168365 1 0 0 rpool/ROOT/delphix.gX9jjSh/root + 0xffffa088ce7ecb40 2 1 0 579 meta-domain/fs-tmp + 0xffffa0893bf95950 25946 1 0 0 rpool/ROOT/delphix.gX9jjSh/root + 0xffffa08930ab4ca8 166891 1 3 2 rpool/ROOT/delphix.gX9jjSh/root + 0xffffa088cbfe8b40 168149 1 0 0 rpool/ROOT/delphix.gX9jjSh/root + 0xffffa088cc1117e8 168397 1 0 0 rpool/ROOT/delphix.gX9jjSh/root + 0xffffa08937e597e8 168443 1 1 34 rpool/ROOT/delphix.gX9jjSh/root + 0xffffa088ebc7a168 134 1 0 0 rpool/ROOT/delphix.gX9jjSh/data + 0xffffa089601757e8 168359 1 0 0 rpool/ROOT/delphix.gX9jjSh/root + 0xffffa089642e70e0 5742 1 0 0 rpool/ROOT/delphix.gX9jjSh/root + 0xffffa08885c69ab8 10679 1 0 0 rpool/ROOT/delphix.gX9jjSh/root + 0xffffa088caeee9d8 10869 1 0 0 rpool/ROOT/delphix.gX9jjSh/root + 0xffffa088d72265a0 168367 1 0 0 rpool/ROOT/delphix.gX9jjSh/root + 0xffffa0889c593518 168443 1 0 274 rpool/ROOT/delphix.gX9jjSh/root + 0xffffa0896422ae10 168398 1 0 0 rpool/ROOT/delphix.gX9jjSh/root + 0xffffa089503309d8 25950 1 0 0 rpool/ROOT/delphix.gX9jjSh/root + 0xffffa08949e62168 0 1 1 196 rpool/ROOT/delphix.gX9jjSh/root + 0xffffa08950331950 25949 1 0 0 rpool/ROOT/delphix.gX9jjSh/root + 0xffffa088caf8eca8 9028 1 0 0 rpool/ROOT/delphix.gX9jjSh/root + 0xffffa0889f1b9518 4460 1 0 0 rpool/ROOT/delphix.gX9jjSh/root + 0xffffa0896422bd88 168217 1 0 0 rpool/ROOT/delphix.gX9jjSh/root + 0xffffa088c43205a0 168295 1 0 0 rpool/ROOT/delphix.gX9jjSh/root + 0xffffa089553f9950 168273 1 0 0 rpool/ROOT/delphix.gX9jjSh/root + 0xffffa088a298d0e0 168269 1 0 0 rpool/ROOT/delphix.gX9jjSh/root + 0xffffa0889f684168 205 1 0 0 rpool/_MOS + 0xffffa088c746c5a0 168315 1 0 0 rpool/ROOT/delphix.gX9jjSh/root + 0xffffa08930801680 0 1 4 125 rpool/ROOT/delphix.gX9jjSh/root + 0xffffa0891ae56b40 25931 1 0 0 rpool/ROOT/delphix.gX9jjSh/root + 0xffffa0893c80d0e0 25953 1 0 0 rpool/ROOT/delphix.gX9jjSh/root + 0xffffa08949e617e8 9888 1 0 0 rpool/ROOT/delphix.gX9jjSh/root + 0xffffa0894953cb40 26126 1 0 0 rpool/ROOT/delphix.gX9jjSh/root + 0xffffa088c64c2870 168253 1 0 0 rpool/ROOT/delphix.gX9jjSh/root + 0xffffa088ca75e9d8 9063 1 0 0 rpool/ROOT/delphix.gX9jjSh/root + 0xffffa08954dd4b40 166891 1 0 312 rpool/ROOT/delphix.gX9jjSh/root + 0xffffa08937e59d88 166891 1 1 36 rpool/ROOT/delphix.gX9jjSh/root + 0xffffa088cabc37e8 11007 1 0 0 rpool/ROOT/delphix.gX9jjSh/root + 0xffffa089580c2b40 26113 1 0 0 rpool/ROOT/delphix.gX9jjSh/root + 0xffffa089598e7248 0 1 0 2 meta-domain + 0xffffa089413e45a0 24579 1 0 0 rpool/ROOT/delphix.gX9jjSh/home + 0xffffa088c5d470e0 168416 1 0 0 rpool/ROOT/delphix.gX9jjSh/root + 0xffffa089409baca8 25956 1 0 0 rpool/ROOT/delphix.gX9jjSh/root + 0xffffa088c9ff53b0 4459 1 0 0 rpool/ROOT/delphix.gX9jjSh/root + 0xffffa088df78a438 5744 1 0 0 rpool/ROOT/delphix.gX9jjSh/root + 0xffffa0894078a708 5740 1 0 0 rpool/ROOT/delphix.gX9jjSh/root + 0xffffa08940384000 0 1 0 1 rpool/upgrade-logs + 0xffffa08943322168 26108 1 0 0 rpool/ROOT/delphix.gX9jjSh/root + 0xffffa0889f685950 1372 1 0 0 rpool/ROOT/delphix.gX9jjSh/data + 0xffffa088c6fc0f78 168343 1 0 0 rpool/ROOT/delphix.gX9jjSh/root + 0xffffa08945818e10 0 1 0 147 rpool/ROOT/delphix.gX9jjSh/data + 0xffffa0889c3542d0 9889 1 0 0 rpool/ROOT/delphix.gX9jjSh/root + 0xffffa08933436f78 9894 1 0 0 rpool/ROOT/delphix.gX9jjSh/root + 0xffffa088c8a3a708 168360 1 0 0 rpool/ROOT/delphix.gX9jjSh/root + 0xffffa08937b83d88 9929 1 0 0 rpool/ROOT/delphix.gX9jjSh/root + 0xffffa089455d9c20 26122 1 0 0 rpool/ROOT/delphix.gX9jjSh/root + 0xffffa08949533518 26106 1 0 0 rpool/ROOT/delphix.gX9jjSh/root + 0xffffa0894cf6a000 168333 1 0 0 rpool/ROOT/delphix.gX9jjSh/root + 0xffffa0891bce0ca8 168135 1 0 0 rpool/ROOT/delphix.gX9jjSh/root + 0xffffa08882a32438 10870 1 0 0 rpool/ROOT/delphix.gX9jjSh/root + 0xffffa088ecd5bab8 168409 1 0 0 rpool/ROOT/delphix.gX9jjSh/root + 0xffffa08933c8b680 0 1 0 308 rpool/ROOT/delphix.gX9jjSh/root + 0xffffa08894b285a0 9022 1 0 0 rpool/ROOT/delphix.gX9jjSh/root + 0xffffa088d0da1ab8 166891 1 7 3 rpool/ROOT/delphix.gX9jjSh/root + 0xffffa088a29705a0 168363 1 0 0 rpool/ROOT/delphix.gX9jjSh/root + 0xffffa088cbfea2d0 168437 1 0 0 rpool/ROOT/delphix.gX9jjSh/root + 0xffffa089601753b0 168274 1 0 0 rpool/ROOT/delphix.gX9jjSh/root + 0xffffa0894a89d950 168294 1 0 0 rpool/ROOT/delphix.gX9jjSh/root + 0xffffa088c42b4b40 872 1 0 0 rpool/ROOT/delphix.gX9jjSh/data + 0xffffa08940567d88 26103 1 0 0 rpool/ROOT/delphix.gX9jjSh/root + 0xffffa0895012fc20 10811 1 0 0 rpool/ROOT/delphix.gX9jjSh/root + 0xffffa088cbfeb7e8 168326 1 0 0 rpool/ROOT/delphix.gX9jjSh/root + 0xffffa088c8a3a5a0 27 1 0 1 rpool/ROOT/delphix.gX9jjSh/log + 0xffffa088ceb46b40 11617 1 0 0 rpool/ROOT/delphix.gX9jjSh/root + 0xffffa0894d8977e8 10790 1 0 0 rpool/ROOT/delphix.gX9jjSh/root + 0xffffa08942ff3248 26102 1 0 0 rpool/ROOT/delphix.gX9jjSh/root + 0xffffa08943600b40 168183 1 0 0 rpool/ROOT/delphix.gX9jjSh/root + 0xffffa088cdd8eca8 10530 1 0 0 rpool/ROOT/delphix.gX9jjSh/root + 0xffffa088c8a3af78 168386 1 0 0 rpool/ROOT/delphix.gX9jjSh/root + 0xffffa0893c8022d0 168345 1 0 0 rpool/ROOT/delphix.gX9jjSh/root + 0xffffa088ce1cb3b0 168435 1 0 0 rpool/ROOT/delphix.gX9jjSh/root + 0xffffa089463a8708 26783 1 0 0 rpool/ROOT/delphix.gX9jjSh/home + 0xffffa08943a01248 4464 1 0 0 rpool/ROOT/delphix.gX9jjSh/root + 0xffffa0895351f0e0 0 1 0 9 rpool/_MOS + 0xffffa088c60bb950 168283 1 0 0 rpool/ROOT/delphix.gX9jjSh/root + 0xffffa088c42b5c20 2173 1 0 2 rpool/ROOT/delphix.gX9jjSh/data + 0xffffa08937e5bab8 166892 1 1 3 rpool/ROOT/delphix.gX9jjSh/root + 0xffffa08939703d88 2331 1 0 0 rpool/ROOT/delphix.gX9jjSh/root + 0xffffa088d344b248 168330 1 0 0 rpool/ROOT/delphix.gX9jjSh/root + 0xffffa088cabc2f78 164086 1 0 0 rpool/ROOT/delphix.gX9jjSh/root + 0xffffa088ebcc9ab8 168279 1 0 0 rpool/ROOT/delphix.gX9jjSh/root + 0xffffa0893dba3680 26818 1 0 0 rpool/ROOT/delphix.gX9jjSh/home + 0xffffa088a17745a0 10525 1 0 0 rpool/ROOT/delphix.gX9jjSh/root + 0xffffa088cbc0c870 2 1 1 1 meta-domain/fs-tmp + 0xffffa088c4321ab8 168264 1 0 0 rpool/ROOT/delphix.gX9jjSh/root + 0xffffa089373729d8 9821 1 0 0 rpool/ROOT/delphix.gX9jjSh/root + 0xffffa088c5672000 168341 1 0 0 rpool/ROOT/delphix.gX9jjSh/root + 0xffffa0894cf6b518 168211 1 0 0 rpool/ROOT/delphix.gX9jjSh/root + 0xffffa088c746c2d0 39612 1 0 1 rpool/ROOT/delphix.gX9jjSh/root + 0xffffa089436c2168 181 1 0 0 rpool/ROOT/delphix.gX9jjSh/data + 0xffffa088cac149d8 168324 1 0 0 rpool/ROOT/delphix.gX9jjSh/root + 0xffffa089403cf248 0 1 0 3 rpool/update + 0xffffa0893bf949d8 25947 1 0 0 rpool/ROOT/delphix.gX9jjSh/root + 0xffffa08951a70000 10764 1 0 0 rpool/ROOT/delphix.gX9jjSh/root + 0xffffa088d0c8f518 280 1 0 1 rpool/_MOS + 0xffffa08950c705a0 10415 1 0 0 rpool/ROOT/delphix.gX9jjSh/root + 0xffffa08940384ca8 0 1 0 1 data + 0xffffa088c9ff5c20 168285 1 0 0 rpool/ROOT/delphix.gX9jjSh/root + 0xffffa088c421e708 10528 1 0 0 rpool/ROOT/delphix.gX9jjSh/root + 0xffffa088ef25fd88 150 1 0 0 rpool/ROOT/delphix.gX9jjSh/root + 0xffffa088831bc000 10716 1 0 0 rpool/ROOT/delphix.gX9jjSh/root + 0xffffa088cc111518 168262 1 0 0 rpool/ROOT/delphix.gX9jjSh/root + 0xffffa088cf192438 168328 1 0 0 rpool/ROOT/delphix.gX9jjSh/root + 0xffffa08954d35680 23 1 0 2 rpool/ROOT/delphix.gX9jjSh/log + 0xffffa088ce7ec9d8 0 1 0 3 meta-domain/fs-tmp + 0xffffa088ecab97e8 168374 1 0 0 rpool/ROOT/delphix.gX9jjSh/root + 0xffffa0893bf9fc20 25948 1 0 0 rpool/ROOT/delphix.gX9jjSh/root + 0xffffa0894288e000 25951 1 0 0 rpool/ROOT/delphix.gX9jjSh/root + 0xffffa088c9ff5680 4458 1 0 0 rpool/ROOT/delphix.gX9jjSh/root + 0xffffa088d362a2d0 168318 1 0 0 rpool/ROOT/delphix.gX9jjSh/root + 0xffffa088c4d8b680 168276 1 0 0 rpool/ROOT/delphix.gX9jjSh/root + 0xffffa0889fc84b40 799 1 0 0 rpool/ROOT/delphix.gX9jjSh/root + 0xffffa088d08430e0 168308 1 0 0 rpool/ROOT/delphix.gX9jjSh/root + 0xffffa088ecab9518 166892 1 7 3 rpool/ROOT/delphix.gX9jjSh/root + 0xffffa08945828870 168281 1 0 0 rpool/ROOT/delphix.gX9jjSh/root + 0xffffa088c57a7518 9027 1 0 0 rpool/ROOT/delphix.gX9jjSh/root + 0xffffa088ca117c20 166892 1 0 97 rpool/ROOT/delphix.gX9jjSh/root + 0xffffa088c42b5d88 168434 1 0 0 rpool/ROOT/delphix.gX9jjSh/root + 0xffffa0891f77f3b0 168384 1 0 0 rpool/ROOT/delphix.gX9jjSh/root + 0xffffa089472df248 10407 1 0 0 rpool/ROOT/delphix.gX9jjSh/root + 0xffffa088ca11a708 10853 1 0 0 rpool/ROOT/delphix.gX9jjSh/root + 0xffffa088a2952000 168387 1 0 0 rpool/ROOT/delphix.gX9jjSh/root + 0xffffa0893c76d518 26123 1 0 0 rpool/ROOT/delphix.gX9jjSh/root + 0xffffa088a533d7e8 168271 1 0 0 rpool/ROOT/delphix.gX9jjSh/root + 0xffffa08944ddc438 168212 1 0 0 rpool/ROOT/delphix.gX9jjSh/root + 0xffffa0889f1b8000 4462 1 0 0 rpool/ROOT/delphix.gX9jjSh/root + 0xffffa08960174870 168306 1 0 0 rpool/ROOT/delphix.gX9jjSh/root + 0xffffa089533e0f78 18 1 0 1 rpool/_MOS + 0xffffa088c60b3518 168309 1 0 0 rpool/ROOT/delphix.gX9jjSh/root + 0xffffa088c6b61c20 168204 1 0 0 rpool/ROOT/delphix.gX9jjSh/root + 0xffffa088c70222d0 10945 1 0 0 rpool/ROOT/delphix.gX9jjSh/root + 0xffffa0894cf6ae10 168288 1 0 0 rpool/ROOT/delphix.gX9jjSh/root + 0xffffa0894b28e9d8 168148 1 0 0 rpool/ROOT/delphix.gX9jjSh/root + 0xffffa088d7226f78 168334 1 0 0 rpool/ROOT/delphix.gX9jjSh/root + 0xffffa088d1f25ab8 10420 1 0 0 rpool/ROOT/delphix.gX9jjSh/root + 0xffffa089408bfd88 168349 1 0 0 rpool/ROOT/delphix.gX9jjSh/root + 0xffffa089496cc5a0 6345 1 0 0 rpool/ROOT/delphix.gX9jjSh/root + 0xffffa0894a9f1950 26125 1 0 0 rpool/ROOT/delphix.gX9jjSh/root + 0xffffa0895012ee10 10844 1 0 0 rpool/ROOT/delphix.gX9jjSh/root + 0xffffa088cd345ab8 168314 1 0 0 rpool/ROOT/delphix.gX9jjSh/root + 0xffffa088a0505518 9832 1 0 0 rpool/ROOT/delphix.gX9jjSh/root + 0xffffa08954d43680 2172 1 0 2 rpool/ROOT/delphix.gX9jjSh/data + 0xffffa08943a6a000 166892 1 3 2 rpool/ROOT/delphix.gX9jjSh/root + 0xffffa088c57a7680 10169 1 0 0 rpool/ROOT/delphix.gX9jjSh/root + 0xffffa0889be0a168 9 1 0 3 rpool/ROOT/delphix.gX9jjSh/data + 0xffffa089455449d8 0 1 0 135 rpool/ROOT/delphix.gX9jjSh/home + 0xffffa08945544000 0 1 0 2 rpool/crashdump + 0xffffa088c8a3b248 52072 1 0 0 rpool/ROOT/delphix.gX9jjSh/root + 0xffffa08960174168 168321 1 0 0 rpool/ROOT/delphix.gX9jjSh/root + 0xffffa0893c76dab8 26124 1 0 0 rpool/ROOT/delphix.gX9jjSh/root + 0xffffa0894c3a9c20 0 1 0 3 data/_MOS + 0xffffa088d2814f78 168235 1 0 0 rpool/ROOT/delphix.gX9jjSh/root + 0xffffa0888952e870 10257 1 0 0 rpool/ROOT/delphix.gX9jjSh/root + 0xffffa08944dddc20 202 1 0 0 rpool/_MOS + 0xffffa08930d86438 0 1 3 31 rpool/ROOT/delphix.gX9jjSh/root + 0xffffa0889c5fef78 66 1 0 0 rpool/_MOS + 0xffffa08933c10438 168440 1 0 0 rpool/ROOT/delphix.gX9jjSh/root + 0xffffa08953aa3680 166893 1 0 2 rpool/ROOT/delphix.gX9jjSh/root + 0xffffa089522bf950 26109 1 0 0 rpool/ROOT/delphix.gX9jjSh/root + 0xffffa0894a895248 52491 1 0 0 rpool/ROOT/delphix.gX9jjSh/root + 0xffffa088ca7313b0 9060 1 0 0 rpool/ROOT/delphix.gX9jjSh/root + 0xffffa08947e80708 0 1 2 108 rpool/ROOT/delphix.gX9jjSh/root + 0xffffa0894ced4b40 207 1 0 0 rpool/_MOS + 0xffffa088a4544b40 10168 1 0 0 rpool/ROOT/delphix.gX9jjSh/root + 0xffffa08946a7fc20 168311 1 0 0 rpool/ROOT/delphix.gX9jjSh/root + 0xffffa089455513b0 168304 1 0 0 rpool/ROOT/delphix.gX9jjSh/root + 0xffffa089482f70e0 26100 1 0 0 rpool/ROOT/delphix.gX9jjSh/root + 0xffffa08937b83950 168241 1 0 0 rpool/ROOT/delphix.gX9jjSh/root + 0xffffa089448305a0 25932 1 0 0 rpool/ROOT/delphix.gX9jjSh/root + 0xffffa089642e6870 5741 1 0 0 rpool/ROOT/delphix.gX9jjSh/root diff --git a/tests/integration/data/regression_output/zfs/dbuf | dbuf -l 1 | head | dbuf b/tests/integration/data/regression_output/zfs/dbuf | dbuf -l 1 | head | dbuf new file mode 100644 index 00000000..8482dc25 --- /dev/null +++ b/tests/integration/data/regression_output/zfs/dbuf | dbuf -l 1 | head | dbuf @@ -0,0 +1,11 @@ + addr object lvl blkid holds os + 0xffffa08954f98e10 25955 1 0 0 rpool/ROOT/delphix.gX9jjSh/root + 0xffffa088c429f518 168157 1 0 0 rpool/ROOT/delphix.gX9jjSh/root + 0xffffa08888c60870 168239 1 0 0 rpool/ROOT/delphix.gX9jjSh/root + 0xffffa088d72262d0 168389 1 0 0 rpool/ROOT/delphix.gX9jjSh/root + 0xffffa088ca1162d0 1730 1 0 0 rpool/ROOT/delphix.gX9jjSh/data + 0xffffa088cdd51950 40457 1 0 0 rpool/ROOT/delphix.gX9jjSh/root + 0xffffa08937e58168 168443 1 2 89 rpool/ROOT/delphix.gX9jjSh/root + 0xffffa08937e593b0 166892 1 2 39 rpool/ROOT/delphix.gX9jjSh/root + 0xffffa08954d437e8 0 1 5 139 rpool/ROOT/delphix.gX9jjSh/root + 0xffffa088d346d3b0 168248 1 0 0 rpool/ROOT/delphix.gX9jjSh/root diff --git a/tests/integration/test_zfs_generic.py b/tests/integration/test_zfs_generic.py index 8c8c468a..07d9daa8 100644 --- a/tests/integration/test_zfs_generic.py +++ b/tests/integration/test_zfs_generic.py @@ -37,7 +37,10 @@ "spa | vdev | metaslab | member ms_allocatable.rt_root | zfs_btree", "zfs_dbgmsg", "zfs_dbgmsg | tail 5 | zfs_dbgmsg", -] + "dbuf -l 1", + "dbuf | dbuf -l 1", + 'dbuf | dbuf -l 1 | head | dbuf' +] # yapf: disable @pytest.mark.skipif(not dump_exists(), From 94fa5fecbd7f409e45e00d16757aed9a5f62967c Mon Sep 17 00:00:00 2001 From: Serapheim Dimitropoulos Date: Fri, 28 Feb 2020 20:52:35 +0000 Subject: [PATCH 04/19] mypy: fix recent failures introduced by the new drgn types mypy: enable mypy --strict --- .github/workflows/main.yml | 12 +++--- sdb/__init__.py | 35 +++++++++++++++++ sdb/command.py | 16 +++++--- sdb/commands/linux/internal/slub_helpers.py | 12 +++--- sdb/commands/linux/per_cpu.py | 10 ++--- sdb/commands/linux/tree.py | 4 +- sdb/commands/linux/vfs.py | 3 +- sdb/commands/spl/internal/kmem_helpers.py | 24 ++++++------ sdb/commands/stacks.py | 2 +- sdb/commands/threads.py | 4 +- sdb/commands/zfs/dbuf.py | 15 ++++---- sdb/commands/zfs/internal/__init__.py | 5 ++- sdb/commands/zfs/metaslab.py | 10 +++-- sdb/commands/zfs/spa.py | 6 ++- sdb/commands/zfs/vdev.py | 4 +- sdb/internal/cli.py | 2 +- sdb/internal/repl.py | 23 ++++++++--- tests/integration/gen_regression_output.py | 2 +- tests/integration/infra.py | 4 +- tests/integration/test_core_generic.py | 21 ++++++----- tests/integration/test_linux_generic.py | 30 ++++++++------- tests/integration/test_spl_generic.py | 12 +++--- tests/integration/test_zfs_generic.py | 13 ++++--- tests/unit/__init__.py | 2 +- tests/unit/commands/test_address.py | 35 +++++++---------- tests/unit/commands/test_cast.py | 42 +++++++++------------ tests/unit/commands/test_count.py | 19 ++++------ tests/unit/commands/test_echo.py | 40 +++++++++----------- tests/unit/commands/test_filter.py | 30 +++++++-------- tests/unit/commands/test_member.py | 40 ++++++++------------ 30 files changed, 260 insertions(+), 217 deletions(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 9125af64..fcfff6b1 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -84,9 +84,11 @@ jobs: # comes with Ubuntu is 0.75 which has a couple of bugs triggered # by our codebase (they've been resolved on trunk though so we # may want to change this soon). - # [2] drgn doesn't provide a stubs file by default with all its type - # info leading to many complaints in mypy's side. Until this is - # fixed in drgn we skip any static type checking related to it. + # [2] We supply --allow-untyped-calls because even though drgn has + # stubs on typeshed now, there are still some untyped functions + # (mainly in the helper API). + # [3] We supply --ignore-missing-imports to the tests package because + # pytest doesn't provide stubs on typeshed. # mypy: runs-on: ubuntu-18.04 @@ -97,5 +99,5 @@ jobs: python-version: '3.6' - run: ./.github/scripts/install-drgn.sh - run: python3 -m pip install mypy==0.730 - - run: python3 -m mypy --ignore-missing-imports --show-error-codes -p sdb - - run: python3 -m mypy --ignore-missing-imports --show-error-codes -p tests + - run: python3 -m mypy --strict --allow-untyped-calls --show-error-codes -p sdb + - run: python3 -m mypy --strict --ignore-missing-imports --show-error-codes -p tests diff --git a/sdb/__init__.py b/sdb/__init__.py index 6a13a9c9..48ddf855 100644 --- a/sdb/__init__.py +++ b/sdb/__init__.py @@ -40,6 +40,41 @@ get_registered_commands) from sdb.pipeline import execute_pipeline, get_first_type, invoke +__all__ = [ + 'Address', + 'Cast', + 'Command', + 'CommandArgumentsError', + 'CommandError', + 'CommandEvalSyntaxError', + 'CommandInvalidInputError', + 'CommandNotFoundError', + 'Error', + 'InputHandler', + 'Locator', + 'PrettyPrinter', + 'SingleInputCommand', + 'SymbolNotFoundError', + 'Walk', + 'Walker', + 'create_object', + 'execute_pipeline', + 'invoke', + 'get_first_type', + 'get_object', + 'get_pointer_type', + 'get_prog', + 'get_registered_commands', + 'get_symbol', + 'get_target_flags', + 'get_type', + 'get_typed_null', + 'type_canonical_name', + 'type_canonicalize', + 'type_canonicalize_name', + 'type_equals', +] + # # The SDB commands build on top of all the SDB "infrastructure" imported # above, so we must be sure to import all of the commands last. diff --git a/sdb/command.py b/sdb/command.py index f513aa95..49e1d9b3 100644 --- a/sdb/command.py +++ b/sdb/command.py @@ -24,7 +24,7 @@ import argparse import inspect import textwrap -from typing import Callable, Dict, Iterable, List, Optional, Type, TypeVar +from typing import Any, Callable, Dict, Iterable, List, Optional, Type, TypeVar import drgn @@ -90,7 +90,7 @@ def _init_parser(cls, name: str) -> argparse.ArgumentParser: return argparse.ArgumentParser(prog=name, description=summary) @classmethod - def help(cls, name: str): + def help(cls, name: str) -> None: """ This method will print a "help message" for the particular command class that it's called on. The docstring and parser for @@ -223,13 +223,17 @@ def __init__(self, args: str = "", name: str = "_") -> None: self.parser = type(self)._init_parser(name) self.args = self.parser.parse_args(args.split()) - def __init_subclass__(cls, **kwargs): + def __init_subclass__(cls, **kwargs: Any) -> None: """ This method will automatically register the subclass command, such that the command will be automatically integrated with the SDB REPL. """ - super().__init_subclass__(**kwargs) + # + # We ignore the type failure below because of the following issue: + # https://github.com/python/mypy/issues/4660 + # + super().__init_subclass__(**kwargs) # type: ignore[call-arg] for name in cls.names: register_command(name, cls) @@ -584,7 +588,7 @@ class Walker(Command): allWalkers: Dict[str, Type["Walker"]] = {} # When a subclass is created, register it - def __init_subclass__(cls, **kwargs): + def __init_subclass__(cls, **kwargs: Any) -> None: super().__init_subclass__(**kwargs) assert cls.input_type is not None Walker.allWalkers[cls.input_type] = cls @@ -621,7 +625,7 @@ class PrettyPrinter(Command): all_printers: Dict[str, Type["PrettyPrinter"]] = {} # When a subclass is created, register it - def __init_subclass__(cls, **kwargs): + def __init_subclass__(cls, **kwargs: Any) -> None: super().__init_subclass__(**kwargs) assert cls.input_type is not None PrettyPrinter.all_printers[cls.input_type] = cls diff --git a/sdb/commands/linux/internal/slub_helpers.py b/sdb/commands/linux/internal/slub_helpers.py index 324ebbcb..64771f99 100644 --- a/sdb/commands/linux/internal/slub_helpers.py +++ b/sdb/commands/linux/internal/slub_helpers.py @@ -27,7 +27,7 @@ def is_root_cache(cache: drgn.Object) -> bool: assert cache.type_.type_name() == 'struct kmem_cache *' - return cache.memcg_params.root_cache.value_() == 0x0 + return int(cache.memcg_params.root_cache.value_()) == 0x0 def for_each_root_cache() -> Iterable[drgn.Object]: @@ -46,7 +46,7 @@ def for_each_child_cache(root_cache: drgn.Object) -> Iterable[drgn.Object]: def nr_slabs(cache: drgn.Object) -> int: assert cache.type_.type_name() == 'struct kmem_cache *' - nslabs = cache.node[0].nr_slabs.counter.value_() + nslabs: int = cache.node[0].nr_slabs.counter.value_() if is_root_cache(cache): for child in for_each_child_cache(cache): nslabs += nr_slabs(child) @@ -55,17 +55,17 @@ def nr_slabs(cache: drgn.Object) -> int: def entries_per_slab(cache: drgn.Object) -> int: assert cache.type_.type_name() == 'struct kmem_cache *' - return cache.oo.x.value_() & 0xffff + return int(cache.oo.x.value_()) & 0xffff def entry_size(cache: drgn.Object) -> int: assert cache.type_.type_name() == 'struct kmem_cache *' - return cache.size.value_() + return int(cache.size.value_()) def object_size(cache: drgn.Object) -> int: assert cache.type_.type_name() == 'struct kmem_cache *' - return cache.object_size.value_() + return int(cache.object_size.value_()) def total_memory(cache: drgn.Object) -> int: @@ -78,7 +78,7 @@ def total_memory(cache: drgn.Object) -> int: def objs(cache: drgn.Object) -> int: assert cache.type_.type_name() == 'struct kmem_cache *' - count = cache.node[0].total_objects.counter.value_() + count: int = cache.node[0].total_objects.counter.value_() if is_root_cache(cache): for child in for_each_child_cache(cache): count += objs(child) diff --git a/sdb/commands/linux/per_cpu.py b/sdb/commands/linux/per_cpu.py index ea433b90..58008228 100644 --- a/sdb/commands/linux/per_cpu.py +++ b/sdb/commands/linux/per_cpu.py @@ -20,6 +20,8 @@ from typing import Iterable import drgn +import drgn.helpers.linux.cpumask as drgn_cpumask +import drgn.helpers.linux.percpu as drgn_percpu import sdb @@ -52,9 +54,7 @@ def _init_parser(cls, name: str) -> argparse.ArgumentParser: def __init__(self, args: str = "", name: str = "_") -> None: super().__init__(args, name) self.ncpus = len( - list( - drgn.helpers.linux.cpumask.for_each_possible_cpu( - sdb.get_prog()))) + list(drgn_cpumask.for_each_possible_cpu(sdb.get_prog()))) def _call_one(self, obj: drgn.Object) -> Iterable[drgn.Object]: cpus = self.args.cpus @@ -65,7 +65,7 @@ def _call_one(self, obj: drgn.Object) -> Iterable[drgn.Object]: raise sdb.CommandError( self.name, f"available CPUs [0-{self.ncpus -1}] - requested CPU {cpu}") - yield drgn.helpers.linux.percpu.per_cpu_ptr(obj, cpu) + yield drgn_percpu.per_cpu_ptr(obj, cpu) class LxPerCpuCounterSum(sdb.SingleInputCommand): @@ -95,7 +95,7 @@ class LxPerCpuCounterSum(sdb.SingleInputCommand): def _call_one(self, obj: drgn.Object) -> Iterable[drgn.Object]: try: - sum_ = drgn.helpers.linux.percpu.percpu_counter_sum(obj) + sum_ = drgn_percpu.percpu_counter_sum(obj) except AttributeError as err: raise sdb.CommandError(self.name, "input is not a percpu_counter") yield drgn.Object(sdb.get_prog(), type="s64", value=sum_) diff --git a/sdb/commands/linux/tree.py b/sdb/commands/linux/tree.py index 1f774400..8e68b06c 100644 --- a/sdb/commands/linux/tree.py +++ b/sdb/commands/linux/tree.py @@ -20,6 +20,8 @@ from typing import Iterable import drgn +import drgn.helpers.linux.rbtree as drgn_rbtree + import sdb from sdb.commands.internal.util import get_valid_struct_name @@ -60,7 +62,7 @@ def _call(self, objs: Iterable[drgn.Object]) -> Iterable[drgn.Object]: sname = get_valid_struct_name(self, self.args.struct_name) for obj in objs: try: - yield from drgn.helpers.linux.rbtree.rbtree_inorder_for_each_entry( + yield from drgn_rbtree.rbtree_inorder_for_each_entry( sname, obj, self.args.member) except LookupError as err: raise sdb.CommandError(self.name, str(err)) diff --git a/sdb/commands/linux/vfs.py b/sdb/commands/linux/vfs.py index 5b501f4b..5119e3a2 100644 --- a/sdb/commands/linux/vfs.py +++ b/sdb/commands/linux/vfs.py @@ -20,6 +20,7 @@ from typing import Iterable import drgn +import drgn.helpers.linux.fs as drgn_fs import sdb @@ -49,4 +50,4 @@ def _init_parser(cls, name: str) -> argparse.ArgumentParser: def _call_one(self, obj: drgn.Object) -> Iterable[drgn.Object]: for fd in self.args.fd: - yield drgn.helpers.linux.fs.fget(obj, fd) + yield drgn_fs.fget(obj, fd) diff --git a/sdb/commands/spl/internal/kmem_helpers.py b/sdb/commands/spl/internal/kmem_helpers.py index 1ba69418..c7d14356 100644 --- a/sdb/commands/spl/internal/kmem_helpers.py +++ b/sdb/commands/spl/internal/kmem_helpers.py @@ -19,41 +19,41 @@ from typing import Iterable import drgn -from drgn.helpers.linux.list import list_for_each_entry +import drgn.helpers.linux.list as drgn_list import sdb from sdb.commands.linux.internal import slub_helpers as slub def list_for_each_spl_kmem_cache() -> Iterable[drgn.Object]: - yield from list_for_each_entry( + yield from drgn_list.list_for_each_entry( "spl_kmem_cache_t", sdb.get_object("spl_kmem_cache_list").address_of_(), "skc_list") def backed_by_linux_cache(cache: drgn.Object) -> bool: assert cache.type_.type_name() == 'spl_kmem_cache_t *' - return cache.skc_linux_cache.value_() != 0x0 + return int(cache.skc_linux_cache.value_()) != 0x0 def slab_name(cache: drgn.Object) -> str: assert cache.type_.type_name() == 'spl_kmem_cache_t *' - return cache.skc_name.string_().decode('utf-8') + return str(cache.skc_name.string_().decode('utf-8')) def nr_slabs(cache: drgn.Object) -> int: assert cache.type_.type_name() == 'spl_kmem_cache_t *' - return cache.skc_slab_total.value_() + return int(cache.skc_slab_total.value_()) def slab_alloc(cache: drgn.Object) -> int: assert cache.type_.type_name() == 'spl_kmem_cache_t *' - return cache.skc_slab_alloc.value_() + return int(cache.skc_slab_alloc.value_()) def slab_size(cache: drgn.Object) -> int: assert cache.type_.type_name() == 'spl_kmem_cache_t *' - return cache.skc_slab_size.value_() + return int(cache.skc_slab_size.value_()) def slab_linux_cache_source(cache: drgn.Object) -> str: @@ -80,19 +80,19 @@ def slab_flags(cache: drgn.Object) -> str: def object_size(cache: drgn.Object) -> int: assert cache.type_.type_name() == 'spl_kmem_cache_t *' - return cache.skc_obj_size.value_() + return int(cache.skc_obj_size.value_()) def nr_objects(cache: drgn.Object) -> int: assert cache.type_.type_name() == 'spl_kmem_cache_t *' if backed_by_linux_cache(cache): - return cache.skc_obj_alloc.value_() - return cache.skc_obj_total.value_() + return int(cache.skc_obj_alloc.value_()) + return int(cache.skc_obj_total.value_()) def obj_alloc(cache: drgn.Object) -> int: assert cache.type_.type_name() == 'spl_kmem_cache_t *' - return cache.skc_obj_alloc.value_() + return int(cache.skc_obj_alloc.value_()) def obj_inactive(cache: drgn.Object) -> int: @@ -102,7 +102,7 @@ def obj_inactive(cache: drgn.Object) -> int: def objs_per_slab(cache: drgn.Object) -> int: assert cache.type_.type_name() == 'spl_kmem_cache_t *' - return cache.skc_slab_objs.value_() + return int(cache.skc_slab_objs.value_()) def entry_size(cache: drgn.Object) -> int: diff --git a/sdb/commands/stacks.py b/sdb/commands/stacks.py index 63a4499e..e6be4e21 100644 --- a/sdb/commands/stacks.py +++ b/sdb/commands/stacks.py @@ -342,7 +342,7 @@ def match_stack(self, task: drgn.Object) -> bool: return True return False - def print_header(self): + def print_header(self) -> None: header = "{:<18} {:<16s}".format("TASK_STRUCT", "STATE") if not self.args.all: header += " {:>6s}".format("COUNT") diff --git a/sdb/commands/threads.py b/sdb/commands/threads.py index 7078d039..2493890e 100644 --- a/sdb/commands/threads.py +++ b/sdb/commands/threads.py @@ -16,7 +16,7 @@ # pylint: disable=missing-docstring -from typing import Iterable +from typing import Callable, Dict, Iterable, Union import drgn from drgn.helpers.linux.pid import for_each_task @@ -52,7 +52,7 @@ class Threads(sdb.Locator, sdb.PrettyPrinter): input_type = "struct task_struct *" output_type = "struct task_struct *" - FIELDS = { + FIELDS: Dict[str, Callable[[drgn.Object], Union[str, int]]] = { "task": lambda obj: hex(obj.value_()), "state": lambda obj: str(Stacks.task_struct_get_state(obj)), "pid": lambda obj: int(obj.pid), diff --git a/sdb/commands/zfs/dbuf.py b/sdb/commands/zfs/dbuf.py index 1bd704dd..aa085ad1 100644 --- a/sdb/commands/zfs/dbuf.py +++ b/sdb/commands/zfs/dbuf.py @@ -57,14 +57,15 @@ def _init_parser(cls, name: str) -> argparse.ArgumentParser: return parser @staticmethod - def DslDirName(dd: drgn.Object): - pname = '' + def DslDirName(dd: drgn.Object) -> str: + name = "" if dd.dd_parent: - pname = Dbuf.DslDirName(dd.dd_parent) + '/' - return pname + dd.dd_myname.string_().decode("utf-8") + name = Dbuf.DslDirName(dd.dd_parent) + "/" + name += dd.dd_myname.string_().decode("utf-8") + return name @staticmethod - def DatasetName(ds: drgn.Object): + def DatasetName(ds: drgn.Object) -> str: name = Dbuf.DslDirName(ds.ds_dir) if not ds.ds_prev: sn = ds.ds_snapname.string_().decode("utf-8") @@ -74,13 +75,13 @@ def DatasetName(ds: drgn.Object): return name @staticmethod - def ObjsetName(os: drgn.Object): + def ObjsetName(os: drgn.Object) -> str: if not os.os_dsl_dataset: return '{}/_MOS'.format( os.os_spa.spa_name.string_().decode("utf-8")) return Dbuf.DatasetName(os.os_dsl_dataset) - def pretty_print(self, dbufs): + def pretty_print(self, dbufs: drgn.Object) -> None: print("{:>20} {:>8} {:>4} {:>8} {:>5} {}".format( "addr", "object", "lvl", "blkid", "holds", "os")) for dbuf in filter(self.argfilter, dbufs): diff --git a/sdb/commands/zfs/internal/__init__.py b/sdb/commands/zfs/internal/__init__.py index 372478fe..3cbecbf5 100644 --- a/sdb/commands/zfs/internal/__init__.py +++ b/sdb/commands/zfs/internal/__init__.py @@ -23,12 +23,13 @@ import sdb -def enum_lookup(enum_type_name: str, value: int): +def enum_lookup(enum_type_name: str, value: int) -> str: """return a string which is the short name of the enum value (truncating off the common prefix) """ fields = sdb.get_type(enum_type_name).type.enumerators + enum_string: str = fields[value].name prefix = os.path.commonprefix([f[0] for f in fields]) - return fields[value][0][prefix.rfind("_") + 1:] + return enum_string[prefix.rfind("_") + 1:] def print_histogram(histogram: List[int], size: int, offset: int) -> None: diff --git a/sdb/commands/zfs/metaslab.py b/sdb/commands/zfs/metaslab.py index bc778301..65dbd847 100644 --- a/sdb/commands/zfs/metaslab.py +++ b/sdb/commands/zfs/metaslab.py @@ -54,7 +54,8 @@ def _init_parser(cls, name: str) -> argparse.ArgumentParser: return parser @staticmethod - def metaslab_weight_print(msp, print_header, indent): + def metaslab_weight_print(msp: drgn.Object, print_header: bool, + indent: int) -> None: if print_header: print( "".ljust(indent), @@ -115,7 +116,8 @@ def metaslab_weight_print(msp, print_header, indent): print("", (count + " x " + size).rjust(12)) @staticmethod - def print_metaslab(msp, print_header, indent): + def print_metaslab(msp: drgn.Object, print_header: bool, + indent: int) -> None: spacemap = msp.ms_sm if print_header: @@ -158,7 +160,9 @@ def print_metaslab(msp, print_header, indent): print((str(int(msp.ms_fragmentation)) + "%").rjust(6), end="") print(nicenum(uchanges_mem).rjust(9)) - def pretty_print(self, metaslabs, indent=0): + def pretty_print(self, + metaslabs: Iterable[drgn.Object], + indent: int = 0) -> None: first_time = True for msp in metaslabs: if not self.args.histogram and not self.args.weight: diff --git a/sdb/commands/zfs/spa.py b/sdb/commands/zfs/spa.py index 445e312c..ab00197b 100644 --- a/sdb/commands/zfs/spa.py +++ b/sdb/commands/zfs/spa.py @@ -17,7 +17,9 @@ # pylint: disable=missing-docstring import argparse +from typing import Iterable +import drgn import sdb from sdb.commands.spl.avl import Avl from sdb.commands.zfs.vdev import Vdev @@ -60,7 +62,7 @@ def __init__(self, args: str = "", name: str = "_") -> None: if self.args.weight: self.arg_string += "-w " - def pretty_print(self, spas): + def pretty_print(self, spas: Iterable[drgn.Object]) -> None: print("{:18} {}".format("ADDR", "NAME")) print("%s" % ("-" * 60)) for spa in spas: @@ -70,7 +72,7 @@ def pretty_print(self, spas): vdevs = sdb.execute_pipeline([spa], [Vdev()]) Vdev(self.arg_string).pretty_print(vdevs, 5) - def no_input(self): + def no_input(self) -> drgn.Object: spas = sdb.execute_pipeline( [sdb.get_object("spa_namespace_avl").address_of_()], [Avl(), sdb.Cast("spa_t *")], diff --git a/sdb/commands/zfs/vdev.py b/sdb/commands/zfs/vdev.py index bd344d01..860d5ca3 100644 --- a/sdb/commands/zfs/vdev.py +++ b/sdb/commands/zfs/vdev.py @@ -66,7 +66,9 @@ def __init__(self, args: str = "", name: str = "_") -> None: if self.args.weight: self.arg_string += "-w " - def pretty_print(self, vdevs, indent=0): + def pretty_print(self, + vdevs: Iterable[drgn.Object], + indent: int = 0) -> None: print( "".ljust(indent), "ADDR".ljust(18), diff --git a/sdb/internal/cli.py b/sdb/internal/cli.py index 22be2c82..08681aee 100644 --- a/sdb/internal/cli.py +++ b/sdb/internal/cli.py @@ -211,7 +211,7 @@ def main() -> None: print("sdb: " + str(err)) return - repl = REPL(prog, sdb.get_registered_commands()) + repl = REPL(prog, list(sdb.get_registered_commands().keys())) repl.enable_history() if args.eval: exit_code = repl.eval_cmd(args.eval) diff --git a/sdb/internal/repl.py b/sdb/internal/repl.py index a39629ee..e8fc38c7 100644 --- a/sdb/internal/repl.py +++ b/sdb/internal/repl.py @@ -20,7 +20,9 @@ import os import readline import traceback +from typing import Callable, List, Optional +import drgn from sdb.error import Error, CommandArgumentsError from sdb.pipeline import invoke @@ -34,25 +36,36 @@ class REPL: """ @staticmethod - def __make_completer(vocabulary): + def __make_completer( + vocabulary: List[str]) -> Callable[[str, int], Optional[str]]: """ Attribution: The following completer code came from Eli Berdensky's blog released under the public domain. """ - def custom_complete(text, state): + def custom_complete(text: str, state: int) -> str: + # # None is returned for the end of the completion session. - results = [x for x in vocabulary if x.startswith(text)] + [None] + # + results = [x for x in vocabulary if x.startswith(text) + ] + [None] # type: ignore[list-item] + + # # A space is added to the completion since the Python readline # doesn't do this on its own. When a word is fully completed we # want to mimic the default readline library behavior of adding # a space after it. + # return results[state] + " " return custom_complete - def __init__(self, target, vocabulary, prompt="sdb> ", closing=""): + def __init__(self, + target: drgn.Program, + vocabulary: List[str], + prompt: str = "sdb> ", + closing: str = ""): self.prompt = prompt self.closing = closing self.vocabulary = vocabulary @@ -60,7 +73,7 @@ def __init__(self, target, vocabulary, prompt="sdb> ", closing=""): self.histfile = "" readline.set_completer(REPL.__make_completer(vocabulary)) - def enable_history(self, history_file='~/.sdb_history'): + def enable_history(self, history_file: str = '~/.sdb_history') -> None: self.histfile = os.path.expanduser(history_file) try: readline.read_history_file(self.histfile) diff --git a/tests/integration/gen_regression_output.py b/tests/integration/gen_regression_output.py index 81e1c3e7..7f288ee6 100644 --- a/tests/integration/gen_regression_output.py +++ b/tests/integration/gen_regression_output.py @@ -20,7 +20,7 @@ from tests.integration.infra import generate_known_regression_output -def main(): +def main() -> None: generate_known_regression_output() diff --git a/tests/integration/infra.py b/tests/integration/infra.py index dfdac7f1..5a8ab07d 100644 --- a/tests/integration/infra.py +++ b/tests/integration/infra.py @@ -63,7 +63,7 @@ def setup_target() -> Optional[drgn.Program]: TEST_PROGRAM = setup_target() -TEST_REPL = REPL(TEST_PROGRAM, sdb.get_registered_commands()) +TEST_REPL = REPL(TEST_PROGRAM, list(sdb.get_registered_commands().keys())) def repl_invoke(cmd: str) -> int: @@ -148,7 +148,7 @@ def get_all_generic_test_modules() -> List[str]: return modnames -def generate_known_regression_output(): +def generate_known_regression_output() -> None: """ Auto-generate the baseline regression output for all the detected test modules in this directory. diff --git a/tests/integration/test_core_generic.py b/tests/integration/test_core_generic.py index 2fc6f31b..c979e85e 100644 --- a/tests/integration/test_core_generic.py +++ b/tests/integration/test_core_generic.py @@ -17,8 +17,9 @@ # pylint: disable=missing-module-docstring # pylint: disable=missing-function-docstring -import pytest +from typing import Any +import pytest from tests.integration.infra import repl_invoke, dump_exists, slurp_output_file POS_CMDS = [ @@ -172,19 +173,21 @@ CMD_TABLE = POS_CMDS + NEG_CMDS -@pytest.mark.skipif(not dump_exists(), - reason="couldn't find crash dump to run tests against") -@pytest.mark.parametrize('cmd', POS_CMDS) -def test_cmd_output_and_error_code_0(capsys, cmd): +@pytest.mark.skipif( # type: ignore[misc] + not dump_exists(), + reason="couldn't find crash dump to run tests against") +@pytest.mark.parametrize('cmd', POS_CMDS) # type: ignore[misc] +def test_cmd_output_and_error_code_0(capsys: Any, cmd: str) -> None: assert repl_invoke(cmd) == 0 captured = capsys.readouterr() assert captured.out == slurp_output_file("core", cmd) -@pytest.mark.skipif(not dump_exists(), - reason="couldn't find crash dump to run tests against") -@pytest.mark.parametrize('cmd', NEG_CMDS) -def test_cmd_output_and_error_code_1(capsys, cmd): +@pytest.mark.skipif( # type: ignore[misc] + not dump_exists(), + reason="couldn't find crash dump to run tests against") +@pytest.mark.parametrize('cmd', NEG_CMDS) # type: ignore[misc] +def test_cmd_output_and_error_code_1(capsys: Any, cmd: str) -> None: assert repl_invoke(cmd) == 1 captured = capsys.readouterr() assert captured.out == slurp_output_file("core", cmd) diff --git a/tests/integration/test_linux_generic.py b/tests/integration/test_linux_generic.py index b5a14da9..8aa010c2 100644 --- a/tests/integration/test_linux_generic.py +++ b/tests/integration/test_linux_generic.py @@ -17,8 +17,9 @@ # pylint: disable=missing-module-docstring # pylint: disable=missing-function-docstring -import pytest +from typing import Any +import pytest from tests.integration.infra import repl_invoke, dump_exists, slurp_output_file POS_CMDS = [ @@ -149,28 +150,31 @@ CMD_TABLE = POS_CMDS + STRIPPED_POS_CMDS + NEG_CMDS -@pytest.mark.skipif(not dump_exists(), - reason="couldn't find crash dump to run tests against") -@pytest.mark.parametrize('cmd', POS_CMDS) -def test_cmd_output_and_error_code_0(capsys, cmd): +@pytest.mark.skipif( # type: ignore[misc] + not dump_exists(), + reason="couldn't find crash dump to run tests against") +@pytest.mark.parametrize('cmd', POS_CMDS) # type: ignore[misc] +def test_cmd_output_and_error_code_0(capsys: Any, cmd: str) -> None: assert repl_invoke(cmd) == 0 captured = capsys.readouterr() assert captured.out == slurp_output_file("linux", cmd) -@pytest.mark.skipif(not dump_exists(), - reason="couldn't find crash dump to run tests against") -@pytest.mark.parametrize('cmd', NEG_CMDS) -def test_cmd_output_and_error_code_1(capsys, cmd): +@pytest.mark.skipif( # type: ignore[misc] + not dump_exists(), + reason="couldn't find crash dump to run tests against") +@pytest.mark.parametrize('cmd', NEG_CMDS) # type: ignore[misc] +def test_cmd_output_and_error_code_1(capsys: Any, cmd: str) -> None: assert repl_invoke(cmd) == 1 captured = capsys.readouterr() assert captured.out == slurp_output_file("linux", cmd) -@pytest.mark.skipif(not dump_exists(), - reason="couldn't find crash dump to run tests against") -@pytest.mark.parametrize('cmd', STRIPPED_POS_CMDS) -def test_cmd_stripped_output_and_error_code_0(capsys, cmd): +@pytest.mark.skipif( # type: ignore[misc] + not dump_exists(), + reason="couldn't find crash dump to run tests against") +@pytest.mark.parametrize('cmd', STRIPPED_POS_CMDS) # type: ignore[misc] +def test_cmd_stripped_output_and_error_code_0(capsys: Any, cmd: str) -> None: assert repl_invoke(cmd) == 0 captured = capsys.readouterr() slurped = slurp_output_file("linux", cmd) diff --git a/tests/integration/test_spl_generic.py b/tests/integration/test_spl_generic.py index e12bce44..08bbb199 100644 --- a/tests/integration/test_spl_generic.py +++ b/tests/integration/test_spl_generic.py @@ -17,8 +17,9 @@ # pylint: disable=missing-module-docstring # pylint: disable=missing-function-docstring -import pytest +from typing import Any +import pytest from tests.integration.infra import repl_invoke, dump_exists, slurp_output_file CMD_TABLE = [ @@ -33,10 +34,11 @@ ] -@pytest.mark.skipif(not dump_exists(), - reason="couldn't find crash dump to run tests against") -@pytest.mark.parametrize('cmd', CMD_TABLE) -def test_cmd_output_and_error_code(capsys, cmd): +@pytest.mark.skipif( # type: ignore[misc] + not dump_exists(), + reason="couldn't find crash dump to run tests against") +@pytest.mark.parametrize('cmd', CMD_TABLE) # type: ignore[misc] +def test_cmd_output_and_error_code(capsys: Any, cmd: str) -> None: assert repl_invoke(cmd) == 0 captured = capsys.readouterr() assert captured.out == slurp_output_file("spl", cmd) diff --git a/tests/integration/test_zfs_generic.py b/tests/integration/test_zfs_generic.py index 07d9daa8..dc3b5b31 100644 --- a/tests/integration/test_zfs_generic.py +++ b/tests/integration/test_zfs_generic.py @@ -17,10 +17,12 @@ # pylint: disable=missing-module-docstring # pylint: disable=missing-function-docstring -import pytest +from typing import Any +import pytest from tests.integration.infra import repl_invoke, dump_exists, slurp_output_file + CMD_TABLE = [ "arc", "dbuf", @@ -43,10 +45,11 @@ ] # yapf: disable -@pytest.mark.skipif(not dump_exists(), - reason="couldn't find crash dump to run tests against") -@pytest.mark.parametrize('cmd', CMD_TABLE) -def test_cmd_output_and_error_code(capsys, cmd): +@pytest.mark.skipif( # type: ignore[misc] + not dump_exists(), + reason="couldn't find crash dump to run tests against") +@pytest.mark.parametrize('cmd', CMD_TABLE) # type: ignore[misc] +def test_cmd_output_and_error_code(capsys: Any, cmd: str) -> None: assert repl_invoke(cmd) == 0 captured = capsys.readouterr() assert captured.out == slurp_output_file("zfs", cmd) diff --git a/tests/unit/__init__.py b/tests/unit/__init__.py index 0802b230..6050de16 100644 --- a/tests/unit/__init__.py +++ b/tests/unit/__init__.py @@ -206,7 +206,7 @@ def fake_memory_reader(address: int, count: int, physical: int, def invoke(prog: drgn.Program, objs: Iterable[drgn.Object], - line: str) -> Iterable[drgn.Object]: + line: str) -> List[drgn.Object]: """ Dispatch to sdb.invoke, but also drain the generator it returns, so the tests can more easily access the returned objects. diff --git a/tests/unit/commands/test_address.py b/tests/unit/commands/test_address.py index 684f86f2..1e320641 100644 --- a/tests/unit/commands/test_address.py +++ b/tests/unit/commands/test_address.py @@ -22,42 +22,38 @@ from tests.unit import invoke, MOCK_PROGRAM -def test_empty(): +def test_empty() -> None: line = 'address' - objs = [] - ret = invoke(MOCK_PROGRAM, objs, line) + ret = invoke(MOCK_PROGRAM, [], line) assert not ret -def test_single_object(): +def test_single_object() -> None: line = 'addr global_int' - objs = [] - ret = invoke(MOCK_PROGRAM, objs, line) + ret = invoke(MOCK_PROGRAM, [], line) assert len(ret) == 1 assert ret[0].value_() == 0xffffffffc0000000 assert ret[0].type_ == MOCK_PROGRAM.type('int *') -def test_plain_address(): +def test_plain_address() -> None: line = 'addr 0xffffffffc084eee0' - objs = [] - ret = invoke(MOCK_PROGRAM, objs, line) + ret = invoke(MOCK_PROGRAM, [], line) assert len(ret) == 1 assert ret[0].value_() == 0xffffffffc084eee0 assert ret[0].type_ == MOCK_PROGRAM.type('void *') -def test_multiple_object(): +def test_multiple_object() -> None: line = 'addr global_int 0xffffffffc084eee0 global_void_ptr' - objs = [] - ret = invoke(MOCK_PROGRAM, objs, line) + ret = invoke(MOCK_PROGRAM, [], line) assert len(ret) == 3 assert ret[0].value_() == 0xffffffffc0000000 @@ -68,11 +64,10 @@ def test_multiple_object(): assert ret[2].type_ == MOCK_PROGRAM.type('void **') -def test_piped_invocations(): +def test_piped_invocations() -> None: line = 'addr global_int | addr 0xffffffffc084eee0 global_void_ptr' - objs = [] - ret = invoke(MOCK_PROGRAM, objs, line) + ret = invoke(MOCK_PROGRAM, [], line) assert len(ret) == 3 assert ret[0].value_() == 0xffffffffc0000000 @@ -83,11 +78,10 @@ def test_piped_invocations(): assert ret[2].type_ == MOCK_PROGRAM.type('void **') -def test_echo_pipe(): +def test_echo_pipe() -> None: line = 'addr 0xffffffffc084eee0 | addr global_void_ptr' - objs = [] - ret = invoke(MOCK_PROGRAM, objs, line) + ret = invoke(MOCK_PROGRAM, [], line) assert len(ret) == 2 assert ret[0].value_() == 0xffffffffc084eee0 @@ -96,11 +90,10 @@ def test_echo_pipe(): assert ret[1].type_ == MOCK_PROGRAM.type('void **') -def test_global_not_found(): +def test_global_not_found() -> None: line = 'addr bogus' - objs = [] with pytest.raises(sdb.SymbolNotFoundError) as err: - invoke(MOCK_PROGRAM, objs, line) + invoke(MOCK_PROGRAM, [], line) assert err.value.symbol == 'bogus' diff --git a/tests/unit/commands/test_cast.py b/tests/unit/commands/test_cast.py index 6108328c..2ed43b14 100644 --- a/tests/unit/commands/test_cast.py +++ b/tests/unit/commands/test_cast.py @@ -22,34 +22,31 @@ from tests.unit import invoke, MOCK_PROGRAM -def test_no_arg(): +def test_no_arg() -> None: line = 'cast' - objs = [] with pytest.raises(sdb.CommandArgumentsError): - invoke(MOCK_PROGRAM, objs, line) + invoke(MOCK_PROGRAM, [], line) -def test_arg_no_pipe_input(): +def test_arg_no_pipe_input() -> None: line = 'cast int' - objs = [] - ret = invoke(MOCK_PROGRAM, objs, line) + ret = invoke(MOCK_PROGRAM, [], line) assert not ret -def test_arg_no_pipe_input_invalid_type(): +def test_arg_no_pipe_input_invalid_type() -> None: line = 'cast bogus' - objs = [] with pytest.raises(sdb.CommandError) as err: - invoke(MOCK_PROGRAM, objs, line) + invoke(MOCK_PROGRAM, [], line) assert "could not find type 'bogus'" in str(err.value) -def test_invoke_pipe_input(): +def test_invoke_pipe_input() -> None: line = 'cast void *' objs = [MOCK_PROGRAM['global_int']] @@ -60,54 +57,49 @@ def test_invoke_pipe_input(): assert ret[0].value_() == 0x01020304 -def test_str_pipe_input(): +def test_str_pipe_input() -> None: line = 'addr global_int | cast void *' - objs = [] - ret = invoke(MOCK_PROGRAM, objs, line) + ret = invoke(MOCK_PROGRAM, [], line) assert len(ret) == 1 assert ret[0].type_ == MOCK_PROGRAM.type('void *') assert ret[0].value_() == 0xffffffffc0000000 -def test_pipe_input_pointer_to_int(): +def test_pipe_input_pointer_to_int() -> None: line = 'addr global_int | cast unsigned int' - objs = [] - ret = invoke(MOCK_PROGRAM, objs, line) + ret = invoke(MOCK_PROGRAM, [], line) assert len(ret) == 1 assert ret[0].type_ == MOCK_PROGRAM.type('unsigned int') assert ret[0].value_() == 0xc0000000 -def test_str_pipe_input_pointer_to_invalid_type(): +def test_str_pipe_input_pointer_to_invalid_type() -> None: line = 'addr global_int | cast bogus' - objs = [] with pytest.raises(sdb.CommandError) as err: - invoke(MOCK_PROGRAM, objs, line) + invoke(MOCK_PROGRAM, [], line) assert "could not find type 'bogus'" in str(err.value) -def test_double_cast(): +def test_double_cast() -> None: line = 'addr global_int | cast unsigned int | cast char *' - objs = [] - ret = invoke(MOCK_PROGRAM, objs, line) + ret = invoke(MOCK_PROGRAM, [], line) assert len(ret) == 1 assert ret[0].type_ == MOCK_PROGRAM.type('char *') assert ret[0].value_() == 0xc0000000 -def test_pointer_to_struct(): +def test_pointer_to_struct() -> None: line = 'addr global_int | cast struct test_struct' - objs = [] with pytest.raises(sdb.CommandError) as err: - invoke(MOCK_PROGRAM, objs, line) + invoke(MOCK_PROGRAM, [], line) assert "cannot convert 'int *' to 'struct test_struct'" in str(err.value) diff --git a/tests/unit/commands/test_count.py b/tests/unit/commands/test_count.py index 965c3833..d5538b94 100644 --- a/tests/unit/commands/test_count.py +++ b/tests/unit/commands/test_count.py @@ -21,37 +21,34 @@ from tests.unit import invoke, MOCK_PROGRAM -def test_empty(): +def test_empty() -> None: line = 'count' - objs = [] - ret = invoke(MOCK_PROGRAM, objs, line) + ret = invoke(MOCK_PROGRAM, [], line) assert len(ret) == 1 assert ret[0].value_() == 0 -def test_single_piped_input(): +def test_single_piped_input() -> None: line = 'echo 0x0 | count' - objs = [] - ret = invoke(MOCK_PROGRAM, objs, line) + ret = invoke(MOCK_PROGRAM, [], line) assert len(ret) == 1 assert ret[0].value_() == 1 -def test_multiple_piped_inputs(): +def test_multiple_piped_inputs() -> None: line = 'echo 0x0 0xfffff 0xdeadbeef 0x101010 | count' - objs = [] - ret = invoke(MOCK_PROGRAM, objs, line) + ret = invoke(MOCK_PROGRAM, [], line) assert len(ret) == 1 assert ret[0].value_() == 4 -def test_single_input(): +def test_single_input() -> None: line = 'count' objs = [drgn.Object(MOCK_PROGRAM, 'void *', value=0)] @@ -61,7 +58,7 @@ def test_single_input(): assert ret[0].value_() == 1 -def test_multiple_inputs(): +def test_multiple_inputs() -> None: line = 'count' objs = [ drgn.Object(MOCK_PROGRAM, 'void *', value=0), diff --git a/tests/unit/commands/test_echo.py b/tests/unit/commands/test_echo.py index a031557d..b90a5084 100644 --- a/tests/unit/commands/test_echo.py +++ b/tests/unit/commands/test_echo.py @@ -23,16 +23,15 @@ from tests.unit import invoke, MOCK_PROGRAM -def test_empty(): +def test_empty() -> None: line = 'echo' - objs = [] - ret = invoke(MOCK_PROGRAM, objs, line) + ret = invoke(MOCK_PROGRAM, [], line) assert not ret -def test_piped_input(): +def test_piped_input() -> None: line = 'echo' objs = [drgn.Object(MOCK_PROGRAM, 'void *', value=0)] @@ -43,39 +42,36 @@ def test_piped_input(): assert ret[0].type_ == MOCK_PROGRAM.type('void *') -def test_single_arg_hex(): +def test_single_arg_hex() -> None: line = 'echo 0x0' - objs = [] - ret = invoke(MOCK_PROGRAM, objs, line) + ret = invoke(MOCK_PROGRAM, [], line) assert len(ret) == 1 assert ret[0].value_() == 0 assert ret[0].type_ == MOCK_PROGRAM.type('void *') -def test_single_arg_decimal(): +def test_single_arg_decimal() -> None: line = 'echo 0' - objs = [] - ret = invoke(MOCK_PROGRAM, objs, line) + ret = invoke(MOCK_PROGRAM, [], line) assert len(ret) == 1 assert ret[0].value_() == 0 assert ret[0].type_ == MOCK_PROGRAM.type('void *') -def test_bogus_arg(): +def test_bogus_arg() -> None: line = 'echo bogus' - objs = [] with pytest.raises(sdb.CommandInvalidInputError) as err: - invoke(MOCK_PROGRAM, objs, line) + invoke(MOCK_PROGRAM, [], line) assert err.value.argument == 'bogus' -def test_test_piped_int(): +def test_test_piped_int() -> None: line = 'echo' objs = [drgn.Object(MOCK_PROGRAM, 'int', value=1)] @@ -86,18 +82,17 @@ def test_test_piped_int(): assert ret[0].type_ == MOCK_PROGRAM.type('int') -def test_single_arg(): +def test_single_arg() -> None: line = 'echo 1' - objs = [] - ret = invoke(MOCK_PROGRAM, objs, line) + ret = invoke(MOCK_PROGRAM, [], line) assert len(ret) == 1 assert ret[0].value_() == 1 assert ret[0].type_ == MOCK_PROGRAM.type('void *') -def test_multiple_piped(): +def test_multiple_piped() -> None: line = 'echo' objs = [ drgn.Object(MOCK_PROGRAM, 'void *', value=0), @@ -113,11 +108,10 @@ def test_multiple_piped(): assert ret[1].type_ == MOCK_PROGRAM.type('int') -def test_multiple_args(): +def test_multiple_args() -> None: line = 'echo 0 1' - objs = [] - ret = invoke(MOCK_PROGRAM, objs, line) + ret = invoke(MOCK_PROGRAM, [], line) assert len(ret) == 2 assert ret[0].value_() == 0 @@ -126,7 +120,7 @@ def test_multiple_args(): assert ret[1].type_ == MOCK_PROGRAM.type('void *') -def test_piped_and_args_combo(): +def test_piped_and_args_combo() -> None: line = 'echo 0 1' objs = [ drgn.Object(MOCK_PROGRAM, 'void *', value=0), @@ -146,7 +140,7 @@ def test_piped_and_args_combo(): assert ret[3].type_ == MOCK_PROGRAM.type('void *') -def test_multi_echo_combo(): +def test_multi_echo_combo() -> None: line = 'echo 2 3 | echo 4' objs = [ drgn.Object(MOCK_PROGRAM, 'void *', value=0), diff --git a/tests/unit/commands/test_filter.py b/tests/unit/commands/test_filter.py index 9c0d8703..0dc30207 100644 --- a/tests/unit/commands/test_filter.py +++ b/tests/unit/commands/test_filter.py @@ -23,39 +23,35 @@ from tests.unit import invoke, MOCK_PROGRAM -def test_no_arg(): +def test_no_arg() -> None: line = 'filter' - objs = [] with pytest.raises(sdb.CommandArgumentsError): - invoke(MOCK_PROGRAM, objs, line) + invoke(MOCK_PROGRAM, [], line) -def test_no_rhs(): +def test_no_rhs() -> None: line = 'filter obj ==' - objs = [] with pytest.raises(sdb.CommandInvalidInputError): - invoke(MOCK_PROGRAM, objs, line) + invoke(MOCK_PROGRAM, [], line) -def test_no_lhs(): +def test_no_lhs() -> None: line = 'filter == obj' - objs = [] with pytest.raises(sdb.CommandInvalidInputError): - invoke(MOCK_PROGRAM, objs, line) + invoke(MOCK_PROGRAM, [], line) -def test_no_operator(): +def test_no_operator() -> None: line = 'filter obj' - objs = [] with pytest.raises(sdb.CommandInvalidInputError): - invoke(MOCK_PROGRAM, objs, line) + invoke(MOCK_PROGRAM, [], line) -def test_single_void_ptr_input_lhs_not_object(): +def test_single_void_ptr_input_lhs_not_object() -> None: line = 'filter 0 == obj' objs = [drgn.Object(MOCK_PROGRAM, 'void *', value=0)] @@ -63,7 +59,7 @@ def test_single_void_ptr_input_lhs_not_object(): invoke(MOCK_PROGRAM, objs, line) -def test_multi_void_ptr_input_value_match_ne(): +def test_multi_void_ptr_input_value_match_ne() -> None: line = 'filter obj != 1' objs = [ drgn.Object(MOCK_PROGRAM, 'void *', value=0), @@ -88,7 +84,7 @@ def test_multi_void_ptr_input_value_match_ne(): invoke(MOCK_PROGRAM, objs, line) -def test_char_array_input_object_match(): +def test_char_array_input_object_match() -> None: line = 'filter obj == obj' objs = [drgn.Object(MOCK_PROGRAM, 'char [4]', value=b"foo")] @@ -96,7 +92,7 @@ def test_char_array_input_object_match(): invoke(MOCK_PROGRAM, objs, line) -def test_struct_input_invalid_syntax(): +def test_struct_input_invalid_syntax() -> None: line = 'filter obj->ts_int == 1' objs = [MOCK_PROGRAM["global_struct"]] @@ -104,7 +100,7 @@ def test_struct_input_invalid_syntax(): invoke(MOCK_PROGRAM, objs, line) -def test_struct_input_bogus_member(): +def test_struct_input_bogus_member() -> None: line = 'filter obj.ts_bogus == 1' objs = [MOCK_PROGRAM["global_struct"]] diff --git a/tests/unit/commands/test_member.py b/tests/unit/commands/test_member.py index b5c71183..e0486b38 100644 --- a/tests/unit/commands/test_member.py +++ b/tests/unit/commands/test_member.py @@ -22,79 +22,71 @@ from tests.unit import invoke, MOCK_PROGRAM -def test_no_arg(): +def test_no_arg() -> None: line = 'member' - objs = [] with pytest.raises(sdb.CommandArgumentsError): - invoke(MOCK_PROGRAM, objs, line) + invoke(MOCK_PROGRAM, [], line) -def test_scalar_input(): +def test_scalar_input() -> None: line = 'addr global_int | member int_member' - objs = [] with pytest.raises(sdb.CommandError) as err: - invoke(MOCK_PROGRAM, objs, line) + invoke(MOCK_PROGRAM, [], line) assert "'int' is not a structure, union, or class" in str(err.value) -def test_member_not_found(): +def test_member_not_found() -> None: line = 'addr global_struct | member bogus' - objs = [] with pytest.raises(sdb.CommandError) as err: - invoke(MOCK_PROGRAM, objs, line) + invoke(MOCK_PROGRAM, [], line) assert "'struct test_struct' has no member 'bogus'" in str(err.value) -def test_array_member_incomplete_expression(): +def test_array_member_incomplete_expression() -> None: line = 'addr global_struct | member ts_array[2' - objs = [] with pytest.raises(sdb.CommandError) as err: - invoke(MOCK_PROGRAM, objs, line) + invoke(MOCK_PROGRAM, [], line) assert "incomplete array expression" in str(err.value) -def test_array_member_bogus_index(): +def test_array_member_bogus_index() -> None: line = 'addr global_struct | member ts_array[a]' - objs = [] with pytest.raises(sdb.CommandError) as err: - invoke(MOCK_PROGRAM, objs, line) + invoke(MOCK_PROGRAM, [], line) assert "incorrect index: 'a' is not a number" in str(err.value) -def test_embedded_struct_member_deref_notation_error(): +def test_embedded_struct_member_deref_notation_error() -> None: line = 'addr global_cstruct | member cs_struct->ts_int' - objs = [] with pytest.raises(sdb.CommandError) as err: - invoke(MOCK_PROGRAM, objs, line) + invoke(MOCK_PROGRAM, [], line) assert "use the dot(.) notation for member access" in str(err.value) -def test_arrow_with_no_identifier(): +def test_arrow_with_no_identifier() -> None: line = 'addr global_cstruct | member cs_struct->' - objs = [] with pytest.raises(sdb.CommandError) as err: - invoke(MOCK_PROGRAM, objs, line) + invoke(MOCK_PROGRAM, [], line) assert "no identifier specified after ->" in str(err.value) -def test_dot_with_no_identifier(): +def test_dot_with_no_identifier() -> None: line = 'addr global_cstruct | member cs_struct.' - objs = [] with pytest.raises(sdb.CommandError) as err: - invoke(MOCK_PROGRAM, objs, line) + invoke(MOCK_PROGRAM, [], line) assert "no identifier specified after ." in str(err.value) From 147874cd659337642f03799a116440c03cf72e18 Mon Sep 17 00:00:00 2001 From: Serapheim Dimitropoulos Date: Mon, 24 Feb 2020 09:24:37 -0800 Subject: [PATCH 05/19] slub_walker: document cache merging in NOTES section --- sdb/commands/linux/slabs.py | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/sdb/commands/linux/slabs.py b/sdb/commands/linux/slabs.py index 5a91d3ed..56864112 100644 --- a/sdb/commands/linux/slabs.py +++ b/sdb/commands/linux/slabs.py @@ -236,6 +236,13 @@ class SlubCacheWalker(sdb.Walker): default Linux kernel config file that most distros use and thus is very inefficient on traversing the entries and slabs of each cache. + + Another thing to keep in mind is Linux SLUB allocator's + merging behavior. Some systems are tuned to merge together + caches whose entries are of the same size where it makes + sense. As a result, when using this walker the user may + run into entries that don't make sense given the cache's + name. """ names = ["slub_cache"] From 6aa9b6e03665037b2bcfaa1258ab3c5b3e148b2c Mon Sep 17 00:00:00 2001 From: Serapheim Dimitropoulos Date: Tue, 25 Feb 2020 18:10:30 +0000 Subject: [PATCH 06/19] Fix: type_canonicalize_name() returns whole structure Introduce type_canonicalize_size() to target API --- sdb/__init__.py | 3 ++- sdb/target.py | 14 +++++++++++++- 2 files changed, 15 insertions(+), 2 deletions(-) diff --git a/sdb/__init__.py b/sdb/__init__.py index 48ddf855..d5a1719e 100644 --- a/sdb/__init__.py +++ b/sdb/__init__.py @@ -34,7 +34,8 @@ from sdb.target import (create_object, get_object, get_prog, get_typed_null, get_type, get_pointer_type, get_target_flags, get_symbol, type_canonical_name, type_canonicalize, - type_canonicalize_name, type_equals) + type_canonicalize_name, type_canonicalize_size, + type_equals) from sdb.command import (Address, Cast, Command, InputHandler, Locator, PrettyPrinter, Walk, Walker, SingleInputCommand, get_registered_commands) diff --git a/sdb/target.py b/sdb/target.py index e6b122ad..32963ce0 100644 --- a/sdb/target.py +++ b/sdb/target.py @@ -117,7 +117,7 @@ def type_canonical_name(t: drgn.Type) -> str: """ Return the "canonical name" of this type. See type_canonicalize(). """ - return str(type_canonicalize(t)) + return type_canonicalize(t).type_name() def type_canonicalize_name(type_name: str) -> str: @@ -128,6 +128,18 @@ def type_canonicalize_name(type_name: str) -> str: return type_canonical_name(prog.type(type_name)) +def type_canonicalize_size(t: Union[drgn.Type, str]) -> int: + """ + Return the "canonical size" of this type. See type_canonicalize(). + """ + if isinstance(t, str): + type_ = get_type(t) + else: + assert isinstance(t, drgn.Type) + type_ = t + return type_canonicalize(type_).size + + def type_equals(a: drgn.Type, b: drgn.Type) -> bool: """ This function determines if two types have the same canonical name. See From 69b8181200c9c3fbd141467e8256293e153c19e9 Mon Sep 17 00:00:00 2001 From: Serapheim Dimitropoulos Date: Tue, 25 Feb 2020 18:14:06 +0000 Subject: [PATCH 07/19] refactor: proper typename assertions for slub_helper funcs --- sdb/commands/linux/internal/slub_helpers.py | 31 +++++++++++---------- 1 file changed, 16 insertions(+), 15 deletions(-) diff --git a/sdb/commands/linux/internal/slub_helpers.py b/sdb/commands/linux/internal/slub_helpers.py index 64771f99..82f4629c 100644 --- a/sdb/commands/linux/internal/slub_helpers.py +++ b/sdb/commands/linux/internal/slub_helpers.py @@ -26,7 +26,7 @@ def is_root_cache(cache: drgn.Object) -> bool: - assert cache.type_.type_name() == 'struct kmem_cache *' + assert sdb.type_canonical_name(cache.type_) == 'struct kmem_cache *' return int(cache.memcg_params.root_cache.value_()) == 0x0 @@ -38,14 +38,14 @@ def for_each_root_cache() -> Iterable[drgn.Object]: def for_each_child_cache(root_cache: drgn.Object) -> Iterable[drgn.Object]: - assert root_cache.type_.type_name() == 'struct kmem_cache *' + assert sdb.type_canonical_name(root_cache.type_) == 'struct kmem_cache *' yield from list_for_each_entry( "struct kmem_cache", root_cache.memcg_params.children.address_of_(), "memcg_params.children_node") def nr_slabs(cache: drgn.Object) -> int: - assert cache.type_.type_name() == 'struct kmem_cache *' + assert sdb.type_canonical_name(cache.type_) == 'struct kmem_cache *' nslabs: int = cache.node[0].nr_slabs.counter.value_() if is_root_cache(cache): for child in for_each_child_cache(cache): @@ -54,22 +54,22 @@ def nr_slabs(cache: drgn.Object) -> int: def entries_per_slab(cache: drgn.Object) -> int: - assert cache.type_.type_name() == 'struct kmem_cache *' + assert sdb.type_canonical_name(cache.type_) == 'struct kmem_cache *' return int(cache.oo.x.value_()) & 0xffff def entry_size(cache: drgn.Object) -> int: - assert cache.type_.type_name() == 'struct kmem_cache *' + assert sdb.type_canonical_name(cache.type_) == 'struct kmem_cache *' return int(cache.size.value_()) def object_size(cache: drgn.Object) -> int: - assert cache.type_.type_name() == 'struct kmem_cache *' + assert sdb.type_canonical_name(cache.type_) == 'struct kmem_cache *' return int(cache.object_size.value_()) def total_memory(cache: drgn.Object) -> int: - assert cache.type_.type_name() == 'struct kmem_cache *' + assert sdb.type_canonical_name(cache.type_) == 'struct kmem_cache *' nslabs = nr_slabs(cache) epslab = entries_per_slab(cache) esize = entry_size(cache) @@ -77,7 +77,7 @@ def total_memory(cache: drgn.Object) -> int: def objs(cache: drgn.Object) -> int: - assert cache.type_.type_name() == 'struct kmem_cache *' + assert sdb.type_canonical_name(cache.type_) == 'struct kmem_cache *' count: int = cache.node[0].total_objects.counter.value_() if is_root_cache(cache): for child in for_each_child_cache(cache): @@ -86,7 +86,7 @@ def objs(cache: drgn.Object) -> int: def inactive_objs(cache: drgn.Object) -> int: - assert cache.type_.type_name() == 'struct kmem_cache *' + assert sdb.type_canonical_name(cache.type_) == 'struct kmem_cache *' node = cache.node[0].partial # assumption nr_node_ids == 0 free = 0 for page in list_for_each_entry("struct page", node.address_of_(), "lru"): @@ -98,17 +98,17 @@ def inactive_objs(cache: drgn.Object) -> int: def active_objs(cache: drgn.Object) -> int: - assert cache.type_.type_name() == 'struct kmem_cache *' + assert sdb.type_canonical_name(cache.type_) == 'struct kmem_cache *' return objs(cache) - inactive_objs(cache) def active_memory(cache: drgn.Object) -> int: - assert cache.type_.type_name() == 'struct kmem_cache *' + assert sdb.type_canonical_name(cache.type_) == 'struct kmem_cache *' return active_objs(cache) * entry_size(cache) def util(cache: drgn.Object) -> int: - assert cache.type_.type_name() == 'struct kmem_cache *' + assert sdb.type_canonical_name(cache.type_) == 'struct kmem_cache *' total_mem = total_memory(cache) if total_mem == 0: return 0 @@ -129,8 +129,8 @@ def cache_get_free_pointer(cache: drgn.Object, p: drgn.Object) -> drgn.Object: function assumes that CONFIG_SLAB_FREELIST_HARDENED is set in the target """ - assert cache.type_.type_name() == 'struct kmem_cache *' - assert p.type_.type_name() == 'void *' + assert sdb.type_canonical_name(cache.type_) == 'struct kmem_cache *' + assert sdb.type_canonical_name(p.type_) == 'void *' hardened_ptr = p + cache.offset.value_() # @@ -177,7 +177,7 @@ def for_each_freeobj_in_slab(cache: drgn.Object, def for_each_partial_slab_in_cache(cache: drgn.Object) -> Iterable[drgn.Object]: - assert cache.type_.type_name() == 'struct kmem_cache *' + assert sdb.type_canonical_name(cache.type_) == 'struct kmem_cache *' node = cache.node[0].partial # assumption nr_node_ids == 0 yield from list_for_each_entry("struct page", node.address_of_(), "lru") @@ -192,6 +192,7 @@ def for_each_object_in_cache(cache: drgn.Object) -> Iterable[drgn.Object]: Goes through each object in the SLUB cache supplied yielding them to the consumer. """ + assert sdb.type_canonical_name(cache.type_) == 'struct kmem_cache *' pg_slab_flag = 1 << sdb.get_prog().constant('PG_slab').value_() cache_children = {child.value_() for child in for_each_child_cache(cache)} From 116d49ce8054e0be942bcac46ce68e32a7c78e6d Mon Sep 17 00:00:00 2001 From: Serapheim Dimitropoulos Date: Tue, 25 Feb 2020 18:14:44 +0000 Subject: [PATCH 08/19] Introduce spl_cache walker --- sdb/__init__.py | 1 + sdb/commands/internal/fmt.py | 8 +- sdb/commands/internal/p2.py | 25 + sdb/commands/linux/linked_lists.py | 8 + sdb/commands/spl/internal/kmem_helpers.py | 112 +- sdb/commands/spl/spl_kmem_caches.py | 37 +- sdb/target.py | 4 +- .../regression_output/spl/spl_kmem_caches -v | 140 + ...ilter obj.skc_linux_cache == 0 | spl_cache | 3564 +++++++++++++++++ ...obj.skc_linux_cache == 0 | spl_cache | cnt | 1 + ...obj.skc_obj_alloc > 0 | head 1 | spl_cache | 170 + ...lter obj.skc_name == \"ddt_cache\" | walk" | 46 + tests/integration/test_spl_generic.py | 14 + 13 files changed, 4103 insertions(+), 27 deletions(-) create mode 100644 sdb/commands/internal/p2.py create mode 100644 tests/integration/data/regression_output/spl/spl_kmem_caches -v create mode 100644 tests/integration/data/regression_output/spl/spl_kmem_caches | filter obj.skc_linux_cache == 0 | spl_cache create mode 100644 tests/integration/data/regression_output/spl/spl_kmem_caches | filter obj.skc_linux_cache == 0 | spl_cache | cnt create mode 100644 tests/integration/data/regression_output/spl/spl_kmem_caches | filter obj.skc_linux_cache > 0 | filter obj.skc_obj_alloc > 0 | head 1 | spl_cache create mode 100644 "tests/integration/data/regression_output/spl/spl_kmem_caches | filter obj.skc_name == \"ddt_cache\" | walk" diff --git a/sdb/__init__.py b/sdb/__init__.py index d5a1719e..ab83479c 100644 --- a/sdb/__init__.py +++ b/sdb/__init__.py @@ -73,6 +73,7 @@ 'type_canonical_name', 'type_canonicalize', 'type_canonicalize_name', + 'type_canonicalize_size', 'type_equals', ] diff --git a/sdb/commands/internal/fmt.py b/sdb/commands/internal/fmt.py index 031130f3..55088bab 100644 --- a/sdb/commands/internal/fmt.py +++ b/sdb/commands/internal/fmt.py @@ -13,13 +13,17 @@ # See the License for the specific language governing permissions and # limitations under the License. # - -# pylint: disable=missing-docstring +""" +Common String and Number formatting functions. +""" from typing import Union def size_nicenum(num: Union[int, float]) -> str: + """ + Return `num` bytes as a human-readable string. + """ num = float(num) for unit in ['B', 'KB', 'MB', 'GB', 'TB']: if num < 1024.0: diff --git a/sdb/commands/internal/p2.py b/sdb/commands/internal/p2.py new file mode 100644 index 00000000..caf30feb --- /dev/null +++ b/sdb/commands/internal/p2.py @@ -0,0 +1,25 @@ +# +# Copyright 2020 Delphix +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +""" +Common C macros for bit-manipulation and alignment. +""" + + +def p2roundup(val: int, align: int) -> int: + """ + Round up `val` to the next `align` boundary. + """ + return ((val - 1) | (align - 1)) + 1 diff --git a/sdb/commands/linux/linked_lists.py b/sdb/commands/linux/linked_lists.py index b9c893fa..0f7122e0 100644 --- a/sdb/commands/linux/linked_lists.py +++ b/sdb/commands/linux/linked_lists.py @@ -124,3 +124,11 @@ def _call(self, objs: Iterable[drgn.Object]) -> Iterable[drgn.Object]: yield from hlist_for_each_entry(sname, obj, self.args.member) except LookupError as err: raise sdb.CommandError(self.name, str(err)) + + +def is_list_empty(l: drgn.Object) -> bool: + """ + True if list is empty, False otherwise. + """ + assert sdb.type_canonical_name(l.type_) == 'struct list_head' + return int(l.address_of_().value_()) == int(l.next.value_()) diff --git a/sdb/commands/spl/internal/kmem_helpers.py b/sdb/commands/spl/internal/kmem_helpers.py index c7d14356..2653089e 100644 --- a/sdb/commands/spl/internal/kmem_helpers.py +++ b/sdb/commands/spl/internal/kmem_helpers.py @@ -22,42 +22,44 @@ import drgn.helpers.linux.list as drgn_list import sdb +from sdb.commands.internal import p2 +from sdb.commands.linux import linked_lists from sdb.commands.linux.internal import slub_helpers as slub -def list_for_each_spl_kmem_cache() -> Iterable[drgn.Object]: +def for_each_spl_kmem_cache() -> Iterable[drgn.Object]: yield from drgn_list.list_for_each_entry( "spl_kmem_cache_t", sdb.get_object("spl_kmem_cache_list").address_of_(), "skc_list") def backed_by_linux_cache(cache: drgn.Object) -> bool: - assert cache.type_.type_name() == 'spl_kmem_cache_t *' + assert sdb.type_canonical_name(cache.type_) == 'struct spl_kmem_cache *' return int(cache.skc_linux_cache.value_()) != 0x0 def slab_name(cache: drgn.Object) -> str: - assert cache.type_.type_name() == 'spl_kmem_cache_t *' + assert sdb.type_canonical_name(cache.type_) == 'struct spl_kmem_cache *' return str(cache.skc_name.string_().decode('utf-8')) def nr_slabs(cache: drgn.Object) -> int: - assert cache.type_.type_name() == 'spl_kmem_cache_t *' + assert sdb.type_canonical_name(cache.type_) == 'struct spl_kmem_cache *' return int(cache.skc_slab_total.value_()) def slab_alloc(cache: drgn.Object) -> int: - assert cache.type_.type_name() == 'spl_kmem_cache_t *' + assert sdb.type_canonical_name(cache.type_) == 'struct spl_kmem_cache *' return int(cache.skc_slab_alloc.value_()) def slab_size(cache: drgn.Object) -> int: - assert cache.type_.type_name() == 'spl_kmem_cache_t *' + assert sdb.type_canonical_name(cache.type_) == 'struct spl_kmem_cache *' return int(cache.skc_slab_size.value_()) def slab_linux_cache_source(cache: drgn.Object) -> str: - assert cache.type_.type_name() == 'spl_kmem_cache_t *' + assert sdb.type_canonical_name(cache.type_) == 'struct spl_kmem_cache *' if not backed_by_linux_cache(cache): name = slab_name(cache) subsystem = "SPL" @@ -67,46 +69,49 @@ def slab_linux_cache_source(cache: drgn.Object) -> str: return f"{name}[{subsystem:4}]" -def slab_flags(cache: drgn.Object) -> str: - assert cache.type_.type_name() == 'spl_kmem_cache_t *' +def for_each_slab_flag_in_cache(cache: drgn.Object) -> Iterable[str]: + assert sdb.type_canonical_name(cache.type_) == 'struct spl_kmem_cache *' flag = cache.skc_flags.value_() - flags_detected = [] for enum_entry, enum_entry_bit in cache.prog_.type( 'enum kmc_bit').enumerators: if flag & (1 << enum_entry_bit): - flags_detected.append(enum_entry.replace('_BIT', '')) - return '|'.join(flags_detected) + yield enum_entry.replace('_BIT', '') + + +def slab_flags(cache: drgn.Object) -> str: + assert sdb.type_canonical_name(cache.type_) == 'struct spl_kmem_cache *' + return '|'.join(for_each_slab_flag_in_cache(cache)) def object_size(cache: drgn.Object) -> int: - assert cache.type_.type_name() == 'spl_kmem_cache_t *' + assert sdb.type_canonical_name(cache.type_) == 'struct spl_kmem_cache *' return int(cache.skc_obj_size.value_()) def nr_objects(cache: drgn.Object) -> int: - assert cache.type_.type_name() == 'spl_kmem_cache_t *' + assert sdb.type_canonical_name(cache.type_) == 'struct spl_kmem_cache *' if backed_by_linux_cache(cache): return int(cache.skc_obj_alloc.value_()) return int(cache.skc_obj_total.value_()) def obj_alloc(cache: drgn.Object) -> int: - assert cache.type_.type_name() == 'spl_kmem_cache_t *' + assert sdb.type_canonical_name(cache.type_) == 'struct spl_kmem_cache *' return int(cache.skc_obj_alloc.value_()) def obj_inactive(cache: drgn.Object) -> int: - assert cache.type_.type_name() == 'spl_kmem_cache_t *' + assert sdb.type_canonical_name(cache.type_) == 'struct spl_kmem_cache *' return nr_objects(cache) - obj_alloc(cache) def objs_per_slab(cache: drgn.Object) -> int: - assert cache.type_.type_name() == 'spl_kmem_cache_t *' + assert sdb.type_canonical_name(cache.type_) == 'struct spl_kmem_cache *' return int(cache.skc_slab_objs.value_()) def entry_size(cache: drgn.Object) -> int: - assert cache.type_.type_name() == 'spl_kmem_cache_t *' + assert sdb.type_canonical_name(cache.type_) == 'struct spl_kmem_cache *' if backed_by_linux_cache(cache): return slub.entry_size(cache.skc_linux_cache) ops = objs_per_slab(cache) @@ -116,20 +121,85 @@ def entry_size(cache: drgn.Object) -> int: def active_memory(cache: drgn.Object) -> int: - assert cache.type_.type_name() == 'spl_kmem_cache_t *' + assert sdb.type_canonical_name(cache.type_) == 'struct spl_kmem_cache *' return obj_alloc(cache) * entry_size(cache) def total_memory(cache: drgn.Object) -> int: - assert cache.type_.type_name() == 'spl_kmem_cache_t *' + assert sdb.type_canonical_name(cache.type_) == 'struct spl_kmem_cache *' if backed_by_linux_cache(cache): return slub.total_memory(cache.skc_linux_cache) return slab_size(cache) * nr_slabs(cache) def util(cache: drgn.Object) -> int: - assert cache.type_.type_name() == 'spl_kmem_cache_t *' + assert sdb.type_canonical_name(cache.type_) == 'struct spl_kmem_cache *' total_mem = total_memory(cache) if total_mem == 0: return 0 return int((active_memory(cache) / total_mem) * 100) + + +def sko_from_obj(cache: drgn.Object, obj: drgn.Object) -> drgn.Object: + assert sdb.type_canonical_name(cache.type_) == 'struct spl_kmem_cache *' + cache_obj_align = cache.skc_obj_align.value_() + return sdb.create_object( + 'spl_kmem_obj_t *', + obj.value_() + p2.p2roundup(object_size(cache), cache_obj_align)) + + +def spl_aligned_obj_size(cache: drgn.Object) -> int: + assert sdb.type_canonical_name(cache.type_) == 'struct spl_kmem_cache *' + cache_obj_align = cache.skc_obj_align.value_() + spl_obj_type_size = sdb.type_canonicalize_size('spl_kmem_obj_t') + return p2.p2roundup(object_size(cache), cache_obj_align) + p2.p2roundup( + spl_obj_type_size, cache_obj_align) + + +def spl_aligned_slab_size(cache: drgn.Object) -> int: + assert sdb.type_canonical_name(cache.type_) == 'struct spl_kmem_cache *' + cache_obj_align = cache.skc_obj_align.value_() + spl_slab_type_size = sdb.type_canonicalize_size('spl_kmem_slab_t') + return p2.p2roundup(spl_slab_type_size, cache_obj_align) + + +def for_each_onslab_object_in_slab(slab: drgn.Object) -> Iterable[drgn.Object]: + assert sdb.type_canonical_name(slab.type_) == 'struct spl_kmem_slab *' + cache = slab.sks_cache + sks_size = spl_aligned_slab_size(cache) + spl_obj_size = spl_aligned_obj_size(cache) + + for i in range(slab.sks_objs.value_()): + obj = sdb.create_object('void *', + slab.value_() + sks_size + (i * spl_obj_size)) + # + # If the sko_list of the object is empty, it means that + # this object is not part of the slab's internal free list + # and therefore it is allocated. NOTE: sko_list in the + # actual code is not a list, but a link on a list. Thus, + # the check below is not checking whether the "object + # list" is empty for this slab, but rather whether the + # link is part of any list. + # + sko = sko_from_obj(cache, obj) + assert sko.sko_magic.value_() == 0x20202020 # SKO_MAGIC + if linked_lists.is_list_empty(sko.sko_list): + yield obj + + +def for_each_object_in_spl_cache(cache: drgn.Object) -> Iterable[drgn.Object]: + assert sdb.type_canonical_name(cache.type_) == 'struct spl_kmem_cache *' + # + # ZFSonLinux initially implemented OFFSLAB caches for certain cases + # that never showed up and thus have never been used in practice. + # Ensure here that we are not looking at such a cache. + # + if 'KMC_OFFSLAB' in list(for_each_slab_flag_in_cache(cache)): + raise sdb.CommandError("spl_caches", + "KMC_OFFSLAB caches are not supported") + + for slab_list in [cache.skc_complete_list, cache.skc_partial_list]: + for slab in drgn_list.list_for_each_entry("spl_kmem_slab_t", + slab_list.address_of_(), + "sks_list"): + yield from for_each_onslab_object_in_slab(slab) diff --git a/sdb/commands/spl/spl_kmem_caches.py b/sdb/commands/spl/spl_kmem_caches.py index 5fd806ca..55723922 100644 --- a/sdb/commands/spl/spl_kmem_caches.py +++ b/sdb/commands/spl/spl_kmem_caches.py @@ -25,6 +25,7 @@ import sdb from sdb.commands.internal.fmt import size_nicenum from sdb.commands.internal.table import Table +from sdb.commands.linux.internal import slub_helpers as slub from sdb.commands.spl.internal import kmem_helpers as kmem @@ -97,12 +98,12 @@ def no_input(self) -> Iterable[drgn.Object]: raise sdb.CommandInvalidInputError( self.name, f"'{self.args.s}' is not a valid field") yield from sorted( - kmem.list_for_each_spl_kmem_cache(), + kmem.for_each_spl_kmem_cache(), key=SplKmemCaches.FIELDS[self.args.s], reverse=(self.args.s not in SplKmemCaches.DEFAULT_INCREASING_ORDER_FIELDS)) else: - yield from kmem.list_for_each_spl_kmem_cache() + yield from kmem.for_each_spl_kmem_cache() FIELDS = { "address": lambda obj: hex(obj.value_()), @@ -203,3 +204,35 @@ def pretty_print(self, objs: Iterable[drgn.Object]) -> None: table.add_row(row_dict[sort_field], row_dict) table.print_(print_headers=self.args.H, reverse_sort=(sort_field not in ["name", "address"])) + + +class SplKmemCacheWalker(sdb.Walker): + """ + Walk through all allocated entries of an spl_kmem_cache. + + DESCRIPTION + Walk through all allocated entries of an spl_kmem_cache. If + the cache is backed by a SLUB cache then iteration will be + delegated to the appropriate walker (keep in mind that in + this case not all objects may be part of the actual SPL + cache due to the SLUB allocator in Linux merging objects). + + EXAMPLES + Print all the objects in the ddt_cache: + + sdb> spl_kmem_caches | filter obj.skc_name == "ddt_cache" | spl_cache + (void *)0xffffa08937e80040 + (void *)0xffffa08937e86180 + (void *)0xffffa08937e8c2c0 + (void *)0xffffa08937e92400 + ... + """ + + names = ["spl_cache"] + input_type = "spl_kmem_cache_t *" + + def walk(self, obj: drgn.Object) -> Iterable[drgn.Object]: + if kmem.backed_by_linux_cache(obj): + yield from slub.for_each_object_in_cache(obj.skc_linux_cache) + else: + yield from kmem.for_each_object_in_spl_cache(obj) diff --git a/sdb/target.py b/sdb/target.py index 32963ce0..162f6738 100644 --- a/sdb/target.py +++ b/sdb/target.py @@ -117,7 +117,7 @@ def type_canonical_name(t: drgn.Type) -> str: """ Return the "canonical name" of this type. See type_canonicalize(). """ - return type_canonicalize(t).type_name() + return str(type_canonicalize(t).type_name()) def type_canonicalize_name(type_name: str) -> str: @@ -137,7 +137,7 @@ def type_canonicalize_size(t: Union[drgn.Type, str]) -> int: else: assert isinstance(t, drgn.Type) type_ = t - return type_canonicalize(type_).size + return int(type_canonicalize(type_).size) def type_equals(a: drgn.Type, b: drgn.Type) -> bool: diff --git a/tests/integration/data/regression_output/spl/spl_kmem_caches -v b/tests/integration/data/regression_output/spl/spl_kmem_caches -v new file mode 100644 index 00000000..265f1e1b --- /dev/null +++ b/tests/integration/data/regression_output/spl/spl_kmem_caches -v @@ -0,0 +1,140 @@ + address name flags object_size entry_size slab_size objects_per_slab entries_per_slab slabs active_slabs active_memory total_memory objs active_objs inactive_objs source util +------------------ ------------------------ ----------------------------------- ----------- ---------- --------- ---------------- ---------------- ----- ------------ ------------- ------------ ------ ----------- ------------- ------------------------------ ---- +0xffffa08957d76c00 zio_data_buf_131072 KMC_NODEBUG|KMC_KVMEM 131072 135680 1085440 8 8 334 334 312.6MB 345.7MB 2672 2416 256 zio_data_buf_131072[SPL ] 90 +0xffffa089574f0200 zio_data_buf_512 KMC_NODEBUG|KMC_NOMAGAZINE|KMC_SLAB 512 512 0 0 0 0 0 128.0MB 128.0MB 262175 262175 0 zio_data_buf_512[SLUB] 99 +0xffffa08957d76400 zio_buf_131072 KMC_NODEBUG|KMC_KVMEM 131072 135680 1085440 8 8 66 66 43.9MB 68.3MB 528 339 189 zio_buf_131072[SPL ] 64 +0xffffa08956636000 zfs_znode_cache KMC_NOMAGAZINE|KMC_SLAB 1088 1088 0 0 0 0 0 22.4MB 22.4MB 21605 21605 0 zfs_znode_cache[SLUB] 99 +0xffffa08957d72600 zio_buf_16384 KMC_NODEBUG|KMC_NOMAGAZINE|KMC_SLAB 16384 16384 0 0 0 0 0 19.8MB 20.2MB 1268 1268 0 zio_buf_16384[SLUB] 98 +0xffffa08956ae2400 dnode_t KMC_NOMAGAZINE|KMC_SLAB 912 912 0 0 0 0 0 19.2MB 19.3MB 22125 22125 0 dnode_t[SLUB] 99 +0xffffa08956ae3c00 arc_buf_hdr_t_full KMC_NOMAGAZINE|KMC_SLAB 328 328 0 0 0 0 0 9.7MB 9.7MB 31047 31047 0 arc_buf_hdr_t_full[SLUB] 99 +0xffffa08956637e00 dmu_buf_impl_t KMC_NOMAGAZINE|KMC_SLAB 360 360 0 0 0 0 0 8.9MB 9.8MB 25853 25853 0 dmu_buf_impl_t[SLUB] 90 +0xffffa08957fb9400 zio_data_buf_65536 KMC_NODEBUG|KMC_KVMEM 65536 70144 561152 8 8 27 27 5.9MB 14.4MB 216 88 128 zio_data_buf_65536[SPL ] 40 +0xffffa08957d77e00 zio_data_buf_114688 KMC_NODEBUG|KMC_KVMEM 114688 119296 954368 8 8 9 9 5.5MB 8.2MB 72 48 24 zio_data_buf_114688[SPL ] 66 +0xffffa08956a27200 sa_cache KMC_NOMAGAZINE|KMC_SLAB 248 248 0 0 0 0 0 5.1MB 5.1MB 21594 21594 0 sa_cache[SLUB] 99 +0xffffa08957d76200 zio_data_buf_98304 KMC_NODEBUG|KMC_KVMEM 98304 102912 823296 8 8 9 9 3.8MB 7.1MB 72 39 33 zio_data_buf_98304[SPL ] 54 +0xffffa08957d77000 zio_data_buf_81920 KMC_NODEBUG|KMC_KVMEM 81920 86528 692224 8 8 14 14 3.8MB 9.2MB 112 46 66 zio_data_buf_81920[SPL ] 41 +0xffffa08957fb9200 zio_data_buf_57344 KMC_NODEBUG|KMC_KVMEM 57344 61952 495616 8 8 14 14 3.0MB 6.6MB 112 51 61 zio_data_buf_57344[SPL ] 45 +0xffffa08957fb9600 zio_data_buf_49152 KMC_NODEBUG|KMC_KVMEM 49152 53760 430080 8 8 15 15 2.8MB 6.2MB 120 54 66 zio_data_buf_49152[SPL ] 45 +0xffffa08957fb9c00 zio_data_buf_40960 KMC_NODEBUG|KMC_KVMEM 40960 45568 364544 8 8 19 19 2.7MB 6.6MB 152 63 89 zio_data_buf_40960[SPL ] 41 +0xffffa08957d76000 zio_buf_114688 KMC_NODEBUG|KMC_KVMEM 114688 119296 954368 8 8 3 3 2.0MB 2.7MB 24 18 6 zio_buf_114688[SPL ] 75 +0xffffa08957d77400 zio_buf_81920 KMC_NODEBUG|KMC_KVMEM 81920 86528 692224 8 8 4 3 2.0MB 2.6MB 32 24 8 zio_buf_81920[SPL ] 75 +0xffffa08957d76600 zio_buf_98304 KMC_NODEBUG|KMC_KVMEM 98304 102912 823296 8 8 3 3 2.0MB 2.4MB 24 20 4 zio_buf_98304[SPL ] 83 +0xffffa08957fb8400 zio_data_buf_28672 KMC_NODEBUG|KMC_KVMEM 28672 33280 266240 8 8 17 17 1.6MB 4.3MB 136 51 85 zio_data_buf_28672[SPL ] 37 +0xffffa08957fb8a00 zio_data_buf_32768 KMC_NODEBUG|KMC_KVMEM 32768 37376 299008 8 8 14 14 1.6MB 4.0MB 112 45 67 zio_data_buf_32768[SPL ] 40 +0xffffa08957fb8000 zio_data_buf_24576 KMC_NODEBUG|KMC_KVMEM 24576 29184 233472 8 8 20 20 1.6MB 4.5MB 160 56 104 zio_data_buf_24576[SPL ] 35 +0xffffa089574f1c00 zio_buf_512 KMC_NODEBUG|KMC_NOMAGAZINE|KMC_SLAB 512 512 0 0 0 0 0 1.4MB 1.5MB 2907 2907 0 zio_buf_512[SLUB] 97 +0xffffa08956a27000 abd_t KMC_NOMAGAZINE|KMC_SLAB 40 40 0 0 0 0 0 1.2MB 1.2MB 31047 31047 0 abd_t[SLUB] 96 +0xffffa08957d95c00 ddt_cache KMC_KVMEM 24856 24904 199232 8 8 6 6 1.1MB 1.1MB 48 46 2 ddt_cache[SPL ] 95 +0xffffa08958132800 zio_data_buf_1024 KMC_NODEBUG|KMC_NOMAGAZINE|KMC_SLAB 1024 1024 0 0 0 0 0 1.0MB 1.1MB 1035 1035 0 zio_data_buf_1024[SLUB] 95 +0xffffa08957fb9800 zio_buf_65536 KMC_NODEBUG|KMC_KVMEM 65536 70144 561152 8 8 2 2 1.0MB 1.1MB 16 15 1 zio_buf_65536[SPL ] 93 +0xffffa08957fb8600 zio_data_buf_20480 KMC_NODEBUG|KMC_KVMEM 20480 25088 200704 8 8 17 17 980.0KB 3.3MB 136 40 96 zio_data_buf_20480[SPL ] 29 +0xffffa08957fb8800 zio_buf_57344 KMC_NODEBUG|KMC_KVMEM 57344 61952 495616 8 8 2 2 907.5KB 968.0KB 16 15 1 zio_buf_57344[SPL ] 93 +0xffffa08957fb8e00 zio_buf_40960 KMC_NODEBUG|KMC_KVMEM 40960 45568 364544 8 8 3 2 712.0KB 1.0MB 24 16 8 zio_buf_40960[SPL ] 66 +0xffffa08957d95200 zfs_btree_leaf_cache KMC_NOMAGAZINE|KMC_SLAB 4096 4096 0 0 0 0 0 688.0KB 832.0KB 172 172 0 zfs_btree_leaf_cache[SLUB] 82 +0xffffa08957fb8200 zio_buf_24576 KMC_NODEBUG|KMC_KVMEM 24576 29184 233472 8 8 3 3 655.5KB 684.0KB 24 23 1 zio_buf_24576[SPL ] 95 +0xffffa08957fb9a00 zio_buf_49152 KMC_NODEBUG|KMC_KVMEM 49152 53760 430080 8 8 2 2 525.0KB 840.0KB 16 10 6 zio_buf_49152[SPL ] 62 +0xffffa08957fb8c00 zio_buf_32768 KMC_NODEBUG|KMC_KVMEM 32768 37376 299008 8 8 2 2 438.0KB 584.0KB 16 12 4 zio_buf_32768[SPL ] 75 +0xffffa08957fb9000 zio_buf_20480 KMC_NODEBUG|KMC_KVMEM 20480 25088 200704 8 8 3 3 416.5KB 588.0KB 24 17 7 zio_buf_20480[SPL ] 70 +0xffffa08957fb9e00 zio_buf_28672 KMC_NODEBUG|KMC_KVMEM 28672 33280 266240 8 8 2 2 390.0KB 520.0KB 16 12 4 zio_buf_28672[SPL ] 75 +0xffffa08956636c00 arc_buf_t KMC_NOMAGAZINE|KMC_SLAB 80 80 0 0 0 0 0 316.1KB 529.9KB 4046 4046 0 arc_buf_t[SLUB] 59 +0xffffa08958133a00 zio_buf_1024 KMC_NODEBUG|KMC_NOMAGAZINE|KMC_SLAB 1024 1024 0 0 0 0 0 217.0KB 352.0KB 217 217 0 zio_buf_1024[SLUB] 61 +0xffffa08956636a00 zil_lwb_cache KMC_NOMAGAZINE|KMC_SLAB 376 376 0 0 0 0 0 81.5KB 84.8KB 222 222 0 zil_lwb_cache[SLUB] 96 +0xffffa08957d69800 zio_buf_4096 KMC_NODEBUG|KMC_NOMAGAZINE|KMC_SLAB 4096 4096 0 0 0 0 0 48.0KB 192.0KB 12 12 0 zio_buf_4096[SLUB] 25 +0xffffa089574f0c00 zio_cache KMC_NOMAGAZINE|KMC_SLAB 1248 1248 0 0 0 0 0 21.9KB 237.7KB 18 18 0 zio_cache[SLUB] 9 +0xffffa08958132200 zio_buf_2048 KMC_NODEBUG|KMC_NOMAGAZINE|KMC_SLAB 2048 2048 0 0 0 0 0 16.0KB 160.0KB 8 8 0 zio_buf_2048[SLUB] 10 +0xffffa08958133800 zio_buf_1536 KMC_NODEBUG|KMC_NOMAGAZINE|KMC_SLAB 1536 1536 0 0 0 0 0 7.5KB 126.0KB 5 5 0 zio_buf_1536[SLUB] 5 +0xffffa08957d69000 zio_data_buf_4096 KMC_NODEBUG|KMC_NOMAGAZINE|KMC_SLAB 4096 4096 0 0 0 0 0 4.0KB 192.0KB 1 1 0 zio_data_buf_4096[SLUB] 2 +0xffffa08957d68e00 zio_data_buf_3072 KMC_NODEBUG|KMC_NOMAGAZINE|KMC_SLAB 3072 3072 0 0 0 0 0 3.0KB 360.0KB 1 1 0 zio_data_buf_3072[SLUB] 0 +0xffffa08957d6f400 mod_hash_entries KMC_NOMAGAZINE|KMC_SLAB 24 24 0 0 0 0 0 840.0B 4.0KB 35 35 0 mod_hash_entries[SLUB] 20 +0xffffa0896679e600 zio_data_buf_458752 KMC_NODEBUG|KMC_KVMEM 458752 463360 3706880 8 8 0 0 0.0B 0.0B 0 0 0 zio_data_buf_458752[SPL ] 0 +0xffffa0896679e000 zio_buf_458752 KMC_NODEBUG|KMC_KVMEM 458752 463360 3706880 8 8 0 0 0.0B 0.0B 0 0 0 zio_buf_458752[SPL ] 0 +0xffffa08958133e00 zio_data_buf_2048 KMC_NODEBUG|KMC_NOMAGAZINE|KMC_SLAB 2048 2048 0 0 0 0 0 0.0B 320.0KB 0 0 0 zio_data_buf_2048[SLUB] 0 +0xffffa08958133000 zio_data_buf_1536 KMC_NODEBUG|KMC_NOMAGAZINE|KMC_SLAB 1536 1536 0 0 0 0 0 0.0B 315.0KB 0 0 0 zio_data_buf_1536[SLUB] 0 +0xffffa08958132e00 zio_data_buf_2560 KMC_NODEBUG|KMC_NOMAGAZINE|KMC_SLAB 2560 2560 0 0 0 0 0 0.0B 330.0KB 0 0 0 zio_data_buf_2560[SLUB] 0 +0xffffa08958132c00 zio_buf_2560 KMC_NODEBUG|KMC_NOMAGAZINE|KMC_SLAB 2560 2560 0 0 0 0 0 0.0B 300.0KB 0 0 0 zio_buf_2560[SLUB] 0 +0xffffa08957f69c00 zio_buf_6144 KMC_NODEBUG|KMC_NOMAGAZINE|KMC_SLAB 6144 8192 0 0 0 0 0 0.0B 64.0KB 0 0 0 zio_buf_6144[SLUB] 0 +0xffffa08957f69a00 zio_data_buf_8192 KMC_NODEBUG|KMC_NOMAGAZINE|KMC_SLAB 8192 8192 0 0 0 0 0 0.0B 384.0KB 0 0 0 zio_data_buf_8192[SLUB] 0 +0xffffa08957f68c00 zio_data_buf_6144 KMC_NODEBUG|KMC_NOMAGAZINE|KMC_SLAB 6144 8192 0 0 0 0 0 0.0B 288.0KB 0 0 0 zio_data_buf_6144[SLUB] 0 +0xffffa08957f68600 zio_buf_8192 KMC_NODEBUG|KMC_NOMAGAZINE|KMC_SLAB 8192 8192 0 0 0 0 0 0.0B 64.0KB 0 0 0 zio_buf_8192[SLUB] 0 +0xffffa08957f68400 zio_data_buf_7168 KMC_NODEBUG|KMC_NOMAGAZINE|KMC_SLAB 7168 8192 0 0 0 0 0 0.0B 288.0KB 0 0 0 zio_data_buf_7168[SLUB] 0 +0xffffa08957f68000 zio_buf_7168 KMC_NODEBUG|KMC_NOMAGAZINE|KMC_SLAB 7168 8192 0 0 0 0 0 0.0B 64.0KB 0 0 0 zio_buf_7168[SLUB] 0 +0xffffa08957d95400 spl_zlib_workspace_cache KMC_KVMEM 268104 268152 2145216 8 8 0 0 0.0B 0.0B 0 0 0 spl_zlib_workspace_cache[SPL ] 0 +0xffffa08957d94600 ddt_entry_cache KMC_NOMAGAZINE|KMC_SLAB 448 448 0 0 0 0 0 0.0B 0.0B 0 0 0 ddt_entry_cache[SLUB] 0 +0xffffa08957d77c00 zio_buf_196608 KMC_NODEBUG|KMC_KVMEM 196608 201216 1609728 8 8 0 0 0.0B 0.0B 0 0 0 zio_buf_196608[SPL ] 0 +0xffffa08957d77a00 zio_data_buf_196608 KMC_NODEBUG|KMC_KVMEM 196608 201216 1609728 8 8 0 0 0.0B 0.0B 0 0 0 zio_data_buf_196608[SPL ] 0 +0xffffa08957d77800 zio_data_buf_262144 KMC_NODEBUG|KMC_KVMEM 262144 266752 2134016 8 8 0 0 0.0B 0.0B 0 0 0 zio_data_buf_262144[SPL ] 0 +0xffffa08957d77600 zio_buf_229376 KMC_NODEBUG|KMC_KVMEM 229376 233984 1871872 8 8 0 0 0.0B 0.0B 0 0 0 zio_buf_229376[SPL ] 0 +0xffffa08957d77200 zio_buf_262144 KMC_NODEBUG|KMC_KVMEM 262144 266752 2134016 8 8 0 0 0.0B 0.0B 0 0 0 zio_buf_262144[SPL ] 0 +0xffffa08957d76e00 zio_data_buf_163840 KMC_NODEBUG|KMC_KVMEM 163840 168448 1347584 8 8 0 0 0.0B 0.0B 0 0 0 zio_data_buf_163840[SPL ] 0 +0xffffa08957d76a00 zio_buf_163840 KMC_NODEBUG|KMC_KVMEM 163840 168448 1347584 8 8 0 0 0.0B 0.0B 0 0 0 zio_buf_163840[SPL ] 0 +0xffffa08957d76800 zio_data_buf_229376 KMC_NODEBUG|KMC_KVMEM 229376 233984 1871872 8 8 0 0 0.0B 0.0B 0 0 0 zio_data_buf_229376[SPL ] 0 +0xffffa08957d73c00 zio_buf_12288 KMC_NODEBUG|KMC_NOMAGAZINE|KMC_SLAB 12288 12288 0 0 0 0 0 0.0B 96.0KB 0 0 0 zio_buf_12288[SLUB] 0 +0xffffa08957d73600 zio_data_buf_12288 KMC_NODEBUG|KMC_NOMAGAZINE|KMC_SLAB 12288 12288 0 0 0 0 0 0.0B 288.0KB 0 0 0 zio_data_buf_12288[SLUB] 0 +0xffffa08957d73400 zio_data_buf_14336 KMC_NODEBUG|KMC_NOMAGAZINE|KMC_SLAB 14336 16384 0 0 0 0 0 0.0B 384.0KB 0 0 0 zio_data_buf_14336[SLUB] 0 +0xffffa08957d73200 zio_buf_14336 KMC_NODEBUG|KMC_NOMAGAZINE|KMC_SLAB 14336 16384 0 0 0 0 0 0.0B 96.0KB 0 0 0 zio_buf_14336[SLUB] 0 +0xffffa08957d72a00 zio_data_buf_10240 KMC_NODEBUG|KMC_NOMAGAZINE|KMC_SLAB 10240 12288 0 0 0 0 0 0.0B 264.0KB 0 0 0 zio_data_buf_10240[SLUB] 0 +0xffffa08957d72400 zio_buf_10240 KMC_NODEBUG|KMC_NOMAGAZINE|KMC_SLAB 10240 12288 0 0 0 0 0 0.0B 144.0KB 0 0 0 zio_buf_10240[SLUB] 0 +0xffffa08957d72000 zio_data_buf_16384 KMC_NODEBUG|KMC_NOMAGAZINE|KMC_SLAB 16384 16384 0 0 0 0 0 0.0B 352.0KB 0 0 0 zio_data_buf_16384[SLUB] 0 +0xffffa08957d6ec00 kcf_areq_cache KMC_NOMAGAZINE|KMC_SLAB 464 512 0 0 0 0 0 0.0B 0.0B 0 0 0 kcf_areq_cache[SLUB] 0 +0xffffa08957d6e200 kcf_sreq_cache KMC_NOMAGAZINE|KMC_SLAB 160 192 0 0 0 0 0 0.0B 0.0B 0 0 0 kcf_sreq_cache[SLUB] 0 +0xffffa08957d6e000 kcf_context_cache KMC_NOMAGAZINE|KMC_SLAB 152 192 0 0 0 0 0 0.0B 0.0B 0 0 0 kcf_context_cache[SLUB] 0 +0xffffa08957d69e00 zio_data_buf_5120 KMC_NODEBUG|KMC_NOMAGAZINE|KMC_SLAB 5120 8192 0 0 0 0 0 0.0B 288.0KB 0 0 0 zio_data_buf_5120[SLUB] 0 +0xffffa08957d69a00 zio_buf_3584 KMC_NODEBUG|KMC_NOMAGAZINE|KMC_SLAB 3584 3584 0 0 0 0 0 0.0B 63.0KB 0 0 0 zio_buf_3584[SLUB] 0 +0xffffa08957d68c00 zio_buf_3072 KMC_NODEBUG|KMC_NOMAGAZINE|KMC_SLAB 3072 3072 0 0 0 0 0 0.0B 180.0KB 0 0 0 zio_buf_3072[SLUB] 0 +0xffffa08957d68800 zio_data_buf_3584 KMC_NODEBUG|KMC_NOMAGAZINE|KMC_SLAB 3584 3584 0 0 0 0 0 0.0B 315.0KB 0 0 0 zio_data_buf_3584[SLUB] 0 +0xffffa08957d68200 zio_buf_5120 KMC_NODEBUG|KMC_NOMAGAZINE|KMC_SLAB 5120 8192 0 0 0 0 0 0.0B 192.0KB 0 0 0 zio_buf_5120[SLUB] 0 +0xffffa08957d15800 zio_buf_393216 KMC_NODEBUG|KMC_KVMEM 393216 397824 3182592 8 8 0 0 0.0B 0.0B 0 0 0 zio_buf_393216[SPL ] 0 +0xffffa08957d15400 zio_data_buf_393216 KMC_NODEBUG|KMC_KVMEM 393216 397824 3182592 8 8 0 0 0.0B 0.0B 0 0 0 zio_data_buf_393216[SPL ] 0 +0xffffa08957d14200 zio_data_buf_327680 KMC_NODEBUG|KMC_KVMEM 327680 332288 2658304 8 8 0 0 0.0B 0.0B 0 0 0 zio_data_buf_327680[SPL ] 0 +0xffffa08957d14000 zio_buf_327680 KMC_NODEBUG|KMC_KVMEM 327680 332288 2658304 8 8 0 0 0.0B 0.0B 0 0 0 zio_buf_327680[SPL ] 0 +0xffffa089574f1a00 zio_link_cache KMC_NOMAGAZINE|KMC_SLAB 48 48 0 0 0 0 0 0.0B 127.5KB 0 0 0 zio_link_cache[SLUB] 0 +0xffffa08956ae3e00 zfs_znode_hold_cache KMC_NOMAGAZINE|KMC_SLAB 88 88 0 0 0 0 0 0.0B 7.9KB 0 0 0 zfs_znode_hold_cache[SLUB] 0 +0xffffa08956ae2a00 arc_buf_hdr_t_full_crypt KMC_NOMAGAZINE|KMC_SLAB 392 392 0 0 0 0 0 0.0B 0.0B 0 0 0 arc_buf_hdr_t_full_crypt[SLUB] 0 +0xffffa08956ac5e00 zio_data_buf_5242880 KMC_NODEBUG|KMC_KVMEM 5242880 5247658 31485952 6 6 0 0 0.0B 0.0B 0 0 0 zio_data_buf_5242880[SPL ] 0 +0xffffa08956ac5c00 zio_buf_3670016 KMC_NODEBUG|KMC_KVMEM 3670016 3674624 29396992 8 8 0 0 0.0B 0.0B 0 0 0 zio_buf_3670016[SPL ] 0 +0xffffa08956ac5a00 zio_data_buf_3145728 KMC_NODEBUG|KMC_KVMEM 3145728 3150336 25202688 8 8 0 0 0.0B 0.0B 0 0 0 zio_data_buf_3145728[SPL ] 0 +0xffffa08956ac5800 zio_data_buf_2097152 KMC_NODEBUG|KMC_KVMEM 2097152 2101760 16814080 8 8 0 0 0.0B 0.0B 0 0 0 zio_data_buf_2097152[SPL ] 0 +0xffffa08956ac5600 zio_buf_3145728 KMC_NODEBUG|KMC_KVMEM 3145728 3150336 25202688 8 8 0 0 0.0B 0.0B 0 0 0 zio_buf_3145728[SPL ] 0 +0xffffa08956ac5400 zio_buf_2097152 KMC_NODEBUG|KMC_KVMEM 2097152 2101760 16814080 8 8 0 0 0.0B 0.0B 0 0 0 zio_buf_2097152[SPL ] 0 +0xffffa08956ac5200 zio_buf_2621440 KMC_NODEBUG|KMC_KVMEM 2621440 2626048 21008384 8 8 0 0 0.0B 0.0B 0 0 0 zio_buf_2621440[SPL ] 0 +0xffffa08956ac5000 zio_data_buf_7340032 KMC_NODEBUG|KMC_KVMEM 7340032 7345152 29380608 4 4 0 0 0.0B 0.0B 0 0 0 zio_data_buf_7340032[SPL ] 0 +0xffffa08956ac4e00 zio_data_buf_3670016 KMC_NODEBUG|KMC_KVMEM 3670016 3674624 29396992 8 8 0 0 0.0B 0.0B 0 0 0 zio_data_buf_3670016[SPL ] 0 +0xffffa08956ac4c00 zio_data_buf_4194304 KMC_NODEBUG|KMC_KVMEM 4194304 4198985 29392896 7 7 0 0 0.0B 0.0B 0 0 0 zio_data_buf_4194304[SPL ] 0 +0xffffa08956ac4a00 zio_buf_4194304 KMC_NODEBUG|KMC_KVMEM 4194304 4198985 29392896 7 7 0 0 0.0B 0.0B 0 0 0 zio_buf_4194304[SPL ] 0 +0xffffa08956ac4800 zio_data_buf_2621440 KMC_NODEBUG|KMC_KVMEM 2621440 2626048 21008384 8 8 0 0 0.0B 0.0B 0 0 0 zio_data_buf_2621440[SPL ] 0 +0xffffa08956ac4600 zio_buf_7340032 KMC_NODEBUG|KMC_KVMEM 7340032 7345152 29380608 4 4 0 0 0.0B 0.0B 0 0 0 zio_buf_7340032[SPL ] 0 +0xffffa08956ac4400 zio_buf_5242880 KMC_NODEBUG|KMC_KVMEM 5242880 5247658 31485952 6 6 0 0 0.0B 0.0B 0 0 0 zio_buf_5242880[SPL ] 0 +0xffffa08956ac4200 zio_data_buf_6291456 KMC_NODEBUG|KMC_KVMEM 6291456 6296371 31481856 5 5 0 0 0.0B 0.0B 0 0 0 zio_data_buf_6291456[SPL ] 0 +0xffffa08956ac4000 zio_buf_6291456 KMC_NODEBUG|KMC_KVMEM 6291456 6296371 31481856 5 5 0 0 0.0B 0.0B 0 0 0 zio_buf_6291456[SPL ] 0 +0xffffa08956a27e00 zio_buf_16777216 KMC_NODEBUG|KMC_KVMEM 16777216 16785408 16785408 1 1 0 0 0.0B 0.0B 0 0 0 zio_buf_16777216[SPL ] 0 +0xffffa08956a27c00 zio_data_buf_10485760 KMC_NODEBUG|KMC_KVMEM 10485760 10491221 31473664 3 3 0 0 0.0B 0.0B 0 0 0 zio_data_buf_10485760[SPL ] 0 +0xffffa08956a27a00 zio_buf_10485760 KMC_NODEBUG|KMC_KVMEM 10485760 10491221 31473664 3 3 0 0 0.0B 0.0B 0 0 0 zio_buf_10485760[SPL ] 0 +0xffffa08956a27600 zio_data_buf_8388608 KMC_NODEBUG|KMC_KVMEM 8388608 8394069 25182208 3 3 0 0 0.0B 0.0B 0 0 0 zio_data_buf_8388608[SPL ] 0 +0xffffa08956a26e00 zio_buf_12582912 KMC_NODEBUG|KMC_KVMEM 12582912 12589056 25178112 2 2 0 0 0.0B 0.0B 0 0 0 zio_buf_12582912[SPL ] 0 +0xffffa08956a26c00 zio_buf_14680064 KMC_NODEBUG|KMC_KVMEM 14680064 14686208 29372416 2 2 0 0 0.0B 0.0B 0 0 0 zio_buf_14680064[SPL ] 0 +0xffffa08956a26a00 zio_data_buf_12582912 KMC_NODEBUG|KMC_KVMEM 12582912 12589056 25178112 2 2 0 0 0.0B 0.0B 0 0 0 zio_data_buf_12582912[SPL ] 0 +0xffffa08956a26800 zio_buf_8388608 KMC_NODEBUG|KMC_KVMEM 8388608 8394069 25182208 3 3 0 0 0.0B 0.0B 0 0 0 zio_buf_8388608[SPL ] 0 +0xffffa08956a26400 zio_data_buf_14680064 KMC_NODEBUG|KMC_KVMEM 14680064 14686208 29372416 2 2 0 0 0.0B 0.0B 0 0 0 zio_data_buf_14680064[SPL ] 0 +0xffffa08956a26200 lz4_cache KMC_NOMAGAZINE|KMC_SLAB 16384 16384 0 0 0 0 0 0.0B 64.0KB 0 0 0 lz4_cache[SLUB] 0 +0xffffa08956a26000 zio_data_buf_16777216 KMC_NODEBUG|KMC_KVMEM 16777216 16785408 16785408 1 1 0 0 0.0B 0.0B 0 0 0 zio_data_buf_16777216[SPL ] 0 +0xffffa08956a01e00 zio_data_buf_1048576 KMC_NODEBUG|KMC_KVMEM 1048576 1053184 8425472 8 8 0 0 0.0B 0.0B 0 0 0 zio_data_buf_1048576[SPL ] 0 +0xffffa08956a01c00 zio_buf_786432 KMC_NODEBUG|KMC_KVMEM 786432 791040 6328320 8 8 0 0 0.0B 0.0B 0 0 0 zio_buf_786432[SPL ] 0 +0xffffa08956a01a00 zio_data_buf_655360 KMC_NODEBUG|KMC_KVMEM 655360 659968 5279744 8 8 0 0 0.0B 0.0B 0 0 0 zio_data_buf_655360[SPL ] 0 +0xffffa08956a01800 zio_data_buf_1835008 KMC_NODEBUG|KMC_KVMEM 1835008 1839616 14716928 8 8 0 0 0.0B 0.0B 0 0 0 zio_data_buf_1835008[SPL ] 0 +0xffffa08956a01600 zio_buf_655360 KMC_NODEBUG|KMC_KVMEM 655360 659968 5279744 8 8 0 0 0.0B 0.0B 0 0 0 zio_buf_655360[SPL ] 0 +0xffffa08956a01400 zio_buf_1835008 KMC_NODEBUG|KMC_KVMEM 1835008 1839616 14716928 8 8 0 0 0.0B 0.0B 0 0 0 zio_buf_1835008[SPL ] 0 +0xffffa08956a01200 zio_buf_524288 KMC_NODEBUG|KMC_KVMEM 524288 528896 4231168 8 8 0 0 0.0B 0.0B 0 0 0 zio_buf_524288[SPL ] 0 +0xffffa08956a01000 zio_data_buf_1572864 KMC_NODEBUG|KMC_KVMEM 1572864 1577472 12619776 8 8 0 0 0.0B 0.0B 0 0 0 zio_data_buf_1572864[SPL ] 0 +0xffffa08956a00e00 zio_data_buf_786432 KMC_NODEBUG|KMC_KVMEM 786432 791040 6328320 8 8 0 0 0.0B 0.0B 0 0 0 zio_data_buf_786432[SPL ] 0 +0xffffa08956a00c00 zio_data_buf_917504 KMC_NODEBUG|KMC_KVMEM 917504 922112 7376896 8 8 0 0 0.0B 0.0B 0 0 0 zio_data_buf_917504[SPL ] 0 +0xffffa08956a00a00 zio_buf_917504 KMC_NODEBUG|KMC_KVMEM 917504 922112 7376896 8 8 0 0 0.0B 0.0B 0 0 0 zio_buf_917504[SPL ] 0 +0xffffa08956a00800 zio_data_buf_524288 KMC_NODEBUG|KMC_KVMEM 524288 528896 4231168 8 8 0 0 0.0B 0.0B 0 0 0 zio_data_buf_524288[SPL ] 0 +0xffffa08956a00600 zio_buf_1572864 KMC_NODEBUG|KMC_KVMEM 1572864 1577472 12619776 8 8 0 0 0.0B 0.0B 0 0 0 zio_buf_1572864[SPL ] 0 +0xffffa08956a00400 zio_buf_1048576 KMC_NODEBUG|KMC_KVMEM 1048576 1053184 8425472 8 8 0 0 0.0B 0.0B 0 0 0 zio_buf_1048576[SPL ] 0 +0xffffa08956a00200 zio_data_buf_1310720 KMC_NODEBUG|KMC_KVMEM 1310720 1315328 10522624 8 8 0 0 0.0B 0.0B 0 0 0 zio_data_buf_1310720[SPL ] 0 +0xffffa08956a00000 zio_buf_1310720 KMC_NODEBUG|KMC_KVMEM 1310720 1315328 10522624 8 8 0 0 0.0B 0.0B 0 0 0 zio_buf_1310720[SPL ] 0 +0xffffa08956637800 sio_cache_2 KMC_NOMAGAZINE|KMC_SLAB 168 168 0 0 0 0 0 0.0B 0.0B 0 0 0 sio_cache_2[SLUB] 0 +0xffffa08956637600 sio_cache_1 KMC_NOMAGAZINE|KMC_SLAB 152 152 0 0 0 0 0 0.0B 0.0B 0 0 0 sio_cache_1[SLUB] 0 +0xffffa08956637400 zil_zcw_cache KMC_NOMAGAZINE|KMC_SLAB 152 152 0 0 0 0 0 0.0B 7.7KB 0 0 0 zil_zcw_cache[SLUB] 0 +0xffffa08956637200 sio_cache_0 KMC_NOMAGAZINE|KMC_SLAB 136 136 0 0 0 0 0 0.0B 0.0B 0 0 0 sio_cache_0[SLUB] 0 +0xffffa08956636e00 arc_buf_hdr_t_l2only KMC_NOMAGAZINE|KMC_SLAB 96 96 0 0 0 0 0 0.0B 3.9KB 0 0 0 arc_buf_hdr_t_l2only[SLUB] 0 diff --git a/tests/integration/data/regression_output/spl/spl_kmem_caches | filter obj.skc_linux_cache == 0 | spl_cache b/tests/integration/data/regression_output/spl/spl_kmem_caches | filter obj.skc_linux_cache == 0 | spl_cache new file mode 100644 index 00000000..ae4e39a1 --- /dev/null +++ b/tests/integration/data/regression_output/spl/spl_kmem_caches | filter obj.skc_linux_cache == 0 | spl_cache @@ -0,0 +1,3564 @@ +(void *)0xffffa08937e80040 +(void *)0xffffa08937e86180 +(void *)0xffffa08937e8c2c0 +(void *)0xffffa08937e92400 +(void *)0xffffa08937e98540 +(void *)0xffffa08937e9e680 +(void *)0xffffa08937ea47c0 +(void *)0xffffa08937eaa900 +(void *)0xffffa08959cc0040 +(void *)0xffffa08959cc6180 +(void *)0xffffa08959ccc2c0 +(void *)0xffffa08959cd2400 +(void *)0xffffa08959cd8540 +(void *)0xffffa08959cde680 +(void *)0xffffa08959ce47c0 +(void *)0xffffa08959cea900 +(void *)0xffffa0895be80040 +(void *)0xffffa0895be86180 +(void *)0xffffa0895be8c2c0 +(void *)0xffffa0895be92400 +(void *)0xffffa0895be98540 +(void *)0xffffa0895be9e680 +(void *)0xffffa0895bea47c0 +(void *)0xffffa0895beaa900 +(void *)0xffffa08953680040 +(void *)0xffffa08953686180 +(void *)0xffffa0895368c2c0 +(void *)0xffffa08953692400 +(void *)0xffffa08953698540 +(void *)0xffffa0895369e680 +(void *)0xffffa089536a47c0 +(void *)0xffffa089536aa900 +(void *)0xffffa08953600040 +(void *)0xffffa08953606180 +(void *)0xffffa0895360c2c0 +(void *)0xffffa08953612400 +(void *)0xffffa08953618540 +(void *)0xffffa0895361e680 +(void *)0xffffa089536247c0 +(void *)0xffffa0895362a900 +(void *)0xffffa0895364c2c0 +(void *)0xffffa08953652400 +(void *)0xffffa08953658540 +(void *)0xffffa0895365e680 +(void *)0xffffa089536647c0 +(void *)0xffffa0895366a900 +(void *)0xffffa08936141000 +(void *)0xffffa08936147000 +(void *)0xffffa0893614d000 +(void *)0xffffa08936153000 +(void *)0xffffa08936159000 +(void *)0xffffa0893615f000 +(void *)0xffffa08936165000 +(void *)0xffffa0893616b000 +(void *)0xffffa08936101000 +(void *)0xffffa08936107000 +(void *)0xffffa0893610d000 +(void *)0xffffa08936113000 +(void *)0xffffa08936119000 +(void *)0xffffa0893611f000 +(void *)0xffffa08936125000 +(void *)0xffffa0893612b000 +(void *)0xffffa089398eb000 +(void *)0xffffa0888d107000 +(void *)0xffffa0888d10d000 +(void *)0xffffa0888d113000 +(void *)0xffffa0888d119000 +(void *)0xffffa0888d12b000 +(void *)0xffffa0889dec7000 +(void *)0xffffa0889ded9000 +(void *)0xffffa0889dee5000 +(void *)0xffffa0889deeb000 +(void *)0xffffa0893d5cd000 +(void *)0xffffa0893d5d9000 +(void *)0xffffa0893d5df000 +(void *)0xffffa08946a13000 +(void *)0xffffa088ca453000 +(void *)0xffffa0893986b000 +(void *)0xffffa08888ec7000 +(void *)0xffffa0889c901000 +(void *)0xffffa0889c907000 +(void *)0xffffa08962f25000 +(void *)0xffffa08962f2b000 +(void *)0xffffa0893f187000 +(void *)0xffffa0895d16b000 +(void *)0xffffa08959759000 +(void *)0xffffa0895976b000 +(void *)0xffffa0894e2cd000 +(void *)0xffffa0894e2d3000 +(void *)0xffffa0889f401000 +(void *)0xffffa0889f407000 +(void *)0xffffa0889f40d000 +(void *)0xffffa0889f413000 +(void *)0xffffa0889f419000 +(void *)0xffffa08855a19000 +(void *)0xffffa08855a1f000 +(void *)0xffffa089519c1000 +(void *)0xffffa089519cd000 +(void *)0xffffa089519d3000 +(void *)0xffffa089519eb000 +(void *)0xffffa088d0a53000 +(void *)0xffffa088d0a59000 +(void *)0xffffa088d0a5f000 +(void *)0xffffa08965201000 +(void *)0xffffa08965208000 +(void *)0xffffa0896520f000 +(void *)0xffffa08965216000 +(void *)0xffffa0896521d000 +(void *)0xffffa08965224000 +(void *)0xffffa0896522b000 +(void *)0xffffa08965232000 +(void *)0xffffa08965a41000 +(void *)0xffffa08965a48000 +(void *)0xffffa08965a4f000 +(void *)0xffffa08965a56000 +(void *)0xffffa08965a5d000 +(void *)0xffffa08965a64000 +(void *)0xffffa08965a6b000 +(void *)0xffffa08965a72000 +(void *)0xffffa0895e6c8000 +(void *)0xffffa0895e6cf000 +(void *)0xffffa0895e6d6000 +(void *)0xffffa0895e6dd000 +(void *)0xffffa0895e6e4000 +(void *)0xffffa0895e6eb000 +(void *)0xffffa0895e6f2000 +(void *)0xffffa0895afc1000 +(void *)0xffffa0895afc8000 +(void *)0xffffa0895afcf000 +(void *)0xffffa0895afd6000 +(void *)0xffffa0895afdd000 +(void *)0xffffa0895afe4000 +(void *)0xffffa0895afeb000 +(void *)0xffffa0895aff2000 +(void *)0xffffa088c7281000 +(void *)0xffffa088c7288000 +(void *)0xffffa088c728f000 +(void *)0xffffa088c7296000 +(void *)0xffffa088c729d000 +(void *)0xffffa088c72b2000 +(void *)0xffffa0895ebb2000 +(void *)0xffffa08948e0f000 +(void *)0xffffa08948e16000 +(void *)0xffffa08948e1d000 +(void *)0xffffa08948e2b000 +(void *)0xffffa088edc41000 +(void *)0xffffa088edc48000 +(void *)0xffffa0894716b000 +(void *)0xffffa08883401000 +(void *)0xffffa08883408000 +(void *)0xffffa0888340f000 +(void *)0xffffa0888341d000 +(void *)0xffffa088ca501000 +(void *)0xffffa088ca508000 +(void *)0xffffa088ca532000 +(void *)0xffffa0896528f000 +(void *)0xffffa089652ab000 +(void *)0xffffa089652b2000 +(void *)0xffffa08888e96000 +(void *)0xffffa08888ea4000 +(void *)0xffffa08894516000 +(void *)0xffffa0889452b000 +(void *)0xffffa08894532000 +(void *)0xffffa08920b88000 +(void *)0xffffa0893f0d6000 +(void *)0xffffa0894bf08000 +(void *)0xffffa0894e332000 +(void *)0xffffa089333a4000 +(void *)0xffffa089333ab000 +(void *)0xffffa088ec88f000 +(void *)0xffffa088ec8b2000 +(void *)0xffffa08947201000 +(void *)0xffffa08947224000 +(void *)0xffffa08947232000 +(void *)0xffffa0891f5c1000 +(void *)0xffffa0891f5c8000 +(void *)0xffffa0891f5cf000 +(void *)0xffffa0891f5d6000 +(void *)0xffffa0891f5e4000 +(void *)0xffffa0891f5eb000 +(void *)0xffffa0891f5f2000 +(void *)0xffffa08895a32000 +(void *)0xffffa0895eb01000 +(void *)0xffffa0895eb09000 +(void *)0xffffa0895eb11000 +(void *)0xffffa0895eb19000 +(void *)0xffffa0895eb21000 +(void *)0xffffa0895eb29000 +(void *)0xffffa0895eb31000 +(void *)0xffffa0895eb39000 +(void *)0xffffa0895ed19000 +(void *)0xffffa0895ed29000 +(void *)0xffffa0895ed31000 +(void *)0xffffa0895ed39000 +(void *)0xffffa088cf401000 +(void *)0xffffa088cf409000 +(void *)0xffffa088cf419000 +(void *)0xffffa088cf421000 +(void *)0xffffa088cf429000 +(void *)0xffffa088cf431000 +(void *)0xffffa088cf439000 +(void *)0xffffa08944f01000 +(void *)0xffffa08944f09000 +(void *)0xffffa08944f11000 +(void *)0xffffa08944f19000 +(void *)0xffffa08889c19000 +(void *)0xffffa0891be81000 +(void *)0xffffa0891beb9000 +(void *)0xffffa088c5a81000 +(void *)0xffffa088c5a99000 +(void *)0xffffa088c5aa1000 +(void *)0xffffa088c5aa9000 +(void *)0xffffa088c5ab1000 +(void *)0xffffa088c5ab9000 +(void *)0xffffa088cc601000 +(void *)0xffffa088cc611000 +(void *)0xffffa08947199000 +(void *)0xffffa089471a1000 +(void *)0xffffa089471b9000 +(void *)0xffffa08950a01000 +(void *)0xffffa08950a29000 +(void *)0xffffa08950a39000 +(void *)0xffffa089372a1000 +(void *)0xffffa089372a9000 +(void *)0xffffa08958621000 +(void *)0xffffa08958629000 +(void *)0xffffa0889c121000 +(void *)0xffffa08959791000 +(void *)0xffffa089626a9000 +(void *)0xffffa089626b9000 +(void *)0xffffa088e5781000 +(void *)0xffffa088e5799000 +(void *)0xffffa088e57a1000 +(void *)0xffffa088e57b1000 +(void *)0xffffa088e57b9000 +(void *)0xffffa08889581000 +(void *)0xffffa08889599000 +(void *)0xffffa088895a1000 +(void *)0xffffa088895a9000 +(void *)0xffffa088895b9000 +(void *)0xffffa08962199000 +(void *)0xffffa089621a9000 +(void *)0xffffa089621b9000 +(void *)0xffffa0894c531000 +(void *)0xffffa0894c539000 +(void *)0xffffa08945b81000 +(void *)0xffffa08945b8a000 +(void *)0xffffa08945b93000 +(void *)0xffffa08945b9c000 +(void *)0xffffa08945ba5000 +(void *)0xffffa08945bae000 +(void *)0xffffa08945bb7000 +(void *)0xffffa08945bc0000 +(void *)0xffffa0894b025000 +(void *)0xffffa0894b02e000 +(void *)0xffffa0894b037000 +(void *)0xffffa0894b040000 +(void *)0xffffa08963a01000 +(void *)0xffffa08888281000 +(void *)0xffffa0888828a000 +(void *)0xffffa08888293000 +(void *)0xffffa0888829c000 +(void *)0xffffa088882a5000 +(void *)0xffffa088882ae000 +(void *)0xffffa088882b7000 +(void *)0xffffa08883001000 +(void *)0xffffa08883013000 +(void *)0xffffa08883025000 +(void *)0xffffa0888302e000 +(void *)0xffffa08883037000 +(void *)0xffffa0888a80a000 +(void *)0xffffa0888a813000 +(void *)0xffffa0888a81c000 +(void *)0xffffa0888a825000 +(void *)0xffffa0888a837000 +(void *)0xffffa0888a840000 +(void *)0xffffa0895d31c000 +(void *)0xffffa0895e38a000 +(void *)0xffffa0895e3a5000 +(void *)0xffffa0895bfae000 +(void *)0xffffa08947393000 +(void *)0xffffa0894739c000 +(void *)0xffffa089473a5000 +(void *)0xffffa0891d401000 +(void *)0xffffa0891d40a000 +(void *)0xffffa0895df13000 +(void *)0xffffa0895df25000 +(void *)0xffffa0894428a000 +(void *)0xffffa089442ae000 +(void *)0xffffa089442b7000 +(void *)0xffffa089442c0000 +(void *)0xffffa0894b181000 +(void *)0xffffa0894b18a000 +(void *)0xffffa0894b193000 +(void *)0xffffa0894b19c000 +(void *)0xffffa0894b1a5000 +(void *)0xffffa0894b1c0000 +(void *)0xffffa0895181c000 +(void *)0xffffa0895182e000 +(void *)0xffffa08951840000 +(void *)0xffffa088c732e000 +(void *)0xffffa088c7337000 +(void *)0xffffa087d3701000 +(void *)0xffffa087d370c000 +(void *)0xffffa087d3717000 +(void *)0xffffa087d3722000 +(void *)0xffffa087d372d000 +(void *)0xffffa087d3738000 +(void *)0xffffa087d3743000 +(void *)0xffffa087d374e000 +(void *)0xffffa088d1c01000 +(void *)0xffffa088d1c0c000 +(void *)0xffffa088d1c17000 +(void *)0xffffa088d1c22000 +(void *)0xffffa088d1c2d000 +(void *)0xffffa088d1c38000 +(void *)0xffffa088d1c43000 +(void *)0xffffa088d1c4e000 +(void *)0xffffa08943c01000 +(void *)0xffffa08943c0c000 +(void *)0xffffa08943c17000 +(void *)0xffffa08943c22000 +(void *)0xffffa08943c2d000 +(void *)0xffffa08943c38000 +(void *)0xffffa08943c43000 +(void *)0xffffa08943c4e000 +(void *)0xffffa088c7201000 +(void *)0xffffa088c720c000 +(void *)0xffffa088c7217000 +(void *)0xffffa088cf581000 +(void *)0xffffa088cf58c000 +(void *)0xffffa088cf597000 +(void *)0xffffa088cf5a2000 +(void *)0xffffa08883201000 +(void *)0xffffa08883222000 +(void *)0xffffa08944581000 +(void *)0xffffa089445b8000 +(void *)0xffffa089445c3000 +(void *)0xffffa08946f8c000 +(void *)0xffffa08946f97000 +(void *)0xffffa08946fb8000 +(void *)0xffffa08946fc3000 +(void *)0xffffa08947e01000 +(void *)0xffffa08947e17000 +(void *)0xffffa08947e22000 +(void *)0xffffa08855b17000 +(void *)0xffffa08855b22000 +(void *)0xffffa08855b43000 +(void *)0xffffa08855b4e000 +(void *)0xffffa08960f97000 +(void *)0xffffa08960fa2000 +(void *)0xffffa08960fad000 +(void *)0xffffa08960fc3000 +(void *)0xffffa08948a43000 +(void *)0xffffa088cc197000 +(void *)0xffffa088cc1c3000 +(void *)0xffffa08944943000 +(void *)0xffffa08948eb8000 +(void *)0xffffa08948ec3000 +(void *)0xffffa0894a401000 +(void *)0xffffa0894a40c000 +(void *)0xffffa0894a417000 +(void *)0xffffa0894a42d000 +(void *)0xffffa0895940c000 +(void *)0xffffa08959417000 +(void *)0xffffa08959422000 +(void *)0xffffa0895942d000 +(void *)0xffffa08959438000 +(void *)0xffffa08959443000 +(void *)0xffffa0895944e000 +(void *)0xffffa0895188c000 +(void *)0xffffa089518a2000 +(void *)0xffffa089518ad000 +(void *)0xffffa088a0c0c000 +(void *)0xffffa0889f0b8000 +(void *)0xffffa0889f0c3000 +(void *)0xffffa0889dba2000 +(void *)0xffffa0889dbad000 +(void *)0xffffa0889dbb8000 +(void *)0xffffa0889dbc3000 +(void *)0xffffa0889dbce000 +(void *)0xffffa08965a81000 +(void *)0xffffa08965a8e000 +(void *)0xffffa08965a9b000 +(void *)0xffffa08965aa8000 +(void *)0xffffa08965ab5000 +(void *)0xffffa08965ac2000 +(void *)0xffffa08965acf000 +(void *)0xffffa08965adc000 +(void *)0xffffa08965b42000 +(void *)0xffffa08965b5c000 +(void *)0xffffa088d1781000 +(void *)0xffffa088d178e000 +(void *)0xffffa088d179b000 +(void *)0xffffa088d17a8000 +(void *)0xffffa088d17b5000 +(void *)0xffffa088d17c2000 +(void *)0xffffa088d17cf000 +(void *)0xffffa08907e01000 +(void *)0xffffa08907e28000 +(void *)0xffffa08907e42000 +(void *)0xffffa0893a301000 +(void *)0xffffa0893a30e000 +(void *)0xffffa0893a31b000 +(void *)0xffffa0893a328000 +(void *)0xffffa0896271b000 +(void *)0xffffa08962728000 +(void *)0xffffa08962735000 +(void *)0xffffa0885580e000 +(void *)0xffffa08855835000 +(void *)0xffffa0885584f000 +(void *)0xffffa0885585c000 +(void *)0xffffa08932e9b000 +(void *)0xffffa08932ea8000 +(void *)0xffffa08932ec2000 +(void *)0xffffa08888301000 +(void *)0xffffa08888335000 +(void *)0xffffa08888342000 +(void *)0xffffa0888834f000 +(void *)0xffffa0888835c000 +(void *)0xffffa0895019b000 +(void *)0xffffa089501a8000 +(void *)0xffffa089501b5000 +(void *)0xffffa089501c2000 +(void *)0xffffa089501cf000 +(void *)0xffffa089501dc000 +(void *)0xffffa08895aa8000 +(void *)0xffffa08895ab5000 +(void *)0xffffa08895ac2000 +(void *)0xffffa08895acf000 +(void *)0xffffa08895adc000 +(void *)0xffffa0895b48e000 +(void *)0xffffa0895b4b5000 +(void *)0xffffa0895b4dc000 +(void *)0xffffa08954e01000 +(void *)0xffffa08954e5c000 +(void *)0xffffa088832a8000 +(void *)0xffffa088832b5000 +(void *)0xffffa088832c2000 +(void *)0xffffa0893475c000 +(void *)0xffffa089651b5000 +(void *)0xffffa089651cf000 +(void *)0xffffa08965081000 +(void *)0xffffa0896508e000 +(void *)0xffffa089650a8000 +(void *)0xffffa08936181000 +(void *)0xffffa08936190000 +(void *)0xffffa0893619f000 +(void *)0xffffa089361ae000 +(void *)0xffffa089361bd000 +(void *)0xffffa089361cc000 +(void *)0xffffa089361db000 +(void *)0xffffa089361ea000 +(void *)0xffffa08935210000 +(void *)0xffffa0893521f000 +(void *)0xffffa0893522e000 +(void *)0xffffa0893523d000 +(void *)0xffffa0893524c000 +(void *)0xffffa0893525b000 +(void *)0xffffa0893526a000 +(void *)0xffffa088c4701000 +(void *)0xffffa088c4710000 +(void *)0xffffa088c471f000 +(void *)0xffffa088c472e000 +(void *)0xffffa088c473d000 +(void *)0xffffa088c474c000 +(void *)0xffffa088c475b000 +(void *)0xffffa088c476a000 +(void *)0xffffa08937090000 +(void *)0xffffa08964a01000 +(void *)0xffffa08964a10000 +(void *)0xffffa08964a1f000 +(void *)0xffffa08964a2e000 +(void *)0xffffa08964a3d000 +(void *)0xffffa0890bb01000 +(void *)0xffffa0890bb10000 +(void *)0xffffa0890bb5b000 +(void *)0xffffa08882b3d000 +(void *)0xffffa08882b4c000 +(void *)0xffffa08882b5b000 +(void *)0xffffa0889de6a000 +(void *)0xffffa08920aae000 +(void *)0xffffa088ef390000 +(void *)0xffffa088ef39f000 +(void *)0xffffa088ef3bd000 +(void *)0xffffa088ef3ea000 +(void *)0xffffa08934590000 +(void *)0xffffa0893459f000 +(void *)0xffffa089345ae000 +(void *)0xffffa089345bd000 +(void *)0xffffa089345cc000 +(void *)0xffffa089345db000 +(void *)0xffffa08883d10000 +(void *)0xffffa08883d1f000 +(void *)0xffffa08883d3d000 +(void *)0xffffa08883d4c000 +(void *)0xffffa08883d6a000 +(void *)0xffffa08947f10000 +(void *)0xffffa08947f2e000 +(void *)0xffffa0895be1f000 +(void *)0xffffa0895be2e000 +(void *)0xffffa0895be3d000 +(void *)0xffffa0895be4c000 +(void *)0xffffa0895be5b000 +(void *)0xffffa08937dbd000 +(void *)0xffffa08937dea000 +(void *)0xffffa0895cd81000 +(void *)0xffffa0895cd90000 +(void *)0xffffa0895cd9f000 +(void *)0xffffa0895cdae000 +(void *)0xffffa0895cdbd000 +(void *)0xffffa0895ea01000 +(void *)0xffffa0895ea12000 +(void *)0xffffa0895ea23000 +(void *)0xffffa0895ea34000 +(void *)0xffffa0895ea45000 +(void *)0xffffa0895ea56000 +(void *)0xffffa0895ea67000 +(void *)0xffffa0895ea78000 +(void *)0xffffa08965312000 +(void *)0xffffa08965323000 +(void *)0xffffa08965334000 +(void *)0xffffa08965345000 +(void *)0xffffa08965356000 +(void *)0xffffa08965367000 +(void *)0xffffa08965378000 +(void *)0xffffa08941b12000 +(void *)0xffffa08941b45000 +(void *)0xffffa08941b56000 +(void *)0xffffa08941b67000 +(void *)0xffffa0895cf01000 +(void *)0xffffa0895cf23000 +(void *)0xffffa0895cf56000 +(void *)0xffffa0895cf67000 +(void *)0xffffa08840312000 +(void *)0xffffa08840323000 +(void *)0xffffa08840345000 +(void *)0xffffa08840367000 +(void *)0xffffa08953c12000 +(void *)0xffffa08953c34000 +(void *)0xffffa08953c67000 +(void *)0xffffa08953c78000 +(void *)0xffffa08883301000 +(void *)0xffffa08883312000 +(void *)0xffffa0895cc56000 +(void *)0xffffa0895cc67000 +(void *)0xffffa0895cc78000 +(void *)0xffffa08840423000 +(void *)0xffffa08886c12000 +(void *)0xffffa08886c23000 +(void *)0xffffa08886c34000 +(void *)0xffffa0889da67000 +(void *)0xffffa0889da78000 +(void *)0xffffa08931601000 +(void *)0xffffa08931656000 +(void *)0xffffa08931667000 +(void *)0xffffa08931678000 +(void *)0xffffa0895de12000 +(void *)0xffffa0895de34000 +(void *)0xffffa0895de56000 +(void *)0xffffa0895de67000 +(void *)0xffffa0891fa01000 +(void *)0xffffa0891fa12000 +(void *)0xffffa0891fa23000 +(void *)0xffffa0891fa34000 +(void *)0xffffa0891fa45000 +(void *)0xffffa0891fa67000 +(void *)0xffffa0891fa78000 +(void *)0xffffa08895812000 +(void *)0xffffa08895878000 +(void *)0xffffa088c4623000 +(void *)0xffffa088c4678000 +(void *)0xffffa088c7834000 +(void *)0xffffa088c7845000 +(void *)0xffffa088c7856000 +(void *)0xffffa088c7867000 +(void *)0xffffa0889df12000 +(void *)0xffffa0889df56000 +(void *)0xffffa08934223000 +(void *)0xffffa08934234000 +(void *)0xffffa08934245000 +(void *)0xffffa08934267000 +(void *)0xffffa08934278000 +(void *)0xffffa08840212000 +(void *)0xffffa08840278000 +(void *)0xffffa0895db01000 +(void *)0xffffa0895db12000 +(void *)0xffffa0895db45000 +(void *)0xffffa0895db56000 +(void *)0xffffa08840523000 +(void *)0xffffa08840545000 +(void *)0xffffa08930701000 +(void *)0xffffa08930712000 +(void *)0xffffa08930723000 +(void *)0xffffa08930745000 +(void *)0xffffa08930767000 +(void *)0xffffa088c8223000 +(void *)0xffffa088c8245000 +(void *)0xffffa088c8256000 +(void *)0xffffa0889c645000 +(void *)0xffffa0889c656000 +(void *)0xffffa0889c667000 +(void *)0xffffa088c6601000 +(void *)0xffffa088c6634000 +(void *)0xffffa088c6667000 +(void *)0xffffa088c6678000 +(void *)0xffffa088a3401000 +(void *)0xffffa088a3412000 +(void *)0xffffa088a3445000 +(void *)0xffffa088a3456000 +(void *)0xffffa08934612000 +(void *)0xffffa08934656000 +(void *)0xffffa08943d12000 +(void *)0xffffa08943d34000 +(void *)0xffffa08938901000 +(void *)0xffffa08938916000 +(void *)0xffffa0893892b000 +(void *)0xffffa08938940000 +(void *)0xffffa08938955000 +(void *)0xffffa0893896a000 +(void *)0xffffa0893897f000 +(void *)0xffffa08938994000 +(void *)0xffffa08940001000 +(void *)0xffffa08940016000 +(void *)0xffffa0894002b000 +(void *)0xffffa08940040000 +(void *)0xffffa08940055000 +(void *)0xffffa0894006a000 +(void *)0xffffa0894007f000 +(void *)0xffffa08940094000 +(void *)0xffffa0893ff01000 +(void *)0xffffa0893ff16000 +(void *)0xffffa0893ff2b000 +(void *)0xffffa0893ff40000 +(void *)0xffffa0893ff55000 +(void *)0xffffa0893ff6a000 +(void *)0xffffa0893ff7f000 +(void *)0xffffa0893ff94000 +(void *)0xffffa08962801000 +(void *)0xffffa08962816000 +(void *)0xffffa0896282b000 +(void *)0xffffa08962840000 +(void *)0xffffa08962855000 +(void *)0xffffa0896286a000 +(void *)0xffffa0896287f000 +(void *)0xffffa08962894000 +(void *)0xffffa08944e01000 +(void *)0xffffa08944e16000 +(void *)0xffffa08944e2b000 +(void *)0xffffa08944e40000 +(void *)0xffffa08944e55000 +(void *)0xffffa08944e6a000 +(void *)0xffffa08944e7f000 +(void *)0xffffa08944e94000 +(void *)0xffffa08947c01000 +(void *)0xffffa0895d201000 +(void *)0xffffa0894a516000 +(void *)0xffffa0894a57f000 +(void *)0xffffa08935301000 +(void *)0xffffa08935316000 +(void *)0xffffa0893532b000 +(void *)0xffffa08935340000 +(void *)0xffffa0893537f000 +(void *)0xffffa08921555000 +(void *)0xffffa0892156a000 +(void *)0xffffa0892157f000 +(void *)0xffffa08921594000 +(void *)0xffffa088cbb7f000 +(void *)0xffffa0888942b000 +(void *)0xffffa08889455000 +(void *)0xffffa0888946a000 +(void *)0xffffa08889494000 +(void *)0xffffa08942d40000 +(void *)0xffffa08942d55000 +(void *)0xffffa08942d6a000 +(void *)0xffffa088c4540000 +(void *)0xffffa088c4555000 +(void *)0xffffa088c456a000 +(void *)0xffffa0888457f000 +(void *)0xffffa08884594000 +(void *)0xffffa08886616000 +(void *)0xffffa08886655000 +(void *)0xffffa0895cb01000 +(void *)0xffffa0895cb55000 +(void *)0xffffa08930601000 +(void *)0xffffa0893061a000 +(void *)0xffffa08930633000 +(void *)0xffffa0893064c000 +(void *)0xffffa08930665000 +(void *)0xffffa0893067e000 +(void *)0xffffa08930697000 +(void *)0xffffa089306b0000 +(void *)0xffffa08930501000 +(void *)0xffffa0893051a000 +(void *)0xffffa08930533000 +(void *)0xffffa0893054c000 +(void *)0xffffa08930565000 +(void *)0xffffa0893057e000 +(void *)0xffffa08930597000 +(void *)0xffffa089305b0000 +(void *)0xffffa0895e765000 +(void *)0xffffa0895e77e000 +(void *)0xffffa0895e797000 +(void *)0xffffa0895e7b0000 +(void *)0xffffa08921201000 +(void *)0xffffa0892121a000 +(void *)0xffffa08921233000 +(void *)0xffffa0892124c000 +(void *)0xffffa08921265000 +(void *)0xffffa0892127e000 +(void *)0xffffa08921297000 +(void *)0xffffa089212b0000 +(void *)0xffffa0894cbb0000 +(void *)0xffffa0895dd01000 +(void *)0xffffa0895dd33000 +(void *)0xffffa0895dd65000 +(void *)0xffffa0895dd7e000 +(void *)0xffffa0895dd97000 +(void *)0xffffa0895ddb0000 +(void *)0xffffa08935001000 +(void *)0xffffa08935097000 +(void *)0xffffa08883565000 +(void *)0xffffa0888357e000 +(void *)0xffffa088835b0000 +(void *)0xffffa088ca265000 +(void *)0xffffa088ca27e000 +(void *)0xffffa088ca297000 +(void *)0xffffa088ca2b0000 +(void *)0xffffa08883c1a000 +(void *)0xffffa08883c33000 +(void *)0xffffa08883c4c000 +(void *)0xffffa08883c97000 +(void *)0xffffa08883cb0000 +(void *)0xffffa0893631a000 +(void *)0xffffa08936333000 +(void *)0xffffa0893634c000 +(void *)0xffffa08936365000 +(void *)0xffffa0893637e000 +(void *)0xffffa08936397000 +(void *)0xffffa0895e201000 +(void *)0xffffa0895e265000 +(void *)0xffffa0895e297000 +(void *)0xffffa0895e2b0000 +(void *)0xffffa08936001000 +(void *)0xffffa0893601e000 +(void *)0xffffa0893603b000 +(void *)0xffffa08936058000 +(void *)0xffffa08936075000 +(void *)0xffffa08936092000 +(void *)0xffffa089360af000 +(void *)0xffffa089360cc000 +(void *)0xffffa08953201000 +(void *)0xffffa0895321e000 +(void *)0xffffa0895323b000 +(void *)0xffffa08953258000 +(void *)0xffffa08953275000 +(void *)0xffffa08953292000 +(void *)0xffffa089532af000 +(void *)0xffffa089532cc000 +(void *)0xffffa08952faf000 +(void *)0xffffa08952fcc000 +(void *)0xffffa0895bd01000 +(void *)0xffffa0895bd1e000 +(void *)0xffffa0895bd3b000 +(void *)0xffffa0895bd58000 +(void *)0xffffa0895bd75000 +(void *)0xffffa0895bd92000 +(void *)0xffffa0895bdaf000 +(void *)0xffffa0895bdcc000 +(void *)0xffffa0891f801000 +(void *)0xffffa0891f81e000 +(void *)0xffffa0891f83b000 +(void *)0xffffa0891f858000 +(void *)0xffffa0891f875000 +(void *)0xffffa0891f892000 +(void *)0xffffa0891f8af000 +(void *)0xffffa0891f8cc000 +(void *)0xffffa0891fb01000 +(void *)0xffffa0891fb1e000 +(void *)0xffffa0891fb3b000 +(void *)0xffffa0891fb58000 +(void *)0xffffa0891fb75000 +(void *)0xffffa0891fb92000 +(void *)0xffffa0891fbaf000 +(void *)0xffffa0891fbcc000 +(void *)0xffffa08944601000 +(void *)0xffffa0894461e000 +(void *)0xffffa0894463b000 +(void *)0xffffa08944658000 +(void *)0xffffa08944675000 +(void *)0xffffa08944692000 +(void *)0xffffa089446af000 +(void *)0xffffa089446cc000 +(void *)0xffffa08895901000 +(void *)0xffffa0889591e000 +(void *)0xffffa0889593b000 +(void *)0xffffa08895958000 +(void *)0xffffa08895975000 +(void *)0xffffa08895992000 +(void *)0xffffa088959af000 +(void *)0xffffa088c5f58000 +(void *)0xffffa088c5f75000 +(void *)0xffffa088c5f92000 +(void *)0xffffa088c5faf000 +(void *)0xffffa088c5fcc000 +(void *)0xffffa0895d51e000 +(void *)0xffffa0895d73b000 +(void *)0xffffa08959675000 +(void *)0xffffa08959692000 +(void *)0xffffa08953801000 +(void *)0xffffa08953822000 +(void *)0xffffa08953843000 +(void *)0xffffa08953864000 +(void *)0xffffa08953885000 +(void *)0xffffa089538a6000 +(void *)0xffffa089538c7000 +(void *)0xffffa089538e8000 +(void *)0xffffa08933e01000 +(void *)0xffffa08933e22000 +(void *)0xffffa08933e43000 +(void *)0xffffa08933e64000 +(void *)0xffffa08933e85000 +(void *)0xffffa08933ea6000 +(void *)0xffffa08933ec7000 +(void *)0xffffa08933ee8000 +(void *)0xffffa08893e01000 +(void *)0xffffa08893e22000 +(void *)0xffffa08893e43000 +(void *)0xffffa08893e64000 +(void *)0xffffa08893e85000 +(void *)0xffffa08893ea6000 +(void *)0xffffa08893ec7000 +(void *)0xffffa08893ee8000 +(void *)0xffffa088cfe01000 +(void *)0xffffa088cfe22000 +(void *)0xffffa088cfe43000 +(void *)0xffffa088cfe64000 +(void *)0xffffa088cfe85000 +(void *)0xffffa088cfea6000 +(void *)0xffffa088cfec7000 +(void *)0xffffa088cfee8000 +(void *)0xffffa08883801000 +(void *)0xffffa08883822000 +(void *)0xffffa08883843000 +(void *)0xffffa08883864000 +(void *)0xffffa08883885000 +(void *)0xffffa088838a6000 +(void *)0xffffa088838c7000 +(void *)0xffffa088838e8000 +(void *)0xffffa08949801000 +(void *)0xffffa08949822000 +(void *)0xffffa08949843000 +(void *)0xffffa08949864000 +(void *)0xffffa08949885000 +(void *)0xffffa089498a6000 +(void *)0xffffa089498c7000 +(void *)0xffffa089498e8000 +(void *)0xffffa0894ee01000 +(void *)0xffffa0894ee22000 +(void *)0xffffa0894ee43000 +(void *)0xffffa0894ee64000 +(void *)0xffffa0894ee85000 +(void *)0xffffa0894eea6000 +(void *)0xffffa0894eec7000 +(void *)0xffffa0894eee8000 +(void *)0xffffa08953001000 +(void *)0xffffa08953022000 +(void *)0xffffa08953043000 +(void *)0xffffa08953064000 +(void *)0xffffa08953085000 +(void *)0xffffa089530a6000 +(void *)0xffffa089530c7000 +(void *)0xffffa089530e8000 +(void *)0xffffa08963e01000 +(void *)0xffffa08963e22000 +(void *)0xffffa08963e43000 +(void *)0xffffa08963e64000 +(void *)0xffffa08963e85000 +(void *)0xffffa08963ea6000 +(void *)0xffffa08963ec7000 +(void *)0xffffa08963ee8000 +(void *)0xffffa08954001000 +(void *)0xffffa08954022000 +(void *)0xffffa08954043000 +(void *)0xffffa08954064000 +(void *)0xffffa08954085000 +(void *)0xffffa089540a6000 +(void *)0xffffa089540c7000 +(void *)0xffffa089540e8000 +(void *)0xffffa08963c01000 +(void *)0xffffa08963c22000 +(void *)0xffffa08963c43000 +(void *)0xffffa08963c64000 +(void *)0xffffa08963c85000 +(void *)0xffffa08963ca6000 +(void *)0xffffa08963cc7000 +(void *)0xffffa08963ce8000 +(void *)0xffffa08961622000 +(void *)0xffffa08961643000 +(void *)0xffffa08961664000 +(void *)0xffffa08961685000 +(void *)0xffffa089616a6000 +(void *)0xffffa089616c7000 +(void *)0xffffa08947485000 +(void *)0xffffa0891ca22000 +(void *)0xffffa0891ca43000 +(void *)0xffffa0891ca64000 +(void *)0xffffa0891ca85000 +(void *)0xffffa0891caa6000 +(void *)0xffffa0891cac7000 +(void *)0xffffa0891cae8000 +(void *)0xffffa0892fa01000 +(void *)0xffffa0892fa64000 +(void *)0xffffa0892fa85000 +(void *)0xffffa0892faa6000 +(void *)0xffffa0892fac7000 +(void *)0xffffa0892fae8000 +(void *)0xffffa08883e01000 +(void *)0xffffa08883e22000 +(void *)0xffffa08883e64000 +(void *)0xffffa08883e85000 +(void *)0xffffa08883ea6000 +(void *)0xffffa08883ec7000 +(void *)0xffffa08942601000 +(void *)0xffffa08942685000 +(void *)0xffffa089426a6000 +(void *)0xffffa089426c7000 +(void *)0xffffa0893fa01000 +(void *)0xffffa0893fa22000 +(void *)0xffffa0893fa43000 +(void *)0xffffa0893fa64000 +(void *)0xffffa0893fa85000 +(void *)0xffffa0893faa6000 +(void *)0xffffa0891c001000 +(void *)0xffffa0891c022000 +(void *)0xffffa0891c064000 +(void *)0xffffa0891c085000 +(void *)0xffffa0891c0a6000 +(void *)0xffffa0891c0e8000 +(void *)0xffffa0892fc01000 +(void *)0xffffa0892fc22000 +(void *)0xffffa0892fc43000 +(void *)0xffffa0892fc64000 +(void *)0xffffa0892fc85000 +(void *)0xffffa0892fca6000 +(void *)0xffffa0892fce8000 +(void *)0xffffa08883601000 +(void *)0xffffa08883622000 +(void *)0xffffa08883664000 +(void *)0xffffa08883685000 +(void *)0xffffa088836a6000 +(void *)0xffffa088836c7000 +(void *)0xffffa08920801000 +(void *)0xffffa08920822000 +(void *)0xffffa08920843000 +(void *)0xffffa08920864000 +(void *)0xffffa08920885000 +(void *)0xffffa089208a6000 +(void *)0xffffa089208e8000 +(void *)0xffffa08950e01000 +(void *)0xffffa08950e43000 +(void *)0xffffa08950e64000 +(void *)0xffffa08950e85000 +(void *)0xffffa08950ea6000 +(void *)0xffffa08938064000 +(void *)0xffffa089380c7000 +(void *)0xffffa08960801000 +(void *)0xffffa089608e8000 +(void *)0xffffa088ed801000 +(void *)0xffffa088ed822000 +(void *)0xffffa088ed843000 +(void *)0xffffa088ed885000 +(void *)0xffffa088ed8a6000 +(void *)0xffffa088ed8c7000 +(void *)0xffffa088ed8e8000 +(void *)0xffffa08943401000 +(void *)0xffffa08943422000 +(void *)0xffffa08943443000 +(void *)0xffffa08943464000 +(void *)0xffffa08943485000 +(void *)0xffffa089434c7000 +(void *)0xffffa089434e8000 +(void *)0xffffa0890f001000 +(void *)0xffffa0890f085000 +(void *)0xffffa0890f0c7000 +(void *)0xffffa088a3601000 +(void *)0xffffa088a3643000 +(void *)0xffffa088a3685000 +(void *)0xffffa08897601000 +(void *)0xffffa08897622000 +(void *)0xffffa08897643000 +(void *)0xffffa08897664000 +(void *)0xffffa08897685000 +(void *)0xffffa088976c7000 +(void *)0xffffa088976e8000 +(void *)0xffffa088eda01000 +(void *)0xffffa088eda22000 +(void *)0xffffa088eda43000 +(void *)0xffffa088eda64000 +(void *)0xffffa088eda85000 +(void *)0xffffa088edaa6000 +(void *)0xffffa088edae8000 +(void *)0xffffa08964e01000 +(void *)0xffffa08964e22000 +(void *)0xffffa08964e43000 +(void *)0xffffa08964e64000 +(void *)0xffffa08964e85000 +(void *)0xffffa08933622000 +(void *)0xffffa08933664000 +(void *)0xffffa089336a6000 +(void *)0xffffa088cb801000 +(void *)0xffffa088cb843000 +(void *)0xffffa088cb864000 +(void *)0xffffa088cb885000 +(void *)0xffffa088cb8c7000 +(void *)0xffffa08882ee8000 +(void *)0xffffa0895fe43000 +(void *)0xffffa0895fe85000 +(void *)0xffffa0891b401000 +(void *)0xffffa0891b443000 +(void *)0xffffa0891b464000 +(void *)0xffffa0891b485000 +(void *)0xffffa0891b4c7000 +(void *)0xffffa08930e22000 +(void *)0xffffa0894e401000 +(void *)0xffffa0894e422000 +(void *)0xffffa0894e464000 +(void *)0xffffa0894e485000 +(void *)0xffffa0894e4a6000 +(void *)0xffffa0894e4c7000 +(void *)0xffffa0894e4e8000 +(void *)0xffffa08945e01000 +(void *)0xffffa08945e43000 +(void *)0xffffa08945ec7000 +(void *)0xffffa08945ee8000 +(void *)0xffffa0895f085000 +(void *)0xffffa0891ba43000 +(void *)0xffffa0891ba64000 +(void *)0xffffa0891baa6000 +(void *)0xffffa0891bac7000 +(void *)0xffffa088ed201000 +(void *)0xffffa088ed222000 +(void *)0xffffa088ed243000 +(void *)0xffffa088ed264000 +(void *)0xffffa088ed2a6000 +(void *)0xffffa088ed2c7000 +(void *)0xffffa08885e22000 +(void *)0xffffa08960601000 +(void *)0xffffa08960664000 +(void *)0xffffa089606a6000 +(void *)0xffffa08963022000 +(void *)0xffffa08963043000 +(void *)0xffffa08963064000 +(void *)0xffffa089630c7000 +(void *)0xffffa089630e8000 +(void *)0xffffa0892f801000 +(void *)0xffffa0892f822000 +(void *)0xffffa0892f843000 +(void *)0xffffa0892f885000 +(void *)0xffffa0892f8a6000 +(void *)0xffffa0892f8c7000 +(void *)0xffffa0892f8e8000 +(void *)0xffffa08882843000 +(void *)0xffffa088828a6000 +(void *)0xffffa0892fe01000 +(void *)0xffffa0892fe22000 +(void *)0xffffa0892fe43000 +(void *)0xffffa0892fe64000 +(void *)0xffffa0892fe85000 +(void *)0xffffa0892fea6000 +(void *)0xffffa0891c801000 +(void *)0xffffa0891c822000 +(void *)0xffffa0891c864000 +(void *)0xffffa0891c885000 +(void *)0xffffa0891c8a6000 +(void *)0xffffa0891c8e8000 +(void *)0xffffa08963801000 +(void *)0xffffa08963822000 +(void *)0xffffa08963864000 +(void *)0xffffa08963885000 +(void *)0xffffa089638a6000 +(void *)0xffffa089638c7000 +(void *)0xffffa089638e8000 +(void *)0xffffa088ece01000 +(void *)0xffffa088ece22000 +(void *)0xffffa088ece43000 +(void *)0xffffa088ece64000 +(void *)0xffffa088ecea6000 +(void *)0xffffa088ecec7000 +(void *)0xffffa088ecee8000 +(void *)0xffffa08961401000 +(void *)0xffffa08961443000 +(void *)0xffffa08961464000 +(void *)0xffffa08961485000 +(void *)0xffffa089614a6000 +(void *)0xffffa089614c7000 +(void *)0xffffa089614e8000 +(void *)0xffffa08884a43000 +(void *)0xffffa08884a64000 +(void *)0xffffa08942022000 +(void *)0xffffa08942043000 +(void *)0xffffa08942064000 +(void *)0xffffa08942085000 +(void *)0xffffa089420c7000 +(void *)0xffffa089420e8000 +(void *)0xffffa08937801000 +(void *)0xffffa08937843000 +(void *)0xffffa08937864000 +(void *)0xffffa089378a6000 +(void *)0xffffa089378e8000 +(void *)0xffffa08920464000 +(void *)0xffffa08920485000 +(void *)0xffffa089204a6000 +(void *)0xffffa089204e8000 +(void *)0xffffa08882c01000 +(void *)0xffffa08882c43000 +(void *)0xffffa08882c64000 +(void *)0xffffa0891b001000 +(void *)0xffffa0891b043000 +(void *)0xffffa0891b064000 +(void *)0xffffa0891b085000 +(void *)0xffffa0891b0c7000 +(void *)0xffffa0894da01000 +(void *)0xffffa0894da85000 +(void *)0xffffa0894daa6000 +(void *)0xffffa0894dac7000 +(void *)0xffffa0894dae8000 +(void *)0xffffa08961043000 +(void *)0xffffa08961064000 +(void *)0xffffa089610a6000 +(void *)0xffffa089610c7000 +(void *)0xffffa089610e8000 +(void *)0xffffa08885201000 +(void *)0xffffa08885222000 +(void *)0xffffa08885243000 +(void *)0xffffa08885264000 +(void *)0xffffa088852a6000 +(void *)0xffffa08893422000 +(void *)0xffffa088934a6000 +(void *)0xffffa088934e8000 +(void *)0xffffa08883a43000 +(void *)0xffffa08883aa6000 +(void *)0xffffa08883ac7000 +(void *)0xffffa08962c43000 +(void *)0xffffa08962ca6000 +(void *)0xffffa08962cc7000 +(void *)0xffffa08962ce8000 +(void *)0xffffa088c52e8000 +(void *)0xffffa0884a601000 +(void *)0xffffa0884a622000 +(void *)0xffffa0884a643000 +(void *)0xffffa0884a664000 +(void *)0xffffa0884a685000 +(void *)0xffffa0884a6a6000 +(void *)0xffffa0884a6c7000 +(void *)0xffffa0884a6e8000 +(void *)0xffffa0884a201000 +(void *)0xffffa0884a222000 +(void *)0xffffa0884a243000 +(void *)0xffffa0884a264000 +(void *)0xffffa0884a285000 +(void *)0xffffa0884a2a6000 +(void *)0xffffa0884a2c7000 +(void *)0xffffa0884a2e8000 +(void *)0xffffa08849e01000 +(void *)0xffffa08849e22000 +(void *)0xffffa08849e43000 +(void *)0xffffa08849e64000 +(void *)0xffffa08849e85000 +(void *)0xffffa08849ea6000 +(void *)0xffffa08849ec7000 +(void *)0xffffa08849ee8000 +(void *)0xffffa08849a01000 +(void *)0xffffa08849a22000 +(void *)0xffffa08849a43000 +(void *)0xffffa08849a64000 +(void *)0xffffa08849a85000 +(void *)0xffffa08849aa6000 +(void *)0xffffa08849ac7000 +(void *)0xffffa08849ae8000 +(void *)0xffffa08849401000 +(void *)0xffffa08849422000 +(void *)0xffffa08849443000 +(void *)0xffffa08849464000 +(void *)0xffffa08849485000 +(void *)0xffffa088494a6000 +(void *)0xffffa088494c7000 +(void *)0xffffa088494e8000 +(void *)0xffffa0895f601000 +(void *)0xffffa0895f622000 +(void *)0xffffa0895f643000 +(void *)0xffffa0895f664000 +(void *)0xffffa0895f685000 +(void *)0xffffa0895f6a6000 +(void *)0xffffa0895f6c7000 +(void *)0xffffa0895f6e8000 +(void *)0xffffa08849001000 +(void *)0xffffa08849022000 +(void *)0xffffa08849043000 +(void *)0xffffa08849064000 +(void *)0xffffa08849085000 +(void *)0xffffa088490a6000 +(void *)0xffffa088490c7000 +(void *)0xffffa088490e8000 +(void *)0xffffa0891c201000 +(void *)0xffffa0891c222000 +(void *)0xffffa0891c243000 +(void *)0xffffa0891c264000 +(void *)0xffffa0891c285000 +(void *)0xffffa0891c2a6000 +(void *)0xffffa0891c2c7000 +(void *)0xffffa0891c2e8000 +(void *)0xffffa08848c01000 +(void *)0xffffa08848c22000 +(void *)0xffffa08848c43000 +(void *)0xffffa08848c64000 +(void *)0xffffa08848c85000 +(void *)0xffffa08848ca6000 +(void *)0xffffa08848cc7000 +(void *)0xffffa08848ce8000 +(void *)0xffffa08848801000 +(void *)0xffffa08848822000 +(void *)0xffffa08848843000 +(void *)0xffffa08848864000 +(void *)0xffffa08848885000 +(void *)0xffffa088488a6000 +(void *)0xffffa088488c7000 +(void *)0xffffa088488e8000 +(void *)0xffffa08848401000 +(void *)0xffffa08848422000 +(void *)0xffffa08848443000 +(void *)0xffffa08848464000 +(void *)0xffffa08848485000 +(void *)0xffffa088484a6000 +(void *)0xffffa088484c7000 +(void *)0xffffa088484e8000 +(void *)0xffffa08892801000 +(void *)0xffffa08892822000 +(void *)0xffffa08892843000 +(void *)0xffffa08892864000 +(void *)0xffffa08892885000 +(void *)0xffffa088928a6000 +(void *)0xffffa088928c7000 +(void *)0xffffa088928e8000 +(void *)0xffffa0895fa01000 +(void *)0xffffa0895fa22000 +(void *)0xffffa0895fa43000 +(void *)0xffffa0895fa64000 +(void *)0xffffa0895fa85000 +(void *)0xffffa0895faa6000 +(void *)0xffffa0895fac7000 +(void *)0xffffa0895fae8000 +(void *)0xffffa08850601000 +(void *)0xffffa08850622000 +(void *)0xffffa08850643000 +(void *)0xffffa08850664000 +(void *)0xffffa08850685000 +(void *)0xffffa088506a6000 +(void *)0xffffa088506c7000 +(void *)0xffffa088506e8000 +(void *)0xffffa08850a01000 +(void *)0xffffa08850a22000 +(void *)0xffffa08850a43000 +(void *)0xffffa08850a64000 +(void *)0xffffa08850a85000 +(void *)0xffffa08850aa6000 +(void *)0xffffa08850ac7000 +(void *)0xffffa08850ae8000 +(void *)0xffffa08850e01000 +(void *)0xffffa08850e22000 +(void *)0xffffa08850e43000 +(void *)0xffffa08850e64000 +(void *)0xffffa08850e85000 +(void *)0xffffa08850ea6000 +(void *)0xffffa08850ec7000 +(void *)0xffffa08850ee8000 +(void *)0xffffa08963401000 +(void *)0xffffa08963422000 +(void *)0xffffa08963443000 +(void *)0xffffa08963464000 +(void *)0xffffa08963485000 +(void *)0xffffa089634a6000 +(void *)0xffffa089634c7000 +(void *)0xffffa089634e8000 +(void *)0xffffa08892e01000 +(void *)0xffffa08892e22000 +(void *)0xffffa08892e43000 +(void *)0xffffa08892e64000 +(void *)0xffffa08892e85000 +(void *)0xffffa08892ea6000 +(void *)0xffffa08892ec7000 +(void *)0xffffa08892ee8000 +(void *)0xffffa08920c01000 +(void *)0xffffa08920c22000 +(void *)0xffffa08920c43000 +(void *)0xffffa08920c64000 +(void *)0xffffa08920c85000 +(void *)0xffffa08920ca6000 +(void *)0xffffa08920cc7000 +(void *)0xffffa08920ce8000 +(void *)0xffffa08846801000 +(void *)0xffffa08846822000 +(void *)0xffffa08846843000 +(void *)0xffffa08846864000 +(void *)0xffffa08846885000 +(void *)0xffffa088468a6000 +(void *)0xffffa088468c7000 +(void *)0xffffa088468e8000 +(void *)0xffffa087ddc01000 +(void *)0xffffa087ddc22000 +(void *)0xffffa087ddc43000 +(void *)0xffffa087ddc64000 +(void *)0xffffa087ddc85000 +(void *)0xffffa087ddca6000 +(void *)0xffffa087ddcc7000 +(void *)0xffffa087ddce8000 +(void *)0xffffa088fd401000 +(void *)0xffffa088fd422000 +(void *)0xffffa088fd443000 +(void *)0xffffa088fd464000 +(void *)0xffffa088fd485000 +(void *)0xffffa088fd4a6000 +(void *)0xffffa088fd4c7000 +(void *)0xffffa088fd4e8000 +(void *)0xffffa087dda01000 +(void *)0xffffa087dda22000 +(void *)0xffffa087dda43000 +(void *)0xffffa087dda64000 +(void *)0xffffa087dda85000 +(void *)0xffffa087ddaa6000 +(void *)0xffffa087ddac7000 +(void *)0xffffa087ddae8000 +(void *)0xffffa08964001000 +(void *)0xffffa08964022000 +(void *)0xffffa08964043000 +(void *)0xffffa08964064000 +(void *)0xffffa08964085000 +(void *)0xffffa089640a6000 +(void *)0xffffa089640c7000 +(void *)0xffffa089640e8000 +(void *)0xffffa087dd401000 +(void *)0xffffa087dd422000 +(void *)0xffffa087dd443000 +(void *)0xffffa087dd464000 +(void *)0xffffa087dd485000 +(void *)0xffffa087dd4a6000 +(void *)0xffffa087dd4c7000 +(void *)0xffffa087dd4e8000 +(void *)0xffffa087dd601000 +(void *)0xffffa087dd622000 +(void *)0xffffa087dd643000 +(void *)0xffffa087dd664000 +(void *)0xffffa087dd685000 +(void *)0xffffa087dd6a6000 +(void *)0xffffa087dd6c7000 +(void *)0xffffa087dd6e8000 +(void *)0xffffa08955601000 +(void *)0xffffa08955622000 +(void *)0xffffa08955643000 +(void *)0xffffa08955664000 +(void *)0xffffa08955685000 +(void *)0xffffa089556a6000 +(void *)0xffffa089556c7000 +(void *)0xffffa089556e8000 +(void *)0xffffa0888f001000 +(void *)0xffffa0888f022000 +(void *)0xffffa0888f043000 +(void *)0xffffa0888f064000 +(void *)0xffffa0888f085000 +(void *)0xffffa0888f0a6000 +(void *)0xffffa0888f0c7000 +(void *)0xffffa0888f0e8000 +(void *)0xffffa088c3c01000 +(void *)0xffffa088c3c22000 +(void *)0xffffa088c3c43000 +(void *)0xffffa088c3c64000 +(void *)0xffffa088c3c85000 +(void *)0xffffa088c3ca6000 +(void *)0xffffa088c3cc7000 +(void *)0xffffa088c3ce8000 +(void *)0xffffa08891801000 +(void *)0xffffa08891822000 +(void *)0xffffa08891843000 +(void *)0xffffa08891864000 +(void *)0xffffa08891885000 +(void *)0xffffa088918a6000 +(void *)0xffffa088918c7000 +(void *)0xffffa088918e8000 +(void *)0xffffa0893ee01000 +(void *)0xffffa0893ee22000 +(void *)0xffffa0893ee43000 +(void *)0xffffa0893ee64000 +(void *)0xffffa0893ee85000 +(void *)0xffffa0893eea6000 +(void *)0xffffa0893eec7000 +(void *)0xffffa0893eee8000 +(void *)0xffffa0895e001000 +(void *)0xffffa0895e022000 +(void *)0xffffa0895e043000 +(void *)0xffffa0895e064000 +(void *)0xffffa0895e085000 +(void *)0xffffa0895e0a6000 +(void *)0xffffa0895e0c7000 +(void *)0xffffa0895e0e8000 +(void *)0xffffa08965601000 +(void *)0xffffa08965622000 +(void *)0xffffa08965643000 +(void *)0xffffa08965664000 +(void *)0xffffa08965685000 +(void *)0xffffa089656a6000 +(void *)0xffffa089656c7000 +(void *)0xffffa089656e8000 +(void *)0xffffa0888c201000 +(void *)0xffffa0888c222000 +(void *)0xffffa0888c243000 +(void *)0xffffa0888c264000 +(void *)0xffffa0888c285000 +(void *)0xffffa0888c2a6000 +(void *)0xffffa0888c2c7000 +(void *)0xffffa0888c2e8000 +(void *)0xffffa087eaa01000 +(void *)0xffffa087eaa22000 +(void *)0xffffa087eaa43000 +(void *)0xffffa087eaa64000 +(void *)0xffffa087eaa85000 +(void *)0xffffa087eaaa6000 +(void *)0xffffa087eaac7000 +(void *)0xffffa087eaae8000 +(void *)0xffffa088c4e01000 +(void *)0xffffa088c4e22000 +(void *)0xffffa088c4e43000 +(void *)0xffffa088c4e64000 +(void *)0xffffa088c4e85000 +(void *)0xffffa088c4ea6000 +(void *)0xffffa088c4ec7000 +(void *)0xffffa088c4ee8000 +(void *)0xffffa08846c01000 +(void *)0xffffa08846c22000 +(void *)0xffffa08846c43000 +(void *)0xffffa08846c64000 +(void *)0xffffa08846c85000 +(void *)0xffffa08846ca6000 +(void *)0xffffa08846cc7000 +(void *)0xffffa08846ce8000 +(void *)0xffffa08851c01000 +(void *)0xffffa08851c22000 +(void *)0xffffa08851c43000 +(void *)0xffffa08851c64000 +(void *)0xffffa08851c85000 +(void *)0xffffa08851ca6000 +(void *)0xffffa08851cc7000 +(void *)0xffffa08851ce8000 +(void *)0xffffa0884e801000 +(void *)0xffffa0884e822000 +(void *)0xffffa0884e843000 +(void *)0xffffa0884e864000 +(void *)0xffffa0884e885000 +(void *)0xffffa0884e8a6000 +(void *)0xffffa0884e8c7000 +(void *)0xffffa0884e8e8000 +(void *)0xffffa087ea601000 +(void *)0xffffa087ea622000 +(void *)0xffffa087ea643000 +(void *)0xffffa087ea664000 +(void *)0xffffa087ea685000 +(void *)0xffffa087ea6a6000 +(void *)0xffffa087ea6c7000 +(void *)0xffffa087ea6e8000 +(void *)0xffffa08960401000 +(void *)0xffffa08960422000 +(void *)0xffffa08960443000 +(void *)0xffffa08960464000 +(void *)0xffffa08960485000 +(void *)0xffffa089604a6000 +(void *)0xffffa089604c7000 +(void *)0xffffa089604e8000 +(void *)0xffffa08946c01000 +(void *)0xffffa08946c22000 +(void *)0xffffa08946c43000 +(void *)0xffffa08946c64000 +(void *)0xffffa08946c85000 +(void *)0xffffa08946ca6000 +(void *)0xffffa08946cc7000 +(void *)0xffffa08946ce8000 +(void *)0xffffa0894dc01000 +(void *)0xffffa0894dc22000 +(void *)0xffffa0894dc43000 +(void *)0xffffa0894dc64000 +(void *)0xffffa0894dc85000 +(void *)0xffffa0894dca6000 +(void *)0xffffa0894dcc7000 +(void *)0xffffa0894dce8000 +(void *)0xffffa08851401000 +(void *)0xffffa08851422000 +(void *)0xffffa08851443000 +(void *)0xffffa08851464000 +(void *)0xffffa08851485000 +(void *)0xffffa088514a6000 +(void *)0xffffa088514c7000 +(void *)0xffffa088514e8000 +(void *)0xffffa087ea201000 +(void *)0xffffa087ea222000 +(void *)0xffffa087ea243000 +(void *)0xffffa087ea264000 +(void *)0xffffa087ea285000 +(void *)0xffffa087ea2a6000 +(void *)0xffffa087ea2c7000 +(void *)0xffffa087ea2e8000 +(void *)0xffffa0893ba01000 +(void *)0xffffa0893ba22000 +(void *)0xffffa0893ba43000 +(void *)0xffffa0893ba64000 +(void *)0xffffa0893ba85000 +(void *)0xffffa0893baa6000 +(void *)0xffffa0893bac7000 +(void *)0xffffa0893bae8000 +(void *)0xffffa087e9c01000 +(void *)0xffffa087e9c22000 +(void *)0xffffa087e9c43000 +(void *)0xffffa087e9c64000 +(void *)0xffffa087e9c85000 +(void *)0xffffa087e9ca6000 +(void *)0xffffa087e9cc7000 +(void *)0xffffa087e9ce8000 +(void *)0xffffa087e9e01000 +(void *)0xffffa087e9e22000 +(void *)0xffffa087e9e43000 +(void *)0xffffa087e9e64000 +(void *)0xffffa087e9e85000 +(void *)0xffffa087e9ea6000 +(void *)0xffffa087e9ec7000 +(void *)0xffffa087e9ee8000 +(void *)0xffffa087e9801000 +(void *)0xffffa087e9822000 +(void *)0xffffa087e9843000 +(void *)0xffffa087e9864000 +(void *)0xffffa087e9885000 +(void *)0xffffa087e98a6000 +(void *)0xffffa087e98c7000 +(void *)0xffffa087e98e8000 +(void *)0xffffa0893b401000 +(void *)0xffffa0893b422000 +(void *)0xffffa0893b443000 +(void *)0xffffa0893b464000 +(void *)0xffffa0893b485000 +(void *)0xffffa0893b4a6000 +(void *)0xffffa0893b4c7000 +(void *)0xffffa0893b4e8000 +(void *)0xffffa087e9a01000 +(void *)0xffffa087e9a22000 +(void *)0xffffa087e9a43000 +(void *)0xffffa087e9a64000 +(void *)0xffffa087e9a85000 +(void *)0xffffa087e9aa6000 +(void *)0xffffa087e9ac7000 +(void *)0xffffa087e9ae8000 +(void *)0xffffa088cd801000 +(void *)0xffffa088cd822000 +(void *)0xffffa088cd843000 +(void *)0xffffa088cd864000 +(void *)0xffffa088cd885000 +(void *)0xffffa088cd8a6000 +(void *)0xffffa088cd8c7000 +(void *)0xffffa088cd8e8000 +(void *)0xffffa088cb201000 +(void *)0xffffa088cb222000 +(void *)0xffffa088cb243000 +(void *)0xffffa088cb264000 +(void *)0xffffa088cb285000 +(void *)0xffffa088cb2a6000 +(void *)0xffffa088cb2c7000 +(void *)0xffffa088cb2e8000 +(void *)0xffffa0893ca01000 +(void *)0xffffa0893ca22000 +(void *)0xffffa0893ca43000 +(void *)0xffffa0893ca64000 +(void *)0xffffa0893ca85000 +(void *)0xffffa0893caa6000 +(void *)0xffffa0893cac7000 +(void *)0xffffa0893cae8000 +(void *)0xffffa08891c01000 +(void *)0xffffa08891c22000 +(void *)0xffffa08891c43000 +(void *)0xffffa08891c64000 +(void *)0xffffa08891c85000 +(void *)0xffffa08891ca6000 +(void *)0xffffa08891cc7000 +(void *)0xffffa08891ce8000 +(void *)0xffffa088cf601000 +(void *)0xffffa088cf622000 +(void *)0xffffa088cf643000 +(void *)0xffffa088cf664000 +(void *)0xffffa088cf685000 +(void *)0xffffa088cf6a6000 +(void *)0xffffa088cf6c7000 +(void *)0xffffa088cf6e8000 +(void *)0xffffa08938a01000 +(void *)0xffffa08938a22000 +(void *)0xffffa08938a43000 +(void *)0xffffa08938a64000 +(void *)0xffffa08938a85000 +(void *)0xffffa08938aa6000 +(void *)0xffffa08938ac7000 +(void *)0xffffa08938ae8000 +(void *)0xffffa087e9401000 +(void *)0xffffa087e9422000 +(void *)0xffffa087e9443000 +(void *)0xffffa087e9464000 +(void *)0xffffa087e9485000 +(void *)0xffffa087e94a6000 +(void *)0xffffa087e94c7000 +(void *)0xffffa087e94e8000 +(void *)0xffffa087e9601000 +(void *)0xffffa087e9622000 +(void *)0xffffa087e9643000 +(void *)0xffffa087e9664000 +(void *)0xffffa087e9685000 +(void *)0xffffa087e96a6000 +(void *)0xffffa087e96c7000 +(void *)0xffffa087e96e8000 +(void *)0xffffa0889ce01000 +(void *)0xffffa0889ce22000 +(void *)0xffffa0889ce43000 +(void *)0xffffa0889ce64000 +(void *)0xffffa0889ce85000 +(void *)0xffffa0889cea6000 +(void *)0xffffa0889cec7000 +(void *)0xffffa0889cee8000 +(void *)0xffffa08930001000 +(void *)0xffffa08930022000 +(void *)0xffffa08930043000 +(void *)0xffffa08930064000 +(void *)0xffffa08930085000 +(void *)0xffffa089300a6000 +(void *)0xffffa089300c7000 +(void *)0xffffa089300e8000 +(void *)0xffffa08887c01000 +(void *)0xffffa08887c22000 +(void *)0xffffa08887c43000 +(void *)0xffffa08887c64000 +(void *)0xffffa08887c85000 +(void *)0xffffa08887ca6000 +(void *)0xffffa08887cc7000 +(void *)0xffffa08887ce8000 +(void *)0xffffa0888ec01000 +(void *)0xffffa0888ec22000 +(void *)0xffffa0888ec43000 +(void *)0xffffa0888ec64000 +(void *)0xffffa0888ec85000 +(void *)0xffffa0888eca6000 +(void *)0xffffa0888ecc7000 +(void *)0xffffa0888ece8000 +(void *)0xffffa08888801000 +(void *)0xffffa08888822000 +(void *)0xffffa08888843000 +(void *)0xffffa08888864000 +(void *)0xffffa08888885000 +(void *)0xffffa088888a6000 +(void *)0xffffa088888c7000 +(void *)0xffffa088888e8000 +(void *)0xffffa08894201000 +(void *)0xffffa08894222000 +(void *)0xffffa08894243000 +(void *)0xffffa08894264000 +(void *)0xffffa08894285000 +(void *)0xffffa088942a6000 +(void *)0xffffa088942c7000 +(void *)0xffffa088942e8000 +(void *)0xffffa08958a01000 +(void *)0xffffa08958a22000 +(void *)0xffffa08958a43000 +(void *)0xffffa08958a64000 +(void *)0xffffa08958a85000 +(void *)0xffffa08958aa6000 +(void *)0xffffa08958ac7000 +(void *)0xffffa08958ae8000 +(void *)0xffffa087e9001000 +(void *)0xffffa087e9022000 +(void *)0xffffa087e9043000 +(void *)0xffffa087e9064000 +(void *)0xffffa087e9085000 +(void *)0xffffa087e90a6000 +(void *)0xffffa087e90c7000 +(void *)0xffffa087e90e8000 +(void *)0xffffa08888601000 +(void *)0xffffa08888622000 +(void *)0xffffa08888643000 +(void *)0xffffa08888664000 +(void *)0xffffa08888685000 +(void *)0xffffa088886a6000 +(void *)0xffffa088886c7000 +(void *)0xffffa088886e8000 +(void *)0xffffa087e9201000 +(void *)0xffffa087e9222000 +(void *)0xffffa087e9243000 +(void *)0xffffa087e9264000 +(void *)0xffffa087e9285000 +(void *)0xffffa087e92a6000 +(void *)0xffffa087e92c7000 +(void *)0xffffa087e92e8000 +(void *)0xffffa087e8e01000 +(void *)0xffffa087e8e22000 +(void *)0xffffa087e8e43000 +(void *)0xffffa087e8e64000 +(void *)0xffffa087e8e85000 +(void *)0xffffa087e8ea6000 +(void *)0xffffa087e8ec7000 +(void *)0xffffa087e8ee8000 +(void *)0xffffa08932a01000 +(void *)0xffffa08932a22000 +(void *)0xffffa08932a43000 +(void *)0xffffa08932a64000 +(void *)0xffffa08932a85000 +(void *)0xffffa08932aa6000 +(void *)0xffffa08932ac7000 +(void *)0xffffa08932ae8000 +(void *)0xffffa087e8801000 +(void *)0xffffa087e8822000 +(void *)0xffffa087e8843000 +(void *)0xffffa087e8864000 +(void *)0xffffa087e8885000 +(void *)0xffffa087e88a6000 +(void *)0xffffa087e88c7000 +(void *)0xffffa087e88e8000 +(void *)0xffffa087e8401000 +(void *)0xffffa087e8422000 +(void *)0xffffa087e8443000 +(void *)0xffffa087e8464000 +(void *)0xffffa087e8485000 +(void *)0xffffa087e84a6000 +(void *)0xffffa087e84c7000 +(void *)0xffffa087e84e8000 +(void *)0xffffa087e8001000 +(void *)0xffffa087e8022000 +(void *)0xffffa087e8043000 +(void *)0xffffa087e8064000 +(void *)0xffffa087e8085000 +(void *)0xffffa087e80a6000 +(void *)0xffffa087e80c7000 +(void *)0xffffa087e80e8000 +(void *)0xffffa0889ee01000 +(void *)0xffffa0889ee22000 +(void *)0xffffa0889ee43000 +(void *)0xffffa0889ee64000 +(void *)0xffffa0889ee85000 +(void *)0xffffa0889eea6000 +(void *)0xffffa0889eec7000 +(void *)0xffffa0889eee8000 +(void *)0xffffa08770201000 +(void *)0xffffa08770222000 +(void *)0xffffa08770243000 +(void *)0xffffa08770264000 +(void *)0xffffa08770285000 +(void *)0xffffa087702a6000 +(void *)0xffffa087702c7000 +(void *)0xffffa087702e8000 +(void *)0xffffa08931e01000 +(void *)0xffffa08931e22000 +(void *)0xffffa08931e43000 +(void *)0xffffa08931e64000 +(void *)0xffffa08931e85000 +(void *)0xffffa08931ea6000 +(void *)0xffffa08931ec7000 +(void *)0xffffa08931ee8000 +(void *)0xffffa087e8201000 +(void *)0xffffa087e8222000 +(void *)0xffffa087e8243000 +(void *)0xffffa087e8264000 +(void *)0xffffa087e8285000 +(void *)0xffffa087e82a6000 +(void *)0xffffa087e82c7000 +(void *)0xffffa087e82e8000 +(void *)0xffffa08770801000 +(void *)0xffffa08770822000 +(void *)0xffffa08770843000 +(void *)0xffffa08770864000 +(void *)0xffffa08770885000 +(void *)0xffffa087708a6000 +(void *)0xffffa087708c7000 +(void *)0xffffa087708e8000 +(void *)0xffffa0884fc01000 +(void *)0xffffa0884fc22000 +(void *)0xffffa0884fc43000 +(void *)0xffffa0884fc64000 +(void *)0xffffa0884fc85000 +(void *)0xffffa0884fca6000 +(void *)0xffffa0884fcc7000 +(void *)0xffffa0884fce8000 +(void *)0xffffa08949201000 +(void *)0xffffa08949222000 +(void *)0xffffa08949243000 +(void *)0xffffa08949264000 +(void *)0xffffa08949285000 +(void *)0xffffa089492a6000 +(void *)0xffffa089492c7000 +(void *)0xffffa089492e8000 +(void *)0xffffa087e7e01000 +(void *)0xffffa087e7e22000 +(void *)0xffffa087e7e43000 +(void *)0xffffa087e7e64000 +(void *)0xffffa087e7e85000 +(void *)0xffffa087e7ea6000 +(void *)0xffffa087e7ec7000 +(void *)0xffffa087e7ee8000 +(void *)0xffffa088cda01000 +(void *)0xffffa088cda22000 +(void *)0xffffa088cda43000 +(void *)0xffffa088cda64000 +(void *)0xffffa088cda85000 +(void *)0xffffa088cdaa6000 +(void *)0xffffa088cdac7000 +(void *)0xffffa088cdae8000 +(void *)0xffffa087e6a01000 +(void *)0xffffa087e6a22000 +(void *)0xffffa087e6a43000 +(void *)0xffffa087e6a64000 +(void *)0xffffa087e6a85000 +(void *)0xffffa087e6aa6000 +(void *)0xffffa087e6ac7000 +(void *)0xffffa087e6ae8000 +(void *)0xffffa087e7a01000 +(void *)0xffffa087e7a22000 +(void *)0xffffa087e7a43000 +(void *)0xffffa087e7a64000 +(void *)0xffffa087e7a85000 +(void *)0xffffa087e7aa6000 +(void *)0xffffa087e7ac7000 +(void *)0xffffa087e7ae8000 +(void *)0xffffa0876f801000 +(void *)0xffffa0876f822000 +(void *)0xffffa0876f843000 +(void *)0xffffa0876f864000 +(void *)0xffffa0876f885000 +(void *)0xffffa0876f8a6000 +(void *)0xffffa0876f8c7000 +(void *)0xffffa0876f8e8000 +(void *)0xffffa087e6201000 +(void *)0xffffa087e6222000 +(void *)0xffffa087e6243000 +(void *)0xffffa087e6264000 +(void *)0xffffa087e6285000 +(void *)0xffffa087e62a6000 +(void *)0xffffa087e62c7000 +(void *)0xffffa087e62e8000 +(void *)0xffffa0888f801000 +(void *)0xffffa0888f822000 +(void *)0xffffa0888f843000 +(void *)0xffffa0888f864000 +(void *)0xffffa0888f885000 +(void *)0xffffa0888f8a6000 +(void *)0xffffa0888f8c7000 +(void *)0xffffa0888f8e8000 +(void *)0xffffa087e5a01000 +(void *)0xffffa087e5a22000 +(void *)0xffffa087e5a43000 +(void *)0xffffa087e5a64000 +(void *)0xffffa087e5a85000 +(void *)0xffffa087e5aa6000 +(void *)0xffffa087e5ac7000 +(void *)0xffffa087e5ae8000 +(void *)0xffffa0888a601000 +(void *)0xffffa0888a622000 +(void *)0xffffa0888a643000 +(void *)0xffffa0888a664000 +(void *)0xffffa0888a685000 +(void *)0xffffa0888a6a6000 +(void *)0xffffa0888a6c7000 +(void *)0xffffa0888a6e8000 +(void *)0xffffa087e5401000 +(void *)0xffffa087e5422000 +(void *)0xffffa087e5443000 +(void *)0xffffa087e5464000 +(void *)0xffffa087e5485000 +(void *)0xffffa087e54a6000 +(void *)0xffffa087e54c7000 +(void *)0xffffa087e54e8000 +(void *)0xffffa087e5001000 +(void *)0xffffa087e5022000 +(void *)0xffffa087e5043000 +(void *)0xffffa087e5064000 +(void *)0xffffa087e5085000 +(void *)0xffffa087e50a6000 +(void *)0xffffa087e50c7000 +(void *)0xffffa087e50e8000 +(void *)0xffffa087e4601000 +(void *)0xffffa087e4622000 +(void *)0xffffa087e4643000 +(void *)0xffffa087e4664000 +(void *)0xffffa087e4685000 +(void *)0xffffa087e46a6000 +(void *)0xffffa087e46c7000 +(void *)0xffffa087e46e8000 +(void *)0xffffa0893f201000 +(void *)0xffffa0893f222000 +(void *)0xffffa0893f243000 +(void *)0xffffa0893f264000 +(void *)0xffffa0893f285000 +(void *)0xffffa0893f2a6000 +(void *)0xffffa0893f2c7000 +(void *)0xffffa0893f2e8000 +(void *)0xffffa087d7801000 +(void *)0xffffa087d7822000 +(void *)0xffffa087d7843000 +(void *)0xffffa087d7864000 +(void *)0xffffa087d7885000 +(void *)0xffffa087d78a6000 +(void *)0xffffa087d78c7000 +(void *)0xffffa087d78e8000 +(void *)0xffffa08770e01000 +(void *)0xffffa08770e22000 +(void *)0xffffa08770e43000 +(void *)0xffffa08770e64000 +(void *)0xffffa08770e85000 +(void *)0xffffa08770ea6000 +(void *)0xffffa08770ec7000 +(void *)0xffffa08770ee8000 +(void *)0xffffa087e5e01000 +(void *)0xffffa087e5e22000 +(void *)0xffffa087e5e43000 +(void *)0xffffa087e5e64000 +(void *)0xffffa087e5e85000 +(void *)0xffffa087e5ea6000 +(void *)0xffffa087e5ec7000 +(void *)0xffffa087e5ee8000 +(void *)0xffffa08770601000 +(void *)0xffffa08770622000 +(void *)0xffffa08770643000 +(void *)0xffffa08770664000 +(void *)0xffffa08770685000 +(void *)0xffffa087706a6000 +(void *)0xffffa087706c7000 +(void *)0xffffa087706e8000 +(void *)0xffffa0876fe01000 +(void *)0xffffa0876fe22000 +(void *)0xffffa0876fe43000 +(void *)0xffffa0876fe64000 +(void *)0xffffa0876fe85000 +(void *)0xffffa0876fea6000 +(void *)0xffffa0876fec7000 +(void *)0xffffa0876fee8000 +(void *)0xffffa0888fa01000 +(void *)0xffffa0888fa22000 +(void *)0xffffa0888fa43000 +(void *)0xffffa0888fa64000 +(void *)0xffffa0888fa85000 +(void *)0xffffa0888faa6000 +(void *)0xffffa0888fac7000 +(void *)0xffffa0888fae8000 +(void *)0xffffa08897001000 +(void *)0xffffa08897022000 +(void *)0xffffa08897043000 +(void *)0xffffa08897064000 +(void *)0xffffa08897085000 +(void *)0xffffa088970a6000 +(void *)0xffffa088970c7000 +(void *)0xffffa088970e8000 +(void *)0xffffa0888e401000 +(void *)0xffffa0888e422000 +(void *)0xffffa0888e443000 +(void *)0xffffa0888e464000 +(void *)0xffffa0888e485000 +(void *)0xffffa0888e4a6000 +(void *)0xffffa0888e4c7000 +(void *)0xffffa0888e4e8000 +(void *)0xffffa0888c401000 +(void *)0xffffa0888c422000 +(void *)0xffffa0888c443000 +(void *)0xffffa0888c464000 +(void *)0xffffa0888c485000 +(void *)0xffffa0888c4a6000 +(void *)0xffffa0888c4c7000 +(void *)0xffffa0888c4e8000 +(void *)0xffffa08932601000 +(void *)0xffffa08932622000 +(void *)0xffffa08932643000 +(void *)0xffffa08932664000 +(void *)0xffffa08932685000 +(void *)0xffffa089326a6000 +(void *)0xffffa089326c7000 +(void *)0xffffa089326e8000 +(void *)0xffffa0888ea01000 +(void *)0xffffa0888ea22000 +(void *)0xffffa0888ea43000 +(void *)0xffffa0888ea64000 +(void *)0xffffa0888ea85000 +(void *)0xffffa0888eaa6000 +(void *)0xffffa0888eac7000 +(void *)0xffffa0888eae8000 +(void *)0xffffa08945201000 +(void *)0xffffa08945222000 +(void *)0xffffa08945243000 +(void *)0xffffa08945264000 +(void *)0xffffa08945285000 +(void *)0xffffa089452a6000 +(void *)0xffffa089452c7000 +(void *)0xffffa089452e8000 +(void *)0xffffa0888da01000 +(void *)0xffffa0888da22000 +(void *)0xffffa0888da43000 +(void *)0xffffa0888da64000 +(void *)0xffffa0888da85000 +(void *)0xffffa0888daa6000 +(void *)0xffffa0888dac7000 +(void *)0xffffa0888dae8000 +(void *)0xffffa0895c001000 +(void *)0xffffa0895c022000 +(void *)0xffffa0895c043000 +(void *)0xffffa0895c064000 +(void *)0xffffa0895c085000 +(void *)0xffffa0895c0a6000 +(void *)0xffffa0895c0c7000 +(void *)0xffffa0895c0e8000 +(void *)0xffffa08962201000 +(void *)0xffffa08962222000 +(void *)0xffffa08962243000 +(void *)0xffffa08962264000 +(void *)0xffffa08962285000 +(void *)0xffffa089622a6000 +(void *)0xffffa089622c7000 +(void *)0xffffa089622e8000 +(void *)0xffffa0888e001000 +(void *)0xffffa0888e022000 +(void *)0xffffa0888e043000 +(void *)0xffffa0888e064000 +(void *)0xffffa0888e085000 +(void *)0xffffa0888e0a6000 +(void *)0xffffa0888e0c7000 +(void *)0xffffa0888e0e8000 +(void *)0xffffa08960201000 +(void *)0xffffa08960222000 +(void *)0xffffa08960243000 +(void *)0xffffa08960264000 +(void *)0xffffa08960285000 +(void *)0xffffa089602a6000 +(void *)0xffffa089602c7000 +(void *)0xffffa089602e8000 +(void *)0xffffa08893a01000 +(void *)0xffffa08893a22000 +(void *)0xffffa08893a43000 +(void *)0xffffa08893a64000 +(void *)0xffffa08893a85000 +(void *)0xffffa08893aa6000 +(void *)0xffffa08893ac7000 +(void *)0xffffa08893ae8000 +(void *)0xffffa088cf201000 +(void *)0xffffa088cf222000 +(void *)0xffffa088cf243000 +(void *)0xffffa088cf264000 +(void *)0xffffa088cf285000 +(void *)0xffffa088cf2a6000 +(void *)0xffffa088cf2c7000 +(void *)0xffffa088cf2e8000 +(void *)0xffffa0888de01000 +(void *)0xffffa0888de22000 +(void *)0xffffa0888de43000 +(void *)0xffffa0888de64000 +(void *)0xffffa0888de85000 +(void *)0xffffa0888dea6000 +(void *)0xffffa0888dec7000 +(void *)0xffffa0888dee8000 +(void *)0xffffa087e3601000 +(void *)0xffffa087e3622000 +(void *)0xffffa087e3643000 +(void *)0xffffa087e3664000 +(void *)0xffffa087e3685000 +(void *)0xffffa087e36a6000 +(void *)0xffffa087e36c7000 +(void *)0xffffa087e36e8000 +(void *)0xffffa0893b001000 +(void *)0xffffa0893b022000 +(void *)0xffffa0893b043000 +(void *)0xffffa0893b064000 +(void *)0xffffa0893b085000 +(void *)0xffffa0893b0a6000 +(void *)0xffffa0893b0c7000 +(void *)0xffffa0893b0e8000 +(void *)0xffffa0895d801000 +(void *)0xffffa0895d822000 +(void *)0xffffa0895d843000 +(void *)0xffffa0895d864000 +(void *)0xffffa0895d885000 +(void *)0xffffa0895d8a6000 +(void *)0xffffa0895d8c7000 +(void *)0xffffa0895d8e8000 +(void *)0xffffa087e2a01000 +(void *)0xffffa087e2a22000 +(void *)0xffffa087e2a43000 +(void *)0xffffa087e2a64000 +(void *)0xffffa087e2a85000 +(void *)0xffffa087e2aa6000 +(void *)0xffffa087e2ac7000 +(void *)0xffffa087e2ae8000 +(void *)0xffffa088ccc01000 +(void *)0xffffa088ccc22000 +(void *)0xffffa088ccc43000 +(void *)0xffffa088ccc64000 +(void *)0xffffa088ccc85000 +(void *)0xffffa088ccca6000 +(void *)0xffffa088cccc7000 +(void *)0xffffa088ccce8000 +(void *)0xffffa087e2401000 +(void *)0xffffa087e2422000 +(void *)0xffffa087e2443000 +(void *)0xffffa087e2464000 +(void *)0xffffa087e2485000 +(void *)0xffffa087e24a6000 +(void *)0xffffa087e24c7000 +(void *)0xffffa087e24e8000 +(void *)0xffffa087e3201000 +(void *)0xffffa087e3222000 +(void *)0xffffa087e3243000 +(void *)0xffffa087e3264000 +(void *)0xffffa087e3285000 +(void *)0xffffa087e32a6000 +(void *)0xffffa087e32c7000 +(void *)0xffffa087e32e8000 +(void *)0xffffa087e2001000 +(void *)0xffffa087e2022000 +(void *)0xffffa087e2043000 +(void *)0xffffa087e2064000 +(void *)0xffffa087e2085000 +(void *)0xffffa087e20a6000 +(void *)0xffffa087e20c7000 +(void *)0xffffa087e20e8000 +(void *)0xffffa087e1e01000 +(void *)0xffffa087e1e22000 +(void *)0xffffa087e1e43000 +(void *)0xffffa087e1e64000 +(void *)0xffffa087e1e85000 +(void *)0xffffa087e1ea6000 +(void *)0xffffa087e1ec7000 +(void *)0xffffa087e1ee8000 +(void *)0xffffa0888ce01000 +(void *)0xffffa0888ce22000 +(void *)0xffffa0888ce43000 +(void *)0xffffa0888ce64000 +(void *)0xffffa0888ce85000 +(void *)0xffffa0888cea6000 +(void *)0xffffa0888cec7000 +(void *)0xffffa0888cee8000 +(void *)0xffffa087e2e01000 +(void *)0xffffa087e2e22000 +(void *)0xffffa087e2e43000 +(void *)0xffffa087e2e64000 +(void *)0xffffa087e2e85000 +(void *)0xffffa087e2ea6000 +(void *)0xffffa087e2ec7000 +(void *)0xffffa087e2ee8000 +(void *)0xffffa087e2201000 +(void *)0xffffa087e2222000 +(void *)0xffffa087e2243000 +(void *)0xffffa087e2264000 +(void *)0xffffa087e2285000 +(void *)0xffffa087e22a6000 +(void *)0xffffa087e22c7000 +(void *)0xffffa087e22e8000 +(void *)0xffffa087e1201000 +(void *)0xffffa087e1222000 +(void *)0xffffa087e1243000 +(void *)0xffffa087e1264000 +(void *)0xffffa087e1285000 +(void *)0xffffa087e12a6000 +(void *)0xffffa087e12c7000 +(void *)0xffffa087e12e8000 +(void *)0xffffa087e0801000 +(void *)0xffffa087e0822000 +(void *)0xffffa087e0843000 +(void *)0xffffa087e0864000 +(void *)0xffffa087e0885000 +(void *)0xffffa087e08a6000 +(void *)0xffffa087e08c7000 +(void *)0xffffa087e08e8000 +(void *)0xffffa0889f201000 +(void *)0xffffa0889f222000 +(void *)0xffffa0889f243000 +(void *)0xffffa0889f264000 +(void *)0xffffa0889f285000 +(void *)0xffffa0889f2a6000 +(void *)0xffffa0889f2c7000 +(void *)0xffffa0889f2e8000 +(void *)0xffffa08959e01000 +(void *)0xffffa08959e22000 +(void *)0xffffa08959e43000 +(void *)0xffffa08959e64000 +(void *)0xffffa08959e85000 +(void *)0xffffa08959ea6000 +(void *)0xffffa08959ec7000 +(void *)0xffffa08959ee8000 +(void *)0xffffa087dd201000 +(void *)0xffffa087dd222000 +(void *)0xffffa087dd243000 +(void *)0xffffa087dd264000 +(void *)0xffffa087dd285000 +(void *)0xffffa087dd2a6000 +(void *)0xffffa087dd2c7000 +(void *)0xffffa087dd2e8000 +(void *)0xffffa08962401000 +(void *)0xffffa08962422000 +(void *)0xffffa08962443000 +(void *)0xffffa08962464000 +(void *)0xffffa08962485000 +(void *)0xffffa089624a6000 +(void *)0xffffa089624c7000 +(void *)0xffffa089624e8000 +(void *)0xffffa08894e01000 +(void *)0xffffa08894e22000 +(void *)0xffffa08894e43000 +(void *)0xffffa08894e64000 +(void *)0xffffa08894e85000 +(void *)0xffffa08894ea6000 +(void *)0xffffa08894ec7000 +(void *)0xffffa08894ee8000 +(void *)0xffffa0888d401000 +(void *)0xffffa0888d422000 +(void *)0xffffa0888d443000 +(void *)0xffffa0888d464000 +(void *)0xffffa0888d485000 +(void *)0xffffa0888d4a6000 +(void *)0xffffa0888d4c7000 +(void *)0xffffa0888d4e8000 +(void *)0xffffa087dc601000 +(void *)0xffffa087dc622000 +(void *)0xffffa087dc643000 +(void *)0xffffa087dc664000 +(void *)0xffffa087dc685000 +(void *)0xffffa087dc6a6000 +(void *)0xffffa087dc6c7000 +(void *)0xffffa087dc6e8000 +(void *)0xffffa0888f601000 +(void *)0xffffa0888f622000 +(void *)0xffffa0888f643000 +(void *)0xffffa0888f664000 +(void *)0xffffa0888f685000 +(void *)0xffffa0888f6a6000 +(void *)0xffffa0888f6c7000 +(void *)0xffffa0888f6e8000 +(void *)0xffffa087da201000 +(void *)0xffffa087da222000 +(void *)0xffffa087da243000 +(void *)0xffffa087da264000 +(void *)0xffffa087da285000 +(void *)0xffffa087da2a6000 +(void *)0xffffa087da2c7000 +(void *)0xffffa087da2e8000 +(void *)0xffffa088c9601000 +(void *)0xffffa088c9622000 +(void *)0xffffa088c9643000 +(void *)0xffffa088c9664000 +(void *)0xffffa088c9685000 +(void *)0xffffa088c96a6000 +(void *)0xffffa088c96c7000 +(void *)0xffffa088c96e8000 +(void *)0xffffa0884e401000 +(void *)0xffffa0884e422000 +(void *)0xffffa0884e443000 +(void *)0xffffa0884e464000 +(void *)0xffffa0884e485000 +(void *)0xffffa0884e4a6000 +(void *)0xffffa0884e4c7000 +(void *)0xffffa0884e4e8000 +(void *)0xffffa08852001000 +(void *)0xffffa08852022000 +(void *)0xffffa08852043000 +(void *)0xffffa08852064000 +(void *)0xffffa08852085000 +(void *)0xffffa088520a6000 +(void *)0xffffa088520c7000 +(void *)0xffffa088520e8000 +(void *)0xffffa08844a01000 +(void *)0xffffa08844a22000 +(void *)0xffffa08844a43000 +(void *)0xffffa08844a64000 +(void *)0xffffa08844a85000 +(void *)0xffffa08844aa6000 +(void *)0xffffa08844ac7000 +(void *)0xffffa08844ae8000 +(void *)0xffffa0884f801000 +(void *)0xffffa0884f822000 +(void *)0xffffa0884f843000 +(void *)0xffffa0884f864000 +(void *)0xffffa0884f885000 +(void *)0xffffa0884f8a6000 +(void *)0xffffa0884f8c7000 +(void *)0xffffa0884f8e8000 +(void *)0xffffa0884f401000 +(void *)0xffffa0884f422000 +(void *)0xffffa0884f443000 +(void *)0xffffa0884f464000 +(void *)0xffffa0884f485000 +(void *)0xffffa0884f4a6000 +(void *)0xffffa0884f4c7000 +(void *)0xffffa0884f4e8000 +(void *)0xffffa0884e001000 +(void *)0xffffa0884e022000 +(void *)0xffffa0884e043000 +(void *)0xffffa0884e064000 +(void *)0xffffa0884e085000 +(void *)0xffffa0884e0a6000 +(void *)0xffffa0884e0c7000 +(void *)0xffffa0884e0e8000 +(void *)0xffffa08844601000 +(void *)0xffffa08844622000 +(void *)0xffffa08844643000 +(void *)0xffffa08844664000 +(void *)0xffffa08844685000 +(void *)0xffffa088446a6000 +(void *)0xffffa088446c7000 +(void *)0xffffa088446e8000 +(void *)0xffffa0884dc01000 +(void *)0xffffa0884dc22000 +(void *)0xffffa0884dc43000 +(void *)0xffffa0884dc64000 +(void *)0xffffa0884dc85000 +(void *)0xffffa0884dca6000 +(void *)0xffffa0884dcc7000 +(void *)0xffffa0884dce8000 +(void *)0xffffa0884d801000 +(void *)0xffffa0884d822000 +(void *)0xffffa0884d843000 +(void *)0xffffa0884d864000 +(void *)0xffffa0884d885000 +(void *)0xffffa0884d8a6000 +(void *)0xffffa0884d8c7000 +(void *)0xffffa0884d8e8000 +(void *)0xffffa08843e01000 +(void *)0xffffa08843e22000 +(void *)0xffffa08843e43000 +(void *)0xffffa08843e64000 +(void *)0xffffa08843e85000 +(void *)0xffffa08843ea6000 +(void *)0xffffa08843ec7000 +(void *)0xffffa08843ee8000 +(void *)0xffffa0884f001000 +(void *)0xffffa0884f022000 +(void *)0xffffa0884f043000 +(void *)0xffffa0884f064000 +(void *)0xffffa0884f085000 +(void *)0xffffa0884f0a6000 +(void *)0xffffa0884f0c7000 +(void *)0xffffa0884f0e8000 +(void *)0xffffa0884ec01000 +(void *)0xffffa0884ec22000 +(void *)0xffffa0884ec43000 +(void *)0xffffa0884ec64000 +(void *)0xffffa0884ec85000 +(void *)0xffffa0884eca6000 +(void *)0xffffa0884ecc7000 +(void *)0xffffa0884ece8000 +(void *)0xffffa0884d401000 +(void *)0xffffa0884d422000 +(void *)0xffffa0884d443000 +(void *)0xffffa0884d464000 +(void *)0xffffa0884d485000 +(void *)0xffffa0884d4a6000 +(void *)0xffffa0884d4c7000 +(void *)0xffffa0884d4e8000 +(void *)0xffffa08843a01000 +(void *)0xffffa08843a22000 +(void *)0xffffa08843a43000 +(void *)0xffffa08843a64000 +(void *)0xffffa08843a85000 +(void *)0xffffa08843aa6000 +(void *)0xffffa08843ac7000 +(void *)0xffffa08843ae8000 +(void *)0xffffa0884d001000 +(void *)0xffffa0884d022000 +(void *)0xffffa0884d043000 +(void *)0xffffa0884d064000 +(void *)0xffffa0884d085000 +(void *)0xffffa0884d0a6000 +(void *)0xffffa0884d0c7000 +(void *)0xffffa0884d0e8000 +(void *)0xffffa0884cc01000 +(void *)0xffffa0884cc22000 +(void *)0xffffa0884cc43000 +(void *)0xffffa0884cc64000 +(void *)0xffffa0884cc85000 +(void *)0xffffa0884cca6000 +(void *)0xffffa0884ccc7000 +(void *)0xffffa0884cce8000 +(void *)0xffffa0884c801000 +(void *)0xffffa0884c822000 +(void *)0xffffa0884c843000 +(void *)0xffffa0884c864000 +(void *)0xffffa0884c885000 +(void *)0xffffa0884c8a6000 +(void *)0xffffa0884c8c7000 +(void *)0xffffa0884c8e8000 +(void *)0xffffa08843601000 +(void *)0xffffa08843622000 +(void *)0xffffa08843643000 +(void *)0xffffa08843664000 +(void *)0xffffa08843685000 +(void *)0xffffa088436a6000 +(void *)0xffffa088436c7000 +(void *)0xffffa088436e8000 +(void *)0xffffa08843201000 +(void *)0xffffa08843222000 +(void *)0xffffa08843243000 +(void *)0xffffa08843264000 +(void *)0xffffa08843285000 +(void *)0xffffa088432a6000 +(void *)0xffffa088432c7000 +(void *)0xffffa088432e8000 +(void *)0xffffa08842e01000 +(void *)0xffffa08842e22000 +(void *)0xffffa08842e43000 +(void *)0xffffa08842e64000 +(void *)0xffffa08842e85000 +(void *)0xffffa08842ea6000 +(void *)0xffffa08842ec7000 +(void *)0xffffa08842ee8000 +(void *)0xffffa08842601000 +(void *)0xffffa08842622000 +(void *)0xffffa08842643000 +(void *)0xffffa08842664000 +(void *)0xffffa08842685000 +(void *)0xffffa088426a6000 +(void *)0xffffa088426c7000 +(void *)0xffffa088426e8000 +(void *)0xffffa08842201000 +(void *)0xffffa08842222000 +(void *)0xffffa08842243000 +(void *)0xffffa08842264000 +(void *)0xffffa08842285000 +(void *)0xffffa088422a6000 +(void *)0xffffa088422c7000 +(void *)0xffffa088422e8000 +(void *)0xffffa0884be01000 +(void *)0xffffa0884be22000 +(void *)0xffffa0884be43000 +(void *)0xffffa0884be64000 +(void *)0xffffa0884be85000 +(void *)0xffffa0884bea6000 +(void *)0xffffa0884bec7000 +(void *)0xffffa0884bee8000 +(void *)0xffffa0884ba01000 +(void *)0xffffa0884ba22000 +(void *)0xffffa0884ba43000 +(void *)0xffffa0884ba64000 +(void *)0xffffa0884ba85000 +(void *)0xffffa0884baa6000 +(void *)0xffffa0884bac7000 +(void *)0xffffa0884bae8000 +(void *)0xffffa08841e01000 +(void *)0xffffa08841e22000 +(void *)0xffffa08841e43000 +(void *)0xffffa08841e64000 +(void *)0xffffa08841e85000 +(void *)0xffffa08841ea6000 +(void *)0xffffa08841ec7000 +(void *)0xffffa08841ee8000 +(void *)0xffffa08889e01000 +(void *)0xffffa08889e22000 +(void *)0xffffa08889e43000 +(void *)0xffffa08889e64000 +(void *)0xffffa08889e85000 +(void *)0xffffa08889ea6000 +(void *)0xffffa08889ec7000 +(void *)0xffffa08889ee8000 +(void *)0xffffa08893001000 +(void *)0xffffa08893022000 +(void *)0xffffa08893043000 +(void *)0xffffa08893064000 +(void *)0xffffa08893085000 +(void *)0xffffa088930a6000 +(void *)0xffffa088930c7000 +(void *)0xffffa088930e8000 +(void *)0xffffa087dc201000 +(void *)0xffffa087dc222000 +(void *)0xffffa087dc243000 +(void *)0xffffa087dc264000 +(void *)0xffffa087dc285000 +(void *)0xffffa087dc2a6000 +(void *)0xffffa087dc2c7000 +(void *)0xffffa087dc2e8000 +(void *)0xffffa087dbe01000 +(void *)0xffffa087dbe22000 +(void *)0xffffa087dbe43000 +(void *)0xffffa087dbe64000 +(void *)0xffffa087dbe85000 +(void *)0xffffa087dbea6000 +(void *)0xffffa087dbec7000 +(void *)0xffffa087dbee8000 +(void *)0xffffa087db001000 +(void *)0xffffa087db022000 +(void *)0xffffa087db043000 +(void *)0xffffa087db064000 +(void *)0xffffa087db085000 +(void *)0xffffa087db0a6000 +(void *)0xffffa087db0c7000 +(void *)0xffffa087db0e8000 +(void *)0xffffa087db201000 +(void *)0xffffa087db222000 +(void *)0xffffa087db243000 +(void *)0xffffa087db264000 +(void *)0xffffa087db285000 +(void *)0xffffa087db2a6000 +(void *)0xffffa087db2c7000 +(void *)0xffffa087db2e8000 +(void *)0xffffa087daa01000 +(void *)0xffffa087daa22000 +(void *)0xffffa087daa43000 +(void *)0xffffa087daa64000 +(void *)0xffffa087daa85000 +(void *)0xffffa087daaa6000 +(void *)0xffffa087daac7000 +(void *)0xffffa087daae8000 +(void *)0xffffa0889e801000 +(void *)0xffffa0889e822000 +(void *)0xffffa0889e843000 +(void *)0xffffa0889e864000 +(void *)0xffffa0889e885000 +(void *)0xffffa0889e8a6000 +(void *)0xffffa0889e8c7000 +(void *)0xffffa0889e8e8000 +(void *)0xffffa087dba01000 +(void *)0xffffa087dba22000 +(void *)0xffffa087dba43000 +(void *)0xffffa087dba64000 +(void *)0xffffa087dba85000 +(void *)0xffffa087dbaa6000 +(void *)0xffffa087dbac7000 +(void *)0xffffa087dbae8000 +(void *)0xffffa087d5801000 +(void *)0xffffa087d5822000 +(void *)0xffffa087d5843000 +(void *)0xffffa087d5864000 +(void *)0xffffa087d5885000 +(void *)0xffffa087d58a6000 +(void *)0xffffa087d58c7000 +(void *)0xffffa087d58e8000 +(void *)0xffffa08889001000 +(void *)0xffffa08889022000 +(void *)0xffffa08889043000 +(void *)0xffffa08889064000 +(void *)0xffffa08889085000 +(void *)0xffffa088890a6000 +(void *)0xffffa088890c7000 +(void *)0xffffa088890e8000 +(void *)0xffffa087d9801000 +(void *)0xffffa087d9822000 +(void *)0xffffa087d9843000 +(void *)0xffffa087d9864000 +(void *)0xffffa087d9885000 +(void *)0xffffa087d98a6000 +(void *)0xffffa087d98c7000 +(void *)0xffffa087d98e8000 +(void *)0xffffa08888401000 +(void *)0xffffa08888422000 +(void *)0xffffa08888443000 +(void *)0xffffa08888464000 +(void *)0xffffa08888485000 +(void *)0xffffa088884a6000 +(void *)0xffffa088884c7000 +(void *)0xffffa088884e8000 +(void *)0xffffa087da801000 +(void *)0xffffa087da822000 +(void *)0xffffa087da843000 +(void *)0xffffa087da864000 +(void *)0xffffa087da885000 +(void *)0xffffa087da8a6000 +(void *)0xffffa087da8c7000 +(void *)0xffffa087da8e8000 +(void *)0xffffa087d9001000 +(void *)0xffffa087d9022000 +(void *)0xffffa087d9043000 +(void *)0xffffa087d9064000 +(void *)0xffffa087d9085000 +(void *)0xffffa087d90a6000 +(void *)0xffffa087d90c7000 +(void *)0xffffa087d90e8000 +(void *)0xffffa0889e601000 +(void *)0xffffa0889e622000 +(void *)0xffffa0889e643000 +(void *)0xffffa0889e664000 +(void *)0xffffa0889e685000 +(void *)0xffffa0889e6a6000 +(void *)0xffffa0889e6c7000 +(void *)0xffffa0889e6e8000 +(void *)0xffffa087d9201000 +(void *)0xffffa087d9222000 +(void *)0xffffa087d9243000 +(void *)0xffffa087d9264000 +(void *)0xffffa087d9285000 +(void *)0xffffa087d92a6000 +(void *)0xffffa087d92c7000 +(void *)0xffffa087d92e8000 +(void *)0xffffa087d8801000 +(void *)0xffffa087d8822000 +(void *)0xffffa087d8843000 +(void *)0xffffa087d8864000 +(void *)0xffffa087d8885000 +(void *)0xffffa087d88a6000 +(void *)0xffffa087d88c7000 +(void *)0xffffa087d88e8000 +(void *)0xffffa0894b401000 +(void *)0xffffa0894b422000 +(void *)0xffffa0894b443000 +(void *)0xffffa0894b464000 +(void *)0xffffa0894b485000 +(void *)0xffffa0894b4a6000 +(void *)0xffffa0894b4c7000 +(void *)0xffffa0894b4e8000 +(void *)0xffffa087d8401000 +(void *)0xffffa087d8422000 +(void *)0xffffa087d8443000 +(void *)0xffffa087d8464000 +(void *)0xffffa087d8485000 +(void *)0xffffa087d84a6000 +(void *)0xffffa087d84c7000 +(void *)0xffffa087d84e8000 +(void *)0xffffa087d8601000 +(void *)0xffffa087d8622000 +(void *)0xffffa087d8643000 +(void *)0xffffa087d8664000 +(void *)0xffffa087d8685000 +(void *)0xffffa087d86a6000 +(void *)0xffffa087d86c7000 +(void *)0xffffa087d86e8000 +(void *)0xffffa08907201000 +(void *)0xffffa08907222000 +(void *)0xffffa08907243000 +(void *)0xffffa08907264000 +(void *)0xffffa08907285000 +(void *)0xffffa089072a6000 +(void *)0xffffa089072c7000 +(void *)0xffffa089072e8000 +(void *)0xffffa087d8201000 +(void *)0xffffa087d8222000 +(void *)0xffffa087d8243000 +(void *)0xffffa087d8264000 +(void *)0xffffa087d8285000 +(void *)0xffffa087d82a6000 +(void *)0xffffa087d82c7000 +(void *)0xffffa087d82e8000 +(void *)0xffffa087d7e01000 +(void *)0xffffa087d7e22000 +(void *)0xffffa087d7e43000 +(void *)0xffffa087d7e64000 +(void *)0xffffa087d7e85000 +(void *)0xffffa087d7ea6000 +(void *)0xffffa087d7ec7000 +(void *)0xffffa087d7ee8000 +(void *)0xffffa0889e201000 +(void *)0xffffa0889e222000 +(void *)0xffffa0889e243000 +(void *)0xffffa0889e264000 +(void *)0xffffa0889e285000 +(void *)0xffffa0889e2a6000 +(void *)0xffffa0889e2c7000 +(void *)0xffffa0889e2e8000 +(void *)0xffffa08848001000 +(void *)0xffffa08848022000 +(void *)0xffffa08848043000 +(void *)0xffffa08848064000 +(void *)0xffffa08848085000 +(void *)0xffffa088480a6000 +(void *)0xffffa088480c7000 +(void *)0xffffa088480e8000 +(void *)0xffffa08847c01000 +(void *)0xffffa08847c22000 +(void *)0xffffa08847c43000 +(void *)0xffffa08847c64000 +(void *)0xffffa08847c85000 +(void *)0xffffa08847ca6000 +(void *)0xffffa08847cc7000 +(void *)0xffffa08847ce8000 +(void *)0xffffa08847401000 +(void *)0xffffa08847422000 +(void *)0xffffa08847443000 +(void *)0xffffa08847464000 +(void *)0xffffa08847485000 +(void *)0xffffa088474a6000 +(void *)0xffffa088474c7000 +(void *)0xffffa088474e8000 +(void *)0xffffa08846401000 +(void *)0xffffa08846422000 +(void *)0xffffa08846443000 +(void *)0xffffa08846464000 +(void *)0xffffa08846485000 +(void *)0xffffa088464a6000 +(void *)0xffffa088464c7000 +(void *)0xffffa088464e8000 +(void *)0xffffa08851801000 +(void *)0xffffa08851822000 +(void *)0xffffa08851843000 +(void *)0xffffa08851864000 +(void *)0xffffa08851885000 +(void *)0xffffa088518a6000 +(void *)0xffffa088518c7000 +(void *)0xffffa088518e8000 +(void *)0xffffa08845e01000 +(void *)0xffffa08845e22000 +(void *)0xffffa08845e43000 +(void *)0xffffa08845e64000 +(void *)0xffffa08845e85000 +(void *)0xffffa08845ea6000 +(void *)0xffffa08845ec7000 +(void *)0xffffa08845ee8000 +(void *)0xffffa08845601000 +(void *)0xffffa08845622000 +(void *)0xffffa08845643000 +(void *)0xffffa08845664000 +(void *)0xffffa08845685000 +(void *)0xffffa088456a6000 +(void *)0xffffa088456c7000 +(void *)0xffffa088456e8000 +(void *)0xffffa08892401000 +(void *)0xffffa08892422000 +(void *)0xffffa08892443000 +(void *)0xffffa08892464000 +(void *)0xffffa08892485000 +(void *)0xffffa088924a6000 +(void *)0xffffa088924c7000 +(void *)0xffffa088924e8000 +(void *)0xffffa087d8e01000 +(void *)0xffffa087d8e22000 +(void *)0xffffa087d8e43000 +(void *)0xffffa087d8e64000 +(void *)0xffffa087d8e85000 +(void *)0xffffa087d8ea6000 +(void *)0xffffa087d8ec7000 +(void *)0xffffa087d8ee8000 +(void *)0xffffa088cd001000 +(void *)0xffffa088cd022000 +(void *)0xffffa088cd043000 +(void *)0xffffa088cd064000 +(void *)0xffffa088cd085000 +(void *)0xffffa088cd0a6000 +(void *)0xffffa088cd0c7000 +(void *)0xffffa088cd0e8000 +(void *)0xffffa088c8401000 +(void *)0xffffa088c8422000 +(void *)0xffffa088c8443000 +(void *)0xffffa088c8464000 +(void *)0xffffa088c8485000 +(void *)0xffffa088c84a6000 +(void *)0xffffa088c84c7000 +(void *)0xffffa088c84e8000 +(void *)0xffffa087d4c01000 +(void *)0xffffa087d4c22000 +(void *)0xffffa087d4c43000 +(void *)0xffffa087d4c64000 +(void *)0xffffa087d4c85000 +(void *)0xffffa087d4ca6000 +(void *)0xffffa087d4cc7000 +(void *)0xffffa087d4ce8000 +(void *)0xffffa087d5001000 +(void *)0xffffa087d5022000 +(void *)0xffffa087d5043000 +(void *)0xffffa087d5064000 +(void *)0xffffa087d5085000 +(void *)0xffffa087d50a6000 +(void *)0xffffa087d50c7000 +(void *)0xffffa087d50e8000 +(void *)0xffffa087d5601000 +(void *)0xffffa087d5622000 +(void *)0xffffa087d5643000 +(void *)0xffffa087d5664000 +(void *)0xffffa087d5685000 +(void *)0xffffa087d56a6000 +(void *)0xffffa087d56c7000 +(void *)0xffffa087d56e8000 +(void *)0xffffa087d5a01000 +(void *)0xffffa087d5a22000 +(void *)0xffffa087d5a43000 +(void *)0xffffa087d5a64000 +(void *)0xffffa087d5a85000 +(void *)0xffffa087d5aa6000 +(void *)0xffffa087d5ac7000 +(void *)0xffffa087d5ae8000 +(void *)0xffffa087d6201000 +(void *)0xffffa087d6222000 +(void *)0xffffa087d6243000 +(void *)0xffffa087d6264000 +(void *)0xffffa087d6285000 +(void *)0xffffa087d62a6000 +(void *)0xffffa087d62c7000 +(void *)0xffffa087d62e8000 +(void *)0xffffa087d6601000 +(void *)0xffffa087d6622000 +(void *)0xffffa087d6643000 +(void *)0xffffa087d6664000 +(void *)0xffffa087d6685000 +(void *)0xffffa087d66a6000 +(void *)0xffffa087d66c7000 +(void *)0xffffa087d66e8000 +(void *)0xffffa087d6401000 +(void *)0xffffa087d6422000 +(void *)0xffffa087d6443000 +(void *)0xffffa087d6464000 +(void *)0xffffa087d6485000 +(void *)0xffffa087d64a6000 +(void *)0xffffa087d64c7000 +(void *)0xffffa087d64e8000 +(void *)0xffffa087d6801000 +(void *)0xffffa087d6822000 +(void *)0xffffa087d6843000 +(void *)0xffffa087d6864000 +(void *)0xffffa087d6885000 +(void *)0xffffa087d68a6000 +(void *)0xffffa087d68c7000 +(void *)0xffffa087d68e8000 +(void *)0xffffa087d6c01000 +(void *)0xffffa087d6c22000 +(void *)0xffffa087d6c43000 +(void *)0xffffa087d6c64000 +(void *)0xffffa087d6c85000 +(void *)0xffffa087d6ca6000 +(void *)0xffffa087d6cc7000 +(void *)0xffffa087d6ce8000 +(void *)0xffffa087d7001000 +(void *)0xffffa087d7022000 +(void *)0xffffa087d7043000 +(void *)0xffffa087d7064000 +(void *)0xffffa087d7085000 +(void *)0xffffa087d70a6000 +(void *)0xffffa087d70c7000 +(void *)0xffffa087d70e8000 +(void *)0xffffa087d7401000 +(void *)0xffffa087d7422000 +(void *)0xffffa087d7443000 +(void *)0xffffa087d7464000 +(void *)0xffffa087d7485000 +(void *)0xffffa087d74a6000 +(void *)0xffffa087d74c7000 +(void *)0xffffa087d74e8000 +(void *)0xffffa087d9401000 +(void *)0xffffa087d9422000 +(void *)0xffffa087d9443000 +(void *)0xffffa087d9464000 +(void *)0xffffa087d9485000 +(void *)0xffffa087d94a6000 +(void *)0xffffa087d94c7000 +(void *)0xffffa087d94e8000 +(void *)0xffffa087de001000 +(void *)0xffffa087de022000 +(void *)0xffffa087de043000 +(void *)0xffffa087de064000 +(void *)0xffffa087de085000 +(void *)0xffffa087de0a6000 +(void *)0xffffa087de0c7000 +(void *)0xffffa087de0e8000 +(void *)0xffffa087de401000 +(void *)0xffffa087de422000 +(void *)0xffffa087de443000 +(void *)0xffffa087de464000 +(void *)0xffffa087de485000 +(void *)0xffffa087de4a6000 +(void *)0xffffa087de4c7000 +(void *)0xffffa087de4e8000 +(void *)0xffffa087de801000 +(void *)0xffffa087de822000 +(void *)0xffffa087de843000 +(void *)0xffffa087de864000 +(void *)0xffffa087de885000 +(void *)0xffffa087de8a6000 +(void *)0xffffa087de8c7000 +(void *)0xffffa087de8e8000 +(void *)0xffffa087dec01000 +(void *)0xffffa087dec22000 +(void *)0xffffa087dec43000 +(void *)0xffffa087dec64000 +(void *)0xffffa087dec85000 +(void *)0xffffa087deca6000 +(void *)0xffffa087decc7000 +(void *)0xffffa087dece8000 +(void *)0xffffa087df001000 +(void *)0xffffa087df022000 +(void *)0xffffa087df043000 +(void *)0xffffa087df064000 +(void *)0xffffa087df085000 +(void *)0xffffa087df0a6000 +(void *)0xffffa087df0c7000 +(void *)0xffffa087df0e8000 +(void *)0xffffa087dfa01000 +(void *)0xffffa087dfa22000 +(void *)0xffffa087dfa43000 +(void *)0xffffa087dfa64000 +(void *)0xffffa087dfa85000 +(void *)0xffffa087dfaa6000 +(void *)0xffffa087dfac7000 +(void *)0xffffa087dfae8000 +(void *)0xffffa087df801000 +(void *)0xffffa087df822000 +(void *)0xffffa087df843000 +(void *)0xffffa087df864000 +(void *)0xffffa087df885000 +(void *)0xffffa087df8a6000 +(void *)0xffffa087df8c7000 +(void *)0xffffa087df8e8000 +(void *)0xffffa087e0201000 +(void *)0xffffa087e0222000 +(void *)0xffffa087e0243000 +(void *)0xffffa087e0264000 +(void *)0xffffa087e0285000 +(void *)0xffffa087e02a6000 +(void *)0xffffa087e02c7000 +(void *)0xffffa087e02e8000 +(void *)0xffffa087e0601000 +(void *)0xffffa087e0622000 +(void *)0xffffa087e0643000 +(void *)0xffffa087e0664000 +(void *)0xffffa087e0685000 +(void *)0xffffa087e06a6000 +(void *)0xffffa087e06c7000 +(void *)0xffffa087e06e8000 +(void *)0xffffa087e0e01000 +(void *)0xffffa087e0e22000 +(void *)0xffffa087e0e43000 +(void *)0xffffa087e0e64000 +(void *)0xffffa087e0e85000 +(void *)0xffffa087e0ea6000 +(void *)0xffffa087e0ec7000 +(void *)0xffffa087e0ee8000 +(void *)0xffffa087e1001000 +(void *)0xffffa087e1022000 +(void *)0xffffa087e1043000 +(void *)0xffffa087e1064000 +(void *)0xffffa087e1085000 +(void *)0xffffa087e10a6000 +(void *)0xffffa087e10c7000 +(void *)0xffffa087e10e8000 +(void *)0xffffa087e1401000 +(void *)0xffffa087e1422000 +(void *)0xffffa087e1443000 +(void *)0xffffa087e1464000 +(void *)0xffffa087e1485000 +(void *)0xffffa087e14a6000 +(void *)0xffffa087e14c7000 +(void *)0xffffa087e14e8000 +(void *)0xffffa087e1a01000 +(void *)0xffffa087e1a22000 +(void *)0xffffa087e1a43000 +(void *)0xffffa087e1a64000 +(void *)0xffffa087e1a85000 +(void *)0xffffa087e1aa6000 +(void *)0xffffa087e1ac7000 +(void *)0xffffa087e1ae8000 +(void *)0xffffa087e3c01000 +(void *)0xffffa087e3c22000 +(void *)0xffffa087e3c43000 +(void *)0xffffa087e3c64000 +(void *)0xffffa087e3c85000 +(void *)0xffffa087e3ca6000 +(void *)0xffffa087e3cc7000 +(void *)0xffffa087e3ce8000 +(void *)0xffffa087e4a01000 +(void *)0xffffa087e4a22000 +(void *)0xffffa087e4a43000 +(void *)0xffffa087e4a64000 +(void *)0xffffa087e4a85000 +(void *)0xffffa087e4aa6000 +(void *)0xffffa087e4ac7000 +(void *)0xffffa087e4ae8000 +(void *)0xffffa087e4c01000 +(void *)0xffffa087e4c22000 +(void *)0xffffa087e4c43000 +(void *)0xffffa087e4c64000 +(void *)0xffffa087e4c85000 +(void *)0xffffa087e4ca6000 +(void *)0xffffa087e4cc7000 +(void *)0xffffa087e4ce8000 +(void *)0xffffa087e6601000 +(void *)0xffffa087e6622000 +(void *)0xffffa087e6643000 +(void *)0xffffa087e6664000 +(void *)0xffffa087e6685000 +(void *)0xffffa087e66a6000 +(void *)0xffffa087e66c7000 +(void *)0xffffa087e66e8000 +(void *)0xffffa087e6e01000 +(void *)0xffffa087e6e22000 +(void *)0xffffa087e6e43000 +(void *)0xffffa087e6e64000 +(void *)0xffffa087e6e85000 +(void *)0xffffa087e6ea6000 +(void *)0xffffa087e6ec7000 +(void *)0xffffa087e6ee8000 +(void *)0xffffa087e7201000 +(void *)0xffffa087e7222000 +(void *)0xffffa087e7243000 +(void *)0xffffa087e7264000 +(void *)0xffffa087e7285000 +(void *)0xffffa087e72a6000 +(void *)0xffffa087e72c7000 +(void *)0xffffa087e72e8000 +(void *)0xffffa087e7601000 +(void *)0xffffa087e7622000 +(void *)0xffffa087e7643000 +(void *)0xffffa087e7664000 +(void *)0xffffa087e7685000 +(void *)0xffffa087e76a6000 +(void *)0xffffa087e76c7000 +(void *)0xffffa087e76e8000 +(void *)0xffffa08958401000 +(void *)0xffffa08958422000 +(void *)0xffffa08958443000 +(void *)0xffffa08958464000 +(void *)0xffffa08958485000 +(void *)0xffffa089584a6000 +(void *)0xffffa089584c7000 +(void *)0xffffa089584e8000 +(void *)0xffffa088ce201000 +(void *)0xffffa088ce222000 +(void *)0xffffa088ce243000 +(void *)0xffffa088ce264000 +(void *)0xffffa088ce285000 +(void *)0xffffa088ce2a6000 +(void *)0xffffa088ce2c7000 +(void *)0xffffa088ce2e8000 +(void *)0xffffa087ea801000 +(void *)0xffffa087ea822000 +(void *)0xffffa087ea843000 +(void *)0xffffa087ea864000 +(void *)0xffffa087ea885000 +(void *)0xffffa087ea8a6000 +(void *)0xffffa087ea8c7000 +(void *)0xffffa087ea8e8000 +(void *)0xffffa087eae01000 +(void *)0xffffa087eae22000 +(void *)0xffffa087eae43000 +(void *)0xffffa087eae64000 +(void *)0xffffa087eae85000 +(void *)0xffffa087eaea6000 +(void *)0xffffa087eaec7000 +(void *)0xffffa087eaee8000 +(void *)0xffffa087eac01000 +(void *)0xffffa087eac22000 +(void *)0xffffa087eac43000 +(void *)0xffffa087eac64000 +(void *)0xffffa087eac85000 +(void *)0xffffa087eaca6000 +(void *)0xffffa087eacc7000 +(void *)0xffffa087eace8000 +(void *)0xffffa087ff201000 +(void *)0xffffa087ff222000 +(void *)0xffffa087ff243000 +(void *)0xffffa087ff264000 +(void *)0xffffa087ff285000 +(void *)0xffffa087ff2a6000 +(void *)0xffffa087ff2c7000 +(void *)0xffffa087ff2e8000 +(void *)0xffffa087ff001000 +(void *)0xffffa087ff022000 +(void *)0xffffa087ff043000 +(void *)0xffffa087ff064000 +(void *)0xffffa087ff085000 +(void *)0xffffa087ff0a6000 +(void *)0xffffa087ff0c7000 +(void *)0xffffa087ff0e8000 +(void *)0xffffa087ff601000 +(void *)0xffffa087ff622000 +(void *)0xffffa087ff643000 +(void *)0xffffa087ff664000 +(void *)0xffffa087ff685000 +(void *)0xffffa087ff6a6000 +(void *)0xffffa087ff6c7000 +(void *)0xffffa087ff6e8000 +(void *)0xffffa087ff401000 +(void *)0xffffa087ff422000 +(void *)0xffffa087ff443000 +(void *)0xffffa087ff464000 +(void *)0xffffa087ff485000 +(void *)0xffffa087ff4a6000 +(void *)0xffffa087ff4c7000 +(void *)0xffffa087ff4e8000 +(void *)0xffffa087ffa01000 +(void *)0xffffa087ffa22000 +(void *)0xffffa087ffa43000 +(void *)0xffffa087ffa64000 +(void *)0xffffa087ffa85000 +(void *)0xffffa087ffaa6000 +(void *)0xffffa087ffac7000 +(void *)0xffffa087ffae8000 +(void *)0xffffa087ff801000 +(void *)0xffffa087ff822000 +(void *)0xffffa087ff843000 +(void *)0xffffa087ff864000 +(void *)0xffffa087ff885000 +(void *)0xffffa087ff8a6000 +(void *)0xffffa087ff8c7000 +(void *)0xffffa087ff8e8000 +(void *)0xffffa0876ee01000 +(void *)0xffffa0876ee22000 +(void *)0xffffa0876ee43000 +(void *)0xffffa0876ee64000 +(void *)0xffffa0876ee85000 +(void *)0xffffa0876eea6000 +(void *)0xffffa0876eec7000 +(void *)0xffffa0876eee8000 +(void *)0xffffa0876ec01000 +(void *)0xffffa0876ec22000 +(void *)0xffffa0876ec43000 +(void *)0xffffa0876ec64000 +(void *)0xffffa0876ec85000 +(void *)0xffffa0876eca6000 +(void *)0xffffa0876ecc7000 +(void *)0xffffa0876ece8000 +(void *)0xffffa0876f201000 +(void *)0xffffa0876f222000 +(void *)0xffffa0876f243000 +(void *)0xffffa0876f264000 +(void *)0xffffa0876f285000 +(void *)0xffffa0876f2a6000 +(void *)0xffffa0876f2c7000 +(void *)0xffffa0876f2e8000 +(void *)0xffffa0876f001000 +(void *)0xffffa0876f022000 +(void *)0xffffa0876f043000 +(void *)0xffffa0876f064000 +(void *)0xffffa0876f085000 +(void *)0xffffa0876f0a6000 +(void *)0xffffa0876f0c7000 +(void *)0xffffa0876f0e8000 +(void *)0xffffa0876f601000 +(void *)0xffffa0876f622000 +(void *)0xffffa0876f643000 +(void *)0xffffa0876f664000 +(void *)0xffffa0876f685000 +(void *)0xffffa0876f6a6000 +(void *)0xffffa0876f6c7000 +(void *)0xffffa0876f6e8000 +(void *)0xffffa0876f401000 +(void *)0xffffa0876f422000 +(void *)0xffffa0876f443000 +(void *)0xffffa0876f464000 +(void *)0xffffa0876f485000 +(void *)0xffffa0876f4a6000 +(void *)0xffffa0876f4c7000 +(void *)0xffffa0876f4e8000 +(void *)0xffffa0876fa01000 +(void *)0xffffa0876fa22000 +(void *)0xffffa0876fa43000 +(void *)0xffffa0876fa64000 +(void *)0xffffa0876fa85000 +(void *)0xffffa0876faa6000 +(void *)0xffffa0876fac7000 +(void *)0xffffa0876fae8000 +(void *)0xffffa0876fc01000 +(void *)0xffffa0876fc22000 +(void *)0xffffa0876fc43000 +(void *)0xffffa0876fc64000 +(void *)0xffffa0876fc85000 +(void *)0xffffa0876fca6000 +(void *)0xffffa0876fcc7000 +(void *)0xffffa0876fce8000 +(void *)0xffffa08770001000 +(void *)0xffffa08770022000 +(void *)0xffffa08770043000 +(void *)0xffffa08770064000 +(void *)0xffffa08770085000 +(void *)0xffffa087700a6000 +(void *)0xffffa087700c7000 +(void *)0xffffa087700e8000 +(void *)0xffffa08770401000 +(void *)0xffffa08770422000 +(void *)0xffffa08770443000 +(void *)0xffffa08770464000 +(void *)0xffffa08770485000 +(void *)0xffffa087704a6000 +(void *)0xffffa087704c7000 +(void *)0xffffa087704e8000 +(void *)0xffffa08770a01000 +(void *)0xffffa08770a22000 +(void *)0xffffa08770a43000 +(void *)0xffffa08770a64000 +(void *)0xffffa08770a85000 +(void *)0xffffa08770aa6000 +(void *)0xffffa08770ac7000 +(void *)0xffffa08770ae8000 +(void *)0xffffa08852601000 +(void *)0xffffa08852622000 +(void *)0xffffa08852643000 +(void *)0xffffa08852664000 +(void *)0xffffa08852685000 +(void *)0xffffa088526a6000 +(void *)0xffffa088526c7000 +(void *)0xffffa088526e8000 +(void *)0xffffa08851001000 +(void *)0xffffa08851022000 +(void *)0xffffa08851043000 +(void *)0xffffa08851064000 +(void *)0xffffa08851085000 +(void *)0xffffa088510a6000 +(void *)0xffffa088510c7000 +(void *)0xffffa088510e8000 +(void *)0xffffa08850001000 +(void *)0xffffa08850022000 +(void *)0xffffa08850043000 +(void *)0xffffa08850064000 +(void *)0xffffa08850085000 +(void *)0xffffa088500a6000 +(void *)0xffffa088500c7000 +(void *)0xffffa088500e8000 +(void *)0xffffa088d0201000 +(void *)0xffffa088d0222000 +(void *)0xffffa088d0243000 +(void *)0xffffa088d0264000 +(void *)0xffffa088d0285000 +(void *)0xffffa088d02a6000 +(void *)0xffffa088d02c7000 +(void *)0xffffa088d02e8000 +(void *)0xffffa08840001000 +(void *)0xffffa08840022000 +(void *)0xffffa08840043000 +(void *)0xffffa08840064000 +(void *)0xffffa08840085000 +(void *)0xffffa088400a6000 +(void *)0xffffa088400c7000 +(void *)0xffffa088400e8000 +(void *)0xffffa08840601000 +(void *)0xffffa08840622000 +(void *)0xffffa08840643000 +(void *)0xffffa08840664000 +(void *)0xffffa08840685000 +(void *)0xffffa088406a6000 +(void *)0xffffa088406c7000 +(void *)0xffffa088406e8000 +(void *)0xffffa08840a01000 +(void *)0xffffa08840a22000 +(void *)0xffffa08840a43000 +(void *)0xffffa08840a64000 +(void *)0xffffa08840a85000 +(void *)0xffffa08840aa6000 +(void *)0xffffa08840ac7000 +(void *)0xffffa08840ae8000 +(void *)0xffffa08771001000 +(void *)0xffffa08771022000 +(void *)0xffffa08771043000 +(void *)0xffffa08771064000 +(void *)0xffffa08771085000 +(void *)0xffffa087710a6000 +(void *)0xffffa087710c7000 +(void *)0xffffa087710e8000 +(void *)0xffffa08771401000 +(void *)0xffffa08771422000 +(void *)0xffffa08771443000 +(void *)0xffffa08771464000 +(void *)0xffffa08771485000 +(void *)0xffffa087714a6000 +(void *)0xffffa087714c7000 +(void *)0xffffa087714e8000 +(void *)0xffffa08771801000 +(void *)0xffffa08771822000 +(void *)0xffffa08771843000 +(void *)0xffffa08771864000 +(void *)0xffffa08771885000 +(void *)0xffffa087718a6000 +(void *)0xffffa087718c7000 +(void *)0xffffa087718e8000 +(void *)0xffffa08771c01000 +(void *)0xffffa08771c22000 +(void *)0xffffa08771c43000 +(void *)0xffffa08771c64000 +(void *)0xffffa08771c85000 +(void *)0xffffa08771ca6000 +(void *)0xffffa08771cc7000 +(void *)0xffffa08771ce8000 +(void *)0xffffa08772201000 +(void *)0xffffa08772222000 +(void *)0xffffa08772243000 +(void *)0xffffa08772264000 +(void *)0xffffa08772285000 +(void *)0xffffa087722a6000 +(void *)0xffffa087722c7000 +(void *)0xffffa087722e8000 +(void *)0xffffa08772601000 +(void *)0xffffa08772622000 +(void *)0xffffa08772643000 +(void *)0xffffa08772664000 +(void *)0xffffa08772685000 +(void *)0xffffa087726a6000 +(void *)0xffffa087726c7000 +(void *)0xffffa087726e8000 +(void *)0xffffa08772a01000 +(void *)0xffffa08772a22000 +(void *)0xffffa08772a43000 +(void *)0xffffa08772a64000 +(void *)0xffffa08772a85000 +(void *)0xffffa08772aa6000 +(void *)0xffffa08772ac7000 +(void *)0xffffa08772ae8000 +(void *)0xffffa08772e01000 +(void *)0xffffa08772e22000 +(void *)0xffffa08772e43000 +(void *)0xffffa08772e64000 +(void *)0xffffa08772e85000 +(void *)0xffffa08772ea6000 +(void *)0xffffa08772ec7000 +(void *)0xffffa08772ee8000 +(void *)0xffffa08773201000 +(void *)0xffffa08773222000 +(void *)0xffffa08773243000 +(void *)0xffffa08773264000 +(void *)0xffffa08773285000 +(void *)0xffffa087732a6000 +(void *)0xffffa087732c7000 +(void *)0xffffa087732e8000 +(void *)0xffffa08840e01000 +(void *)0xffffa08840e22000 +(void *)0xffffa08840e43000 +(void *)0xffffa08840e64000 +(void *)0xffffa08840e85000 +(void *)0xffffa08840ea6000 +(void *)0xffffa08840ec7000 +(void *)0xffffa08840ee8000 +(void *)0xffffa08841201000 +(void *)0xffffa08841222000 +(void *)0xffffa08841243000 +(void *)0xffffa08841264000 +(void *)0xffffa08841285000 +(void *)0xffffa088412a6000 +(void *)0xffffa088412c7000 +(void *)0xffffa088412e8000 +(void *)0xffffa08841601000 +(void *)0xffffa08841622000 +(void *)0xffffa08841643000 +(void *)0xffffa08841664000 +(void *)0xffffa08841685000 +(void *)0xffffa088416a6000 +(void *)0xffffa088416c7000 +(void *)0xffffa088416e8000 +(void *)0xffffa08841a01000 +(void *)0xffffa08841a22000 +(void *)0xffffa08841a43000 +(void *)0xffffa08841a64000 +(void *)0xffffa08841a85000 +(void *)0xffffa08841aa6000 +(void *)0xffffa08841ac7000 +(void *)0xffffa08841ae8000 +(void *)0xffffa08842a01000 +(void *)0xffffa08842a22000 +(void *)0xffffa08842a43000 +(void *)0xffffa08842a64000 +(void *)0xffffa08842a85000 +(void *)0xffffa08842aa6000 +(void *)0xffffa08842ac7000 +(void *)0xffffa08842ae8000 +(void *)0xffffa08844201000 +(void *)0xffffa08844222000 +(void *)0xffffa08844243000 +(void *)0xffffa08844264000 +(void *)0xffffa08844285000 +(void *)0xffffa088442a6000 +(void *)0xffffa088442c7000 +(void *)0xffffa088442e8000 +(void *)0xffffa08844e01000 +(void *)0xffffa08844e22000 +(void *)0xffffa08844e43000 +(void *)0xffffa08844e64000 +(void *)0xffffa08844e85000 +(void *)0xffffa08844ea6000 +(void *)0xffffa08844ec7000 +(void *)0xffffa08844ee8000 +(void *)0xffffa08845201000 +(void *)0xffffa08845222000 +(void *)0xffffa08845243000 +(void *)0xffffa08845264000 +(void *)0xffffa08845285000 +(void *)0xffffa088452a6000 +(void *)0xffffa088452c7000 +(void *)0xffffa088452e8000 +(void *)0xffffa08845a01000 +(void *)0xffffa08845a22000 +(void *)0xffffa08845a43000 +(void *)0xffffa08845a64000 +(void *)0xffffa08845a85000 +(void *)0xffffa08845aa6000 +(void *)0xffffa08845ac7000 +(void *)0xffffa08845ae8000 +(void *)0xffffa08846201000 +(void *)0xffffa08846222000 +(void *)0xffffa08846243000 +(void *)0xffffa08846264000 +(void *)0xffffa08846285000 +(void *)0xffffa088462a6000 +(void *)0xffffa088462c7000 +(void *)0xffffa088462e8000 +(void *)0xffffa08847001000 +(void *)0xffffa08847022000 +(void *)0xffffa08847043000 +(void *)0xffffa08847064000 +(void *)0xffffa08847085000 +(void *)0xffffa088470a6000 +(void *)0xffffa088470c7000 +(void *)0xffffa088470e8000 +(void *)0xffffa08847801000 +(void *)0xffffa08847822000 +(void *)0xffffa08847843000 +(void *)0xffffa08847864000 +(void *)0xffffa08847885000 +(void *)0xffffa088478a6000 +(void *)0xffffa088478c7000 +(void *)0xffffa088478e8000 +(void *)0xffffa0884b601000 +(void *)0xffffa0884b622000 +(void *)0xffffa0884b643000 +(void *)0xffffa0884b664000 +(void *)0xffffa0884b685000 +(void *)0xffffa0884b6a6000 +(void *)0xffffa0884b6c7000 +(void *)0xffffa0884b6e8000 +(void *)0xffffa088c9c01000 +(void *)0xffffa088c9c22000 +(void *)0xffffa088c9c43000 +(void *)0xffffa088c9c64000 +(void *)0xffffa088c9cc7000 +(void *)0xffffa088c9ce8000 +(void *)0xffffa0884c422000 +(void *)0xffffa0884aa01000 +(void *)0xffffa0884aa22000 +(void *)0xffffa0884aa43000 +(void *)0xffffa0884aa85000 +(void *)0xffffa0884aaa6000 +(void *)0xffffa0884aac7000 +(void *)0xffffa0884aae8000 +(void *)0xffffa089514c7000 +(void *)0xffffa08894001000 +(void *)0xffffa0889d285000 +(void *)0xffffa0889d2c7000 +(void *)0xffffa08940e22000 +(void *)0xffffa08940e64000 +(void *)0xffffa08940ec7000 +(void *)0xffffa089618e8000 +(void *)0xffffa0884c085000 +(void *)0xffffa0884c0a6000 +(void *)0xffffa0884c0e8000 +(void *)0xffffa088d22e8000 +(void *)0xffffa0884ae01000 +(void *)0xffffa0884ae22000 +(void *)0xffffa0884ae43000 +(void *)0xffffa0884ae85000 +(void *)0xffffa0884aec7000 +(void *)0xffffa0884aee8000 +(void *)0xffffa0888bc43000 +(void *)0xffffa0888bc64000 +(void *)0xffffa0888bc85000 +(void *)0xffffa0888bca6000 +(void *)0xffffa088c88e8000 +(void *)0xffffa0890b0a6000 +(void *)0xffffa0890b0c7000 +(void *)0xffffa088c4001000 +(void *)0xffffa088c4064000 +(void *)0xffffa088c4085000 +(void *)0xffffa0884b201000 +(void *)0xffffa0884b264000 +(void *)0xffffa0884b285000 +(void *)0xffffa0884b2c7000 +(void *)0xffffa0884b2e8000 +(void *)0xffffa0888ee01000 +(void *)0xffffa0888ee22000 +(void *)0xffffa0888ee64000 +(void *)0xffffa0888ee85000 +(void *)0xffffa0888eec7000 +(void *)0xffffa0888e201000 +(void *)0xffffa0888e222000 +(void *)0xffffa0888e243000 +(void *)0xffffa0888e264000 +(void *)0xffffa0888e285000 +(void *)0xffffa0888e2c7000 +(void *)0xffffa0888e2e8000 +(void *)0xffffa088cee22000 +(void *)0xffffa088ceec7000 +(void *)0xffffa0893bc22000 +(void *)0xffffa0893bc43000 +(void *)0xffffa0893bc64000 +(void *)0xffffa0893bc85000 +(void *)0xffffa0893bca6000 +(void *)0xffffa0893bcc7000 +(void *)0xffffa0893bce8000 +(void *)0xffffa08897a01000 +(void *)0xffffa08897a43000 +(void *)0xffffa08892243000 +(void *)0xffffa08892264000 +(void *)0xffffa08892285000 +(void *)0xffffa088e9643000 +(void *)0xffffa08960c01000 +(void *)0xffffa08960c22000 +(void *)0xffffa08960c43000 +(void *)0xffffa08960c85000 +(void *)0xffffa08960cc7000 +(void *)0xffffa0889bc22000 +(void *)0xffffa08887e43000 +(void *)0xffffa08887ea6000 +(void *)0xffffa08887ee8000 +(void *)0xffffa088c8e64000 +(void *)0xffffa088d1a43000 +(void *)0xffffa088d1a64000 +(void *)0xffffa088d1a85000 +(void *)0xffffa088d1ae8000 +(void *)0xffffa0888fc22000 +(void *)0xffffa0888fc43000 +(void *)0xffffa0888fc64000 +(void *)0xffffa0888fca6000 +(void *)0xffffa0888fcc7000 +(void *)0xffffa0895a622000 +(void *)0xffffa0895a6c7000 +(void *)0xffffa0895a6e8000 +(void *)0xffffa0888a285000 +(void *)0xffffa0888a2c7000 +(void *)0xffffa0888a2e8000 +(void *)0xffffa088cc264000 +(void *)0xffffa0888c822000 +(void *)0xffffa0888c864000 +(void *)0xffffa0888c885000 +(void *)0xffffa088c4801000 +(void *)0xffffa088c4843000 +(void *)0xffffa088c4864000 +(void *)0xffffa088c48a6000 +(void *)0xffffa088956e8000 +(void *)0xffffa088c5085000 +(void *)0xffffa088c50a6000 +(void *)0xffffa0888a422000 +(void *)0xffffa0888a443000 +(void *)0xffffa0888a485000 +(void *)0xffffa0889dc22000 +(void *)0xffffa0889dc85000 +(void *)0xffffa0889dca6000 +(void *)0xffffa088892e8000 +(void *)0xffffa0888aa01000 +(void *)0xffffa08889aa6000 +(void *)0xffffa088cd622000 +(void *)0xffffa088cd643000 +(void *)0xffffa088cd6a6000 +(void *)0xffffa088cd6c7000 +(void *)0xffffa08939a43000 +(void *)0xffffa08939a85000 +(void *)0xffffa08939aa6000 +(void *)0xffffa08891a22000 +(void *)0xffffa08891a43000 +(void *)0xffffa08891a85000 +(void *)0xffffa08891aa6000 +(void *)0xffffa08891ac7000 +(void *)0xffffa0893cc22000 +(void *)0xffffa0893cc64000 +(void *)0xffffa0893cc85000 +(void *)0xffffa088ce401000 +(void *)0xffffa088ce4a6000 +(void *)0xffffa0895ba64000 +(void *)0xffffa0895bac7000 +(void *)0xffffa08890201000 +(void *)0xffffa08890222000 +(void *)0xffffa08890243000 +(void *)0xffffa08890264000 +(void *)0xffffa088902a6000 +(void *)0xffffa088902c7000 +(void *)0xffffa0889e422000 +(void *)0xffffa0889e4c7000 +(void *)0xffffa0889e4e8000 +(void *)0xffffa088c9001000 +(void *)0xffffa088c9022000 +(void *)0xffffa088c90a6000 +(void *)0xffffa088c90c7000 +(void *)0xffffa088c90e8000 +(void *)0xffffa08893201000 +(void *)0xffffa08893222000 +(void *)0xffffa088932c7000 +(void *)0xffffa087d4e64000 +(void *)0xffffa087d4e85000 +(void *)0xffffa087d4ea6000 +(void *)0xffffa087d4ec7000 +(void *)0xffffa087d4ee8000 diff --git a/tests/integration/data/regression_output/spl/spl_kmem_caches | filter obj.skc_linux_cache == 0 | spl_cache | cnt b/tests/integration/data/regression_output/spl/spl_kmem_caches | filter obj.skc_linux_cache == 0 | spl_cache | cnt new file mode 100644 index 00000000..dbc7115a --- /dev/null +++ b/tests/integration/data/regression_output/spl/spl_kmem_caches | filter obj.skc_linux_cache == 0 | spl_cache | cnt @@ -0,0 +1 @@ +(unsigned long long)3564 diff --git a/tests/integration/data/regression_output/spl/spl_kmem_caches | filter obj.skc_linux_cache > 0 | filter obj.skc_obj_alloc > 0 | head 1 | spl_cache b/tests/integration/data/regression_output/spl/spl_kmem_caches | filter obj.skc_linux_cache > 0 | filter obj.skc_obj_alloc > 0 | head 1 | spl_cache new file mode 100644 index 00000000..438cdcef --- /dev/null +++ b/tests/integration/data/regression_output/spl/spl_kmem_caches | filter obj.skc_linux_cache > 0 | filter obj.skc_obj_alloc > 0 | head 1 | spl_cache @@ -0,0 +1,170 @@ +(void *)0xffffa089566da000 +(void *)0xffffa089566da018 +(void *)0xffffa089566da030 +(void *)0xffffa089566da048 +(void *)0xffffa089566da060 +(void *)0xffffa089566da078 +(void *)0xffffa089566da090 +(void *)0xffffa089566da0a8 +(void *)0xffffa089566da0c0 +(void *)0xffffa089566da0d8 +(void *)0xffffa089566da0f0 +(void *)0xffffa089566da108 +(void *)0xffffa089566da120 +(void *)0xffffa089566da138 +(void *)0xffffa089566da150 +(void *)0xffffa089566da168 +(void *)0xffffa089566da180 +(void *)0xffffa089566da198 +(void *)0xffffa089566da1b0 +(void *)0xffffa089566da1c8 +(void *)0xffffa089566da1e0 +(void *)0xffffa089566da1f8 +(void *)0xffffa089566da210 +(void *)0xffffa089566da228 +(void *)0xffffa089566da240 +(void *)0xffffa089566da258 +(void *)0xffffa089566da270 +(void *)0xffffa089566da288 +(void *)0xffffa089566da2a0 +(void *)0xffffa089566da2b8 +(void *)0xffffa089566da2d0 +(void *)0xffffa089566da2e8 +(void *)0xffffa089566da300 +(void *)0xffffa089566da318 +(void *)0xffffa089566da330 +(void *)0xffffa089566da348 +(void *)0xffffa089566da360 +(void *)0xffffa089566da378 +(void *)0xffffa089566da390 +(void *)0xffffa089566da3a8 +(void *)0xffffa089566da3c0 +(void *)0xffffa089566da3d8 +(void *)0xffffa089566da3f0 +(void *)0xffffa089566da408 +(void *)0xffffa089566da420 +(void *)0xffffa089566da438 +(void *)0xffffa089566da450 +(void *)0xffffa089566da468 +(void *)0xffffa089566da480 +(void *)0xffffa089566da498 +(void *)0xffffa089566da4b0 +(void *)0xffffa089566da4c8 +(void *)0xffffa089566da4e0 +(void *)0xffffa089566da4f8 +(void *)0xffffa089566da510 +(void *)0xffffa089566da528 +(void *)0xffffa089566da540 +(void *)0xffffa089566da558 +(void *)0xffffa089566da570 +(void *)0xffffa089566da588 +(void *)0xffffa089566da5a0 +(void *)0xffffa089566da5b8 +(void *)0xffffa089566da5d0 +(void *)0xffffa089566da5e8 +(void *)0xffffa089566da600 +(void *)0xffffa089566da618 +(void *)0xffffa089566da630 +(void *)0xffffa089566da648 +(void *)0xffffa089566da660 +(void *)0xffffa089566da678 +(void *)0xffffa089566da690 +(void *)0xffffa089566da6a8 +(void *)0xffffa089566da6c0 +(void *)0xffffa089566da6d8 +(void *)0xffffa089566da6f0 +(void *)0xffffa089566da708 +(void *)0xffffa089566da720 +(void *)0xffffa089566da738 +(void *)0xffffa089566da750 +(void *)0xffffa089566da768 +(void *)0xffffa089566da780 +(void *)0xffffa089566da798 +(void *)0xffffa089566da7b0 +(void *)0xffffa089566da7c8 +(void *)0xffffa089566da7e0 +(void *)0xffffa089566da7f8 +(void *)0xffffa089566da810 +(void *)0xffffa089566da828 +(void *)0xffffa089566da840 +(void *)0xffffa089566da858 +(void *)0xffffa089566da870 +(void *)0xffffa089566da888 +(void *)0xffffa089566da8a0 +(void *)0xffffa089566da8b8 +(void *)0xffffa089566da8d0 +(void *)0xffffa089566da8e8 +(void *)0xffffa089566da900 +(void *)0xffffa089566da918 +(void *)0xffffa089566da930 +(void *)0xffffa089566da948 +(void *)0xffffa089566da960 +(void *)0xffffa089566da978 +(void *)0xffffa089566da990 +(void *)0xffffa089566da9a8 +(void *)0xffffa089566da9c0 +(void *)0xffffa089566da9d8 +(void *)0xffffa089566da9f0 +(void *)0xffffa089566daa08 +(void *)0xffffa089566daa20 +(void *)0xffffa089566daa38 +(void *)0xffffa089566daa50 +(void *)0xffffa089566daa68 +(void *)0xffffa089566daa80 +(void *)0xffffa089566daa98 +(void *)0xffffa089566daab0 +(void *)0xffffa089566daac8 +(void *)0xffffa089566daae0 +(void *)0xffffa089566daaf8 +(void *)0xffffa089566dab10 +(void *)0xffffa089566dab28 +(void *)0xffffa089566dab40 +(void *)0xffffa089566dab58 +(void *)0xffffa089566dab70 +(void *)0xffffa089566dab88 +(void *)0xffffa089566daba0 +(void *)0xffffa089566dabb8 +(void *)0xffffa089566dabd0 +(void *)0xffffa089566dabe8 +(void *)0xffffa089566dac00 +(void *)0xffffa089566dac18 +(void *)0xffffa089566dac30 +(void *)0xffffa089566dac48 +(void *)0xffffa089566dac60 +(void *)0xffffa089566dac78 +(void *)0xffffa089566dac90 +(void *)0xffffa089566daca8 +(void *)0xffffa089566dacc0 +(void *)0xffffa089566dacd8 +(void *)0xffffa089566dacf0 +(void *)0xffffa089566dad08 +(void *)0xffffa089566dad20 +(void *)0xffffa089566dad38 +(void *)0xffffa089566dad50 +(void *)0xffffa089566dad68 +(void *)0xffffa089566dad80 +(void *)0xffffa089566dad98 +(void *)0xffffa089566dadb0 +(void *)0xffffa089566dadc8 +(void *)0xffffa089566dade0 +(void *)0xffffa089566dadf8 +(void *)0xffffa089566dae10 +(void *)0xffffa089566dae28 +(void *)0xffffa089566dae40 +(void *)0xffffa089566dae58 +(void *)0xffffa089566dae70 +(void *)0xffffa089566dae88 +(void *)0xffffa089566daea0 +(void *)0xffffa089566daeb8 +(void *)0xffffa089566daed0 +(void *)0xffffa089566daee8 +(void *)0xffffa089566daf00 +(void *)0xffffa089566daf18 +(void *)0xffffa089566daf30 +(void *)0xffffa089566daf48 +(void *)0xffffa089566daf60 +(void *)0xffffa089566daf78 +(void *)0xffffa089566daf90 +(void *)0xffffa089566dafa8 +(void *)0xffffa089566dafc0 +(void *)0xffffa089566dafd8 diff --git "a/tests/integration/data/regression_output/spl/spl_kmem_caches | filter obj.skc_name == \"ddt_cache\" | walk" "b/tests/integration/data/regression_output/spl/spl_kmem_caches | filter obj.skc_name == \"ddt_cache\" | walk" new file mode 100644 index 00000000..149b31b1 --- /dev/null +++ "b/tests/integration/data/regression_output/spl/spl_kmem_caches | filter obj.skc_name == \"ddt_cache\" | walk" @@ -0,0 +1,46 @@ +(void *)0xffffa08937e80040 +(void *)0xffffa08937e86180 +(void *)0xffffa08937e8c2c0 +(void *)0xffffa08937e92400 +(void *)0xffffa08937e98540 +(void *)0xffffa08937e9e680 +(void *)0xffffa08937ea47c0 +(void *)0xffffa08937eaa900 +(void *)0xffffa08959cc0040 +(void *)0xffffa08959cc6180 +(void *)0xffffa08959ccc2c0 +(void *)0xffffa08959cd2400 +(void *)0xffffa08959cd8540 +(void *)0xffffa08959cde680 +(void *)0xffffa08959ce47c0 +(void *)0xffffa08959cea900 +(void *)0xffffa0895be80040 +(void *)0xffffa0895be86180 +(void *)0xffffa0895be8c2c0 +(void *)0xffffa0895be92400 +(void *)0xffffa0895be98540 +(void *)0xffffa0895be9e680 +(void *)0xffffa0895bea47c0 +(void *)0xffffa0895beaa900 +(void *)0xffffa08953680040 +(void *)0xffffa08953686180 +(void *)0xffffa0895368c2c0 +(void *)0xffffa08953692400 +(void *)0xffffa08953698540 +(void *)0xffffa0895369e680 +(void *)0xffffa089536a47c0 +(void *)0xffffa089536aa900 +(void *)0xffffa08953600040 +(void *)0xffffa08953606180 +(void *)0xffffa0895360c2c0 +(void *)0xffffa08953612400 +(void *)0xffffa08953618540 +(void *)0xffffa0895361e680 +(void *)0xffffa089536247c0 +(void *)0xffffa0895362a900 +(void *)0xffffa0895364c2c0 +(void *)0xffffa08953652400 +(void *)0xffffa08953658540 +(void *)0xffffa0895365e680 +(void *)0xffffa089536647c0 +(void *)0xffffa0895366a900 diff --git a/tests/integration/test_spl_generic.py b/tests/integration/test_spl_generic.py index 08bbb199..eccfc282 100644 --- a/tests/integration/test_spl_generic.py +++ b/tests/integration/test_spl_generic.py @@ -16,6 +16,7 @@ # pylint: disable=missing-module-docstring # pylint: disable=missing-function-docstring +# pylint: disable=line-too-long from typing import Any @@ -23,11 +24,24 @@ from tests.integration.infra import repl_invoke, dump_exists, slurp_output_file CMD_TABLE = [ + # avl walker "addr spa_namespace_avl | avl", "addr spa_namespace_avl | walk", "addr arc_mru | member [0].arcs_list[1] | walk | head", + + # multilist walker "addr arc_mru | member [0].arcs_list[1] | multilist | head", + + # spl_cache walker + 'spl_kmem_caches | filter obj.skc_name == "ddt_cache" | walk', + "spl_kmem_caches | filter obj.skc_linux_cache == 0 | spl_cache", + "spl_kmem_caches | filter obj.skc_linux_cache == 0 | spl_cache | cnt", + # spl_cache - ensure we can walk caches backed by SLUB + "spl_kmem_caches | filter obj.skc_linux_cache > 0 | filter obj.skc_obj_alloc > 0 | head 1 | spl_cache", + + # spl_kmem_caches "spl_kmem_caches", + "spl_kmem_caches -v", "spl_kmem_caches -s entry_size", "spl_kmem_caches -s entry_size | head 4 | spl_kmem_caches", "spl_kmem_caches | pp", From cdff14553584039cef297bdf97db46f5878ced72 Mon Sep 17 00:00:00 2001 From: sara hartse Date: Tue, 3 Mar 2020 12:27:53 -0800 Subject: [PATCH 09/19] Verify input types for PrettyPrinter with a generator --- sdb/command.py | 23 ++++++++++++------- .../regression_output/core/spa | range_tree | 1 + tests/integration/test_core_generic.py | 3 +++ 3 files changed, 19 insertions(+), 8 deletions(-) create mode 100644 tests/integration/data/regression_output/core/spa | range_tree diff --git a/sdb/command.py b/sdb/command.py index 49e1d9b3..9d5e09df 100644 --- a/sdb/command.py +++ b/sdb/command.py @@ -634,24 +634,31 @@ def pretty_print(self, objs: Iterable[drgn.Object]) -> None: # pylint: disable=missing-docstring raise NotImplementedError - def _call( # type: ignore[return] - self, - objs: Iterable[drgn.Object]) -> Optional[Iterable[drgn.Object]]: + def check_input_type(self, + objs: Iterable[drgn.Object]) -> Iterable[drgn.Object]: """ - This function will call pretty_print() on each input object, - verifying the types as we go. + This function acts as a generator, checking that each passed object + matches the input type for the command """ - assert self.input_type is not None type_name = type_canonicalize_name(self.input_type) for obj in objs: if type_canonical_name(obj.type_) != type_name: raise CommandError( self.name, - f'exepected input of type {self.input_type}, but received ' + f'expected input of type {self.input_type}, but received ' f'type {obj.type_}') + yield obj - self.pretty_print([obj]) + def _call( # type: ignore[return] + self, + objs: Iterable[drgn.Object]) -> Optional[Iterable[drgn.Object]]: + """ + This function will call pretty_print() on each input object, + verifying the types as we go. + """ + assert self.input_type is not None + self.pretty_print(self.check_input_type(objs)) class Locator(Command): diff --git a/tests/integration/data/regression_output/core/spa | range_tree b/tests/integration/data/regression_output/core/spa | range_tree new file mode 100644 index 00000000..91a26850 --- /dev/null +++ b/tests/integration/data/regression_output/core/spa | range_tree @@ -0,0 +1 @@ +sdb: range_tree: expected input of type range_tree_t *, but received type spa_t * diff --git a/tests/integration/test_core_generic.py b/tests/integration/test_core_generic.py index c979e85e..45018c73 100644 --- a/tests/integration/test_core_generic.py +++ b/tests/integration/test_core_generic.py @@ -168,6 +168,9 @@ # ptype - bogus type "ptype bogus_t", + + # pretty printer passed incorrect type + "spa | range_tree" ] CMD_TABLE = POS_CMDS + NEG_CMDS From 513528d3414a7d5105b7126413c049cdaafefa02 Mon Sep 17 00:00:00 2001 From: Serapheim Dimitropoulos Date: Fri, 13 Mar 2020 15:25:38 +0000 Subject: [PATCH 10/19] Use shfmt for shell scripts in .github/scripts (#118) --- .github/scripts/install-shfmt.sh | 8 ++++++++ .github/workflows/main.yml | 9 +++++++++ 2 files changed, 17 insertions(+) create mode 100755 .github/scripts/install-shfmt.sh diff --git a/.github/scripts/install-shfmt.sh b/.github/scripts/install-shfmt.sh new file mode 100755 index 00000000..8fc8c764 --- /dev/null +++ b/.github/scripts/install-shfmt.sh @@ -0,0 +1,8 @@ +#!/bin/bash -eux + +if [[ ! -f /usr/local/bin/shfmt ]]; then + sudo wget -nv -O /usr/local/bin/shfmt \ + https://github.com/mvdan/sh/releases/download/v3.0.2/shfmt_v3.0.2_linux_amd64 + sudo chmod +x /usr/local/bin/shfmt +fi +echo "shfmt version $(/usr/local/bin/shfmt -version) is installed." diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index fcfff6b1..a3d1f884 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -101,3 +101,12 @@ jobs: - run: python3 -m pip install mypy==0.730 - run: python3 -m mypy --strict --allow-untyped-calls --show-error-codes -p sdb - run: python3 -m mypy --strict --ignore-missing-imports --show-error-codes -p tests + # + # Verify that "shfmt" ran successfully against our shell scripts. + # + shfmt: + runs-on: ubuntu-18.04 + steps: + - uses: actions/checkout@v1 + - run: ./.github/scripts/install-shfmt.sh + - run: /usr/local/bin/shfmt -d .github/scripts/ From 48a50f237de3ac196746f9cbe94c97ffdc328e3e Mon Sep 17 00:00:00 2001 From: Serapheim Dimitropoulos Date: Fri, 13 Mar 2020 15:32:16 +0000 Subject: [PATCH 11/19] shfmt: fix formatting errors --- .github/scripts/download-dump-from-s3.sh | 6 +++--- .github/workflows/main.yml | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/scripts/download-dump-from-s3.sh b/.github/scripts/download-dump-from-s3.sh index b85cc4fe..7fb79191 100755 --- a/.github/scripts/download-dump-from-s3.sh +++ b/.github/scripts/download-dump-from-s3.sh @@ -25,16 +25,16 @@ fi echo "initiating download of $1 from S3 ..." /usr/local/bin/aws s3 cp --no-sign-request s3://sdb-regression-dumps/$1 . -[ $? -eq 0 ] || exit 1 +[ $? -eq 0 ] || exit 1 echo "decompressing dump ..." tar -x --lzma -f $1 echo "moving contents to tests/integration/data ..." mv dump-data/* $DATA_DIR -[ $? -eq 0 ] || exit 1 +[ $? -eq 0 ] || exit 1 rmdir dump-data -[ $? -eq 0 ] || exit 1 +[ $? -eq 0 ] || exit 1 echo "Done" diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index a3d1f884..750ea085 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -109,4 +109,4 @@ jobs: steps: - uses: actions/checkout@v1 - run: ./.github/scripts/install-shfmt.sh - - run: /usr/local/bin/shfmt -d .github/scripts/ + - run: /usr/local/bin/shfmt -d . From 48b8025a527094d372d1aad183c76f8543402562 Mon Sep 17 00:00:00 2001 From: Serapheim Dimitropoulos Date: Fri, 13 Mar 2020 20:32:46 +0000 Subject: [PATCH 12/19] refactor: extract `get_valid_type_by_name()` out of the `ptype` command --- sdb/commands/internal/util.py | 104 +++++++++++++----- sdb/commands/ptype.py | 46 +------- ...container_of bogus_type comm | cast void * | 2 +- ...list bogus_type pid_links[3] | member comm | 2 +- ...les | lxlist bogus_type list | member name | 2 +- ...vmap_area_root | rbtree bogus_type rb_node | 2 +- 6 files changed, 86 insertions(+), 72 deletions(-) diff --git a/sdb/commands/internal/util.py b/sdb/commands/internal/util.py index 85757a95..f1700602 100644 --- a/sdb/commands/internal/util.py +++ b/sdb/commands/internal/util.py @@ -20,19 +20,20 @@ import sdb -def get_valid_struct_name(cmd: sdb.Command, tname: str) -> str: +def get_valid_type_by_name(cmd: sdb.Command, tname: str) -> drgn.Type: """ - If tname is a name of a type that's a typedef to a - struct, this function return will it as is. If this - is a name of a struct, then it returns the canonical - name (e.g. adds "struct" prefix). Otherwise, raises - an error. + Given a type name in string form (`tname`) without any C keyword + prefixes (e.g. 'struct', 'enum', 'class', 'union'), return the + corresponding drgn.Type object. - Used for shorthands in providing names of structure - types to be consumed by drgn interfaces in string - form (linux_list, container_of, etc..). + This function is used primarily by commands that accept a type + name as an argument and exists mainly for 2 reasons: + [1] There is a limitation in the way the SDB lexer interacts with + argparse making it hard for us to parse type names more than + 1 token wide (e.g. 'struct task_struct'). [bad reason] + [2] We save some typing for the user. [good reason] """ - if tname in ['struct', 'union', 'class']: + if tname in ['struct', 'enum', 'union', 'class']: # # Note: We have to do this because currently in drgn # prog.type('struct') returns a different error than @@ -46,21 +47,74 @@ def get_valid_struct_name(cmd: sdb.Command, tname: str) -> str: f"skip keyword '{tname}' and try again") try: - type_ = sdb.get_prog().type(tname) + type_ = sdb.get_type(tname) + if type_.kind == drgn.TypeKind.TYPEDEF and type_.type_name( + ) == sdb.type_canonical_name(type_): + # + # In some C codebases there are typedefs like this: + # + # typedef union GCObject GCObject; // taken from LUA repo + # + # The point of the above is to avoid typing the word + # 'union' every time we declare a variable of that type. + # For the purposes of SDB, passing around a drng.Type + # describing the typedef above isn't particularly + # useful. Using such an object with the `ptype` command + # (one of the consumers of this function) would yield + # the following: + # + # sdb> ptype GCObject + # typedef union GCObject GCObject + # + # Resolving the typedef's explicitly in those cases + # is more useful and this is why this if-clause exists. + # + # sdb> ptype GCObject + # union GCObject { + # GCheader gch; + # union TString ts; + # ... + # } + # + return sdb.type_canonicalize(type_) + return type_ except LookupError: - # Check for struct - struct_name = f"struct {tname}" + # + # We couldn't find a type with that name. Check if + # it is a structure, an enum, or a union. + # + pass + for prefix in ["struct ", "enum ", "union "]: try: - type_ = sdb.get_prog().type(struct_name) - except LookupError as err: - raise sdb.CommandError(cmd.name, str(err)) - return struct_name + return sdb.get_type(f"{prefix}{tname}") + except LookupError: + pass + raise sdb.CommandError( + cmd.name, + f"couldn't find typedef, struct, enum, nor union named '{tname}'") - # Check for typedef to struct - if type_.kind != drgn.TypeKind.TYPEDEF: - raise sdb.CommandError( - cmd.name, f"{tname} is not a struct nor a typedef to a struct") - if sdb.type_canonicalize(type_).kind != drgn.TypeKind.STRUCT: - raise sdb.CommandError(cmd.name, - f"{tname} is not a typedef to a struct") - return tname + +def get_valid_struct_name(cmd: sdb.Command, tname: str) -> str: + """ + If tname is a name of a type that's a typedef to a + struct, this function return will it as is. If this + is a name of a struct, then it returns the canonical + name (e.g. adds "struct" prefix). Otherwise, raises + an error. + + Used for shorthands in providing names of structure + types to be consumed by drgn interfaces in string + form (linux_list, container_of, etc..). + """ + type_ = get_valid_type_by_name(cmd, tname) + + if type_.kind == drgn.TypeKind.STRUCT: + return str(type_.type_name()) + + # canonicalize in case this is a typedef to a struct + canonical_type_ = sdb.type_canonicalize(type_) + if canonical_type_.kind == drgn.TypeKind.STRUCT: + return str(canonical_type_.type_name()) + + raise sdb.CommandError( + cmd.name, f"{tname} is not a struct nor a typedef to a struct") diff --git a/sdb/commands/ptype.py b/sdb/commands/ptype.py index 04b07827..76395239 100644 --- a/sdb/commands/ptype.py +++ b/sdb/commands/ptype.py @@ -21,6 +21,7 @@ import drgn import sdb +from sdb.commands.internal import util class PType(sdb.Command): @@ -74,46 +75,5 @@ def _init_parser(cls, name: str) -> argparse.ArgumentParser: return parser def _call(self, objs: Iterable[drgn.Object]) -> None: - for tp_name in self.args.type: - found = False - - # - # There is a reason we have "" at the end below after we - # check all the C keywords below. There are cases that - # we've seen in C codebases that do things like this: - # - # typedef union GCObject GCObject; // taken from LUA repo - # - # If we checked for typedefs first (e.g. "" below), then - # we'd get the description that is useless: - # - # sdb> ptype GCObject - # typedef union GCObject GCObject - # - # Putting the typedef at the end allows to first check for - # the real type info which is more useful: - # - # sdb> ptype GCObject - # union GCObject { - # GCheader gch; - # union TString ts; - # ... - # } - # - # In the future we probably want to also support queries - # like `ptype union GCObject` so the code doesn't have - # to be mindful of this issue. - # - for prefix in ["struct ", "enum ", "union ", ""]: - try: - print(sdb.get_prog().type(f"{prefix}{tp_name}")) - found = True - except LookupError: - pass - if found: - break - if not found: - raise sdb.CommandError( - self.name, - f"couldn't find typedef, struct, enum, nor union named '{tp_name}'" - ) + for tname in self.args.type: + print(util.get_valid_type_by_name(self, tname)) diff --git a/tests/integration/data/regression_output/linux/addr init_task | member comm | addr | container_of bogus_type comm | cast void * b/tests/integration/data/regression_output/linux/addr init_task | member comm | addr | container_of bogus_type comm | cast void * index 077142fe..24d3c12c 100644 --- a/tests/integration/data/regression_output/linux/addr init_task | member comm | addr | container_of bogus_type comm | cast void * +++ b/tests/integration/data/regression_output/linux/addr init_task | member comm | addr | container_of bogus_type comm | cast void * @@ -1 +1 @@ -sdb: container_of: could not find 'struct bogus_type' +sdb: container_of: couldn't find typedef, struct, enum, nor union named 'bogus_type' diff --git a/tests/integration/data/regression_output/linux/addr init_task | member thread_pid.tasks[3] | lxhlist bogus_type pid_links[3] | member comm b/tests/integration/data/regression_output/linux/addr init_task | member thread_pid.tasks[3] | lxhlist bogus_type pid_links[3] | member comm index 39de8b10..93c7930d 100644 --- a/tests/integration/data/regression_output/linux/addr init_task | member thread_pid.tasks[3] | lxhlist bogus_type pid_links[3] | member comm +++ b/tests/integration/data/regression_output/linux/addr init_task | member thread_pid.tasks[3] | lxhlist bogus_type pid_links[3] | member comm @@ -1 +1 @@ -sdb: lxhlist: could not find 'struct bogus_type' +sdb: lxhlist: couldn't find typedef, struct, enum, nor union named 'bogus_type' diff --git a/tests/integration/data/regression_output/linux/addr modules | lxlist bogus_type list | member name b/tests/integration/data/regression_output/linux/addr modules | lxlist bogus_type list | member name index 853ee443..a0dcea05 100644 --- a/tests/integration/data/regression_output/linux/addr modules | lxlist bogus_type list | member name +++ b/tests/integration/data/regression_output/linux/addr modules | lxlist bogus_type list | member name @@ -1 +1 @@ -sdb: lxlist: could not find 'struct bogus_type' +sdb: lxlist: couldn't find typedef, struct, enum, nor union named 'bogus_type' diff --git a/tests/integration/data/regression_output/linux/addr vmap_area_root | rbtree bogus_type rb_node b/tests/integration/data/regression_output/linux/addr vmap_area_root | rbtree bogus_type rb_node index 6700df75..0e236835 100644 --- a/tests/integration/data/regression_output/linux/addr vmap_area_root | rbtree bogus_type rb_node +++ b/tests/integration/data/regression_output/linux/addr vmap_area_root | rbtree bogus_type rb_node @@ -1 +1 @@ -sdb: rbtree: could not find 'struct bogus_type' +sdb: rbtree: couldn't find typedef, struct, enum, nor union named 'bogus_type' From f433fbb2a7c6e70e23f971b76316fa749b1db30f Mon Sep 17 00:00:00 2001 From: Serapheim Dimitropoulos Date: Fri, 13 Mar 2020 21:31:46 +0000 Subject: [PATCH 13/19] Want sizeof (#153) --- sdb/commands/sizeof.py | 63 +++++++++++++++++++ .../data/regression_output/core/sizeof bogus | 1 + .../data/regression_output/core/sizeof size_t | 1 + .../regression_output/core/sizeof spa vdev | 2 + .../regression_output/core/sizeof struct spa | 1 + .../regression_output/core/sizeof task_struct | 1 + tests/integration/test_core_generic.py | 11 +++- 7 files changed, 79 insertions(+), 1 deletion(-) create mode 100644 sdb/commands/sizeof.py create mode 100644 tests/integration/data/regression_output/core/sizeof bogus create mode 100644 tests/integration/data/regression_output/core/sizeof size_t create mode 100644 tests/integration/data/regression_output/core/sizeof spa vdev create mode 100644 tests/integration/data/regression_output/core/sizeof struct spa create mode 100644 tests/integration/data/regression_output/core/sizeof task_struct diff --git a/sdb/commands/sizeof.py b/sdb/commands/sizeof.py new file mode 100644 index 00000000..0874c4eb --- /dev/null +++ b/sdb/commands/sizeof.py @@ -0,0 +1,63 @@ +# +# Copyright 2020 Delphix +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +# pylint: disable=missing-docstring + +import argparse +from typing import Iterable + +import drgn +import sdb +from sdb.commands.internal import util + + +class SizeOf(sdb.Command): + """ + Print the size of a type in bytes. + + DESCRIPTION + The type can be specified by name as an argument, or + by object through a pipe. + + EXAMPLES + Print the size of struct task_struct and spa_t: + + sdb> sizeof task_struct spa_t + (size_t)9152 + (size_t)9176 + + Figuring out the size of objects passed through a + pipe: + + sdb> addr spa_namespace_avl | deref | sizeof + (size_t)40 + """ + + names = ["sizeof"] + + @classmethod + def _init_parser(cls, name: str) -> argparse.ArgumentParser: + parser = super()._init_parser(name) + parser.add_argument("type", nargs="*", metavar="") + return parser + + def _call(self, objs: Iterable[drgn.Object]) -> Iterable[drgn.Object]: + for tname in self.args.type: + type_ = util.get_valid_type_by_name(self, tname) + yield sdb.create_object('size_t', sdb.type_canonicalize_size(type_)) + for obj in objs: + yield sdb.create_object('size_t', + sdb.type_canonicalize_size(obj.type_)) diff --git a/tests/integration/data/regression_output/core/sizeof bogus b/tests/integration/data/regression_output/core/sizeof bogus new file mode 100644 index 00000000..c8133ac4 --- /dev/null +++ b/tests/integration/data/regression_output/core/sizeof bogus @@ -0,0 +1 @@ +sdb: sizeof: couldn't find typedef, struct, enum, nor union named 'bogus' diff --git a/tests/integration/data/regression_output/core/sizeof size_t b/tests/integration/data/regression_output/core/sizeof size_t new file mode 100644 index 00000000..a6375e71 --- /dev/null +++ b/tests/integration/data/regression_output/core/sizeof size_t @@ -0,0 +1 @@ +(size_t)8 diff --git a/tests/integration/data/regression_output/core/sizeof spa vdev b/tests/integration/data/regression_output/core/sizeof spa vdev new file mode 100644 index 00000000..0ef9fa6a --- /dev/null +++ b/tests/integration/data/regression_output/core/sizeof spa vdev @@ -0,0 +1,2 @@ +(size_t)9176 +(size_t)14440 diff --git a/tests/integration/data/regression_output/core/sizeof struct spa b/tests/integration/data/regression_output/core/sizeof struct spa new file mode 100644 index 00000000..019f62f1 --- /dev/null +++ b/tests/integration/data/regression_output/core/sizeof struct spa @@ -0,0 +1 @@ +sdb: sizeof: skip keyword 'struct' and try again diff --git a/tests/integration/data/regression_output/core/sizeof task_struct b/tests/integration/data/regression_output/core/sizeof task_struct new file mode 100644 index 00000000..8ff6bdc9 --- /dev/null +++ b/tests/integration/data/regression_output/core/sizeof task_struct @@ -0,0 +1 @@ +(size_t)9152 diff --git a/tests/integration/test_core_generic.py b/tests/integration/test_core_generic.py index 45018c73..9b21cbdd 100644 --- a/tests/integration/test_core_generic.py +++ b/tests/integration/test_core_generic.py @@ -120,6 +120,11 @@ "ptype spa_t", "ptype spa vdev", "ptype zfs_case v_t thread_union", + + # sizeof + "sizeof size_t", + "sizeof task_struct", + "sizeof spa vdev", ] NEG_CMDS = [ @@ -170,7 +175,11 @@ "ptype bogus_t", # pretty printer passed incorrect type - "spa | range_tree" + "spa | range_tree", + + # sizeof - bogus types + "sizeof struct spa", + "sizeof bogus" ] CMD_TABLE = POS_CMDS + NEG_CMDS From 22113f46a592da1291e1f32bef67fd3b456aee91 Mon Sep 17 00:00:00 2001 From: Serapheim Dimitropoulos Date: Fri, 13 Mar 2020 21:59:45 +0000 Subject: [PATCH 14/19] Want sum --- sdb/commands/sum.py | 53 +++++++++++++++++++ .../core/echo 1 | echo 2 | sum | 1 + .../regression_output/core/spa | deref | sum | 1 + ...a | vdev | metaslab | deref | sizeof | sum | 1 + .../data/regression_output/core/sum | 1 + .../core/threads | deref | sizeof | sum | 1 + .../core/threads | sizeof | sum | 1 + tests/integration/test_core_generic.py | 12 ++++- 8 files changed, 70 insertions(+), 1 deletion(-) create mode 100644 sdb/commands/sum.py create mode 100644 tests/integration/data/regression_output/core/echo 1 | echo 2 | sum create mode 100644 tests/integration/data/regression_output/core/spa | deref | sum create mode 100644 tests/integration/data/regression_output/core/spa | vdev | metaslab | deref | sizeof | sum create mode 100644 tests/integration/data/regression_output/core/sum create mode 100644 tests/integration/data/regression_output/core/threads | deref | sizeof | sum create mode 100644 tests/integration/data/regression_output/core/threads | sizeof | sum diff --git a/sdb/commands/sum.py b/sdb/commands/sum.py new file mode 100644 index 00000000..eace748d --- /dev/null +++ b/sdb/commands/sum.py @@ -0,0 +1,53 @@ +# +# Copyright 2020 Delphix +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +# pylint: disable=missing-docstring + +from typing import Iterable + +import drgn +import sdb + + +class SdbSum(sdb.Command): + """ + Sum integers passed through the pipe. + + EXAMPLES + Print the number of bytes used by all the metaslab_t + structures: + + sdb> spa | vdev | metaslab | deref | sizeof | sum + (uint64_t)284672 + + Print the number of bytes used by all the task_structs + in the system: + + sdb> threads | deref | sizeof | sum + (uint64_t)4548544 + """ + + names = ["sum"] + + def _call(self, objs: Iterable[drgn.Object]) -> Iterable[drgn.Object]: + result = 0 + for obj in objs: + type_ = sdb.type_canonicalize(obj.type_) + if type_.kind != drgn.TypeKind.INT and type_.kind != drgn.TypeKind.POINTER: + raise sdb.CommandError( + self.name, f"'{type_.type_name()}' is not an integer type") + result += int(obj.value_()) + yield sdb.create_object('uint64_t', result) diff --git a/tests/integration/data/regression_output/core/echo 1 | echo 2 | sum b/tests/integration/data/regression_output/core/echo 1 | echo 2 | sum new file mode 100644 index 00000000..5b9bbfda --- /dev/null +++ b/tests/integration/data/regression_output/core/echo 1 | echo 2 | sum @@ -0,0 +1 @@ +(uint64_t)3 diff --git a/tests/integration/data/regression_output/core/spa | deref | sum b/tests/integration/data/regression_output/core/spa | deref | sum new file mode 100644 index 00000000..908ade20 --- /dev/null +++ b/tests/integration/data/regression_output/core/spa | deref | sum @@ -0,0 +1 @@ +sdb: sum: 'struct spa' is not an integer type diff --git a/tests/integration/data/regression_output/core/spa | vdev | metaslab | deref | sizeof | sum b/tests/integration/data/regression_output/core/spa | vdev | metaslab | deref | sizeof | sum new file mode 100644 index 00000000..8bae3206 --- /dev/null +++ b/tests/integration/data/regression_output/core/spa | vdev | metaslab | deref | sizeof | sum @@ -0,0 +1 @@ +(uint64_t)368640 diff --git a/tests/integration/data/regression_output/core/sum b/tests/integration/data/regression_output/core/sum new file mode 100644 index 00000000..8d8f8e43 --- /dev/null +++ b/tests/integration/data/regression_output/core/sum @@ -0,0 +1 @@ +(uint64_t)0 diff --git a/tests/integration/data/regression_output/core/threads | deref | sizeof | sum b/tests/integration/data/regression_output/core/threads | deref | sizeof | sum new file mode 100644 index 00000000..a23552ef --- /dev/null +++ b/tests/integration/data/regression_output/core/threads | deref | sizeof | sum @@ -0,0 +1 @@ +(uint64_t)5244096 diff --git a/tests/integration/data/regression_output/core/threads | sizeof | sum b/tests/integration/data/regression_output/core/threads | sizeof | sum new file mode 100644 index 00000000..d6fdeb70 --- /dev/null +++ b/tests/integration/data/regression_output/core/threads | sizeof | sum @@ -0,0 +1 @@ +(uint64_t)4584 diff --git a/tests/integration/test_core_generic.py b/tests/integration/test_core_generic.py index 9b21cbdd..0934fd9f 100644 --- a/tests/integration/test_core_generic.py +++ b/tests/integration/test_core_generic.py @@ -125,6 +125,13 @@ "sizeof size_t", "sizeof task_struct", "sizeof spa vdev", + + # sum + "sum", + "echo 1 | echo 2 | sum", + "spa | vdev | metaslab | deref | sizeof | sum", + "threads | sizeof | sum", + "threads | deref | sizeof | sum", ] NEG_CMDS = [ @@ -179,7 +186,10 @@ # sizeof - bogus types "sizeof struct spa", - "sizeof bogus" + "sizeof bogus", + + # sum + "spa | deref | sum", ] CMD_TABLE = POS_CMDS + NEG_CMDS From a1639da26005f37bdcfd5305a016861df0ee36c8 Mon Sep 17 00:00:00 2001 From: Serapheim Dimitropoulos Date: Tue, 17 Mar 2020 17:39:37 +0000 Subject: [PATCH 15/19] fix: sdb requires sudo just for history file (#56) feature: allow alternate paths for history file = Issue Having a history file created using sudo first then trying to use SDB on a crash dump without sudo: ``` $ sdb vmlinux-5.0.0-36-generic dump.201912060006 -s mods Traceback (most recent call last): File "/usr/bin/sdb", line 11, in load_entry_point('sdb==0.1.0', 'console_scripts', 'sdb')() File "/usr/local/lib/python3.6/dist-packages/sdb-0.1.0-py3.6.egg/sdb/internal/cli.py", line 215, in main repl.enable_history(os.getenv('SDB_HISTORY_FILE', '~/.sdb_history')) File "/usr/local/lib/python3.6/dist-packages/sdb-0.1.0-py3.6.egg/sdb/internal/repl.py", line 79, in enable_history readline.read_history_file(self.histfile) PermissionError: [Errno 13] Permission denied ...(sdb exits)... ``` = Testing With this patch we print a warning and drive on: ``` $ sdb vmlinux-5.0.0-36-generic dump.201912060006 -s mods Warning: You don't have permissions to read ~/.sdb_history and the command history of this session won't be saved. Either change this files permission, recreate this file, or use an alternate path with the SDB_HISTORY_FILE environment variable. sdb> addr spa_namespace_avl (avl_tree_t *)spa_namespace_avl+0x0 = 0xffffffffc07d0fe0 ``` Again with this patch in the same situation, we can provide an alternative path: ``` $ SDB_HISTORY_FILE=./test-history sdb vmlinux-5.0.0-36-generic dump.201912060006 -s mods sdb> addr init_task (struct task_struct *)init_task+0x0 = 0xffffffff8c817740 sdb> spa ADDR NAME ------------------------------------------------------------ 0xffffa0894e720000 data 0xffffa089413b8000 meta-domain 0xffffa08955c44000 rpool sdb> (^D) $ cat test-history addr init_task spa $ # running sdb with the same history file we ensure that it works $ SDB_HISTORY_FILE=./test-history sdb vmlinux-5.0.0-36-generic dump.201912060006 -s mods sdb> spa ADDR NAME ------------------------------------------------------------ 0xffffa0894e720000 data 0xffffa089413b8000 meta-domain 0xffffa08955c44000 rpool ``` = Other Notes This patch also helps with situations where SDB gets stuck because the filesystem backing its history file has crashed and it cannot append anything to it. For cases like these with the above patch we should be able to get unstuck by specifying SDB_HISTORY_FILE=/dev/null, like this: ``` $ SDB_HISTORY_FILE=/dev/null sdb vmlinux-5.0.0-36-generic dump.201912060006 -s mods sdb> addr spa_namespace_avl (avl_tree_t *)spa_namespace_avl+0x0 = 0xffffffffc07d0fe0 ``` = Github Issue Tracker Automation Closes #56 --- sdb/internal/cli.py | 2 +- sdb/internal/repl.py | 13 +++++++++++-- 2 files changed, 12 insertions(+), 3 deletions(-) diff --git a/sdb/internal/cli.py b/sdb/internal/cli.py index 08681aee..5358f425 100644 --- a/sdb/internal/cli.py +++ b/sdb/internal/cli.py @@ -212,7 +212,7 @@ def main() -> None: return repl = REPL(prog, list(sdb.get_registered_commands().keys())) - repl.enable_history() + repl.enable_history(os.getenv('SDB_HISTORY_FILE', '~/.sdb_history')) if args.eval: exit_code = repl.eval_cmd(args.eval) sys.exit(exit_code) diff --git a/sdb/internal/repl.py b/sdb/internal/repl.py index e8fc38c7..64cdf772 100644 --- a/sdb/internal/repl.py +++ b/sdb/internal/repl.py @@ -72,14 +72,23 @@ def __init__(self, self.target = target self.histfile = "" readline.set_completer(REPL.__make_completer(vocabulary)) + readline.parse_and_bind("tab: complete") - def enable_history(self, history_file: str = '~/.sdb_history') -> None: + def enable_history(self, history_file: str) -> None: self.histfile = os.path.expanduser(history_file) try: readline.read_history_file(self.histfile) except FileNotFoundError: pass - readline.parse_and_bind("tab: complete") + except PermissionError: + self.histfile = "" + print( + f"Warning: You don't have permissions to read {history_file} and\n" + " the command history of this session won't be saved.\n" + " Either change this file's permissions, recreate it,\n" + " or use an alternate path with the SDB_HISTORY_FILE\n" + " environment variable.") + return readline.set_history_length(1000) atexit.register(readline.write_history_file, self.histfile) From 9e6e0a500142a352e001106b93be07879e01ac5e Mon Sep 17 00:00:00 2001 From: Serapheim Dimitropoulos Date: Tue, 17 Mar 2020 17:52:43 +0000 Subject: [PATCH 16/19] fix: ugly error handling when dump file doesn't exist = Issue Specifying a wrong argument for a crash dump shows the following error: ``` $ sdb vmlinux-5.0.0-36-generic bogus.dump -s mods Traceback (most recent call last): File "/usr/bin/sdb", line 11, in load_entry_point('sdb==0.1.0', 'console_scripts', 'sdb')() File "/usr/local/lib/python3.6/dist-packages/sdb-0.1.0-py3.6.egg/sdb/internal/cli.py", line 209, in main prog = setup_target(args) File "/usr/local/lib/python3.6/dist-packages/sdb-0.1.0-py3.6.egg/sdb/internal/cli.py", line 157, in setup_target prog.set_core_dump(args.core) FileNotFoundError: [Errno 2] No such file or directory: 'bogus.dump' ``` = Patch With this patch: ``` $ sdb vmlinux-5.0.0-36-generic bogus.dump -s mods sdb: no such file: 'bogus.dump' ``` --- sdb/internal/cli.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/sdb/internal/cli.py b/sdb/internal/cli.py index 5358f425..034e77a7 100644 --- a/sdb/internal/cli.py +++ b/sdb/internal/cli.py @@ -154,7 +154,11 @@ def setup_target(args: argparse.Namespace) -> drgn.Program: """ prog = drgn.Program() if args.core: - prog.set_core_dump(args.core) + try: + prog.set_core_dump(args.core) + except FileNotFoundError: + print(f"sdb: no such file: '{args.core}'") + sys.exit(2) # # This is currently a short-coming of drgn. Whenever we From 4c229e03827dcd301bb8d26309ff610f017c0481 Mon Sep 17 00:00:00 2001 From: Serapheim Dimitropoulos Date: Tue, 17 Mar 2020 21:07:32 +0000 Subject: [PATCH 17/19] github-actions: enable testing with multiple python versions github-actions: upgrade to latest stable checkout module (v2) --- .github/scripts/install-libkdumpfile.sh | 12 ++++++++++-- .github/workflows/main.yml | 26 +++++++++++++++++-------- 2 files changed, 28 insertions(+), 10 deletions(-) diff --git a/.github/scripts/install-libkdumpfile.sh b/.github/scripts/install-libkdumpfile.sh index ed8e3b56..80e27449 100755 --- a/.github/scripts/install-libkdumpfile.sh +++ b/.github/scripts/install-libkdumpfile.sh @@ -2,9 +2,12 @@ # # These are build requirements of "libkdumpfile"; if we don't install these, -# the build/install of "libkdumpfile" will fail below. +# the build/install of "libkdumpfile" will fail below. Note that we install +# all version of python3.X-dev so the Github actions jobs can install +# libkdumpfile with the right version. # -sudo apt-get install autoconf automake liblzo2-dev libsnappy1v5 libtool pkg-config python3-dev zlib1g-dev +sudo apt-get install autoconf automake liblzo2-dev libsnappy1v5 libtool pkg-config zlib1g-dev +sudo apt-get install python3.6-dev python3.7-dev python3.8-dev git clone https://github.com/ptesarik/libkdumpfile.git @@ -14,3 +17,8 @@ autoreconf -fi make sudo make install cd - + +# +# Debug statements +# +echo $(which python3) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 750ea085..b61512c7 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -10,12 +10,19 @@ jobs: # install: runs-on: ubuntu-18.04 + strategy: + matrix: + python-version: [3.6, 3.7, 3.8] steps: - - uses: actions/checkout@v1 + - uses: actions/checkout@v2 - uses: actions/setup-python@v1 with: - python-version: '3.6' + python-version: ${{ matrix.python-version }} - run: python3 setup.py install + # + # The statement below is used for debugging the Github job. + # + - run: python3 --version # # Verify "pylint" runs successfully. # @@ -26,7 +33,7 @@ jobs: pylint: runs-on: ubuntu-18.04 steps: - - uses: actions/checkout@v1 + - uses: actions/checkout@v2 - uses: actions/setup-python@v1 with: python-version: '3.6' @@ -46,11 +53,14 @@ jobs: # pytest: runs-on: ubuntu-18.04 + strategy: + matrix: + python-version: [3.6, 3.7, 3.8] steps: - - uses: actions/checkout@v1 + - uses: actions/checkout@v2 - uses: actions/setup-python@v1 with: - python-version: '3.6' + python-version: ${{ matrix.python-version }} - run: python3 -m pip install aws python-config pytest pytest-cov - run: ./.github/scripts/install-libkdumpfile.sh - run: ./.github/scripts/install-drgn.sh @@ -65,7 +75,7 @@ jobs: yapf: runs-on: ubuntu-18.04 steps: - - uses: actions/checkout@v1 + - uses: actions/checkout@v2 - uses: actions/setup-python@v1 with: python-version: '3.6' @@ -93,7 +103,7 @@ jobs: mypy: runs-on: ubuntu-18.04 steps: - - uses: actions/checkout@v1 + - uses: actions/checkout@v2 - uses: actions/setup-python@v1 with: python-version: '3.6' @@ -107,6 +117,6 @@ jobs: shfmt: runs-on: ubuntu-18.04 steps: - - uses: actions/checkout@v1 + - uses: actions/checkout@v2 - run: ./.github/scripts/install-shfmt.sh - run: /usr/local/bin/shfmt -d . From addf0f6bc830492e1bf39dab5f0b90ecbdd6839a Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Mon, 4 May 2020 10:58:01 -0700 Subject: [PATCH 18/19] Merge branch 'master' into '6.0/stage' (#220) * pylint upgrade: fix new warnings (#218) * Migrate "sync-with-master" to use "delphix/actions" (#217) Co-authored-by: Serapheim Dimitropoulos Co-authored-by: Prakash Surya --- .github/scripts/install-hub.sh | 3 -- .github/scripts/sync-with-master.sh | 39 -------------------------- .github/workflows/sync-with-master.yml | 6 ++-- sdb/command.py | 2 +- sdb/commands/zfs/histograms.py | 2 +- 5 files changed, 5 insertions(+), 47 deletions(-) delete mode 100755 .github/scripts/install-hub.sh delete mode 100755 .github/scripts/sync-with-master.sh diff --git a/.github/scripts/install-hub.sh b/.github/scripts/install-hub.sh deleted file mode 100755 index 5caf70f4..00000000 --- a/.github/scripts/install-hub.sh +++ /dev/null @@ -1,3 +0,0 @@ -#!/bin/bash -eux - -curl -fsSL https://github.com/github/hub/raw/master/script/get | bash -s v2.14.2 diff --git a/.github/scripts/sync-with-master.sh b/.github/scripts/sync-with-master.sh deleted file mode 100755 index d8e48786..00000000 --- a/.github/scripts/sync-with-master.sh +++ /dev/null @@ -1,39 +0,0 @@ -#!/bin/bash -eux - -# -# This variable must be passed into this script. -# -[[ -n "${BRANCH}" ]] || exit 1 - -# -# We need these config parameters set in order to do the git-merge. -# -git config user.name "${GITHUB_ACTOR}" -git config user.email "${GITHUB_ACTOR}@users.noreply.github.com" - -# -# We need the full git repository history in order to do the git-merge. -# -git fetch --unshallow - -# -# In order to open a pull request, we need to push to a remote branch. -# To avoid conflicting with existing remote branches, we use branches -# within the "sync-with-master" namespace. -# -git checkout -b "sync-with-master/${BRANCH}" "origin/${BRANCH}" -git merge -Xtheirs origin/master -git push -f origin "sync-with-master/${BRANCH}" - -# -# Opening a pull request may fail if there already exists a pull request -# for the branch; e.g. if a previous pull request was previously made, -# but not yet merged by the time we run this "sync" script again. Thus, -# rather than causing the automation to report a failure in this case, -# we swallow the error and report success. -# -# Additionally, as along as the git branch was properly updated (via the -# "git push" above), the existing PR will have been updated as well, so -# the "hub" command is unnecessary (hence ignoring the error). -# -git log -1 --format=%B | hub pull-request -F - -b "${BRANCH}" || true diff --git a/.github/workflows/sync-with-master.yml b/.github/workflows/sync-with-master.yml index 5d98d1d1..a6a7a447 100644 --- a/.github/workflows/sync-with-master.yml +++ b/.github/workflows/sync-with-master.yml @@ -14,8 +14,8 @@ jobs: runs-on: ubuntu-18.04 steps: - uses: actions/checkout@v2 - - run: ./.github/scripts/install-hub.sh - - run: ./.github/scripts/sync-with-master.sh + - uses: delphix/actions/sync-with-master@master + with: + branch-to-sync: ${{ matrix.branch }} env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - BRANCH: ${{ matrix.branch }} diff --git a/sdb/command.py b/sdb/command.py index 9d5e09df..83603cca 100644 --- a/sdb/command.py +++ b/sdb/command.py @@ -145,7 +145,7 @@ def help(cls, name: str) -> None: # conditional control flow. # # pylint: disable=unsubscriptable-object - it_text = f"This command accepts inputs of type 'void *'," + it_text = "This command accepts inputs of type 'void *'," if cls.input_type[-1] == '*': it_text += f" and '{cls.input_type[:-1].strip()}'," it_text += f" which will be converted to '{cls.input_type}'." diff --git a/sdb/commands/zfs/histograms.py b/sdb/commands/zfs/histograms.py index aea150c8..9f983b57 100644 --- a/sdb/commands/zfs/histograms.py +++ b/sdb/commands/zfs/histograms.py @@ -143,7 +143,7 @@ def print_histogram(hist: drgn.Object, def _call(self, objs: Iterable[drgn.Object]) -> None: for obj in objs: - print(f'seg-size count') + print('seg-size count') print(f'{"-" * 8} {"-" * 5}') ZFSHistogram.print_histogram(obj, self.args.offset) ZFSHistogram.print_histogram_median(obj, self.args.offset) From 9957fdeaad72561b62e612605f2e741e782e828a Mon Sep 17 00:00:00 2001 From: sravyamks <32839681+sravyamks@users.noreply.github.com> Date: Thu, 18 Jun 2020 12:52:11 -0400 Subject: [PATCH 19/19] Add copyright to debian folder (#231) Reasoning: The copyrights will be included the debian packages and can be scanned on a deployed VM by Delphix's automation. --- debian/copyright | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) create mode 100644 debian/copyright diff --git a/debian/copyright b/debian/copyright new file mode 100644 index 00000000..bca024ba --- /dev/null +++ b/debian/copyright @@ -0,0 +1,23 @@ +Format: http://www.debian.org/doc/packaging-manuals/copyright-format/1.0/ +Upstream-Name: sdb +Source: https://github.com/delphix/sdb + +Files: * +Copyright: Delphix Corp. +License: Apache-2.0 + +License: Apache-2.0 + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + . + http://www.apache.org/licenses/LICENSE-2.0 + . + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + . + On Debian systems, the complete text of the Apache License can be found in + the file `/usr/share/common-licenses/Apache-2.0'.