Zfs.exports

From OpenZFS on OS X
Revision as of 09:32, 13 April 2021 by Lundman (Talk | contribs)

Jump to: navigation, search

zfs.exports

We used to list functions from XNU's private.exports, and using a codeless kext let's us call them. With 2.0 re-port, we no longer use zfs.exports, but it would be nice to have some calls back.

_cpu_number

Comment: Used to spread out lock contention, we use the lock at active-core-index
Alternative: None, only using [0]
Result: performance penalty
_fp_lookup
_fp_drop
_fp_drop_written
_fo_read
_fo_write

Comment: "zfs send" and "zfs recv" will either do IO on a file (vnode) or pipe. There is no
way to do IO on a pipe in a kext without private.exports. 
Alternative: userland will mknod /tmp/.pipe, spawn a relay helper, and open(/tmp/.pipe) which passes
a vnode to kernel. This works, but is complicated, both setting up pipes, and cleaning up. Especially with
SIGINT involved. It would be nice to do pipe IO in kext.
Result: Complicated code, but already working. Pipes love to deadlock, so corner cases could exist.
_vnode_iocount

Comment: Used to know if VFS will re-enter before vnode_put(). 
Alternative: ((int32_t *)vp)[25] - disgusting, but no choice. Really don't want to look in struct vnode.
Result: None, but if struct vnode changes we explode.
_hostname

Comment: uses hostname for diagnostic messages, history logs and multihost mounting (failover would
display which host stopped and which host took over.)
Alternative: None. Some work arounds could be done, like passing hostname from userland. Hashing hostid as string.
Result: user confusion to which host was in use. (Until work around)
_virtual_space_start
_virtual_space_end
_vm_page_free_wanted
_vm_page_free_count
_vm_page_free_min
_vm_page_speculative_count
_vm_pool_low

Comment: used to detect memory pressure well before jettison. 
Alternative: implement with optional hardcap limit, mach_vm_pressure_level_monitor and
mach_vm_pressure_monitor.
Result: Hopefully can be made to run the same, without stutter.
_VFS_ROOT
_rootvnode

Comment: Used with boot to know when root has been mounted. vfs_rootvnode()
does not check for NULL and will just panic.
Alternative: None, It would be better if vfs_rootvnode() would not panic.
Result: No boot support.
_cache_purgevfs

Comment: Used to drop all cache entires for a mount, for example "zfs rollback".
Alternative: Implemented with vnode_iterate(cache_purge_negatives() cache_purge()). Working.
Result: None. Happy to live without.
_vfs_context_kernel
Comment: Used at times when it is correct to use kernel context. Like hfs.kext does as well.
Alternative: None
Result: No idea, seems to run any way
_vnode_lookupat

Comment: Look up a "file" from a directory is useful.
Alternative: Implemented with vn_getpath() strcat("/file" and vnode_lookup().
Result: Some string work in kernel, not "that" expensive. Still, vnode_lookupat would be nice.
_kvtophys
__mh_execute_header
_gLoadedKextSummaries

Comment: Used only in debug/panic. To lookup symbols when dumping stack.
Alternatives: None, and even harder with arm64's PAC. Can live without.
Result: Stack dumps with addresses only, use lldb to resolve symbols.
_kauth_cred_getgroups

Comment: Getting a list of other groups, to check for permission.
Alternative: Get list of permissions, and compare with _kauth_cred_ismember_gid
Result: No difference, just #ifdef in upstream
_cpuid_info

Comment: Get CPU features, sse, avx, aes etc.
Alternative: inline asm { cpuid }, and create own bit checks.
Result: None, just a shame to not be able to use XNU existing API.
thread_set_cpulimit
throttle_set_thread_io_policy

rottegift said something about something