-
- Downloads
zfsbuffers: reference count the arc buffer
Gleb has noticed that the ARC buffers can go unshared too early. This will
happen because we call the UNMAP operation on every put(). That is certainly
not what we want, since the buffer only has to be unshared when the last
reference is gone.
Design decisions:
1) We obviously can't use the arc natural reference count for that, since
bumping it would make the buffer unevictable.
2) We could modify the arc_buf structure itself to add another refcnt (minimum
4 bytes). However, I am trying to keep core-ZFS modifications to a minimum,
and only to places where it is totally unavoidable.
Therefore, the solution is to add another hash, which will hash the whole
buffer instead of the physaddr like the one we have currently. In terms of
memory usage, it will add only 8 bytes per buffer (+/- 128k each buffer), which
makes for a memory usage of 64k per mapped Gb compared to the arc refcount
solution. This is a good trade off.
I am also avoiding adding a new vop_map/unmap style operation just to query the
buffer address from its file attributes (needed for the put side). Instead, I
am conventioning that an empty iovec means query, and a filled iov means
unshare.
Signed-off-by:
Glauber Costa <glommer@cloudius-systems.com>
Showing
- bsd/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/dmu.c 9 additions, 1 deletionbsd/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/dmu.c
- core/mmu.cc 33 additions, 4 deletionscore/mmu.cc
- fs/vfs/vfs_fops.cc 17 additions, 3 deletionsfs/vfs/vfs_fops.cc
- include/osv/mmu.hh 2 additions, 2 deletionsinclude/osv/mmu.hh
Loading
Please register or sign in to comment