diff options
author | Mateusz Guzik <mjg@FreeBSD.org> | 2020-03-08 00:23:36 +0000 |
---|---|---|
committer | Mateusz Guzik <mjg@FreeBSD.org> | 2020-03-08 00:23:36 +0000 |
commit | d2222aa0e949cbab3c322b4c2956130acb01e7c2 (patch) | |
tree | 36ad02fca88ba5468f66aeb58013dbdfe23bc9a0 /lib/libprocstat | |
parent | a6924f5db3cba5306b316b813094753841c5e6ba (diff) | |
download | src-test-d2222aa0e949cbab3c322b4c2956130acb01e7c2.tar.gz src-test-d2222aa0e949cbab3c322b4c2956130acb01e7c2.zip |
fd: use smr for managing struct pwd
This has a side effect of eliminating filedesc slock/sunlock during path
lookup, which in turn removes contention vs concurrent modifications to the fd
table.
Reviewed by: markj, kib
Differential Revision: https://reviews.freebsd.org/D23889
Notes
Notes:
svn path=/head/; revision=358734
Diffstat (limited to 'lib/libprocstat')
-rw-r--r-- | lib/libprocstat/libprocstat.c | 9 |
1 files changed, 5 insertions, 4 deletions
diff --git a/lib/libprocstat/libprocstat.c b/lib/libprocstat/libprocstat.c index de3b674be7c83..cf51270dcedde 100644 --- a/lib/libprocstat/libprocstat.c +++ b/lib/libprocstat/libprocstat.c @@ -460,6 +460,7 @@ procstat_getfiles_kvm(struct procstat *procstat, struct kinfo_proc *kp, int mmap struct file file; struct filedesc filed; struct pwd pwd; + unsigned long pwd_addr; struct vm_map_entry vmentry; struct vm_object object; struct vmspace vmspace; @@ -488,10 +489,10 @@ procstat_getfiles_kvm(struct procstat *procstat, struct kinfo_proc *kp, int mmap return (NULL); } haspwd = false; - if (filed.fd_pwd != NULL) { - if (!kvm_read_all(kd, (unsigned long)filed.fd_pwd, &pwd, - sizeof(pwd))) { - warnx("can't read fd_pwd at %p", (void *)filed.fd_pwd); + pwd_addr = (unsigned long)(FILEDESC_KVM_LOAD_PWD(&filed)); + if (pwd_addr != 0) { + if (!kvm_read_all(kd, pwd_addr, &pwd, sizeof(pwd))) { + warnx("can't read fd_pwd at %p", (void *)pwd_addr); return (NULL); } haspwd = true; |