| Education
|
|
California Institute of Technology
BS in Physics received June 2002
|
| Programming Languages
|
|
| Fluent: |
|
C (>20 years),
shell scripts (>12 years),
Sparc assembly (>5 years),
x86 assembly (>5 years)
|
| Familiar: |
|
Python (4 years),
Objective-C (3 years),
C++ (3 years),
Perl (2 years),
Java (1 year),
Rust (1 year)
|
|
| Operating Systems
|
|
| Fluent: |
| Solaris (extensive), Linux (7 years)
|
| Familiar: |
| *BSD (9 months),
Windows and MacOS X (never professionally)
|
|
| Work Experience
|
|
Google, LLC
Staff Software Engineer, May 2018 – present
I work in the Linux Production Kernel (ProdKernel) Memory Management group.
My current projects are:
Kernel Metrics Technical Debt Google generates a variety of telemetry and
metrics using an internal debugfs filesystem, which is a
source of technical debt. This prevents some subsystems (like Memory Management)
from adding many statistics, since the cost of rebasing is too high. I'm working
on a plan to reduce this by working with upstream statistics and metrics projects
to add a similar filesystem to the upstream kernel, so that we can switch to that.
Upstream A/B performance testing Helping maintain and extend an existing
single-machine benchmarking system to work on newer upstream kernels. The goal is
to allow us to both contribute performance data to the upstream community on
hardware we care about (and find regressions earlier), and enable our kernel team
to more easily measure and share performance results on patches being
sent upstream. I'm supporting the MM-related benchmarks, and helping our team
and our collaborators get quick turn-around on their benchmarks.
ProdKernel Rotation
I'm a member of the "ProdKernel Rotation", where I spend one week out of every 8-12
being the kernel representative for on-call issues that have stumped SRE. This
is a working-hours-only on-call shift, and (since such issues are rare) it mostly
involves triage of incoming syzkaller bugs and
handing off those issues to the relevant teams.
Previously, I've worked on:
Far Memory Investigations I worked with the Borglet (Google's distributed system
monitor) and Hardware Platform teams to investigate integrating 3D Xpoint and
other "distant" memory (cheaper than DRAM but slower) into our production fleet. I
investigated of PMU-based read/write sample data using Python and pandas
to see if we could use it to watch access patterns to drive data motion between
DRAM and Far Memory, but it didn't pan out.
Investigating L1TF mitigations I spent a couple months working
to investigate directions for Address-space-isolation-based mitigations for
the L1TF Intel vulnerability
Co-hosted two interns With another engineer, I hosted two rising-Junior
summer interns, who investigated alternative compression & allocation
algorithms for our production zswap stack. Introduced them to and mentored them in
professional engineering, linux development, cherry-picking patches, kernel
testing, crash dumps, and kernel debugging.
|
|
|
|
Oracle Corporation
Senior Principal Software Engineer,
November 2014 – April 2018
Principal Software Engineer,
February 2010 – November 2014
RDBMS Data Layer Group
From September 2017 – April 2018 I was in the Oracle RDBMs Data Layer
group, working on a project to apply persistent memory (3D XPoint, etc.)
to the database, and doing some cleanups to familiarize myself with the codebase.
I continued to consult with the Solaris team when issues came up.
Oracle's acquisition of Sun Microsystems completed in February 2010.
From February 2010 – September 2017, I worked on the Virtual Memory team of
the Solaris Kernel Group doing:
VM 2.0 Phase 1 I spent two and a half years as one
of the primary engineers on the first phase of VM 2.0, which
re-implemented the "physical side" of the Solaris VM subsystem, which
was ~30 years old. The new version bakes in large pages,
the physical partitioning of user and kernel memory, and Non-Uniform
Memory Access (NUMA) into the basic design. Phase 1 was a
>100k-line project built by a team of 5 engineers consisting of
10-11 intertwined sub-projects.
I pair-programmed with another engineer (the technical lead), and we
built around 7 or 8 of those sub-projects, including the basic page state
tracking structure and memory freelists, dynamic addition and removal of memory,
memory power management support, memory allocation credits, queues for waiting
for memory availability, and debugging support for all of our new
data structures. I was also responsible for maintaining the project
repository, merging with ongoing development work, and managing the code review process.
Phase 1 shipped as part of Solaris 11.1.
VM / IO interface restructuring I refactored the interface
between the Virtual Memory subsystem and the I/O subsystem, so that the changes
to how physical memory is locked down for I/O done in VM2 Phase 2 would be behind an
interface barrier. This was a 10k+ line project spanning
a wide swatch of the Solaris Kernel, including rewriting four
separate variants of the DMA setup code. The new interfaces made the
resulting code both shorter and easier to understand, and integrated
into Solaris 11.2.
Virtual Memory, Phase 2
I was the primary engineer for Phase 2 of the VM 2.0 project
(the process of rewriting Solaris Virtual Memory from the ground up).
Phase 2 covered re-implementing the "Intimate Shared Memory"
used by databases for their main shared memory segment in
terms of the new VM 2.0 data structures, some introduced by Phase 1, and
the rest new to Phase 2. The work improved the anonymous memory
initialization part of database startup time by ~5-10%, and turned the
database's teardown of the memory segment from a
tens-to-hundreds of seconds operation (scaling with segment size) into
an almost constant-time millisecond cleanup.
Phase 2 integrated into Solaris 11.3, and was a ~35,000 line project.
Async write acquire for kernel rwlocks
I extended the kernel readers/writer lock
primitive (krwlock) to allow a thread to request asynchronous write
acquisitions of normal kernel rwlocks. This required minor
reworking of the main krwlock codepaths, as well as adding a new
interface to the underlying priority-inheritance turnstile
implementation. It was integrated as part of the Phase 2 project.
Virtual Memory Technical Lead
From early 2015-September 2017, I was Technical Lead for the VM2 team,
overseeing the work of 5-7 engineers to extended and maintain
the virtual memory system. This involved mentoring the junior group
members, scoping projects, working with the engineers on design
and implementation issues, coordinating work in progress with
other groups who depended upon it, organizing bug triage, and
presenting schedules and progress to the larger Solaris group. I also
worked on various VM projects, including re-working the swap and
reserved memory accounting to give better statistics to the new
Solaris Analytics project.
Other wider duties I had included:
Crash Dump Analysis
I have a lot of experience analyzing Solaris
crash dumps, and often helped the Solaris technical leads and other engineers
analyze difficult crash dumps. I also maintained documentation for our
debugging tools and contributed to internal mailing lists about them.
Patent Review Committee From July 2013 – April 2018, I
was on the Software & Operating Systems Patent Review Committee, which
reviews potentially patentable inventions submitted by engineers throughout the
Solaris, Oracle Labs, and Oracle Hardware divisions. It is responsible
for evaluating and triaging the submitted ideas, and either rejecting
them, requesting further information from the submitters, or
green-lighting them to go through the full patenting process.
Change Review Team From 2004 – 2006 and 2008 – 2017,
I was on the Solaris "Change Review Team" (CRT), whose job was to
evaluate the technical risk and merit of proposed changes to the Solaris
source base, so that its level of quality is maintained. The CRT was the final
gate between code review and the integration of a project or bugfix.
|
|
|
|
Sun Microsystems, Inc.
Senior Software Engineer,
March, 2008 – February, 2010
Worked as a senior engineer in the Solaris development organization,
focusing on Solaris Kernel Development. In addition to
resuming my Change Review Team and Crash Dump Analysis
duties (see above), I worked on:
ZFS
Investigated and addressed performance issues in the Zettabyte File
System (ZFS). Worked on analyzing checksum algorithm performance and
implementation.
Improved fault management information for ZFS checksum errors.
System Duty Cycle scheduling class
As part of my ZFS performance investigation, I worked on fixing issues
with ZFS I/O processing threads (responsible for doing work like
compressing/decompressing and checksumming data on its way to/from
disks) preventing other threads from making progress. With
one other engineer, I designed and implemented a new System scheduling
class for kernel threads which use large amounts of CPU time. This
scheduling class has since been applied to many other threads in the kernel.
Debugging support
I've done various work improving Solaris debugging support in the
Solaris modular debugger (mdb), including making object identification
pluggable, making searching kernel memory for a pointer
efficient, summarizing thread stack traces,
improving printing of enum values, etc.
|
|
|
|
The EROS Group, LLC
Partner and Staff Engineer,
September, 2006 – January, 2008
I worked in a two-person startup designing and implementing "Coyotos",
a high-reliability, high-security microkernel targeting the embedded space.
Coyotos was a from-scratch successor to the EROS kernel I previously worked on at
University of Pennsylvania. The kernel was written in C, the
build tools and user programs in C and C++. The initial kernel
rans on x86, and we did most of our development testing under
qemu. I worked in the following areas:
Business
I collaborated on several SBIR (Small Business Innovative Research)
Phase I proposals and two BAA (Broad Agency Announcement) proposals
for government funding.
Build Tools
I modified the Interface Description Language (IDL) code generation tool to
process and understand
doxygen-style documentation comments, for automatically generated
architecture documentation.
I wrote address space tree builders in the system image generation tool, for loading
ELF binaries into the bootable image.
Kernel
I wrote most of the kernel's Object handling code, including the
system image loader, the object hash (manages locating objects by ID),
the capability preperation logic, and the generic address space
walker. I also wrote the x86 page fault handler and page-table invalidation logic.
I assisted with the architecture, design, and implementation of
the kernel's invocation path, which was used for
all extra-Process communication, both to the kernel and to other
processes. The IPC design went through several revisions.
User-land
I designed and implemented the bulk of the extant user-level support
and basic utility programs in Coyotos, including the "Space Bank"
(which provides all user-related objects and memory), the low-level
C runtime initialization code, the "spawn"ing process, a copy-on-write
address space manager, and the "elf" program address space manager.
|
|
|
|
Sun Microsystems, Inc.
Member of Technical Staff,
November, 2001 – September, 2006
By the end of my time at Sun, my projects and responsibilities included the
Change Review Team and Crash Dump Analysis duties mentioned above, and:
Userland Filesystem Framework My final project
involved designing and implementing a userland-daemon backed
filesystem framework based on the Solaris Doors IPC mechanism.
I did initial prototyping and scoping of the work, but left before
it was integrated.
OpenSolaris Sponsor In addition to being on the
Change Review Team (see above), I was also a OpenSolaris Sponsor, which
meant I took contributions
from the OpenSolaris community and worked to integrate them into
the main Solaris release.
Product Training I presented training presentations to
groups of either Sun
Employees or customers about specific subsystems of Solaris about once every
month or two.
These presentations mainly involved training on the design and use of the
Solaris Management Framework and the Dynamic Tracing Framework
(Dtrace). I've presented to groups as small as 10 and as large
as 300 people.
My past projects and responsibilities included:
Completing libumem(3lib) My first
project after joining Sun was to "productize" the port of the
kernel memory allocator (kmem) I'd done as an intern.
libumem(3lib) became a major competitive feature for Solaris; its
scalability provided a major advantage. Internally, hundreds of bugs have
been found, tracked down, and fixed using libumem's
debugging features.
Solaris Management Framework One of the
major projects for Solaris 10 was re-architecting the way
software services are managed. The Solaris Management Framework
(smf) was the end result; I designed and
implemented the programmatic interface and underlying daemon for
the smf repository, a transactional store of service
configuration and state. The overall project was reported in
the 2005 LISA conference.
Platinum Beta The Solaris Platinum Beta program
is for bleeding-edge customers who are willing to run Solaris
beta bits in a production environment. I was a front-line engineer for three
customers, and acted as their first point-of-contact for all Solaris issues.
Doors IPC Subsystem I discovered a series of very serious
security holes in a Solaris-specific IPC subsystem called Doors, did a pinpoint
fix for the version of Solaris about to be released, and re-wrote it in the
following Solaris release, closing the remaining holes and improving the code's
maintainability.
Debugging Infrastructure Solaris 10 introduced an in-situ
kernel debugger, kmdb, which had substantial memory constraints. I
re-worked many of the memory-related debugger commands to use substantially less memory,
which allowed them to function in the kmdb environment, including our memory leak
detector.
Tool Building and Support I did several build and source code
tool improvements (increasing build parallelism, improving the coding-style checker,
improving the source-code searcher, etc.)
|
|
|
|
Sun Microsystems, Inc.
Summer Intern,
May, 2000 – September, 2000
I interned in the Solaris Kernel Group. I investigated a syscall performance degredation.
I ported the Solaris kernel memory allocator (including advanced debugging
support and memory leak detection) to a user-space library
which was reported in the 2001 USENIX proceedings.
I fixed multi-threaded performance in the existing 'MT-hot'
malloc implementation, making it scale linearly up to
the number of available processors, and decreased its fragmentation issues.
|
|
|
|
Tradar, LLC
Member of Technical Staff,
June, 1998 – September, 1998
I was responsible for software architecture and significant
implementation of data analysis and trading system for the
Options Market. I supervised two other software developers, and
wrote a data analysis tool using the Statistical Analysis System
to analyze the trade data and create Postscript pictures of the results.
|
|
|
|
University of Pennsylvania
Research Associate,
June, 1997 – September, 1997
I worked with Jonathan Shapiro on the "Extremely Reliable Operating
System" (EROS), a capability-based research OS. I was the principal designer
and implementor of the EROS "Space Bank",
which was responsible for disk storage allocation, placement, and
locality. EROS is a single-level store, so the Space Bank
design had to consider application-level usage patterns, including
heap, stack, and bulk data allocation. This work was reported
in the 2002 Usenix proceedings. I also designed, implemented,
and tested a component that manages a set of
capabilities, and a line discipline implementation.
|
|
|
|
Filoli Information Systems, Inc.
Part-Time Employee and
Member of Technical Staff,
April, 1994 – August, 1996
Filoli was a Palo Alto start-up which designed and implemented a
NextStep-based paperless office system for a property-casualty
insurance company. I began as a part-time employee and became a full-time
employee in less than a year.
I initially functioned as a general troubleshooter, and did a
wide variety of projects, including tool building, application
programming, and setting up communications hardware and
software. I subsequently designed and implemented tool to facilitate
development in a daily-build environment which was used daily by more
than 30 programmers. I designed and did initial implementation
of integrated computerized telephony application. I designed and
implemented an integrated check writing system which included security
and journaling.
|
| Papers
|
|
Jonathan Adams, David Bustos,
Stephen Hahn, and Liane Praza
Solaris Service Management Facility: Modern System Startup and
Administration
Proceedings of the 2005 Large Installation System Administration (LISA)
USENIX Conference
Jonathan Shapiro and Jonathan Adams
Design Evolution of the EROS Single-Level Store
Proceedings of the 2002 Usenix Conference
Jeff Bonwick and Jonathan Adams
Magazines and vmem: Extending the Slab Allocator to Many CPUs and
Arbitrary Resources
Proceedings of the 2001 Usenix Conference
|
| Patents
|
|
US 7970740,
Automated Service Configuration Snapshots and Fallback,
Stephen C. Hahn, Liana Praza, and Jonathan Adams
US 8572441 B2,
Maximizing Encodings of Version Control Bits for Memory Corruption Detection,
Darryl J. Gove, Zoran Radovic, Jonathan Adams
US 9052903 B2,
Operating System Support for Memory Power Management,
Blake A. Jones, Julia D. Harper, and Jonathan William Adams
US 9183126 B2,
Memory Range Preferred Sizes and Out-of-bounds Counts,
Blake A. Jones and Jonathan William Adams
US 9367439 B2,
Physical Memory Usage Prediction,
Eric E. Lowe, Blake A. Jones, and Jonathan William Adams
|
| References
|
|
available upon request
|