Do not force a writer to the devfs file to drain the buffer writes.

Requested and tested by:	Ian Lepore <freebsd@damnhippie.dyndns.org>
MFC after:	2 weeks
This commit is contained in:
Konstantin Belousov 2012-12-23 22:43:27 +00:00
parent 6be79c7b99
commit ad9789f6db
3 changed files with 15 additions and 2 deletions

View File

@ -1049,6 +1049,7 @@ devfs_open(struct vop_open_args *ap)
int error, ref, vlocked;
struct cdevsw *dsw;
struct file *fpop;
struct mtx *mtxp;
if (vp->v_type == VBLK)
return (ENXIO);
@ -1099,6 +1100,16 @@ devfs_open(struct vop_open_args *ap)
#endif
if (fp->f_ops == &badfileops)
finit(fp, fp->f_flag, DTYPE_VNODE, dev, &devfs_ops_f);
mtxp = mtx_pool_find(mtxpool_sleep, fp);
/*
* Hint to the dofilewrite() to not force the buffer draining
* on the writer to the file. Most likely, the write would
* not need normal buffers.
*/
mtx_lock(mtxp);
fp->f_vnread_flags |= FDEVFS_VNODE;
mtx_unlock(mtxp);
return (error);
}

View File

@ -536,7 +536,8 @@ dofilewrite(td, fd, fp, auio, offset, flags)
ktruio = cloneuio(auio);
#endif
cnt = auio->uio_resid;
if (fp->f_type == DTYPE_VNODE)
if (fp->f_type == DTYPE_VNODE &&
(fp->f_vnread_flags & FDEVFS_VNODE) == 0)
bwillwrite();
if ((error = fo_write(fp, auio, td->td_ucred, flags, td))) {
if (auio->uio_resid != cnt && (error == ERESTART ||

View File

@ -178,7 +178,8 @@ struct file {
#define f_advice f_vnun.fvn_advice
#define FOFFSET_LOCKED 0x1
#define FOFFSET_LOCK_WAITING 0x2
#define FOFFSET_LOCK_WAITING 0x2
#define FDEVFS_VNODE 0x4
#endif /* _KERNEL || _WANT_FILE */