The struct 'tty_struct' has a callback to read the status flags of the tty
if the tty driver provides them. So fare, the data is transferred directly
to userspace with the function 'tty_tiocmget'. This function cannot be
used to evaluate the status line of the tty interface in the ledtrig-tty
trigger. To make this possible, a new function must be added that does
not immediately pass the data on to userspace.
The new function 'tty_get_tiocm' only returns the status register.
This information can then be processed further in the ledtrig-tty
trigger.
Signed-off-by: Florian Eckert <fe@dev.tdt.de>
---
drivers/tty/tty_io.c | 28 ++++++++++++++++++++++------
include/linux/tty.h | 1 +
2 files changed, 23 insertions(+), 6 deletions(-)
diff --git a/drivers/tty/tty_io.c b/drivers/tty/tty_io.c
index 3299a5d50727..a12f63854ac4 100644
--- a/drivers/tty/tty_io.c
+++ b/drivers/tty/tty_io.c
@@ -2494,6 +2494,24 @@ static int send_break(struct tty_struct *tty, unsigned int duration)
return retval;
}
+/**
+ * tty_get_tiocm - get tiocm status register
+ * @tty: tty device
+ *
+ * Obtain the modem status bits from the tty driver if the feature
+ * is supported.
+ */
+int tty_get_tiocm(struct tty_struct *tty)
+{
+ int retval = -ENOTTY;
+
+ if (tty->ops->tiocmget)
+ retval = tty->ops->tiocmget(tty);
+
+ return retval;
+}
+EXPORT_SYMBOL_GPL(tty_get_tiocm);
+
/**
* tty_tiocmget - get modem status
* @tty: tty device
@@ -2506,14 +2524,12 @@ static int send_break(struct tty_struct *tty, unsigned int duration)
*/
static int tty_tiocmget(struct tty_struct *tty, int __user *p)
{
- int retval = -ENOTTY;
+ int retval;
- if (tty->ops->tiocmget) {
- retval = tty->ops->tiocmget(tty);
+ retval = tty_get_tiocm(tty);
+ if (retval >= 0)
+ retval = put_user(retval, p);
- if (retval >= 0)
- retval = put_user(retval, p);
- }
return retval;
}
diff --git a/include/linux/tty.h b/include/linux/tty.h
index f002d0f25db7..8e4d0b3b12b7 100644
--- a/include/linux/tty.h
+++ b/include/linux/tty.h
@@ -421,6 +421,7 @@ int tty_unthrottle_safe(struct tty_struct *tty);
int tty_do_resize(struct tty_struct *tty, struct winsize *ws);
int tty_get_icount(struct tty_struct *tty,
struct serial_icounter_struct *icount);
+int tty_get_tiocm(struct tty_struct *tty);
int is_current_pgrp_orphaned(void);
void tty_hangup(struct tty_struct *tty);
void tty_vhangup(struct tty_struct *tty);
--
2.30.2
On Thu, Oct 19, 2023 at 01:28:08PM +0200, Florian Eckert wrote: > The struct 'tty_struct' has a callback to read the status flags of the tty > if the tty driver provides them. So fare, the data is transferred directly > to userspace with the function 'tty_tiocmget'. This function cannot be > used to evaluate the status line of the tty interface in the ledtrig-tty > trigger. To make this possible, a new function must be added that does > not immediately pass the data on to userspace. > > The new function 'tty_get_tiocm' only returns the status register. > This information can then be processed further in the ledtrig-tty > trigger. Writing changelogs are hard. You are including a lot of information in here that really doesn't need to be, as you are focusing on your specific use case, which is fine, but you are creating a generic function. This can be simpler, how about something like this: There is no in-kernel function to get the status register of a tty device like the TIOCMGET ioctl returns to userspace. Create a new function, tty_get_tiocm(), to obtain the status register that other portions of the kernel can call if they need this information, and move the existing internal tty_tiocmget() function to use this interface. Sound good? The code portion looks fine to me, thanks for doing this. greg k-h
On 2023-10-21 18:15, Greg KH wrote: > On Thu, Oct 19, 2023 at 01:28:08PM +0200, Florian Eckert wrote: >> The struct 'tty_struct' has a callback to read the status flags of the >> tty >> if the tty driver provides them. So fare, the data is transferred >> directly >> to userspace with the function 'tty_tiocmget'. This function cannot be >> used to evaluate the status line of the tty interface in the >> ledtrig-tty >> trigger. To make this possible, a new function must be added that does >> not immediately pass the data on to userspace. >> >> The new function 'tty_get_tiocm' only returns the status register. >> This information can then be processed further in the ledtrig-tty >> trigger. > > Writing changelogs are hard. You are including a lot of information in > here that really doesn't need to be, as you are focusing on your > specific use case, which is fine, but you are creating a generic > function. Yes, that is absolutely right. I'll try to take that into account next time, thanks for your advice. > This can be simpler, how about something like this: > > There is no in-kernel function to get the status register of a > tty device like the TIOCMGET ioctl returns to userspace. Create > a new function, tty_get_tiocm(), to obtain the status register > that other portions of the kernel can call if they need this > information, and move the existing internal tty_tiocmget() > function to use this interface. I will replace the commit message with your suggestion in the next round of the patch series. Thanks! --- Florian
© 2016 - 2025 Red Hat, Inc.