staging: greybus: Convert uart.c from IDR to XArray
Subsystems (3)
PATCH 1/1 staging: greybus: Convert uart.c from IDR to XArray
Convert greybus/uart.c from IDR to XArray. The abstract data type XArray is more memory-efficient, parallelisable, and cache friendly. It takes advantage of RCU to perform lookups without locking. Furthermore, IDR is deprecated because XArray has a better (cleaner and more consistent) API.
Reported-by kernel test robot <[email protected]>
Signed-off-by Fabio M. De Francesco <[email protected]>
---
v1->v2:
Fixed an issue found by the kernel test robot. It was due to passing to xa_*lock() the same old mutex that IDR used with the previous version of the code.
drivers/staging/greybus/uart.c | 29 ++++++++++++++--------------- 1 file changed, 14 insertions(+), 15 deletions(-)
drivers/staging/greybus/uart.c +14 -15
@@ -22,7 +22,7 @@#include <linux/serial.h> #include <linux/tty_driver.h> #include <linux/tty_flip.h> -#include <linux/idr.h> +#include <linux/xarray.h> #include <linux/fs.h> #include <linux/kdev_t.h> #include <linux/kfifo.h>
@@ -33,6 +33,7 @@#include "gbphy.h" #define GB_NUM_MINORS 16/* 16 is more than enough */ +#define GB_RANGE_MINORS XA_LIMIT(0, GB_NUM_MINORS)#define GB_NAME "ttyGB"#define GB_UART_WRITE_FIFO_SIZE PAGE_SIZE
@@ -67,8 +68,7 @@ struct gb_tty { };static struct tty_driver *gb_tty_driver; -static DEFINE_IDR (tty_minors); -static DEFINE_MUTEX (table_lock); +static DEFINE_XARRAY (tty_minors);static int gb_uart_receive_data_handler (struct gb_operation *op) {
@@ -77,6 +77,7 @@ static int gb_uart_receive_data_handler(struct gb_operation *op)struct tty_port *port = &gb_tty->port;struct gb_message *request = op->request;struct gb_uart_recv_data_request *receive_data; +u16 recv_data_size;int count;unsigned long tty_flags =TTY_NORMAL ;
@@ -341,8 +342,8 @@ static struct gb_tty *get_gb_by_minor(unsigned int minor) {struct gb_tty *gb_tty; -mutex_lock (&table_lock); - gb_tty =idr_find (&tty_minors, minor); +xa_lock (&tty_minors); + gb_tty =xa_load (&tty_minors, minor);if (gb_tty) {mutex_lock (&gb_tty->mutex);if (gb_tty->disconnected) {
@@ -353,19 +354,19 @@ static struct gb_tty *get_gb_by_minor(unsigned int minor)mutex_unlock (&gb_tty->mutex); } } -mutex_unlock (&table_lock); +xa_unlock (&tty_minors);return gb_tty; }static int alloc_minor (struct gb_tty *gb_tty) {int minor; +int ret; -mutex_lock (&table_lock); - minor =idr_alloc (&tty_minors, gb_tty,0 ,GB_NUM_MINORS ,GFP_KERNEL ); -mutex_unlock (&table_lock); -if (minor >=0 ) - gb_tty->minor = minor; + ret =xa_alloc (&tty_minors, &minor, gb_tty,GB_RANGE_MINORS ,GFP_KERNEL ); +if (ret) +return ret; + gb_tty->minor = minor;return minor; }
@@ -374,9 +375,7 @@ static void release_minor(struct gb_tty *gb_tty)int minor = gb_tty->minor; gb_tty->minor =0 ;/* Maybe should use an invalid value instead */ -mutex_lock (&table_lock); -idr_remove (&tty_minors, minor); -mutex_unlock (&table_lock); +xa_erase (&tty_minors, minor); }static int gb_tty_install (struct tty_driver *driver,struct tty_struct *tty)
@@ -982,7 +981,7 @@ static void gb_tty_exit(void) {tty_unregister_driver (gb_tty_driver);put_tty_driver (gb_tty_driver); -idr_destroy (&tty_minors); +xa_destroy (&tty_minors); }static const struct gbphy_device_id gb_uart_id_table[] = {
Signature · 1 line
2.32.0