Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 0a245982 authored by H Hartley Sweeten's avatar H Hartley Sweeten Committed by Greg Kroah-Hartman
Browse files

staging: comedi: serial2002: factor (*poll) busy wait out of tty_read()



Factor the (*poll) busy wait code out of tty_read() so the indent
level can be reduced and tty_read() is a bit cleaner.

Signed-off-by: default avatarH Hartley Sweeten <hsweeten@visionengravers.com>
Cc: Ian Abbott <abbotti@mev.co.uk>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent 32ef0e3e
Loading
Loading
Loading
Loading
+28 −25
Original line number Diff line number Diff line
@@ -102,6 +102,33 @@ static int __tty_readb(struct file *f, unsigned char *buf)
	return f->f_op->read(f, p, 1, &f->f_pos);
}

static void tty_read_poll_wait(struct file *f, int timeout)
{
	struct poll_wqueues table;
	struct timeval start, now;

	do_gettimeofday(&start);
	poll_initwait(&table);
	while (1) {
		long elapsed;
		int mask;

		mask = f->f_op->poll(f, &table.pt);
		if (mask & (POLLRDNORM | POLLRDBAND | POLLIN |
			    POLLHUP | POLLERR)) {
			break;
		}
		do_gettimeofday(&now);
		elapsed = (1000000 * (now.tv_sec - start.tv_sec) +
			  now.tv_usec - start.tv_usec);
		if (elapsed > timeout)
			break;
		set_current_state(TASK_INTERRUPTIBLE);
		schedule_timeout(((timeout - elapsed) * HZ) / 10000);
	}
	poll_freewait(&table);
}

#if 0
/*
 * On 2.6.26.3 this occaisonally gave me page faults, worked around by
@@ -132,31 +159,7 @@ static int tty_read(struct file *f, int timeout)
		oldfs = get_fs();
		set_fs(KERNEL_DS);
		if (f->f_op->poll) {
			struct poll_wqueues table;
			struct timeval start, now;

			do_gettimeofday(&start);
			poll_initwait(&table);
			while (1) {
				long elapsed;
				int mask;

				mask = f->f_op->poll(f, &table.pt);
				if (mask & (POLLRDNORM | POLLRDBAND | POLLIN |
					    POLLHUP | POLLERR)) {
					break;
				}
				do_gettimeofday(&now);
				elapsed =
				    (1000000 * (now.tv_sec - start.tv_sec) +
				     now.tv_usec - start.tv_usec);
				if (elapsed > timeout)
					break;
				set_current_state(TASK_INTERRUPTIBLE);
				schedule_timeout(((timeout -
						   elapsed) * HZ) / 10000);
			}
			poll_freewait(&table);
			tty_read_poll_wait(f, timeout);

			if (__tty_readb(f, &ch) == 1)
				result = ch;