Unverified Commit ce9f1089 authored by openeuler-ci-bot's avatar openeuler-ci-bot Committed by Gitee
Browse files

!13232 Revert "tty: n_gsm: avoid call of sleeping functions from atomic context"

parents ea638435 dd8f0f73
Loading
Loading
Loading
Loading
+21 −18
Original line number Diff line number Diff line
@@ -235,7 +235,7 @@ struct gsm_mux {
	int old_c_iflag;		/* termios c_iflag value before attach */
	bool constipated;		/* Asked by remote to shut up */

	struct mutex tx_mutex;
	spinlock_t tx_lock;
	unsigned int tx_bytes;		/* TX data outstanding */
#define TX_THRESH_HI		8192
#define TX_THRESH_LO		2048
@@ -820,14 +820,15 @@ static void __gsm_data_queue(struct gsm_dlci *dlci, struct gsm_msg *msg)
 *
 *	Add data to the transmit queue and try and get stuff moving
 *	out of the mux tty if not already doing so. Take the
 *	the gsm tx mutex and dlci lock.
 *	the gsm tx lock and dlci lock.
 */

static void gsm_data_queue(struct gsm_dlci *dlci, struct gsm_msg *msg)
{
	mutex_lock(&dlci->gsm->tx_mutex);
	unsigned long flags;
	spin_lock_irqsave(&dlci->gsm->tx_lock, flags);
	__gsm_data_queue(dlci, msg);
	mutex_unlock(&dlci->gsm->tx_mutex);
	spin_unlock_irqrestore(&dlci->gsm->tx_lock, flags);
}

/**
@@ -839,7 +840,7 @@ static void gsm_data_queue(struct gsm_dlci *dlci, struct gsm_msg *msg)
 *	is data. Keep to the MRU of the mux. This path handles the usual tty
 *	interface which is a byte stream with optional modem data.
 *
 *	Caller must hold the tx_mutex of the mux.
 *	Caller must hold the tx_lock of the mux.
 */

static int gsm_dlci_data_output(struct gsm_mux *gsm, struct gsm_dlci *dlci)
@@ -902,7 +903,7 @@ static int gsm_dlci_data_output(struct gsm_mux *gsm, struct gsm_dlci *dlci)
 *	is data. Keep to the MRU of the mux. This path handles framed data
 *	queued as skbuffs to the DLCI.
 *
 *	Caller must hold the tx_mutex of the mux.
 *	Caller must hold the tx_lock of the mux.
 */

static int gsm_dlci_data_output_framed(struct gsm_mux *gsm,
@@ -918,7 +919,7 @@ static int gsm_dlci_data_output_framed(struct gsm_mux *gsm,
	if (dlci->adaption == 4)
		overhead = 1;

	/* dlci->skb is locked by tx_mutex */
	/* dlci->skb is locked by tx_lock */
	if (dlci->skb == NULL) {
		dlci->skb = skb_dequeue_tail(&dlci->skb_list);
		if (dlci->skb == NULL)
@@ -1018,12 +1019,13 @@ static void gsm_dlci_data_sweep(struct gsm_mux *gsm)

static void gsm_dlci_data_kick(struct gsm_dlci *dlci)
{
	unsigned long flags;
	int sweep;

	if (dlci->constipated)
		return;

	mutex_lock(&dlci->gsm->tx_mutex);
	spin_lock_irqsave(&dlci->gsm->tx_lock, flags);
	/* If we have nothing running then we need to fire up */
	sweep = (dlci->gsm->tx_bytes < TX_THRESH_LO);
	if (dlci->gsm->tx_bytes == 0) {
@@ -1034,7 +1036,7 @@ static void gsm_dlci_data_kick(struct gsm_dlci *dlci)
	}
	if (sweep)
		gsm_dlci_data_sweep(dlci->gsm);
	mutex_unlock(&dlci->gsm->tx_mutex);
	spin_unlock_irqrestore(&dlci->gsm->tx_lock, flags);
}

/*
@@ -1256,6 +1258,7 @@ static void gsm_control_message(struct gsm_mux *gsm, unsigned int command,
						const u8 *data, int clen)
{
	u8 buf[1];
	unsigned long flags;

	switch (command) {
	case CMD_CLD: {
@@ -1277,9 +1280,9 @@ static void gsm_control_message(struct gsm_mux *gsm, unsigned int command,
		gsm->constipated = false;
		gsm_control_reply(gsm, CMD_FCON, NULL, 0);
		/* Kick the link in case it is idling */
		mutex_lock(&gsm->tx_mutex);
		spin_lock_irqsave(&gsm->tx_lock, flags);
		gsm_data_kick(gsm, NULL);
		mutex_unlock(&gsm->tx_mutex);
		spin_unlock_irqrestore(&gsm->tx_lock, flags);
		break;
	case CMD_FCOFF:
		/* Modem wants us to STFU */
@@ -2230,7 +2233,6 @@ static void gsm_free_mux(struct gsm_mux *gsm)
			break;
		}
	}
	mutex_destroy(&gsm->tx_mutex);
	mutex_destroy(&gsm->mutex);
	kfree(gsm->txframe);
	kfree(gsm->buf);
@@ -2302,12 +2304,12 @@ static struct gsm_mux *gsm_alloc_mux(void)
	}
	spin_lock_init(&gsm->lock);
	mutex_init(&gsm->mutex);
	mutex_init(&gsm->tx_mutex);
	kref_init(&gsm->ref);
	INIT_LIST_HEAD(&gsm->tx_list);
	timer_setup(&gsm->t2_timer, gsm_control_retransmit, 0);
	init_waitqueue_head(&gsm->event);
	spin_lock_init(&gsm->control_lock);
	spin_lock_init(&gsm->tx_lock);

	gsm->t1 = T1;
	gsm->t2 = T2;
@@ -2332,7 +2334,6 @@ static struct gsm_mux *gsm_alloc_mux(void)
	}
	spin_unlock(&gsm_mux_lock);
	if (i == MAX_MUX) {
		mutex_destroy(&gsm->tx_mutex);
		mutex_destroy(&gsm->mutex);
		kfree(gsm->txframe);
		kfree(gsm->buf);
@@ -2660,15 +2661,16 @@ static int gsmld_open(struct tty_struct *tty)
static void gsmld_write_wakeup(struct tty_struct *tty)
{
	struct gsm_mux *gsm = tty->disc_data;
	unsigned long flags;

	/* Queue poll */
	clear_bit(TTY_DO_WRITE_WAKEUP, &tty->flags);
	mutex_lock(&gsm->tx_mutex);
	spin_lock_irqsave(&gsm->tx_lock, flags);
	gsm_data_kick(gsm, NULL);
	if (gsm->tx_bytes < TX_THRESH_LO) {
		gsm_dlci_data_sweep(gsm);
	}
	mutex_unlock(&gsm->tx_mutex);
	spin_unlock_irqrestore(&gsm->tx_lock, flags);
}

/**
@@ -2711,6 +2713,7 @@ static ssize_t gsmld_write(struct tty_struct *tty, struct file *file,
			   const unsigned char *buf, size_t nr)
{
	struct gsm_mux *gsm = tty->disc_data;
	unsigned long flags;
	int space;
	int ret;

@@ -2718,13 +2721,13 @@ static ssize_t gsmld_write(struct tty_struct *tty, struct file *file,
		return -ENODEV;

	ret = -ENOBUFS;
	mutex_lock(&gsm->tx_mutex);
	spin_lock_irqsave(&gsm->tx_lock, flags);
	space = tty_write_room(tty);
	if (space >= nr)
		ret = tty->ops->write(tty, buf, nr);
	else
		set_bit(TTY_DO_WRITE_WAKEUP, &tty->flags);
	mutex_unlock(&gsm->tx_mutex);
	spin_unlock_irqrestore(&gsm->tx_lock, flags);

	return ret;
}