Return partially filled buffer for non-blocking read(2)
in non-immediate mode. PR: kern/143855
This commit is contained in:
parent
9b3e11b84b
commit
8df67d77ed
Notes:
svn2git
2020-12-20 02:59:44 +00:00
svn path=/head/; revision=204105
@ -664,8 +664,9 @@ static int
|
||||
bpfread(struct cdev *dev, struct uio *uio, int ioflag)
|
||||
{
|
||||
struct bpf_d *d;
|
||||
int timed_out;
|
||||
int error;
|
||||
int non_block;
|
||||
int timed_out;
|
||||
|
||||
error = devfs_get_cdevpriv((void **)&d);
|
||||
if (error != 0)
|
||||
@ -678,6 +679,8 @@ bpfread(struct cdev *dev, struct uio *uio, int ioflag)
|
||||
if (uio->uio_resid != d->bd_bufsize)
|
||||
return (EINVAL);
|
||||
|
||||
non_block = ((ioflag & O_NONBLOCK) != 0);
|
||||
|
||||
BPFD_LOCK(d);
|
||||
d->bd_pid = curthread->td_proc->p_pid;
|
||||
if (d->bd_bufmode != BPF_BUFMODE_BUFFER) {
|
||||
@ -694,14 +697,20 @@ bpfread(struct cdev *dev, struct uio *uio, int ioflag)
|
||||
* have arrived to fill the store buffer.
|
||||
*/
|
||||
while (d->bd_hbuf == NULL) {
|
||||
if ((d->bd_immediate || timed_out) && d->bd_slen != 0) {
|
||||
if (d->bd_slen != 0) {
|
||||
/*
|
||||
* A packet(s) either arrived since the previous
|
||||
* read or arrived while we were asleep.
|
||||
* Rotate the buffers and return what's here.
|
||||
*/
|
||||
ROTATE_BUFFERS(d);
|
||||
break;
|
||||
if (d->bd_immediate || non_block || timed_out) {
|
||||
/*
|
||||
* Rotate the buffers and return what's here
|
||||
* if we are in immediate mode, non-blocking
|
||||
* flag is set, or this descriptor timed out.
|
||||
*/
|
||||
ROTATE_BUFFERS(d);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
@ -715,7 +724,7 @@ bpfread(struct cdev *dev, struct uio *uio, int ioflag)
|
||||
return (ENXIO);
|
||||
}
|
||||
|
||||
if (ioflag & O_NONBLOCK) {
|
||||
if (non_block) {
|
||||
BPFD_UNLOCK(d);
|
||||
return (EWOULDBLOCK);
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user