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

Commit 019ebdf9 authored by Peter Hurley's avatar Peter Hurley Committed by Greg Kroah-Hartman
Browse files

n_tty: Eliminate echo_commit memory barrier



Use output_lock mutex as a memory barrier when storing echo_commit.

Signed-off-by: default avatarPeter Hurley <peter@hurleysoftware.com>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent 17bd7907
Loading
Loading
Loading
Loading
+20 −11
Original line number Diff line number Diff line
@@ -638,21 +638,16 @@ static ssize_t process_output_block(struct tty_struct *tty,
 *	are prioritized.  Also, when control characters are echoed with a
 *	prefixed "^", the pair is treated atomically and thus not separated.
 *
 *	Locking: output_lock to protect column state and space left
 *	Locking: callers must hold output_lock
 */

static void process_echoes(struct tty_struct *tty)
static void __process_echoes(struct tty_struct *tty)
{
	struct n_tty_data *ldata = tty->disc_data;
	int	space, nr;
	size_t tail;
	unsigned char c;

	if (ldata->echo_commit == ldata->echo_tail)
		return;

	mutex_lock(&ldata->output_lock);

	space = tty_write_room(tty);

	tail = ldata->echo_tail;
@@ -772,20 +767,34 @@ static void process_echoes(struct tty_struct *tty)
	}

	ldata->echo_tail = tail;
}

static void commit_echoes(struct tty_struct *tty)
{
	struct n_tty_data *ldata = tty->disc_data;

	mutex_lock(&ldata->output_lock);
	ldata->echo_commit = ldata->echo_head;
	__process_echoes(tty);
	mutex_unlock(&ldata->output_lock);

	if (tty->ops->flush_chars)
		tty->ops->flush_chars(tty);
}

static void commit_echoes(struct tty_struct *tty)
static void process_echoes(struct tty_struct *tty)
{
	struct n_tty_data *ldata = tty->disc_data;

	smp_mb();
	ldata->echo_commit = ldata->echo_head;
	process_echoes(tty);
	if (!L_ECHO(tty) || ldata->echo_commit == ldata->echo_tail)
		return;

	mutex_lock(&ldata->output_lock);
	__process_echoes(tty);
	mutex_unlock(&ldata->output_lock);

	if (tty->ops->flush_chars)
		tty->ops->flush_chars(tty);
}

/**