From: Debian User <h.vanberkum@chello.nl>
To: kernel-janitors@vger.kernel.org
Subject: [Kernel-janitors] serial.c cli() patch
Date: Wed, 25 Feb 2004 22:08:03 +0000 [thread overview]
Message-ID: <403D1CC3.6080906@chello.nl> (raw)
I tried to remove the cli() calls from serial.c. I just used a global
spin_lock_t serial_lock, to replace the cli() calls with
spin_lock_irqsave().
Can someone tell me when I do need multiple spinlocks variables instead
of one global one?
Richard
--- linux-2.6.3/arch/cris/arch-v10/drivers/serial.c 2004-02-18
04:58:40.000000000 +0100
+++ linux-2.6.3b/arch/cris/arch-v10/drivers/serial.c 2004-02-25
22:49:09.000000000 +0100
@@ -436,6 +436,9 @@
#include "serial.h"
#include <asm/fasttimer.h>
+
+spinlock_t serial_lock;
+
#ifdef CONFIG_ETRAX_SERIAL_FAST_TIMER
#ifndef CONFIG_ETRAX_FAST_TIMER
#error "Enable FAST_TIMER to use SERIAL_FAST_TIMER"
@@ -1227,12 +1230,12 @@
{
unsigned long flags;
- save_flags(flags);
- cli();
+ //spin_lock_irqsave(&serial_lock, flags);
+ //spinlock already accuired by calling function
*e100_modem_pins[info->line].dtr_shadow &= ~mask;
*e100_modem_pins[info->line].dtr_shadow |= (set ? 0 : mask);
*e100_modem_pins[info->line].dtr_port =
*e100_modem_pins[info->line].dtr_shadow;
- restore_flags(flags);
+ //spin_unlock_irqrestore(&serial_lock, flags);
}
#ifdef SERIAL_DEBUG_IO
@@ -1270,12 +1273,11 @@
unsigned char mask = e100_modem_pins[info->line].ri_mask;
unsigned long flags;
- save_flags(flags);
- cli();
+ spin_lock_irqsave(&serial_lock, flags);
*e100_modem_pins[info->line].ri_shadow &= ~mask;
*e100_modem_pins[info->line].ri_shadow |= (set ? 0 : mask);
*e100_modem_pins[info->line].ri_port =
*e100_modem_pins[info->line].ri_shadow;
- restore_flags(flags);
+ spin_unlock_irqrestore(&serial_lock, flags);
}
#endif
}
@@ -1288,12 +1290,11 @@
unsigned char mask = e100_modem_pins[info->line].cd_mask;
unsigned long flags;
- save_flags(flags);
- cli();
+ spin_lock_irqsave(&serial_lock, flags);
*e100_modem_pins[info->line].cd_shadow &= ~mask;
*e100_modem_pins[info->line].cd_shadow |= (set ? 0 : mask);
*e100_modem_pins[info->line].cd_port =
*e100_modem_pins[info->line].cd_shadow;
- restore_flags(flags);
+ spin_unlock_irqrestore(&serial_lock, flags);
}
#endif
}
@@ -1366,8 +1367,8 @@
/* Disable output DMA channel for the serial port in question
* ( set to something other then serialX)
*/
- save_flags(flags);
- cli();
+
+ spin_lock(&serial_lock, flags);
if (info->line = 0) {
genconfig_shadow &= ~IO_MASK(R_GEN_CONFIG, dma6);
genconfig_shadow |= IO_STATE(R_GEN_CONFIG, dma6, unused);
@@ -1382,7 +1383,7 @@
genconfig_shadow |= IO_STATE(R_GEN_CONFIG, dma4, par1);
}
*R_GEN_CONFIG = genconfig_shadow;
- restore_flags(flags);
+ spin_unlock_irqrestore(&serial_lock, flags);
}
@@ -1390,9 +1391,8 @@
e100_enable_txdma_channel(struct e100_serial *info)
{
unsigned long flags;
-
- save_flags(flags);
- cli();
+
+ spin_lock_irqsave(&serial_lock, flags);
/* Enable output DMA channel for the serial port in question */
if (info->line = 0) {
genconfig_shadow &= ~IO_MASK(R_GEN_CONFIG, dma6);
@@ -1408,7 +1408,7 @@
genconfig_shadow |= IO_STATE(R_GEN_CONFIG, dma4, serial3);
}
*R_GEN_CONFIG = genconfig_shadow;
- restore_flags(flags);
+ spin_unlock_irqrestore(&serial_lock, flags);
}
@@ -1514,7 +1514,7 @@
unsigned long flags;
unsigned long xoff;
- save_flags(flags); cli();
+ spin_lock_irqsave(&serial_lock, flags);
xoff = IO_FIELD(R_SERIAL0_XOFF, xoff_char, STOP_CHAR(info->tty));
xoff |= IO_STATE(R_SERIAL0_XOFF, tx_stop, stop);
if (tty->termios->c_iflag & IXON ) {
@@ -1522,7 +1522,7 @@
}
*((unsigned long *)&info->port[REG_XOFF]) = xoff;
- restore_flags(flags);
+ spin_unlock_irqrestore(&serial_lock, flags);
}
}
@@ -1534,7 +1534,7 @@
unsigned long flags;
unsigned long xoff;
- save_flags(flags); cli();
+ spin_lock_irqsave(&serial_lock, flags);
xoff = IO_FIELD(R_SERIAL0_XOFF, xoff_char, STOP_CHAR(tty));
xoff |= IO_STATE(R_SERIAL0_XOFF, tx_stop, enable);
if (tty->termios->c_iflag & IXON ) {
@@ -1543,7 +1543,7 @@
*((unsigned long *)&info->port[REG_XOFF]) = xoff;
- restore_flags(flags);
+ spin_unlock_irqrestore(&serial_lock, flags);
}
}
@@ -1712,9 +1712,9 @@
static void flush_timeout_function(unsigned long data);
#define START_FLUSH_FAST_TIMER(info, string) {\
unsigned long timer_flags; \
- save_flags(timer_flags); \
- cli(); \
- if (fast_timers[info->line].function = NULL) { \
+
+ spin_lock_irqsave(&serial_lock, timer_flags); \
+ if (fast_timers[info->line].function = NULL) { \
serial_fast_timer_started++; \
TIMERD(DEBUG_LOG(info->line, "start_timer %i ", info->line)); \
TIMERD(DEBUG_LOG(info->line, "num started: %i\n",
serial_fast_timer_started)); \
@@ -1727,7 +1727,7 @@
else { \
TIMERD(DEBUG_LOG(info->line, "timer %i already running\n",
info->line)); \
} \
- restore_flags(timer_flags); \
+ spin_lock_irqrestore(&serial_lock, timer_flags); \
}
#else
@@ -1754,9 +1754,7 @@
{
unsigned long flags;
- save_flags(flags);
- cli();
-
+ spin_lock_irqsave(&serial_lock, flags);
if (!info->first_recv_buffer)
info->first_recv_buffer = buffer;
else
@@ -1768,7 +1766,7 @@
if (info->recv_cnt > info->max_recv_cnt)
info->max_recv_cnt = info->recv_cnt;
- restore_flags(flags);
+ spin_unlock_irqrestore(&serial_lock, flags);
}
static int
@@ -2134,11 +2132,10 @@
if (!info->first_recv_buffer)
return;
- save_flags(flags);
- cli();
-
+ spin_lock_irqsave(&serial_lock, flags);
+
if (!(tty = info->tty)) {
- restore_flags(flags);
+ spin_lock_irqrestore(&serial_lock, flags);
return;
}
@@ -2172,8 +2169,7 @@
tty->flip.count = length;
- restore_flags(flags);
-
+ spin_unlock_irqrestore(&serial_lock, flags);
/* this includes a check for low-latency */
tty_flip_buffer_push(tty);
}
@@ -2472,13 +2468,12 @@
if (!xmit_page)
return -ENOMEM;
- save_flags(flags);
- cli();
-
+ spin_lock_irqsave(&serial_lock, flags);
+
/* if it was already initialized, skip this */
if (info->flags & ASYNC_INITIALIZED) {
- restore_flags(flags);
+ spin_unlock_irqrestore(&serial_lock, flags);
free_page(xmit_page);
return 0;
}
@@ -2588,7 +2583,7 @@
info->flags |= ASYNC_INITIALIZED;
- restore_flags(flags);
+ spin_lock_irqrestore(&serial_lock, flags);
return 0;
}
@@ -2631,8 +2626,7 @@
info->irq);
#endif
- save_flags(flags);
- cli(); /* Disable interrupts */
+ spin_lock_irqsave(&serial_lock, flags);
if (info->xmit.buf) {
free_page((unsigned long)info->xmit.buf);
@@ -2656,7 +2650,7 @@
set_bit(TTY_IO_ERROR, &info->tty->flags);
info->flags &= ~ASYNC_INITIALIZED;
- restore_flags(flags);
+ spin_unlock_irqrestore(&serial_lock, flags);
}
@@ -2780,10 +2774,9 @@
/* this protection might not exactly be necessary here */
- save_flags(flags);
- cli();
+ spin_lock_irqsave(&serial_lock, flags);
start_transmit(info);
- restore_flags(flags);
+ spin_unlock_irqrestore(&serial_lock, flags);
}
extern inline int
@@ -2810,7 +2803,6 @@
SIMCOUT(buf, count);
return count;
#endif
- save_flags(flags);
/* the cli/restore_flags pairs below are needed because the
* DMA interrupt handler moves the info->xmit values. the memcpy
@@ -2837,7 +2829,7 @@
ret = -EFAULT;
break;
}
- cli();
+ spin_lock_irqsave(&serial_lock, flags);
c1 = CIRC_SPACE_TO_END(info->xmit.head,
info->xmit.tail,
SERIAL_XMIT_SIZE);
@@ -2846,14 +2838,14 @@
memcpy(info->xmit.buf + info->xmit.head, tmp_buf, c);
info->xmit.head = ((info->xmit.head + c) &
(SERIAL_XMIT_SIZE-1));
- restore_flags(flags);
+ spin_lock_irqrestore(&serial_lock, flags);
buf += c;
count -= c;
ret += c;
}
up(&tmp_buf_sem);
} else {
- cli();
+ spin_lock_irqsave(&serial_lock, flags);
while (1) {
c = CIRC_SPACE_TO_END(info->xmit.head,
info->xmit.tail,
@@ -2871,7 +2863,7 @@
count -= c;
ret += c;
}
- restore_flags(flags);
+ spin_unlock_irqrestore(&serial_lock, flags);
}
/* enable transmitter if not running, unless the tty is stopped
@@ -2987,11 +2979,9 @@
struct e100_serial *info = (struct e100_serial *)tty->driver_data;
unsigned long flags;
- save_flags(flags);
- cli();
+ spin_lock_irqsave(&serial_lock_irqsave, flags);
info->xmit.head = info->xmit.tail = 0;
- restore_flags(flags);
-
+ spin_lock_irqrestore(&serial_lock, flags);
wake_up_interruptible(&tty->write_wait);
if ((tty->flags & (1 << TTY_DO_WRITE_WAKEUP)) &&
@@ -3045,10 +3035,9 @@
/* Do RTS before XOFF since XOFF might take some time */
if (tty->termios->c_cflag & CRTSCTS) {
/* Turn off RTS line (do this atomic) */
- save_flags(flags);
- cli();
+ spin_lock_irqsave(&serial_lock, flags);
e100_rts(info, 0);
- restore_flags(flags);
+ spin_unlock_irqrestore(&serial_lock, flags);
}
if (I_IXOFF(tty))
rs_send_xchar(tty, STOP_CHAR(tty));
@@ -3070,10 +3059,9 @@
/* Do RTS before XOFF since XOFF might take some time */
if (tty->termios->c_cflag & CRTSCTS) {
/* Assert RTS line (do this atomic) */
- save_flags(flags);
- cli();
+ spin_lock_irqsave(serial_lock, flags);
e100_rts(info, 1);
- restore_flags(flags);
+ spin_lock_irqrestore(&serial_lock, flags);
}
if (I_IXOFF(tty)) {
@@ -3335,8 +3323,7 @@
if (!info->port)
return;
- save_flags(flags);
- cli();
+ spin_lock_irqsave(&serial_lock, flags);
if (break_state = -1) {
/* Go to manual mode and set the txd pin to 0 */
info->tx_ctrl &= 0x3F; /* Clear bit 7 (txd) and 6 (tr_enable) */
@@ -3344,7 +3331,7 @@
info->tx_ctrl |= (0x80 | 0x40); /* Set bit 7 (txd) and 6 (tr_enable) */
}
info->port[REG_TR_CTRL] = info->tx_ctrl;
- restore_flags(flags);
+ spin_unlock_irqrestore(&serial_lock, flags);
}
static int
@@ -3447,11 +3434,9 @@
/* interrupts are disabled for this entire function */
- save_flags(flags);
- cli();
-
+ spin_lock_irqsave(&serial_lock, flags);
if (tty_hung_up_p(filp)) {
- restore_flags(flags);
+ spin_unlock_irqrestore(&serial_lock, flags);
return;
}
@@ -3478,7 +3463,7 @@
info->count = 0;
}
if (info->count) {
- restore_flags(flags);
+ spin_unlock_irqrestore(&serial_lock, flags);
return;
}
info->flags |= ASYNC_CLOSING;
@@ -3528,8 +3513,8 @@
}
info->flags &= ~(ASYNC_NORMAL_ACTIVE|ASYNC_CLOSING);
wake_up_interruptible(&info->close_wait);
- restore_flags(flags);
-
+ spin_unlock_irqrestore(&serial_lock, flags);
+
/* port closed */
#if defined(CONFIG_ETRAX_RS485)
@@ -3662,12 +3647,11 @@
restore_flags(flags);
info->blocked_open++;
while (1) {
- save_flags(flags);
- cli();
- /* assert RTS and DTR */
+ spin_lock_irqsave(&serial_lock, flags);
+ /* assert RTS and DTR */
e100_rts(info, 1);
e100_dtr(info, 1);
- restore_flags(flags);
+ spin_unlock_irqrestore(&serial_lock, flags);
set_current_state(TASK_INTERRUPTIBLE);
if (tty_hung_up_p(filp) ||
!(info->flags & ASYNC_INITIALIZED)) {
_______________________________________________
Kernel-janitors mailing list
Kernel-janitors@lists.osdl.org
http://lists.osdl.org/mailman/listinfo/kernel-janitors
next reply other threads:[~2004-02-25 22:08 UTC|newest]
Thread overview: 8+ messages / expand[flat|nested] mbox.gz Atom feed top
2004-02-25 22:08 Debian User [this message]
2004-02-25 23:44 ` [Kernel-janitors] serial.c cli() patch Debian User
2004-02-25 23:51 ` Debian User
2004-02-26 22:59 ` Zach Brown
2004-02-26 23:18 ` Matthew Wilcox
2004-02-27 0:32 ` Zach Brown
2004-02-27 15:17 ` Matthew Wilcox
2004-02-28 4:07 ` Arnaldo Carvalho de Melo
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=403D1CC3.6080906@chello.nl \
--to=h.vanberkum@chello.nl \
--cc=kernel-janitors@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.