mirror of
https://github.com/AuxXxilium/linux_dsm_epyc7002.git
synced 2025-01-18 12:06:22 +07:00
synclink: reworking locking a bit
Use the port mutex and port lock to fix the various races. The locking still isn't totally consistent but its better than before. Wants switching to the port helpers. Signed-off-by: Alan Cox <alan@linux.intel.com> Cc: Arnd Bergmann <arnd@arndb.de> Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
This commit is contained in:
parent
4287341d4d
commit
a360fae67b
@ -675,12 +675,14 @@ static int open(struct tty_struct *tty, struct file *filp)
|
||||
goto cleanup;
|
||||
}
|
||||
|
||||
mutex_lock(&info->port.mutex);
|
||||
info->port.tty->low_latency = (info->port.flags & ASYNC_LOW_LATENCY) ? 1 : 0;
|
||||
|
||||
spin_lock_irqsave(&info->netlock, flags);
|
||||
if (info->netcount) {
|
||||
retval = -EBUSY;
|
||||
spin_unlock_irqrestore(&info->netlock, flags);
|
||||
mutex_unlock(&info->port.mutex);
|
||||
goto cleanup;
|
||||
}
|
||||
info->port.count++;
|
||||
@ -692,7 +694,7 @@ static int open(struct tty_struct *tty, struct file *filp)
|
||||
if (retval < 0)
|
||||
goto cleanup;
|
||||
}
|
||||
|
||||
mutex_unlock(&info->port.mutex);
|
||||
retval = block_til_ready(tty, filp, info);
|
||||
if (retval) {
|
||||
DBGINFO(("%s block_til_ready rc=%d\n", info->device_name, retval));
|
||||
@ -724,12 +726,14 @@ static void close(struct tty_struct *tty, struct file *filp)
|
||||
if (tty_port_close_start(&info->port, tty, filp) == 0)
|
||||
goto cleanup;
|
||||
|
||||
mutex_lock(&info->port.mutex);
|
||||
if (info->port.flags & ASYNC_INITIALIZED)
|
||||
wait_until_sent(tty, info->timeout);
|
||||
flush_buffer(tty);
|
||||
tty_ldisc_flush(tty);
|
||||
|
||||
shutdown(info);
|
||||
mutex_unlock(&info->port.mutex);
|
||||
|
||||
tty_port_close_end(&info->port, tty);
|
||||
info->port.tty = NULL;
|
||||
@ -740,17 +744,23 @@ static void close(struct tty_struct *tty, struct file *filp)
|
||||
static void hangup(struct tty_struct *tty)
|
||||
{
|
||||
struct slgt_info *info = tty->driver_data;
|
||||
unsigned long flags;
|
||||
|
||||
if (sanity_check(info, tty->name, "hangup"))
|
||||
return;
|
||||
DBGINFO(("%s hangup\n", info->device_name));
|
||||
|
||||
flush_buffer(tty);
|
||||
|
||||
mutex_lock(&info->port.mutex);
|
||||
shutdown(info);
|
||||
|
||||
spin_lock_irqsave(&info->port.lock, flags);
|
||||
info->port.count = 0;
|
||||
info->port.flags &= ~ASYNC_NORMAL_ACTIVE;
|
||||
info->port.tty = NULL;
|
||||
spin_unlock_irqrestore(&info->port.lock, flags);
|
||||
mutex_unlock(&info->port.mutex);
|
||||
|
||||
wake_up_interruptible(&info->port.open_wait);
|
||||
}
|
||||
|
@ -812,13 +812,15 @@ static void close(struct tty_struct *tty, struct file *filp)
|
||||
|
||||
if (tty_port_close_start(&info->port, tty, filp) == 0)
|
||||
goto cleanup;
|
||||
|
||||
|
||||
mutex_lock(&info->port.mutex);
|
||||
if (info->port.flags & ASYNC_INITIALIZED)
|
||||
wait_until_sent(tty, info->timeout);
|
||||
|
||||
flush_buffer(tty);
|
||||
tty_ldisc_flush(tty);
|
||||
shutdown(info);
|
||||
mutex_unlock(&info->port.mutex);
|
||||
|
||||
tty_port_close_end(&info->port, tty);
|
||||
info->port.tty = NULL;
|
||||
@ -834,6 +836,7 @@ static void close(struct tty_struct *tty, struct file *filp)
|
||||
static void hangup(struct tty_struct *tty)
|
||||
{
|
||||
SLMP_INFO *info = tty->driver_data;
|
||||
unsigned long flags;
|
||||
|
||||
if (debug_level >= DEBUG_LEVEL_INFO)
|
||||
printk("%s(%d):%s hangup()\n",
|
||||
@ -842,12 +845,16 @@ static void hangup(struct tty_struct *tty)
|
||||
if (sanity_check(info, tty->name, "hangup"))
|
||||
return;
|
||||
|
||||
mutex_lock(&info->port.mutex);
|
||||
flush_buffer(tty);
|
||||
shutdown(info);
|
||||
|
||||
spin_lock_irqsave(&info->port.lock, flags);
|
||||
info->port.count = 0;
|
||||
info->port.flags &= ~ASYNC_NORMAL_ACTIVE;
|
||||
info->port.tty = NULL;
|
||||
spin_unlock_irqrestore(&info->port.lock, flags);
|
||||
mutex_unlock(&info->port.mutex);
|
||||
|
||||
wake_up_interruptible(&info->port.open_wait);
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user