From 387d2e2917226c0552942da3a77ce8e9a965080d Mon Sep 17 00:00:00 2001 From: Matthew Dillon Date: Fri, 14 Feb 2020 16:01:09 -0800 Subject: [PATCH] devfs - Clean up some SMP inefficiencies * We don't need the devfs master lock around a setattr call. This fixes the open(O_CREAT|O_TRUNC) path for redirects to e.g. /dev/null, which is used all over the place in ports builds. * The devfs spec open (open() again) path can obtain the devfs master lock shared instead of exclusive, except in the cloning case. This significantly reduces stalls during heavily concurrent bulk builds. --- sys/vfs/devfs/devfs_vnops.c | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/sys/vfs/devfs/devfs_vnops.c b/sys/vfs/devfs/devfs_vnops.c index b1599e89db..adf1dd2e2c 100644 --- a/sys/vfs/devfs/devfs_vnops.c +++ b/sys/vfs/devfs/devfs_vnops.c @@ -635,8 +635,6 @@ devfs_vop_setattr(struct vop_setattr_args *ap) return ENOENT; node_sync_dev_get(node); - lockmgr(&devfs_lock, LK_EXCLUSIVE); - vap = ap->a_vap; if ((vap->va_uid != (uid_t)VNOVAL) || (vap->va_gid != (gid_t)VNOVAL)) { @@ -667,7 +665,6 @@ devfs_vop_setattr(struct vop_setattr_args *ap) out: node_sync_dev_set(node); nanotime(&node->ctime); - lockmgr(&devfs_lock, LK_RELEASE); return error; } @@ -898,12 +895,14 @@ devfs_spec_open(struct vop_open_args *ap) int exists; devfs_debug(DEVFS_DEBUG_DEBUG, "devfs_spec_open: -1.1-\n"); - lockmgr(&devfs_lock, LK_EXCLUSIVE); + lockmgr(&devfs_lock, LK_SHARED); ndev = devfs_clone(dev, node->d_dir.d_name, node->d_dir.d_namlen, ap->a_mode, ap->a_cred); if (ndev != NULL) { + lockmgr(&devfs_lock, LK_RELEASE); + lockmgr(&devfs_lock, LK_EXCLUSIVE); newnode = devfs_create_device_node( DEVFS_MNTDATA(vp->v_mount)->root_node, ndev, &exists, NULL, NULL); -- 2.41.0