From: Deepak R Varma <drv@mailo.com>
To: "Maciej W. Rozycki" <macro@orcam.me.uk>,
Greg Kroah-Hartman <gregkh@linuxfoundation.org>,
Jiri Slaby <jirislaby@kernel.org>,
linux-serial@vger.kernel.org, linux-kernel@vger.kernel.org
Cc: Saurabh Singh Sengar <ssengar@microsoft.com>,
Praveen Kumar <kumarpraveen@linux.microsoft.com>,
drv@mailo.com
Subject: [PATCH] tty: serial: convert atomic_* to refcount_* APIs
Date: Thu, 22 Dec 2022 01:27:40 +0530 [thread overview]
Message-ID: <Y6NlNB9c22XiYHdD@qemulion> (raw)
The refcount_* APIs are designed to address known issues with the
atomic_t APIs for reference counting. They protect the reference
counters from overflow/underflow, use-after-free errors, provide
improved memory ordering guarantee schemes, are neater and safer.
Hence, replace the atomic_* APIs by their equivalent refcount_t
API functions.
This patch proposal address the following warnings generated by
the atomic_as_refcounter.cocci coccinelle script
atomic_add_return(-1, ...)
Signed-off-by: Deepak R Varma <drv@mailo.com>
---
Note: The patch is compile tested using dec_station.defconfig for
MIPS architecture.
drivers/tty/serial/dz.c | 34 +++++++++++++---------------------
drivers/tty/serial/zs.c | 11 ++++-------
drivers/tty/serial/zs.h | 2 +-
3 files changed, 18 insertions(+), 29 deletions(-)
diff --git a/drivers/tty/serial/dz.c b/drivers/tty/serial/dz.c
index 6b7ed7f2f3ca..c248201f9499 100644
--- a/drivers/tty/serial/dz.c
+++ b/drivers/tty/serial/dz.c
@@ -46,7 +46,7 @@
#include <linux/tty.h>
#include <linux/tty_flip.h>
-#include <linux/atomic.h>
+#include <linux/refcount.h>
#include <linux/io.h>
#include <asm/bootinfo.h>
@@ -75,8 +75,8 @@ struct dz_port {
struct dz_mux {
struct dz_port dport[DZ_NB_PORT];
- atomic_t map_guard;
- atomic_t irq_guard;
+ refcount_t map_guard;
+ refcount_t irq_guard;
int initialised;
};
@@ -399,18 +399,17 @@ static int dz_startup(struct uart_port *uport)
struct dz_port *dport = to_dport(uport);
struct dz_mux *mux = dport->mux;
unsigned long flags;
- int irq_guard;
int ret;
u16 tmp;
- irq_guard = atomic_add_return(1, &mux->irq_guard);
- if (irq_guard != 1)
+ refcount_inc(&mux->irq_guard);
+ if (refcount_read(&mux->irq_guard) != 1)
return 0;
ret = request_irq(dport->port.irq, dz_interrupt,
IRQF_SHARED, "dz", mux);
if (ret) {
- atomic_add(-1, &mux->irq_guard);
+ refcount_dec(&mux->irq_guard);
printk(KERN_ERR "dz: Cannot get IRQ %d!\n", dport->port.irq);
return ret;
}
@@ -440,15 +439,13 @@ static void dz_shutdown(struct uart_port *uport)
struct dz_port *dport = to_dport(uport);
struct dz_mux *mux = dport->mux;
unsigned long flags;
- int irq_guard;
u16 tmp;
spin_lock_irqsave(&dport->port.lock, flags);
dz_stop_tx(&dport->port);
spin_unlock_irqrestore(&dport->port.lock, flags);
- irq_guard = atomic_add_return(-1, &mux->irq_guard);
- if (!irq_guard) {
+ if (refcount_dec_and_test(&mux->irq_guard)) {
/* Disable interrupts. */
tmp = dz_in(dport, DZ_CSR);
tmp &= ~(DZ_RIE | DZ_TIE);
@@ -662,13 +659,11 @@ static const char *dz_type(struct uart_port *uport)
static void dz_release_port(struct uart_port *uport)
{
struct dz_mux *mux = to_dport(uport)->mux;
- int map_guard;
iounmap(uport->membase);
uport->membase = NULL;
- map_guard = atomic_add_return(-1, &mux->map_guard);
- if (!map_guard)
+ if (refcount_dec_and_test(&mux->map_guard))
release_mem_region(uport->mapbase, dec_kn_slot_size);
}
@@ -687,14 +682,12 @@ static int dz_map_port(struct uart_port *uport)
static int dz_request_port(struct uart_port *uport)
{
struct dz_mux *mux = to_dport(uport)->mux;
- int map_guard;
int ret;
- map_guard = atomic_add_return(1, &mux->map_guard);
- if (map_guard == 1) {
- if (!request_mem_region(uport->mapbase, dec_kn_slot_size,
- "dz")) {
- atomic_add(-1, &mux->map_guard);
+ refcount_inc(&mux->map_guard);
+ if (refcount_read(&mux->map_guard) == 1) {
+ if (!request_mem_region(uport->mapbase, dec_kn_slot_size, "dz")) {
+ refcount_dec(&mux->map_guard);
printk(KERN_ERR
"dz: Unable to reserve MMIO resource\n");
return -EBUSY;
@@ -702,8 +695,7 @@ static int dz_request_port(struct uart_port *uport)
}
ret = dz_map_port(uport);
if (ret) {
- map_guard = atomic_add_return(-1, &mux->map_guard);
- if (!map_guard)
+ if (refcount_dec_and_test(&mux->map_guard))
release_mem_region(uport->mapbase, dec_kn_slot_size);
return ret;
}
diff --git a/drivers/tty/serial/zs.c b/drivers/tty/serial/zs.c
index 730c648e32ff..6fa79705a0c9 100644
--- a/drivers/tty/serial/zs.c
+++ b/drivers/tty/serial/zs.c
@@ -753,15 +753,14 @@ static int zs_startup(struct uart_port *uport)
struct zs_port *zport = to_zport(uport);
struct zs_scc *scc = zport->scc;
unsigned long flags;
- int irq_guard;
int ret;
- irq_guard = atomic_add_return(1, &scc->irq_guard);
- if (irq_guard == 1) {
+ refcount_inc(&scc->irq_guard);
+ if (refcount_read(&scc->irq_guard) == 1) {
ret = request_irq(zport->port.irq, zs_interrupt,
IRQF_SHARED, "scc", scc);
if (ret) {
- atomic_add(-1, &scc->irq_guard);
+ refcount_dec(&scc->irq_guard);
printk(KERN_ERR "zs: can't get irq %d\n",
zport->port.irq);
return ret;
@@ -806,7 +805,6 @@ static void zs_shutdown(struct uart_port *uport)
struct zs_port *zport = to_zport(uport);
struct zs_scc *scc = zport->scc;
unsigned long flags;
- int irq_guard;
spin_lock_irqsave(&scc->zlock, flags);
@@ -816,8 +814,7 @@ static void zs_shutdown(struct uart_port *uport)
spin_unlock_irqrestore(&scc->zlock, flags);
- irq_guard = atomic_add_return(-1, &scc->irq_guard);
- if (!irq_guard)
+ if (refcount_dec_and_test(&scc->irq_guard))
free_irq(zport->port.irq, scc);
}
diff --git a/drivers/tty/serial/zs.h b/drivers/tty/serial/zs.h
index 26ef8eafa1c1..bd97b73d7e16 100644
--- a/drivers/tty/serial/zs.h
+++ b/drivers/tty/serial/zs.h
@@ -40,7 +40,7 @@ struct zs_port {
struct zs_scc {
struct zs_port zport[2];
spinlock_t zlock;
- atomic_t irq_guard;
+ refcount_t irq_guard;
int initialised;
};
--
2.34.1
next reply other threads:[~2022-12-21 19:58 UTC|newest]
Thread overview: 3+ messages / expand[flat|nested] mbox.gz Atom feed top
2022-12-21 19:57 Deepak R Varma [this message]
2022-12-22 5:55 ` [PATCH] tty: serial: convert atomic_* to refcount_* APIs Greg Kroah-Hartman
2022-12-22 14:02 ` Deepak R Varma
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=Y6NlNB9c22XiYHdD@qemulion \
--to=drv@mailo.com \
--cc=gregkh@linuxfoundation.org \
--cc=jirislaby@kernel.org \
--cc=kumarpraveen@linux.microsoft.com \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-serial@vger.kernel.org \
--cc=macro@orcam.me.uk \
--cc=ssengar@microsoft.com \
/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.