On 01-08-25, 10:27, Joris Verhaegen wrote: > The previous patch introduced the internal infrastructure for handling > 64-bit timestamps. This patch exposes this capability to user-space. > > Define the new ioctl command SNDRV_COMPRESS_TSTAMP64, which allows > applications to fetch the overflow-safe struct snd_compr_tstamp64. > > The ioctl dispatch table is updated to handle the new command by > calling a new snd_compr_tstamp64 handler, while the legacy path is > renamed to snd_compr_tstamp32 for clarity. > > This patch bumps the SNDRV_COMPRESS_VERSION to 0.4.0. > > Reviewed-by: Miller Liang <millerliang@xxxxxxxxxx> > Tested-by: Joris Verhaegen <verhaegen@xxxxxxxxxx> > Signed-off-by: Joris Verhaegen <verhaegen@xxxxxxxxxx> > --- > include/uapi/sound/compress_offload.h | 5 +++-- > sound/core/compress_offload.c | 19 +++++++++++++------ > 2 files changed, 16 insertions(+), 8 deletions(-) > > diff --git a/include/uapi/sound/compress_offload.h b/include/uapi/sound/compress_offload.h > index abd0ea3f86ee..70b8921601f9 100644 > --- a/include/uapi/sound/compress_offload.h > +++ b/include/uapi/sound/compress_offload.h > @@ -13,8 +13,7 @@ > #include <sound/asound.h> > #include <sound/compress_params.h> > > - > -#define SNDRV_COMPRESS_VERSION SNDRV_PROTOCOL_VERSION(0, 3, 0) > +#define SNDRV_COMPRESS_VERSION SNDRV_PROTOCOL_VERSION(0, 4, 0) > /** > * struct snd_compressed_buffer - compressed buffer > * @fragment_size: size of buffer fragment in bytes > @@ -208,6 +207,7 @@ struct snd_compr_task_status { > * Note: only codec params can be changed runtime and stream params cant be > * SNDRV_COMPRESS_GET_PARAMS: Query codec params > * SNDRV_COMPRESS_TSTAMP: get the current timestamp value > + * SNDRV_COMPRESS_TSTAMP64: get the current timestamp value in 64 bit format > * SNDRV_COMPRESS_AVAIL: get the current buffer avail value. > * This also queries the tstamp properties > * SNDRV_COMPRESS_PAUSE: Pause the running stream > @@ -230,6 +230,7 @@ struct snd_compr_task_status { > struct snd_compr_metadata) > #define SNDRV_COMPRESS_TSTAMP _IOR('C', 0x20, struct snd_compr_tstamp) > #define SNDRV_COMPRESS_AVAIL _IOR('C', 0x21, struct snd_compr_avail) > +#define SNDRV_COMPRESS_TSTAMP64 _IOR('C', 0x22, struct snd_compr_tstamp64) > #define SNDRV_COMPRESS_PAUSE _IO('C', 0x30) > #define SNDRV_COMPRESS_RESUME _IO('C', 0x31) > #define SNDRV_COMPRESS_START _IO('C', 0x32) > diff --git a/sound/core/compress_offload.c b/sound/core/compress_offload.c > index d3164aa07158..445220fdb6a0 100644 > --- a/sound/core/compress_offload.c > +++ b/sound/core/compress_offload.c > @@ -736,18 +736,23 @@ snd_compr_set_metadata(struct snd_compr_stream *stream, unsigned long arg) > return retval; > } > > -static inline int > -snd_compr_tstamp(struct snd_compr_stream *stream, unsigned long arg) > +static inline int snd_compr_tstamp(struct snd_compr_stream *stream, > + unsigned long arg, bool is_32bit) > { > struct snd_compr_tstamp64 tstamp64 = { 0 }; > struct snd_compr_tstamp tstamp32 = { 0 }; > + const void *copy_from = &tstamp64; > + size_t copy_size = sizeof(tstamp64); > int ret; > > ret = snd_compr_update_tstamp(stream, &tstamp64); > if (ret == 0) { > - snd_compr_tstamp32_from_64(&tstamp32, &tstamp64); > - ret = copy_to_user((struct snd_compr_tstamp __user *)arg, > - &tstamp32, sizeof(tstamp32)) ? > + if (is_32bit) { > + snd_compr_tstamp32_from_64(&tstamp32, &tstamp64); > + copy_from = &tstamp32; > + copy_size = sizeof(tstamp32); > + } Most of the applications and people would be 32bit right now and we expect this to progressively change, but then this imposes a penalty as default path is 64 bit, since we expect this ioctl to be called very frequently, should we do this optimization for 64bit here? > + ret = copy_to_user((void __user *)arg, copy_from, copy_size) ? > -EFAULT : > 0; > } > @@ -1327,7 +1332,9 @@ static long snd_compr_ioctl(struct file *f, unsigned int cmd, unsigned long arg) > > switch (cmd) { > case SNDRV_COMPRESS_TSTAMP: > - return snd_compr_tstamp(stream, arg); > + return snd_compr_tstamp(stream, arg, true); > + case SNDRV_COMPRESS_TSTAMP64: > + return snd_compr_tstamp(stream, arg, false); > case SNDRV_COMPRESS_AVAIL: > return snd_compr_ioctl_avail(stream, arg); > case SNDRV_COMPRESS_PAUSE: > -- > 2.50.1.565.gc32cd1483b-goog -- ~Vinod