Page Menu
Home
FreeBSD
Search
Configure Global Search
Log In
Files
F149273537
D49335.1789801866.diff
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Flag For Later
Award Token
Size
4 KB
Referenced Files
None
Subscribers
None
D49335.1789801866.diff
View Options
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 <vm/vm_map.h>
#include <vm/vm_object.h>
#include <vm/vm_page.h>
+#include <vm/vm_pager.h>
#include <vm/uma.h>
#include <fs/devfs/devfs.h>
@@ -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,
File Metadata
Details
Attached
Mime Type
text/plain
Expires
Sat, Sep 19, 7:11 AM (9 h, 46 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
29774043
Default Alt Text
D49335.1789801866.diff (4 KB)
Attached To
Mode
D49335: device_pager: Add cdev_pager_get_path to retrieve the "path" for an object
Attached
Detach File
Event Timeline
Log In to Comment