summaryrefslogtreecommitdiff
path: root/lib/libprocstat
diff options
context:
space:
mode:
authorMateusz Guzik <mjg@FreeBSD.org>2020-03-08 00:23:36 +0000
committerMateusz Guzik <mjg@FreeBSD.org>2020-03-08 00:23:36 +0000
commitd2222aa0e949cbab3c322b4c2956130acb01e7c2 (patch)
tree36ad02fca88ba5468f66aeb58013dbdfe23bc9a0 /lib/libprocstat
parenta6924f5db3cba5306b316b813094753841c5e6ba (diff)
downloadsrc-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.c9
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;