[Bug 201611] [patch] Add devfs_get_cdevpriv_from_file(9)
bugzilla-noreply at freebsd.org
bugzilla-noreply at freebsd.org
Thu Jul 16 08:11:45 UTC 2015
https://bugs.freebsd.org/bugzilla/show_bug.cgi?id=201611
Bug ID: 201611
Summary: [patch] Add devfs_get_cdevpriv_from_file(9)
Product: Base System
Version: 11.0-CURRENT
Hardware: Any
OS: Any
Status: New
Keywords: patch
Severity: Affects Some People
Priority: ---
Component: kern
Assignee: freebsd-bugs at FreeBSD.org
Reporter: aritger at nvidia.com
Keywords: patch
Created attachment 158831
--> https://bugs.freebsd.org/bugzilla/attachment.cgi?id=158831&action=edit
patch to implement devfs_get_cdevpriv_from_file(9)
In the NVIDIA GPU driver stack for FreeBSD, we have a variety of cases
where one user-space driver component calls our kernel-space driver
component to allocate an object (e.g., a block of video memory) and then
needs to share the object with another user-space driver component.
We would like to share these objects between user-space driver components
by passing a file descriptor over a UNIX domain socket. E.g.,
Process A:
- alloc video memory
- fd = open("/dev/nvidiactl");
- call kernel driver to associate video memory with fd
- pass fd to process B
- close fd
Process B:
- receive fd from process A
- call kernel driver to retrieve video memory assocated with fd
- close fd
But to do this, we would like to be able to map from a file descriptor to
the per-open file descriptor data (registered with devfs_set_cdevpriv(9)
and normally retrieved using devfs_get_cdevpriv(9)).
If I understand correctly, this can be done with (pseudo-code):
struct file *fp;
struct cdev_privdata *p;
struct driver_per_open *popen;
fget(curthread, fd, &fp);
p = fp->f_cdevpriv;
popen = p->cdpd_data;
/* use popen... */
fdrop(fp, curthread);
However, it looks like struct cdev_privdata is not intended to be accessed
by drivers.
Would it be reasonable to extend the devfs_cdevpriv(9) family of
functions with a function that can retrieve the driver specific data,
given a struct file? That way, drivers could do:
struct file *fp;
struct driver_per_open *popen;
fget(curthread, fd, &fp);
devfs_get_cdevpriv_from_file(&popen, fp);
/* use popen... */
fdrop(fp, curthread);
The attached patch implements devfs_get_cdevpriv_from_file().
--
You are receiving this mail because:
You are the assignee for the bug.
More information about the freebsd-bugs
mailing list