diff --git a/sys/kern/kern_proc.c b/sys/kern/kern_proc.c --- a/sys/kern/kern_proc.c +++ b/sys/kern/kern_proc.c @@ -91,6 +91,7 @@ #include #include #include +#include #include #include @@ -2615,11 +2616,9 @@ struct ucred *cred; struct vnode *vp; struct vmspace *vm; - struct cdev *cdev; - struct cdevsw *csw; vm_offset_t addr; unsigned int last_timestamp; - int error, ref; + int error; key_t key; unsigned short seq; bool guard, super; @@ -2715,19 +2714,10 @@ kve->kve_ref_count = obj->ref_count; kve->kve_shadow_count = obj->shadow_count; - if ((obj->type == OBJT_DEVICE || - obj->type == OBJT_MGTDEVICE) && - (obj->flags & OBJ_CDEVH) != 0) { - cdev = obj->un_pager.devp.handle; - if (cdev != NULL) { - csw = dev_refthread(cdev, &ref); - if (csw != NULL) { - strlcpy(kve->kve_path, - cdev->si_name, sizeof( - kve->kve_path)); - dev_relthread(cdev, ref); - } - } + if (obj->type == OBJT_DEVICE || + obj->type == OBJT_MGTDEVICE) { + cdev_pager_get_path(obj, kve->kve_path, + sizeof(kve->kve_path)); } VM_OBJECT_RUNLOCK(obj); if ((lobj->flags & OBJ_SYSVSHM) != 0) { diff --git a/sys/vm/device_pager.c b/sys/vm/device_pager.c --- a/sys/vm/device_pager.c +++ b/sys/vm/device_pager.c @@ -97,11 +97,13 @@ static void old_dev_pager_dtor(void *handle); static int old_dev_pager_fault(vm_object_t object, vm_ooffset_t offset, int prot, vm_page_t *mres); +static void old_dev_pager_path(void *handle, char *path, size_t len); static const struct cdev_pager_ops old_dev_pager_ops = { .cdev_pg_ctor = old_dev_pager_ctor, .cdev_pg_dtor = old_dev_pager_dtor, - .cdev_pg_fault = old_dev_pager_fault + .cdev_pg_fault = old_dev_pager_fault, + .cdev_pg_path = old_dev_pager_path }; static void @@ -262,6 +264,14 @@ size, prot, foff, cred)); } +void +cdev_pager_get_path(vm_object_t object, char *path, size_t sz) +{ + if (object->un_pager.devp.ops->cdev_pg_path != NULL) + object->un_pager.devp.ops->cdev_pg_path( + object->un_pager.devp.handle, path, sz); +} + void cdev_pager_free_page(vm_object_t object, vm_page_t m) { @@ -537,3 +547,12 @@ dev_rel(handle); } + +static void +old_dev_pager_path(void *handle, char *path, size_t len) +{ + struct cdev *cdev = handle; + + if (cdev != NULL) + dev_copyname(cdev, path, len); +} diff --git a/sys/vm/vm_mmap.c b/sys/vm/vm_mmap.c --- a/sys/vm/vm_mmap.c +++ b/sys/vm/vm_mmap.c @@ -1407,9 +1407,6 @@ td->td_ucred); if (obj == NULL) return (EINVAL); - VM_OBJECT_WLOCK(obj); - vm_object_set_flag(obj, OBJ_CDEVH); - VM_OBJECT_WUNLOCK(obj); *objp = obj; *flagsp = flags; return (0); diff --git a/sys/vm/vm_object.h b/sys/vm/vm_object.h --- a/sys/vm/vm_object.h +++ b/sys/vm/vm_object.h @@ -204,7 +204,6 @@ #define OBJ_PAGERPRIV2 0x00008000 /* Pager private */ #define OBJ_SYSVSHM 0x00010000 /* SysV SHM */ #define OBJ_POSIXSHM 0x00020000 /* Posix SHM */ -#define OBJ_CDEVH 0x00040000 /* OBJT_DEVICE handle is cdev */ /* * Helpers to perform conversion between vm_object page indexes and offsets. diff --git a/sys/vm/vm_object.c b/sys/vm/vm_object.c --- a/sys/vm/vm_object.c +++ b/sys/vm/vm_object.c @@ -2485,10 +2485,8 @@ struct vattr va; vm_object_t obj; vm_page_t m; - struct cdev *cdev; - struct cdevsw *csw; u_long sp; - int count, error, ref; + int count, error; key_t key; unsigned short seq; bool want_path; @@ -2577,17 +2575,9 @@ sp = swap_pager_swapped_pages(obj); kvo->kvo_swapped = sp > UINT32_MAX ? UINT32_MAX : sp; } - if ((obj->type == OBJT_DEVICE || obj->type == OBJT_MGTDEVICE) && - (obj->flags & OBJ_CDEVH) != 0) { - cdev = obj->un_pager.devp.handle; - if (cdev != NULL) { - csw = dev_refthread(cdev, &ref); - if (csw != NULL) { - strlcpy(kvo->kvo_path, cdev->si_name, - sizeof(kvo->kvo_path)); - dev_relthread(cdev, ref); - } - } + if (obj->type == OBJT_DEVICE || obj->type == OBJT_MGTDEVICE) { + cdev_pager_get_path(obj, kvo->kvo_path, + sizeof(kvo->kvo_path)); } VM_OBJECT_RUNLOCK(obj); if ((obj->flags & OBJ_SYSVSHM) != 0) { diff --git a/sys/vm/vm_pager.h b/sys/vm/vm_pager.h --- a/sys/vm/vm_pager.h +++ b/sys/vm/vm_pager.h @@ -293,6 +293,7 @@ int (*cdev_pg_ctor)(void *handle, vm_ooffset_t size, vm_prot_t prot, vm_ooffset_t foff, struct ucred *cred, u_short *color); void (*cdev_pg_dtor)(void *handle); + void (*cdev_pg_path)(void *handle, char *path, size_t len); }; vm_object_t cdev_pager_allocate(void *handle, enum obj_type tp, @@ -302,6 +303,7 @@ void cdev_pager_free_page(vm_object_t object, vm_page_t m); void cdev_mgtdev_pager_free_page(struct pctrie_iter *pages, vm_page_t m); void cdev_mgtdev_pager_free_pages(vm_object_t object); +void cdev_pager_get_path(vm_object_t object, char *path, size_t sz); struct phys_pager_ops { int (*phys_pg_getpages)(vm_object_t vm_obj, vm_page_t *m, int count,