svn commit: r274242 - in user/dchagin/lemul/sys: kern sys

Konstantin Belousov kostikbel at gmail.com
Fri Nov 7 18:17:21 UTC 2014


On Fri, Nov 07, 2014 at 04:25:08PM +0000, Dmitry Chagin wrote:
> Author: dchagin
> Date: Fri Nov  7 16:25:07 2014
> New Revision: 274242
> URL: https://svnweb.freebsd.org/changeset/base/274242
> 
> Log:
>   Split up sys_poll() into a sys_ and kern_ counterparts, add kern_ppoll()
>   version needed by an upcoming Linuxulator change.
I think there must be native ppoll(2) if you added a helper and
plan Linux one.

> 
> Modified:
>   user/dchagin/lemul/sys/kern/sys_generic.c
>   user/dchagin/lemul/sys/sys/syscallsubr.h
> 
> Modified: user/dchagin/lemul/sys/kern/sys_generic.c
> ==============================================================================
> --- user/dchagin/lemul/sys/kern/sys_generic.c	Fri Nov  7 16:22:58 2014	(r274241)
> +++ user/dchagin/lemul/sys/kern/sys_generic.c	Fri Nov  7 16:25:07 2014	(r274242)
> @@ -97,6 +97,8 @@ static int	pollout(struct thread *, stru
>  		    u_int);
>  static int	pollscan(struct thread *, struct pollfd *, u_int);
>  static int	pollrescan(struct thread *);
> +static int	kern_poll(struct thread *, struct pollfd *, uint32_t,
> +		    sbintime_t, sbintime_t);
>  static int	selscan(struct thread *, fd_mask **, fd_mask **, int);
>  static int	selrescan(struct thread *, fd_mask **, fd_mask **);
>  static void	selfdalloc(struct thread *, void *);
> @@ -1301,30 +1303,12 @@ sys_poll(td, uap)
>  	struct thread *td;
>  	struct poll_args *uap;
>  {
> -	struct pollfd *bits;
> -	struct pollfd smallbits[32];
>  	sbintime_t asbt, precision, rsbt;
> -	u_int nfds;
> -	int error;
> -	size_t ni;
>  
> -	nfds = uap->nfds;
> -	if (nfds > maxfilesperproc && nfds > FD_SETSIZE) 
> -		return (EINVAL);
> -	ni = nfds * sizeof(struct pollfd);
> -	if (ni > sizeof(smallbits))
> -		bits = malloc(ni, M_TEMP, M_WAITOK);
> -	else
> -		bits = smallbits;
> -	error = copyin(uap->fds, bits, ni);
> -	if (error)
> -		goto done;
>  	precision = 0;
>  	if (uap->timeout != INFTIM) {
> -		if (uap->timeout < 0) {
> -			error = EINVAL;
> -			goto done;
> -		}
> +		if (uap->timeout < 0)
> +			return (EINVAL);
>  		if (uap->timeout == 0)
>  			asbt = 0;
>  		else {
> @@ -1337,13 +1321,37 @@ sys_poll(td, uap)
>  		}
>  	} else
>  		asbt = -1;
> +
> +	return (kern_poll(td, uap->fds, uap->nfds, asbt, precision));
> +}
> +
> +static int
> +kern_poll(struct thread *td, struct pollfd *fds, uint32_t nfds,
> +    sbintime_t sbt, sbintime_t prec)
uint32_t type fo nfds is weird and probably even wrong.
Native syscalls use unsigned int for it, and this helper definitely
should follow them.

> +{
> +	struct pollfd *bits;
> +	struct pollfd smallbits[32];
> +	int error;
> +	size_t ni;
> +
> +	if (nfds > maxfilesperproc && nfds > FD_SETSIZE) 
> +		return (EINVAL);
This line was moved from the original code intact, but it still
looks strange.  What is the purpose of FD_SETSIZE test ?

> +	ni = nfds * sizeof(struct pollfd);
> +	if (ni > sizeof(smallbits))
> +		bits = malloc(ni, M_TEMP, M_WAITOK);
> +	else
> +		bits = smallbits;
> +	error = copyin(fds, bits, ni);
> +	if (error)
> +		goto done;
> +
>  	seltdinit(td);
>  	/* Iterate until the timeout expires or descriptors become ready. */
>  	for (;;) {
>  		error = pollscan(td, bits, nfds);
>  		if (error || td->td_retval[0] != 0)
>  			break;
> -		error = seltdwait(td, asbt, precision);
> +		error = seltdwait(td, sbt, prec);
>  		if (error)
>  			break;
>  		error = pollrescan(td);
> @@ -1359,7 +1367,7 @@ done:
>  	if (error == EWOULDBLOCK)
>  		error = 0;
>  	if (error == 0) {
> -		error = pollout(td, bits, uap->fds, nfds);
> +		error = pollout(td, bits, fds, nfds);
>  		if (error)
>  			goto out;
>  	}
> @@ -1369,6 +1377,59 @@ out:
>  	return (error);
>  }
>  
> +int
> +kern_ppoll(struct thread *td, struct pollfd *fds, uint32_t nfds,
Same uint32_t.

> +    struct timespec *tsp, sigset_t *uset)
> +{
> +	struct timespec ts;
> +	sbintime_t sbt, precision, tmp;
> +	time_t over;
> +	int error;


More information about the svn-src-user mailing list