HSI: cmt_speech: fix timestamp interface
RFC PATCH 1/1 HSI: cmt_speech: fix timestamp interface
The user interface for timestamps in the new cms_speech driver is broken in multiple ways:
- The layout is incompatible between 32-bit and 64-bit user space, because of the size differences in 'struct timespec'. This means that the driver can not work when used with 32-bit user space on a 64-bit kernel.
- As there are plans to change 32-bit user space to use a 64-bit time_t type in the future, it will also be incompatible with new 32-bit user space.
As the driver is not yet widely used, now would be a good time to change it to just use a 64-bit nanosecond value, which also happens to be more efficient. In order to make the layout non-ambiguous, we have to also add extra padding so the 64-bit value is naturally aligned.
The change requires the respective update to user space tools using it. If that is for some reason not possible any more, another solution would be to replace the timespec structure with two __u32 values to avoid incompatibilities later.
drivers/hsi/clients/cmt_speech.c +1 -3
@@ -451,9 +451,7 @@ static void cs_hsi_read_on_control_complete(struct hsi_msg *msg)dev_dbg (&hi->cl->device,"Read on control: %08X\n" , cmd);cs_release_cmd (msg);if (hi->flags &CS_FEAT_TSTAMP_RX_CTRL ) { -struct timespec *tstamp = - &hi->mmap_cfg->tstamp_rx_ctrl; -do_posix_clock_monotonic_gettime (tstamp); + hi->mmap_cfg->tstamp_rx_ctrl =ktime_get_ns (); }spin_unlock (&hi->lock);
include/uapi/linux/hsi/cs-protocol.h +2 -2
@@ -90,12 +90,12 @@ struct cs_mmap_config_block {__u32 tx_offsets[CS_MAX_BUFFERS ];__u32 rx_ptr;__u32 rx_ptr_boundary; -__u32 reserved3[2 ]; +__u32 reserved3[3 ];/* * if enabled with CS_FEAT_TSTAMP_RX_CTRL, monotonic * timestamp taken when the last control command was received */ -struct timespec tstamp_rx_ctrl; +__u64 tstamp_rx_ctrl; };#define CS_IO_MAGIC 'C'
Sebastian Reichel
maintainerHi Arnd,
[CC'd Kai's new mail address]
Quoted 2 lines · Arnd Bergmann
The user interface for timestamps in the new
cms_speechdriver is broken in multiple ways:
ow :( Thanks for the report.
Quoted 15 lines
- The layout is incompatible between 32-bit and 64-bit user space, because of the size differences in 'struct timespec'. This means that the driver can not work when used with 32-bit user space on a 64-bit kernel.
- As there are plans to change 32-bit user space to use a 64-bit
time_ttype in the future, it will also be incompatible with new 32-bit user space.As the driver is not yet widely used, now would be a good time to change it to just use a 64-bit nanosecond value, which also happens to be more efficient. In order to make the layout non-ambiguous, we have to also add extra padding so the 64-bit value is naturally aligned.
Quoted 6 lines
The change requires the respective update to user space tools using it. If that is for some reason not possible any more, another solution would be to replace the timespec structure with two
__u32values to avoid incompatibilities later.Signed-off-by Arnd Bergmann <[email protected]>
I think updating to two __u32 values is the better solution here. While the driver is new in the mainline kernel it has been used for multiple years downstream in the Maemo/MeeGo/Mer communities and I would prefer to keep userspace compatibility.
-- Sebastian
Quoted 34 lines
drivers/hsi/clients/cmt_speech.c +1
-3@@ -451,9 +451,7 @@ static void cs_hsi_read_on_control_complete(struct hsi_msg *msg)dev_dbg (&hi->cl->device,"Read on control: %08X\n" , cmd);cs_release_cmd (msg);if (hi->flags &CS_FEAT_TSTAMP_RX_CTRL ) { -struct timespec *tstamp = - &hi->mmap_cfg->tstamp_rx_ctrl; -do_posix_clock_monotonic_gettime (tstamp); + hi->mmap_cfg->tstamp_rx_ctrl =ktime_get_ns (); }spin_unlock (&hi->lock);include/uapi/linux/hsi/cs-protocol.h +2
-2@@ -90,12 +90,12 @@ struct cs_mmap_config_block {__u32 tx_offsets[CS_MAX_BUFFERS ];__u32 rx_ptr;__u32 rx_ptr_boundary; -__u32 reserved3[2 ]; +__u32 reserved3[3 ];/* * if enabled with CS_FEAT_TSTAMP_RX_CTRL, monotonic * timestamp taken when the last control command was received */ -struct timespec tstamp_rx_ctrl; +__u64 tstamp_rx_ctrl; };#define CS_IO_MAGIC 'C'
Quoted 21 lines · On Friday 10 April 2015 15:36:10 Sebastian Reichel wrote:
Quoted 21 lines
- The layout is incompatible between 32-bit and 64-bit user space, because of the size differences in 'struct timespec'. This means that the driver can not work when used with 32-bit user space on a 64-bit kernel.
- As there are plans to change 32-bit user space to use a 64-bit
time_ttype in the future, it will also be incompatible with new 32-bit user space.As the driver is not yet widely used, now would be a good time to change it to just use a 64-bit nanosecond value, which also happens to be more efficient. In order to make the layout non-ambiguous, we have to also add extra padding so the 64-bit value is naturally aligned.
The change requires the respective update to user space tools using it. If that is for some reason not possible any more, another solution would be to replace the timespec structure with two
__u32values to avoid incompatibilities later.
Quoted 6 lines
Quoted 1 line
Signed-off-by Arnd Bergmann <[email protected]>I think updating to two
__u32values is the better solution here. While the driver is new in the mainline kernel it has been used for multiple years downstream in the Maemo/MeeGo/Mer communities and I would prefer to keep userspace compatibility.
Ok. You still need to update that userspace to the new ABI in order to support compiling on 64-bit machines and on future arm32 with 64-bit time_t, but existing binaries will continue to run.
Can you (or someone on Cc) prepare a patch for this?
Arnd
Sebastian Reichel
maintainerPATCH 1/1 HSI: cmt_speech: fix timestamp interface
The user interface for timestamps in the new cmt_speech driver is broken in multiple ways:
- The layout is incompatible between 32-bit and 64-bit user space, because of the size differences in 'struct timespec'. This means that the driver can not work when used with 32-bit user space on a 64-bit kernel.
- As there are plans to change 32-bit user space to use a 64-bit time_t type in the future, it will also be incompatible with new 32-bit user space.
To keep support for the user space tools written for this driver (which have lived many years out-of-tree), the interface has been hardened to unsigned 32-bit values.
--- drivers/hsi/clients/cmt_speech.c | 9 +++++++-- include/uapi/linux/hsi/cs-protocol.h | 16 +++++++++++----- 2 files changed, 18 insertions(+), 7 deletions(-)
drivers/hsi/clients/cmt_speech.c +7 -2
@@ -451,9 +451,14 @@ static void cs_hsi_read_on_control_complete(struct hsi_msg *msg)dev_dbg (&hi->cl->device,"Read on control: %08X\n" , cmd);cs_release_cmd (msg);if (hi->flags &CS_FEAT_TSTAMP_RX_CTRL ) { -struct timespec *tstamp = +struct timespec tspec; +struct cs_timestamp *tstamp = &hi->mmap_cfg->tstamp_rx_ctrl; -do_posix_clock_monotonic_gettime (tstamp); + +do_posix_clock_monotonic_gettime (&tspec); + + tstamp->tv_sec = (__u32 ) tspec.tv_sec; + tstamp->tv_nsec = (__u32 ) tspec.tv_nsec; }spin_unlock (&hi->lock);
include/uapi/linux/hsi/cs-protocol.h +11 -5
@@ -76,6 +76,15 @@ struct cs_buffer_config { };/* +* struct for monotonic timestamp taken when the +* last control command was received +*/ +struct cs_timestamp { +__u32 tv_sec;/* seconds */ +__u32 tv_nsec;/* nanoseconds */ +}; + +/* * Struct describing the layout and contents of the driver mmap area. * This information is meant as read-only information for the application. */
@@ -91,11 +100,8 @@ struct cs_mmap_config_block {__u32 rx_ptr;__u32 rx_ptr_boundary;__u32 reserved3[2 ]; -/* -* if enabled with CS_FEAT_TSTAMP_RX_CTRL, monotonic -* timestamp taken when the last control command was received -*/ -struct timespec tstamp_rx_ctrl; +/* enabled with CS_FEAT_TSTAMP_RX_CTRL */ +struct cs_timestamp tstamp_rx_ctrl; };#define CS_IO_MAGIC 'C'
Signature · 1 line
2.1.4
Quoted 28 lines · Sebastian Reichel
The user interface for timestamps in the new
cmt_speechdriver is broken in multiple ways:- The layout is incompatible between 32-bit and 64-bit user space, because of the size differences in 'struct timespec'. This means that the driver can not work when used with 32-bit user space on a 64-bit kernel.
- As there are plans to change 32-bit user space to use a 64-bit
time_ttype in the future, it will also be incompatible with new 32-bit user space.To keep support for the user space tools written for this driver (which have lived many years out-of-tree), the interface has been hardened to unsigned 32-bit values.
Reported-by Arnd Bergmann <[email protected]>Signed-off-by Sebastian Reichel <[email protected]>--- drivers/hsi/clients/cmt_speech.c | 9 +++++++-- include/uapi/linux/hsi/cs-protocol.h | 16 +++++++++++----- 2 files changed, 18 insertions(+), 7 deletions(-)drivers/hsi/clients/cmt_speech.c +0
-0
drivers/hsi/clients/cmt_speech.c static void cs_hsi_read_on_control_complete(struct hsi_msg *msg) · line 458
Quoted 10 lines
drivers/hsi/clients/cmt_speech.c +4
-2@@ -451,9 +451,14 @@ static void cs_hsi_read_on_control_complete(struct hsi_msg *msg)dev_dbg (&hi->cl->device,"Read on control: %08X\n" , cmd);cs_release_cmd (msg);if (hi->flags &CS_FEAT_TSTAMP_RX_CTRL ) { -struct timespec *tstamp = +struct timespec tspec; +struct cs_timestamp *tstamp = &hi->mmap_cfg->tstamp_rx_ctrl; -do_posix_clock_monotonic_gettime (tstamp); + +do_posix_clock_monotonic_gettime (&tspec);
Can you please use ktime_get_ts() instead of do_posix_clock_monotonic_gettime(). I'm desperately trying to get rid of the latter, but it seems to come back in circles.
Thanks,
tglx
Sebastian Reichel
maintainerHi Thomas,
Quoted 7 lines · Thomas Gleixner
drivers/hsi/clients/cmt_speech.c static void cs_hsi_read_on_control_complete(struct hsi_msg *msg) · line 458
Quoted 3 lines
drivers/hsi/clients/cmt_speech.c +2
-1-do_posix_clock_monotonic_gettime (tstamp); + +do_posix_clock_monotonic_gettime (&tspec);Can you please use
ktime_get_ts()instead ofdo_posix_clock_monotonic_gettime(). I'm desperately trying to get rid of the latter, but it seems to come back in circles.
Sure, I modified the patch to use ktime_get_ts() instead of do_posix_clock_monotonic_gettime(). If Arnd has no other comments I will not resend it and queue the modified patch for 4.1-rc.
-- Sebastian
Sebastian Reichel
maintainerHi Arnd,
Quoted 8 lines · Sebastian Reichel
The user interface for timestamps in the new
cmt_speechdriver is broken in multiple ways:- The layout is incompatible between 32-bit and 64-bit user space, because of the size differences in 'struct timespec'. This means that the driver can not work when used with 32-bit user space on a 64-bit kernel.
Quoted 7 lines
- As there are plans to change 32-bit user space to use a 64-bit
time_ttype in the future, it will also be incompatible with new 32-bit user space.To keep support for the user space tools written for this driver (which have lived many years out-of-tree), the interface has been hardened to unsigned 32-bit values.
Are you fine with this patch? I would like to queue it for 4.1-rc.
-- Sebastian