Here is the third part of the unification time printing in the kernel. This time for struct timespec64. The first patch brings a support into printf() implementation (test cases and documentation update included) followed by the treewide conversion of the current users.
Petr, we got like more than a half being Acked, I think if you are okay with this, the patches that have been tagged can be applied.
Note, not everything was compile-tested. Kunit test has been passed, though.
Changelog v3: - fixed a compilation issue with fnic (LKP), also satisfied checkpatch - collected more tags
Petr, I have not renamed 'p' to 'n' due to much of rework and noise introduction for the changes that has been reviewed. However, I addressed the documentation issues.
v2: 20251111122735.880607-1-andriy.shevchenko@linux.intel.com
Changelog v2: - dropped wrong patches (Hans, Takashi) - fixed most of the checkpatch warnings (fdo CI, media CI) - collected tags
v1: 20251110184727.666591-1-andriy.shevchenko@linux.intel.com
Andy Shevchenko (21): lib/vsprintf: Add specifier for printing struct timespec64 ceph: Switch to use %ptSp libceph: Switch to use %ptSp dma-buf: Switch to use %ptSp drm/amdgpu: Switch to use %ptSp drm/msm: Switch to use %ptSp drm/vblank: Switch to use %ptSp drm/xe: Switch to use %ptSp e1000e: Switch to use %ptSp igb: Switch to use %ptSp ipmi: Switch to use %ptSp media: av7110: Switch to use %ptSp mmc: mmc_test: Switch to use %ptSp net: dsa: sja1105: Switch to use %ptSp PCI: epf-test: Switch to use %ptSp pps: Switch to use %ptSp ptp: ocp: Switch to use %ptSp s390/dasd: Switch to use %ptSp scsi: fnic: Switch to use %ptSp scsi: snic: Switch to use %ptSp tracing: Switch to use %ptSp
Documentation/core-api/printk-formats.rst | 11 +++- drivers/char/ipmi/ipmi_si_intf.c | 3 +- drivers/char/ipmi/ipmi_ssif.c | 6 +-- drivers/dma-buf/sync_debug.c | 2 +- .../gpu/drm/amd/amdgpu/amdgpu_dev_coredump.c | 3 +- drivers/gpu/drm/drm_vblank.c | 6 +-- .../gpu/drm/msm/disp/msm_disp_snapshot_util.c | 3 +- drivers/gpu/drm/msm/msm_gpu.c | 3 +- drivers/gpu/drm/xe/xe_devcoredump.c | 4 +- drivers/mmc/core/mmc_test.c | 20 +++---- drivers/net/dsa/sja1105/sja1105_tas.c | 8 ++- drivers/net/ethernet/intel/e1000e/ptp.c | 7 +-- drivers/net/ethernet/intel/igb/igb_ptp.c | 7 +-- drivers/pci/endpoint/functions/pci-epf-test.c | 5 +- drivers/pps/generators/pps_gen_parport.c | 3 +- drivers/pps/kapi.c | 3 +- drivers/ptp/ptp_ocp.c | 13 ++--- drivers/s390/block/dasd.c | 3 +- drivers/scsi/fnic/fnic_trace.c | 52 ++++++++----------- drivers/scsi/snic/snic_debugfs.c | 10 ++-- drivers/scsi/snic/snic_trc.c | 5 +- drivers/staging/media/av7110/av7110.c | 2 +- fs/ceph/dir.c | 5 +- fs/ceph/inode.c | 49 ++++++----------- fs/ceph/xattr.c | 6 +-- kernel/trace/trace_output.c | 6 +-- lib/tests/printf_kunit.c | 4 ++ lib/vsprintf.c | 28 +++++++++- net/ceph/messenger_v2.c | 6 +-- 29 files changed, 130 insertions(+), 153 deletions(-)
A handful drivers want to print a content of the struct timespec64 in a format of %lld:%09ld. In order to make their lives easier, add the respecting specifier directly to the printf() implementation.
Signed-off-by: Andy Shevchenko andriy.shevchenko@linux.intel.com --- Documentation/core-api/printk-formats.rst | 11 +++++++-- lib/tests/printf_kunit.c | 4 ++++ lib/vsprintf.c | 28 ++++++++++++++++++++++- 3 files changed, 40 insertions(+), 3 deletions(-)
diff --git a/Documentation/core-api/printk-formats.rst b/Documentation/core-api/printk-formats.rst index 7f2f11b48286..c0b1b6089307 100644 --- a/Documentation/core-api/printk-formats.rst +++ b/Documentation/core-api/printk-formats.rst @@ -547,11 +547,13 @@ Time and date %pt[RT]s YYYY-mm-dd HH:MM:SS %pt[RT]d YYYY-mm-dd %pt[RT]t HH:MM:SS - %pt[RT][dt][r][s] + %ptSp <seconds>.<nanoseconds> + %pt[RST][dt][r][s]
For printing date and time as represented by::
- R struct rtc_time structure + R content of struct rtc_time + S content of struct timespec64 T time64_t type
in human readable format. @@ -563,6 +565,11 @@ The %pt[RT]s (space) will override ISO 8601 separator by using ' ' (space) instead of 'T' (Capital T) between date and time. It won't have any effect when date or time is omitted.
+The %ptSp is equivalent to %lld.%09ld for the content of the struct timespec64. +When the other specifiers are given, it becomes the respective equivalent of +%ptT[dt][r][s].%09ld. In other words, the seconds are being printed in +the human readable format followed by a dot and nanoseconds. + Passed by reference.
struct clk diff --git a/lib/tests/printf_kunit.c b/lib/tests/printf_kunit.c index bc54cca2d7a6..7617e5b8b02c 100644 --- a/lib/tests/printf_kunit.c +++ b/lib/tests/printf_kunit.c @@ -504,6 +504,7 @@ time_and_date(struct kunit *kunittest) }; /* 2019-01-04T15:32:23 */ time64_t t = 1546615943; + struct timespec64 ts = { .tv_sec = t, .tv_nsec = 11235813 };
test("(%pt?)", "%pt", &tm); test("2018-11-26T05:35:43", "%ptR", &tm); @@ -522,6 +523,9 @@ time_and_date(struct kunit *kunittest) test("0119-00-04 15:32:23", "%ptTsr", &t); test("15:32:23|2019-01-04", "%ptTts|%ptTds", &t, &t); test("15:32:23|0119-00-04", "%ptTtrs|%ptTdrs", &t, &t); + + test("2019-01-04T15:32:23.011235813", "%ptS", &ts); + test("1546615943.011235813", "%ptSp", &ts); }
static void diff --git a/lib/vsprintf.c b/lib/vsprintf.c index 11dbf1023391..51a88b3f5b52 100644 --- a/lib/vsprintf.c +++ b/lib/vsprintf.c @@ -1983,6 +1983,28 @@ char *time64_str(char *buf, char *end, const time64_t time, return rtc_str(buf, end, &rtc_time, spec, fmt); }
+static noinline_for_stack +char *timespec64_str(char *buf, char *end, const struct timespec64 *ts, + struct printf_spec spec, const char *fmt) +{ + static const struct printf_spec default_dec09_spec = { + .base = 10, + .field_width = 9, + .precision = -1, + .flags = ZEROPAD, + }; + + if (fmt[2] == 'p') + buf = number(buf, end, ts->tv_sec, default_dec_spec); + else + buf = time64_str(buf, end, ts->tv_sec, spec, fmt); + if (buf < end) + *buf = '.'; + buf++; + + return number(buf, end, ts->tv_nsec, default_dec09_spec); +} + static noinline_for_stack char *time_and_date(char *buf, char *end, void *ptr, struct printf_spec spec, const char *fmt) @@ -1993,6 +2015,8 @@ char *time_and_date(char *buf, char *end, void *ptr, struct printf_spec spec, switch (fmt[1]) { case 'R': return rtc_str(buf, end, (const struct rtc_time *)ptr, spec, fmt); + case 'S': + return timespec64_str(buf, end, (const struct timespec64 *)ptr, spec, fmt); case 'T': return time64_str(buf, end, *(const time64_t *)ptr, spec, fmt); default: @@ -2456,9 +2480,11 @@ early_param("no_hash_pointers", no_hash_pointers_enable); * - 'd[234]' For a dentry name (optionally 2-4 last components) * - 'D[234]' Same as 'd' but for a struct file * - 'g' For block_device name (gendisk + partition number) - * - 't[RT][dt][r][s]' For time and date as represented by: + * - 't[RST][dt][r][s]' For time and date as represented by: * R struct rtc_time + * S struct timespec64 * T time64_t + * - 'tSp' For time represented by struct timespec64 printed as <seconds>.<nanoseconds> * - 'C' For a clock, it prints the name (Common Clock Framework) or address * (legacy clock framework) of the clock * - 'G' For flags to be printed as a collection of symbolic strings that would
On Thu 2025-11-13 15:32:15, Andy Shevchenko wrote:
A handful drivers want to print a content of the struct timespec64 in a format of %lld:%09ld. In order to make their lives easier, add the respecting specifier directly to the printf() implementation.
Signed-off-by: Andy Shevchenko andriy.shevchenko@linux.intel.com
Looks goor to me:
Reviewed-by: Petr Mladek pmladek@suse.com Tested-by: Petr Mladek pmladek@suse.com
I wonder how to move forward. I could take the whole patchset via printk tree. There is no conflict with linux-next at the moment.
It seems that only 3 patches haven't got any ack yet. I am going to wait for more feedback and push it later the following week (Wednesday or so) unless anyone complains.
Best Regards, Petr
Use %ptSp instead of open coded variants to print content of struct timespec64 in human readable format.
Reviewed-by: Christian König christian.koenig@amd.com Acked-by: Sumit Semwal sumit.semwal@linaro.org Signed-off-by: Andy Shevchenko andriy.shevchenko@linux.intel.com --- drivers/dma-buf/sync_debug.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/drivers/dma-buf/sync_debug.c b/drivers/dma-buf/sync_debug.c index 67cd69551e42..9e5d662cd4e8 100644 --- a/drivers/dma-buf/sync_debug.c +++ b/drivers/dma-buf/sync_debug.c @@ -59,7 +59,7 @@ static void sync_print_fence(struct seq_file *s, struct timespec64 ts64 = ktime_to_timespec64(fence->timestamp);
- seq_printf(s, "@%lld.%09ld", (s64)ts64.tv_sec, ts64.tv_nsec); + seq_printf(s, "@%ptSp", &ts64); }
seq_printf(s, ": %lld", fence->seqno);
Use %ptSp instead of open coded variants to print content of struct timespec64 in human readable format.
Signed-off-by: Andy Shevchenko andriy.shevchenko@linux.intel.com --- drivers/gpu/drm/msm/disp/msm_disp_snapshot_util.c | 3 +-- drivers/gpu/drm/msm/msm_gpu.c | 3 +-- 2 files changed, 2 insertions(+), 4 deletions(-)
diff --git a/drivers/gpu/drm/msm/disp/msm_disp_snapshot_util.c b/drivers/gpu/drm/msm/disp/msm_disp_snapshot_util.c index 071bcdea80f7..19b470968f4d 100644 --- a/drivers/gpu/drm/msm/disp/msm_disp_snapshot_util.c +++ b/drivers/gpu/drm/msm/disp/msm_disp_snapshot_util.c @@ -82,8 +82,7 @@ void msm_disp_state_print(struct msm_disp_state *state, struct drm_printer *p) drm_printf(p, "kernel: " UTS_RELEASE "\n"); drm_printf(p, "module: " KBUILD_MODNAME "\n"); drm_printf(p, "dpu devcoredump\n"); - drm_printf(p, "time: %lld.%09ld\n", - state->time.tv_sec, state->time.tv_nsec); + drm_printf(p, "time: %ptSp\n", &state->time);
list_for_each_entry_safe(block, tmp, &state->blocks, node) { drm_printf(p, "====================%s================\n", block->name); diff --git a/drivers/gpu/drm/msm/msm_gpu.c b/drivers/gpu/drm/msm/msm_gpu.c index 17759abc46d7..a4251afe4541 100644 --- a/drivers/gpu/drm/msm/msm_gpu.c +++ b/drivers/gpu/drm/msm/msm_gpu.c @@ -197,8 +197,7 @@ static ssize_t msm_gpu_devcoredump_read(char *buffer, loff_t offset, drm_printf(&p, "---\n"); drm_printf(&p, "kernel: " UTS_RELEASE "\n"); drm_printf(&p, "module: " KBUILD_MODNAME "\n"); - drm_printf(&p, "time: %lld.%09ld\n", - state->time.tv_sec, state->time.tv_nsec); + drm_printf(&p, "time: %ptSp\n", &state->time); if (state->comm) drm_printf(&p, "comm: %s\n", state->comm); if (state->cmd)
On Thu, Nov 13, 2025 at 03:32:20PM +0100, Andy Shevchenko wrote:
Use %ptSp instead of open coded variants to print content of struct timespec64 in human readable format.
Signed-off-by: Andy Shevchenko andriy.shevchenko@linux.intel.com
drivers/gpu/drm/msm/disp/msm_disp_snapshot_util.c | 3 +-- drivers/gpu/drm/msm/msm_gpu.c | 3 +-- 2 files changed, 2 insertions(+), 4 deletions(-)
Acked-by: Dmitry Baryshkov dmitry.baryshkov@oss.qualcomm.com
Use %ptSp instead of open coded variants to print content of struct timespec64 in human readable format.
Reviewed-by: Viacheslav Dubeyko Slava.Dubeyko@ibm.com Signed-off-by: Andy Shevchenko andriy.shevchenko@linux.intel.com --- fs/ceph/dir.c | 5 ++--- fs/ceph/inode.c | 49 ++++++++++++++++--------------------------------- fs/ceph/xattr.c | 6 ++---- 3 files changed, 20 insertions(+), 40 deletions(-)
diff --git a/fs/ceph/dir.c b/fs/ceph/dir.c index d18c0eaef9b7..bf50c6e7a029 100644 --- a/fs/ceph/dir.c +++ b/fs/ceph/dir.c @@ -2155,7 +2155,7 @@ static ssize_t ceph_read_dir(struct file *file, char __user *buf, size_t size, " rfiles: %20lld\n" " rsubdirs: %20lld\n" "rbytes: %20lld\n" - "rctime: %10lld.%09ld\n", + "rctime: %ptSp\n", ci->i_files + ci->i_subdirs, ci->i_files, ci->i_subdirs, @@ -2163,8 +2163,7 @@ static ssize_t ceph_read_dir(struct file *file, char __user *buf, size_t size, ci->i_rfiles, ci->i_rsubdirs, ci->i_rbytes, - ci->i_rctime.tv_sec, - ci->i_rctime.tv_nsec); + &ci->i_rctime); }
if (*ppos >= dfi->dir_info_len) diff --git a/fs/ceph/inode.c b/fs/ceph/inode.c index 37d3a2477c17..a596cb53f1ac 100644 --- a/fs/ceph/inode.c +++ b/fs/ceph/inode.c @@ -879,7 +879,9 @@ void ceph_fill_file_time(struct inode *inode, int issued, { struct ceph_client *cl = ceph_inode_to_client(inode); struct ceph_inode_info *ci = ceph_inode(inode); + struct timespec64 iatime = inode_get_atime(inode); struct timespec64 ictime = inode_get_ctime(inode); + struct timespec64 imtime = inode_get_mtime(inode); int warn = 0;
if (issued & (CEPH_CAP_FILE_EXCL| @@ -889,39 +891,26 @@ void ceph_fill_file_time(struct inode *inode, int issued, CEPH_CAP_XATTR_EXCL)) { if (ci->i_version == 0 || timespec64_compare(ctime, &ictime) > 0) { - doutc(cl, "ctime %lld.%09ld -> %lld.%09ld inc w/ cap\n", - ictime.tv_sec, ictime.tv_nsec, - ctime->tv_sec, ctime->tv_nsec); + doutc(cl, "ctime %ptSp -> %ptSp inc w/ cap\n", &ictime, ctime); inode_set_ctime_to_ts(inode, *ctime); } if (ci->i_version == 0 || ceph_seq_cmp(time_warp_seq, ci->i_time_warp_seq) > 0) { /* the MDS did a utimes() */ - doutc(cl, "mtime %lld.%09ld -> %lld.%09ld tw %d -> %d\n", - inode_get_mtime_sec(inode), - inode_get_mtime_nsec(inode), - mtime->tv_sec, mtime->tv_nsec, - ci->i_time_warp_seq, (int)time_warp_seq); + doutc(cl, "mtime %ptSp -> %ptSp tw %d -> %d\n", &imtime, mtime, + ci->i_time_warp_seq, (int)time_warp_seq);
inode_set_mtime_to_ts(inode, *mtime); inode_set_atime_to_ts(inode, *atime); ci->i_time_warp_seq = time_warp_seq; } else if (time_warp_seq == ci->i_time_warp_seq) { - struct timespec64 ts; - /* nobody did utimes(); take the max */ - ts = inode_get_mtime(inode); - if (timespec64_compare(mtime, &ts) > 0) { - doutc(cl, "mtime %lld.%09ld -> %lld.%09ld inc\n", - ts.tv_sec, ts.tv_nsec, - mtime->tv_sec, mtime->tv_nsec); + if (timespec64_compare(mtime, &imtime) > 0) { + doutc(cl, "mtime %ptSp -> %ptSp inc\n", &imtime, mtime); inode_set_mtime_to_ts(inode, *mtime); } - ts = inode_get_atime(inode); - if (timespec64_compare(atime, &ts) > 0) { - doutc(cl, "atime %lld.%09ld -> %lld.%09ld inc\n", - ts.tv_sec, ts.tv_nsec, - atime->tv_sec, atime->tv_nsec); + if (timespec64_compare(atime, &iatime) > 0) { + doutc(cl, "atime %ptSp -> %ptSp inc\n", &iatime, atime); inode_set_atime_to_ts(inode, *atime); } } else if (issued & CEPH_CAP_FILE_EXCL) { @@ -2703,10 +2692,8 @@ int __ceph_setattr(struct mnt_idmap *idmap, struct inode *inode, if (ia_valid & ATTR_ATIME) { struct timespec64 atime = inode_get_atime(inode);
- doutc(cl, "%p %llx.%llx atime %lld.%09ld -> %lld.%09ld\n", - inode, ceph_vinop(inode), - atime.tv_sec, atime.tv_nsec, - attr->ia_atime.tv_sec, attr->ia_atime.tv_nsec); + doutc(cl, "%p %llx.%llx atime %ptSp -> %ptSp\n", + inode, ceph_vinop(inode), &atime, &attr->ia_atime); if (!do_sync && (issued & CEPH_CAP_FILE_EXCL)) { ci->i_time_warp_seq++; inode_set_atime_to_ts(inode, attr->ia_atime); @@ -2780,10 +2767,8 @@ int __ceph_setattr(struct mnt_idmap *idmap, struct inode *inode, if (ia_valid & ATTR_MTIME) { struct timespec64 mtime = inode_get_mtime(inode);
- doutc(cl, "%p %llx.%llx mtime %lld.%09ld -> %lld.%09ld\n", - inode, ceph_vinop(inode), - mtime.tv_sec, mtime.tv_nsec, - attr->ia_mtime.tv_sec, attr->ia_mtime.tv_nsec); + doutc(cl, "%p %llx.%llx mtime %ptSp -> %ptSp\n", + inode, ceph_vinop(inode), &mtime, &attr->ia_mtime); if (!do_sync && (issued & CEPH_CAP_FILE_EXCL)) { ci->i_time_warp_seq++; inode_set_mtime_to_ts(inode, attr->ia_mtime); @@ -2804,13 +2789,11 @@ int __ceph_setattr(struct mnt_idmap *idmap, struct inode *inode,
/* these do nothing */ if (ia_valid & ATTR_CTIME) { + struct timespec64 ictime = inode_get_ctime(inode); bool only = (ia_valid & (ATTR_SIZE|ATTR_MTIME|ATTR_ATIME| ATTR_MODE|ATTR_UID|ATTR_GID)) == 0; - doutc(cl, "%p %llx.%llx ctime %lld.%09ld -> %lld.%09ld (%s)\n", - inode, ceph_vinop(inode), - inode_get_ctime_sec(inode), - inode_get_ctime_nsec(inode), - attr->ia_ctime.tv_sec, attr->ia_ctime.tv_nsec, + doutc(cl, "%p %llx.%llx ctime %ptSp -> %ptSp (%s)\n", + inode, ceph_vinop(inode), &ictime, &attr->ia_ctime, only ? "ctime only" : "ignored"); if (only) { /* diff --git a/fs/ceph/xattr.c b/fs/ceph/xattr.c index 537165db4519..ad1f30bea175 100644 --- a/fs/ceph/xattr.c +++ b/fs/ceph/xattr.c @@ -249,8 +249,7 @@ static ssize_t ceph_vxattrcb_dir_rbytes(struct ceph_inode_info *ci, char *val, static ssize_t ceph_vxattrcb_dir_rctime(struct ceph_inode_info *ci, char *val, size_t size) { - return ceph_fmt_xattr(val, size, "%lld.%09ld", ci->i_rctime.tv_sec, - ci->i_rctime.tv_nsec); + return ceph_fmt_xattr(val, size, "%ptSp", &ci->i_rctime); }
/* dir pin */ @@ -307,8 +306,7 @@ static bool ceph_vxattrcb_snap_btime_exists(struct ceph_inode_info *ci) static ssize_t ceph_vxattrcb_snap_btime(struct ceph_inode_info *ci, char *val, size_t size) { - return ceph_fmt_xattr(val, size, "%lld.%09ld", ci->i_snap_btime.tv_sec, - ci->i_snap_btime.tv_nsec); + return ceph_fmt_xattr(val, size, "%ptSp", &ci->i_snap_btime); }
static ssize_t ceph_vxattrcb_cluster_fsid(struct ceph_inode_info *ci,
Use %ptSp instead of open coded variants to print content of struct timespec64 in human readable format.
Reviewed-by: Viacheslav Dubeyko Slava.Dubeyko@ibm.com Signed-off-by: Andy Shevchenko andriy.shevchenko@linux.intel.com --- net/ceph/messenger_v2.c | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-)
diff --git a/net/ceph/messenger_v2.c b/net/ceph/messenger_v2.c index 9e39378eda00..6e676e2d4ba0 100644 --- a/net/ceph/messenger_v2.c +++ b/net/ceph/messenger_v2.c @@ -1535,8 +1535,7 @@ static int prepare_keepalive2(struct ceph_connection *con) struct timespec64 now;
ktime_get_real_ts64(&now); - dout("%s con %p timestamp %lld.%09ld\n", __func__, con, now.tv_sec, - now.tv_nsec); + dout("%s con %p timestamp %ptSp\n", __func__, con, &now);
ceph_encode_timespec64(ts, &now);
@@ -2729,8 +2728,7 @@ static int process_keepalive2_ack(struct ceph_connection *con, ceph_decode_need(&p, end, sizeof(struct ceph_timespec), bad); ceph_decode_timespec64(&con->last_keepalive_ack, p);
- dout("%s con %p timestamp %lld.%09ld\n", __func__, con, - con->last_keepalive_ack.tv_sec, con->last_keepalive_ack.tv_nsec); + dout("%s con %p timestamp %ptSp\n", __func__, con, &con->last_keepalive_ack);
return 0;
Use %ptSp instead of open coded variants to print content of struct timespec64 in human readable format.
Acked-by: Alex Deucher alexander.deucher@amd.com Signed-off-by: Andy Shevchenko andriy.shevchenko@linux.intel.com --- drivers/gpu/drm/amd/amdgpu/amdgpu_dev_coredump.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-)
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_dev_coredump.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_dev_coredump.c index 8a026bc9ea44..4e2fe6674db8 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_dev_coredump.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_dev_coredump.c @@ -217,8 +217,7 @@ amdgpu_devcoredump_read(char *buffer, loff_t offset, size_t count, drm_printf(&p, "version: " AMDGPU_COREDUMP_VERSION "\n"); drm_printf(&p, "kernel: " UTS_RELEASE "\n"); drm_printf(&p, "module: " KBUILD_MODNAME "\n"); - drm_printf(&p, "time: %lld.%09ld\n", coredump->reset_time.tv_sec, - coredump->reset_time.tv_nsec); + drm_printf(&p, "time: %ptSp\n", &coredump->reset_time);
if (coredump->reset_task_info.task.pid) drm_printf(&p, "process_name: %s PID: %d\n",
Use %ptSp instead of open coded variants to print content of struct timespec64 in human readable format.
Reviewed-by: Aleksandr Loktionov aleksandr.loktionov@intel.com Signed-off-by: Andy Shevchenko andriy.shevchenko@linux.intel.com --- drivers/net/ethernet/intel/igb/igb_ptp.c | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-)
diff --git a/drivers/net/ethernet/intel/igb/igb_ptp.c b/drivers/net/ethernet/intel/igb/igb_ptp.c index a7876882aeaf..bd85d02ecadd 100644 --- a/drivers/net/ethernet/intel/igb/igb_ptp.c +++ b/drivers/net/ethernet/intel/igb/igb_ptp.c @@ -840,14 +840,11 @@ static void igb_ptp_overflow_check(struct work_struct *work) struct igb_adapter *igb = container_of(work, struct igb_adapter, ptp_overflow_work.work); struct timespec64 ts; - u64 ns;
/* Update the timecounter */ - ns = timecounter_read(&igb->tc); + ts = ns_to_timespec64(timecounter_read(&igb->tc));
- ts = ns_to_timespec64(ns); - pr_debug("igb overflow check at %lld.%09lu\n", - (long long) ts.tv_sec, ts.tv_nsec); + pr_debug("igb overflow check at %ptSp\n", &ts);
schedule_delayed_work(&igb->ptp_overflow_work, IGB_SYSTIM_OVERFLOW_PERIOD);
Use %ptSp instead of open coded variants to print content of struct timespec64 in human readable format.
Acked-by: Corey Minyard cminyard@mvista.com Signed-off-by: Andy Shevchenko andriy.shevchenko@linux.intel.com --- drivers/char/ipmi/ipmi_si_intf.c | 3 +-- drivers/char/ipmi/ipmi_ssif.c | 6 ++---- 2 files changed, 3 insertions(+), 6 deletions(-)
diff --git a/drivers/char/ipmi/ipmi_si_intf.c b/drivers/char/ipmi/ipmi_si_intf.c index 70e55f5ff85e..5459ffdde8dc 100644 --- a/drivers/char/ipmi/ipmi_si_intf.c +++ b/drivers/char/ipmi/ipmi_si_intf.c @@ -275,8 +275,7 @@ void debug_timestamp(struct smi_info *smi_info, char *msg) struct timespec64 t;
ktime_get_ts64(&t); - dev_dbg(smi_info->io.dev, "**%s: %lld.%9.9ld\n", - msg, t.tv_sec, t.tv_nsec); + dev_dbg(smi_info->io.dev, "**%s: %ptSp\n", msg, &t); } #else #define debug_timestamp(smi_info, x) diff --git a/drivers/char/ipmi/ipmi_ssif.c b/drivers/char/ipmi/ipmi_ssif.c index 1b63f7d2fcda..ef1582a029f4 100644 --- a/drivers/char/ipmi/ipmi_ssif.c +++ b/drivers/char/ipmi/ipmi_ssif.c @@ -1083,10 +1083,8 @@ static int sender(void *send_info, struct ipmi_smi_msg *msg) struct timespec64 t;
ktime_get_real_ts64(&t); - dev_dbg(&ssif_info->client->dev, - "**Enqueue %02x %02x: %lld.%6.6ld\n", - msg->data[0], msg->data[1], - (long long)t.tv_sec, (long)t.tv_nsec / NSEC_PER_USEC); + dev_dbg(&ssif_info->client->dev, "**Enqueue %02x %02x: %ptSp\n", + msg->data[0], msg->data[1], &t); } return IPMI_CC_NO_ERROR; }
Use %ptSp instead of open coded variants to print content of struct timespec64 in human readable format.
Signed-off-by: Andy Shevchenko andriy.shevchenko@linux.intel.com --- drivers/gpu/drm/drm_vblank.c | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-)
diff --git a/drivers/gpu/drm/drm_vblank.c b/drivers/gpu/drm/drm_vblank.c index 32d013c5c8fc..5c14140cd0c2 100644 --- a/drivers/gpu/drm/drm_vblank.c +++ b/drivers/gpu/drm/drm_vblank.c @@ -806,10 +806,8 @@ drm_crtc_vblank_helper_get_vblank_timestamp_internal( ts_vblank_time = ktime_to_timespec64(*vblank_time);
drm_dbg_vbl(dev, - "crtc %u : v p(%d,%d)@ %lld.%06ld -> %lld.%06ld [e %d us, %d rep]\n", - pipe, hpos, vpos, - (u64)ts_etime.tv_sec, ts_etime.tv_nsec / 1000, - (u64)ts_vblank_time.tv_sec, ts_vblank_time.tv_nsec / 1000, + "crtc %u : v p(%d,%d)@ %ptSp -> %ptSp [e %d us, %d rep]\n", + pipe, hpos, vpos, &ts_etime, &ts_vblank_time, duration_ns / 1000, i);
return true;
Use %ptSp instead of open coded variants to print content of struct timespec64 in human readable format.
While at it, fix wrong use of %ptT against struct timespec64. It's kinda lucky that it worked just because the first member there 64-bit and it's of time64_t type. Now with %ptS it may be used correctly.
Acked-by: Vadim Fedorenko vadim.fedorenko@linux.dev Signed-off-by: Andy Shevchenko andriy.shevchenko@linux.intel.com --- drivers/ptp/ptp_ocp.c | 13 +++++-------- 1 file changed, 5 insertions(+), 8 deletions(-)
diff --git a/drivers/ptp/ptp_ocp.c b/drivers/ptp/ptp_ocp.c index eeebe4d149f7..21a8109fae34 100644 --- a/drivers/ptp/ptp_ocp.c +++ b/drivers/ptp/ptp_ocp.c @@ -4293,11 +4293,9 @@ ptp_ocp_summary_show(struct seq_file *s, void *data) ns += (s64)bp->utc_tai_offset * NSEC_PER_SEC; sys_ts = ns_to_timespec64(ns);
- seq_printf(s, "%7s: %lld.%ld == %ptT TAI\n", "PHC", - ts.tv_sec, ts.tv_nsec, &ts); - seq_printf(s, "%7s: %lld.%ld == %ptT UTC offset %d\n", "SYS", - sys_ts.tv_sec, sys_ts.tv_nsec, &sys_ts, - bp->utc_tai_offset); + seq_printf(s, "%7s: %ptSp == %ptS TAI\n", "PHC", &ts, &ts); + seq_printf(s, "%7s: %ptSp == %ptS UTC offset %d\n", "SYS", + &sys_ts, &sys_ts, bp->utc_tai_offset); seq_printf(s, "%7s: PHC:SYS offset: %lld window: %lld\n", "", timespec64_to_ns(&ts) - ns, post_ns - pre_ns); @@ -4505,9 +4503,8 @@ ptp_ocp_phc_info(struct ptp_ocp *bp) ptp_clock_index(bp->ptp));
if (!ptp_ocp_gettimex(&bp->ptp_info, &ts, NULL)) - dev_info(&bp->pdev->dev, "Time: %lld.%ld, %s\n", - ts.tv_sec, ts.tv_nsec, - bp->sync ? "in-sync" : "UNSYNCED"); + dev_info(&bp->pdev->dev, "Time: %ptSp, %s\n", + &ts, bp->sync ? "in-sync" : "UNSYNCED"); }
static void
Use %ptSp instead of open coded variants to print content of struct timespec64 in human readable format.
Acked-by: Lucas De Marchi lucas.demarchi@intel.com Signed-off-by: Andy Shevchenko andriy.shevchenko@linux.intel.com --- drivers/gpu/drm/xe/xe_devcoredump.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/drivers/gpu/drm/xe/xe_devcoredump.c b/drivers/gpu/drm/xe/xe_devcoredump.c index 203e3038cc81..d444eda65ca6 100644 --- a/drivers/gpu/drm/xe/xe_devcoredump.c +++ b/drivers/gpu/drm/xe/xe_devcoredump.c @@ -106,9 +106,9 @@ static ssize_t __xe_devcoredump_read(char *buffer, ssize_t count, drm_puts(&p, "module: " KBUILD_MODNAME "\n");
ts = ktime_to_timespec64(ss->snapshot_time); - drm_printf(&p, "Snapshot time: %lld.%09ld\n", ts.tv_sec, ts.tv_nsec); + drm_printf(&p, "Snapshot time: %ptSp\n", &ts); ts = ktime_to_timespec64(ss->boot_time); - drm_printf(&p, "Uptime: %lld.%09ld\n", ts.tv_sec, ts.tv_nsec); + drm_printf(&p, "Uptime: %ptSp\n", &ts); drm_printf(&p, "Process: %s [%d]\n", ss->process_name, ss->pid); xe_device_snapshot_print(xe, &p);
Use %ptSp instead of open coded variants to print content of struct timespec64 in human readable format.
Signed-off-by: Andy Shevchenko andriy.shevchenko@linux.intel.com --- drivers/s390/block/dasd.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-)
diff --git a/drivers/s390/block/dasd.c b/drivers/s390/block/dasd.c index 7765e40f7cea..97dcc70f669e 100644 --- a/drivers/s390/block/dasd.c +++ b/drivers/s390/block/dasd.c @@ -974,8 +974,7 @@ static void dasd_stats_array(struct seq_file *m, unsigned int *array) static void dasd_stats_seq_print(struct seq_file *m, struct dasd_profile_info *data) { - seq_printf(m, "start_time %lld.%09ld\n", - (s64)data->starttod.tv_sec, data->starttod.tv_nsec); + seq_printf(m, "start_time %ptSp\n", &data->starttod); seq_printf(m, "total_requests %u\n", data->dasd_io_reqs); seq_printf(m, "total_sectors %u\n", data->dasd_io_sects); seq_printf(m, "total_pav %u\n", data->dasd_io_alias);
Am 13.11.25 um 15:32 schrieb Andy Shevchenko:
Use %ptSp instead of open coded variants to print content of struct timespec64 in human readable format.
Signed-off-by: Andy Shevchenko andriy.shevchenko@linux.intel.com
Thanks, looks good to me.
Acked-by: Stefan Haberland sth@linux.ibm.com
Use %ptSp instead of open coded variants to print content of struct timespec64 in human readable format.
Reviewed-by: Aleksandr Loktionov aleksandr.loktionov@intel.com Signed-off-by: Andy Shevchenko andriy.shevchenko@linux.intel.com --- drivers/net/ethernet/intel/e1000e/ptp.c | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-)
diff --git a/drivers/net/ethernet/intel/e1000e/ptp.c b/drivers/net/ethernet/intel/e1000e/ptp.c index ea3c3eb2ef20..ec39e35f3857 100644 --- a/drivers/net/ethernet/intel/e1000e/ptp.c +++ b/drivers/net/ethernet/intel/e1000e/ptp.c @@ -229,14 +229,11 @@ static void e1000e_systim_overflow_work(struct work_struct *work) systim_overflow_work.work); struct e1000_hw *hw = &adapter->hw; struct timespec64 ts; - u64 ns;
/* Update the timecounter */ - ns = timecounter_read(&adapter->tc); + ts = ns_to_timespec64(timecounter_read(&adapter->tc));
- ts = ns_to_timespec64(ns); - e_dbg("SYSTIM overflow check at %lld.%09lu\n", - (long long) ts.tv_sec, ts.tv_nsec); + e_dbg("SYSTIM overflow check at %ptSp\n", &ts);
schedule_delayed_work(&adapter->systim_overflow_work, E1000_SYSTIM_OVERFLOW_PERIOD);
Use %ptSp instead of open coded variants to print content of struct timespec64 in human readable format.
Acked-by: Hans Verkuil hverkuil+cisco@kernel.org Signed-off-by: Andy Shevchenko andriy.shevchenko@linux.intel.com --- drivers/staging/media/av7110/av7110.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/drivers/staging/media/av7110/av7110.c b/drivers/staging/media/av7110/av7110.c index bc9a2a40afcb..602342d1174f 100644 --- a/drivers/staging/media/av7110/av7110.c +++ b/drivers/staging/media/av7110/av7110.c @@ -321,7 +321,7 @@ static inline void print_time(char *s) struct timespec64 ts;
ktime_get_real_ts64(&ts); - pr_info("%s(): %lld.%09ld\n", s, (s64)ts.tv_sec, ts.tv_nsec); + pr_info("%s(): %ptSp\n", s, &ts); #endif }
Use %ptSp instead of open coded variants to print content of struct timespec64 in human readable format.
Signed-off-by: Andy Shevchenko andriy.shevchenko@linux.intel.com --- drivers/mmc/core/mmc_test.c | 20 ++++++++------------ 1 file changed, 8 insertions(+), 12 deletions(-)
diff --git a/drivers/mmc/core/mmc_test.c b/drivers/mmc/core/mmc_test.c index a74089df4547..01d1e62c2ce7 100644 --- a/drivers/mmc/core/mmc_test.c +++ b/drivers/mmc/core/mmc_test.c @@ -586,14 +586,11 @@ static void mmc_test_print_avg_rate(struct mmc_test_card *test, uint64_t bytes, rate = mmc_test_rate(tot, &ts); iops = mmc_test_rate(count * 100, &ts); /* I/O ops per sec x 100 */
- pr_info("%s: Transfer of %u x %u sectors (%u x %u%s KiB) took " - "%llu.%09u seconds (%u kB/s, %u KiB/s, " - "%u.%02u IOPS, sg_len %d)\n", - mmc_hostname(test->card->host), count, sectors, count, - sectors >> 1, (sectors & 1 ? ".5" : ""), - (u64)ts.tv_sec, (u32)ts.tv_nsec, - rate / 1000, rate / 1024, iops / 100, iops % 100, - test->area.sg_len); + pr_info("%s: Transfer of %u x %u sectors (%u x %u%s KiB) took %ptSp seconds (%u kB/s, %u KiB/s, %u.%02u IOPS, sg_len %d)\n", + mmc_hostname(test->card->host), count, sectors, count, + sectors >> 1, (sectors & 1 ? ".5" : ""), &ts, + rate / 1000, rate / 1024, iops / 100, iops % 100, + test->area.sg_len);
mmc_test_save_transfer_result(test, count, sectors, ts, rate, iops); } @@ -3074,10 +3071,9 @@ static int mtf_test_show(struct seq_file *sf, void *data) seq_printf(sf, "Test %d: %d\n", gr->testcase + 1, gr->result);
list_for_each_entry(tr, &gr->tr_lst, link) { - seq_printf(sf, "%u %d %llu.%09u %u %u.%02u\n", - tr->count, tr->sectors, - (u64)tr->ts.tv_sec, (u32)tr->ts.tv_nsec, - tr->rate, tr->iops / 100, tr->iops % 100); + seq_printf(sf, "%u %d %ptSp %u %u.%02u\n", + tr->count, tr->sectors, &tr->ts, tr->rate, + tr->iops / 100, tr->iops % 100); } }
On Thu, 13 Nov 2025 at 16:03, Andy Shevchenko andriy.shevchenko@linux.intel.com wrote:
Use %ptSp instead of open coded variants to print content of struct timespec64 in human readable format.
Signed-off-by: Andy Shevchenko andriy.shevchenko@linux.intel.com
Acked-by: Ulf Hansson ulf.hansson@linaro.org
Kind regards Uffe
drivers/mmc/core/mmc_test.c | 20 ++++++++------------ 1 file changed, 8 insertions(+), 12 deletions(-)
diff --git a/drivers/mmc/core/mmc_test.c b/drivers/mmc/core/mmc_test.c index a74089df4547..01d1e62c2ce7 100644 --- a/drivers/mmc/core/mmc_test.c +++ b/drivers/mmc/core/mmc_test.c @@ -586,14 +586,11 @@ static void mmc_test_print_avg_rate(struct mmc_test_card *test, uint64_t bytes, rate = mmc_test_rate(tot, &ts); iops = mmc_test_rate(count * 100, &ts); /* I/O ops per sec x 100 */
pr_info("%s: Transfer of %u x %u sectors (%u x %u%s KiB) took ""%llu.%09u seconds (%u kB/s, %u KiB/s, ""%u.%02u IOPS, sg_len %d)\n",mmc_hostname(test->card->host), count, sectors, count,sectors >> 1, (sectors & 1 ? ".5" : ""),(u64)ts.tv_sec, (u32)ts.tv_nsec,rate / 1000, rate / 1024, iops / 100, iops % 100,test->area.sg_len);
pr_info("%s: Transfer of %u x %u sectors (%u x %u%s KiB) took %ptSp seconds (%u kB/s, %u KiB/s, %u.%02u IOPS, sg_len %d)\n",mmc_hostname(test->card->host), count, sectors, count,sectors >> 1, (sectors & 1 ? ".5" : ""), &ts,rate / 1000, rate / 1024, iops / 100, iops % 100,test->area.sg_len); mmc_test_save_transfer_result(test, count, sectors, ts, rate, iops);} @@ -3074,10 +3071,9 @@ static int mtf_test_show(struct seq_file *sf, void *data) seq_printf(sf, "Test %d: %d\n", gr->testcase + 1, gr->result);
list_for_each_entry(tr, &gr->tr_lst, link) {
seq_printf(sf, "%u %d %llu.%09u %u %u.%02u\n",tr->count, tr->sectors,(u64)tr->ts.tv_sec, (u32)tr->ts.tv_nsec,tr->rate, tr->iops / 100, tr->iops % 100);
seq_printf(sf, "%u %d %ptSp %u %u.%02u\n",tr->count, tr->sectors, &tr->ts, tr->rate,tr->iops / 100, tr->iops % 100); } }-- 2.50.1
Use %ptSp instead of open coded variants to print content of struct timespec64 in human readable format.
Acked-by: Rodolfo Giometti giometti@enneenne.com Signed-off-by: Andy Shevchenko andriy.shevchenko@linux.intel.com --- drivers/pps/generators/pps_gen_parport.c | 3 +-- drivers/pps/kapi.c | 3 +-- 2 files changed, 2 insertions(+), 4 deletions(-)
diff --git a/drivers/pps/generators/pps_gen_parport.c b/drivers/pps/generators/pps_gen_parport.c index f5eeb4dd01ad..05bbf8d30ef1 100644 --- a/drivers/pps/generators/pps_gen_parport.c +++ b/drivers/pps/generators/pps_gen_parport.c @@ -80,8 +80,7 @@ static enum hrtimer_restart hrtimer_event(struct hrtimer *timer) /* check if we are late */ if (expire_time.tv_sec != ts1.tv_sec || ts1.tv_nsec > lim) { local_irq_restore(flags); - pr_err("we are late this time %lld.%09ld\n", - (s64)ts1.tv_sec, ts1.tv_nsec); + pr_err("we are late this time %ptSp\n", &ts1); goto done; }
diff --git a/drivers/pps/kapi.c b/drivers/pps/kapi.c index e9389876229e..6985c34de2ce 100644 --- a/drivers/pps/kapi.c +++ b/drivers/pps/kapi.c @@ -163,8 +163,7 @@ void pps_event(struct pps_device *pps, struct pps_event_time *ts, int event, /* check event type */ BUG_ON((event & (PPS_CAPTUREASSERT | PPS_CAPTURECLEAR)) == 0);
- dev_dbg(&pps->dev, "PPS event at %lld.%09ld\n", - (s64)ts->ts_real.tv_sec, ts->ts_real.tv_nsec); + dev_dbg(&pps->dev, "PPS event at %ptSp\n", &ts->ts_real);
timespec_to_pps_ktime(&ts_real, ts->ts_real);
Use %ptSp instead of open coded variants to print content of struct timespec64 in human readable format.
Reviewed-by: Aleksandr Loktionov aleksandr.loktionov@intel.com Signed-off-by: Andy Shevchenko andriy.shevchenko@linux.intel.com --- drivers/net/dsa/sja1105/sja1105_tas.c | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-)
diff --git a/drivers/net/dsa/sja1105/sja1105_tas.c b/drivers/net/dsa/sja1105/sja1105_tas.c index d7818710bc02..d5949d2c3e71 100644 --- a/drivers/net/dsa/sja1105/sja1105_tas.c +++ b/drivers/net/dsa/sja1105/sja1105_tas.c @@ -775,9 +775,8 @@ static void sja1105_tas_state_machine(struct work_struct *work) base_time_ts = ns_to_timespec64(base_time); now_ts = ns_to_timespec64(now);
- dev_dbg(ds->dev, "OPER base time %lld.%09ld (now %lld.%09ld)\n", - base_time_ts.tv_sec, base_time_ts.tv_nsec, - now_ts.tv_sec, now_ts.tv_nsec); + dev_dbg(ds->dev, "OPER base time %ptSp (now %ptSp)\n", + &base_time_ts, &now_ts);
break;
@@ -798,8 +797,7 @@ static void sja1105_tas_state_machine(struct work_struct *work) if (now < tas_data->oper_base_time) { /* TAS has not started yet */ diff = ns_to_timespec64(tas_data->oper_base_time - now); - dev_dbg(ds->dev, "time to start: [%lld.%09ld]", - diff.tv_sec, diff.tv_nsec); + dev_dbg(ds->dev, "time to start: [%ptSp]", &diff); break; }
Hi Andy,
On Thu, Nov 13, 2025 at 03:32:28PM +0100, Andy Shevchenko wrote:
Use %ptSp instead of open coded variants to print content of struct timespec64 in human readable format.
Reviewed-by: Aleksandr Loktionov aleksandr.loktionov@intel.com Signed-off-by: Andy Shevchenko andriy.shevchenko@linux.intel.com
Acked-by: Vladimir Oltean olteanv@gmail.com Tested-by: Vladimir Oltean olteanv@gmail.com
Thanks!
This is a rarely modified portion of the SJA1105 driver, and it doesn't conflict with other changes that I have planned, so from my PoV there is no problem with the patch being picked up via other trees.
Use %ptSp instead of open coded variants to print content of struct timespec64 in human readable format.
Acked-by: Bjorn Helgaas bhelgaas@google.com Signed-off-by: Andy Shevchenko andriy.shevchenko@linux.intel.com --- drivers/pci/endpoint/functions/pci-epf-test.c | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-)
diff --git a/drivers/pci/endpoint/functions/pci-epf-test.c b/drivers/pci/endpoint/functions/pci-epf-test.c index b05e8db575c3..debd235253c5 100644 --- a/drivers/pci/endpoint/functions/pci-epf-test.c +++ b/drivers/pci/endpoint/functions/pci-epf-test.c @@ -331,9 +331,8 @@ static void pci_epf_test_print_rate(struct pci_epf_test *epf_test, rate = div64_u64(size * NSEC_PER_SEC, ns * 1000);
dev_info(&epf_test->epf->dev, - "%s => Size: %llu B, DMA: %s, Time: %llu.%09u s, Rate: %llu KB/s\n", - op, size, dma ? "YES" : "NO", - (u64)ts.tv_sec, (u32)ts.tv_nsec, rate); + "%s => Size: %llu B, DMA: %s, Time: %ptSp s, Rate: %llu KB/s\n", + op, size, dma ? "YES" : "NO", &ts, rate); }
static void pci_epf_test_copy(struct pci_epf_test *epf_test,
On Thu, Nov 13, 2025 at 03:32:29PM +0100, Andy Shevchenko wrote:
Use %ptSp instead of open coded variants to print content of struct timespec64 in human readable format.
Acked-by: Bjorn Helgaas bhelgaas@google.com Signed-off-by: Andy Shevchenko andriy.shevchenko@linux.intel.com
Acked-by: Manivannan Sadhasivam mani@kernel.org
- Mani
drivers/pci/endpoint/functions/pci-epf-test.c | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-)
diff --git a/drivers/pci/endpoint/functions/pci-epf-test.c b/drivers/pci/endpoint/functions/pci-epf-test.c index b05e8db575c3..debd235253c5 100644 --- a/drivers/pci/endpoint/functions/pci-epf-test.c +++ b/drivers/pci/endpoint/functions/pci-epf-test.c @@ -331,9 +331,8 @@ static void pci_epf_test_print_rate(struct pci_epf_test *epf_test, rate = div64_u64(size * NSEC_PER_SEC, ns * 1000); dev_info(&epf_test->epf->dev,
"%s => Size: %llu B, DMA: %s, Time: %llu.%09u s, Rate: %llu KB/s\n",op, size, dma ? "YES" : "NO",(u64)ts.tv_sec, (u32)ts.tv_nsec, rate);
"%s => Size: %llu B, DMA: %s, Time: %ptSp s, Rate: %llu KB/s\n",op, size, dma ? "YES" : "NO", &ts, rate);} static void pci_epf_test_copy(struct pci_epf_test *epf_test, -- 2.50.1
Use %ptSp instead of open coded variants to print content of struct timespec64 in human readable format.
Reviewed-by: Martin K. Petersen martin.petersen@oracle.com Signed-off-by: Andy Shevchenko andriy.shevchenko@linux.intel.com --- drivers/scsi/fnic/fnic_trace.c | 52 ++++++++++++++-------------------- 1 file changed, 22 insertions(+), 30 deletions(-)
diff --git a/drivers/scsi/fnic/fnic_trace.c b/drivers/scsi/fnic/fnic_trace.c index cdc6b12b1ec2..0a849a195a8e 100644 --- a/drivers/scsi/fnic/fnic_trace.c +++ b/drivers/scsi/fnic/fnic_trace.c @@ -138,9 +138,8 @@ int fnic_get_trace_data(fnic_dbgfs_t *fnic_dbgfs_prt) */ len += scnprintf(fnic_dbgfs_prt->buffer + len, (trace_max_pages * PAGE_SIZE * 3) - len, - "%16llu.%09lu %-50s %8x %8x %16llx %16llx " - "%16llx %16llx %16llx\n", (u64)val.tv_sec, - val.tv_nsec, str, tbp->host_no, tbp->tag, + "%ptSp %-50s %8x %8x %16llx %16llx %16llx %16llx %16llx\n", + &val, str, tbp->host_no, tbp->tag, tbp->data[0], tbp->data[1], tbp->data[2], tbp->data[3], tbp->data[4]); rd_idx++; @@ -180,9 +179,8 @@ int fnic_get_trace_data(fnic_dbgfs_t *fnic_dbgfs_prt) */ len += scnprintf(fnic_dbgfs_prt->buffer + len, (trace_max_pages * PAGE_SIZE * 3) - len, - "%16llu.%09lu %-50s %8x %8x %16llx %16llx " - "%16llx %16llx %16llx\n", (u64)val.tv_sec, - val.tv_nsec, str, tbp->host_no, tbp->tag, + "%ptSp %-50s %8x %8x %16llx %16llx %16llx %16llx %16llx\n", + &val, str, tbp->host_no, tbp->tag, tbp->data[0], tbp->data[1], tbp->data[2], tbp->data[3], tbp->data[4]); rd_idx++; @@ -215,30 +213,26 @@ int fnic_get_stats_data(struct stats_debug_info *debug, { int len = 0; int buf_size = debug->buf_size; - struct timespec64 val1, val2; + struct timespec64 val, val1, val2; int i = 0;
- ktime_get_real_ts64(&val1); + ktime_get_real_ts64(&val); len = scnprintf(debug->debug_buffer + len, buf_size - len, "------------------------------------------\n" "\t\tTime\n" "------------------------------------------\n");
+ val1 = timespec64_sub(val, stats->stats_timestamps.last_reset_time); + val2 = timespec64_sub(val, stats->stats_timestamps.last_read_time); len += scnprintf(debug->debug_buffer + len, buf_size - len, - "Current time : [%lld:%ld]\n" - "Last stats reset time: [%lld:%09ld]\n" - "Last stats read time: [%lld:%ld]\n" - "delta since last reset: [%lld:%ld]\n" - "delta since last read: [%lld:%ld]\n", - (s64)val1.tv_sec, val1.tv_nsec, - (s64)stats->stats_timestamps.last_reset_time.tv_sec, - stats->stats_timestamps.last_reset_time.tv_nsec, - (s64)stats->stats_timestamps.last_read_time.tv_sec, - stats->stats_timestamps.last_read_time.tv_nsec, - (s64)timespec64_sub(val1, stats->stats_timestamps.last_reset_time).tv_sec, - timespec64_sub(val1, stats->stats_timestamps.last_reset_time).tv_nsec, - (s64)timespec64_sub(val1, stats->stats_timestamps.last_read_time).tv_sec, - timespec64_sub(val1, stats->stats_timestamps.last_read_time).tv_nsec); + "Current time : [%ptSp]\n" + "Last stats reset time: [%ptSp]\n" + "Last stats read time: [%ptSp]\n" + "delta since last reset: [%ptSp]\n" + "delta since last read: [%ptSp]\n", + &val, + &stats->stats_timestamps.last_reset_time, &val1, + &stats->stats_timestamps.last_read_time, &val2);
stats->stats_timestamps.last_read_time = val1;
@@ -416,8 +410,8 @@ int fnic_get_stats_data(struct stats_debug_info *debug, jiffies_to_timespec64(stats->misc_stats.last_ack_time, &val2);
len += scnprintf(debug->debug_buffer + len, buf_size - len, - "Last ISR time: %llu (%8llu.%09lu)\n" - "Last ACK time: %llu (%8llu.%09lu)\n" + "Last ISR time: %llu (%ptSp)\n" + "Last ACK time: %llu (%ptSp)\n" "Max ISR jiffies: %llu\n" "Max ISR time (ms) (0 denotes < 1 ms): %llu\n" "Corr. work done: %llu\n" @@ -437,10 +431,8 @@ int fnic_get_stats_data(struct stats_debug_info *debug, "Number of rport not ready: %lld\n" "Number of receive frame errors: %lld\n" "Port speed (in Mbps): %lld\n", - (u64)stats->misc_stats.last_isr_time, - (s64)val1.tv_sec, val1.tv_nsec, - (u64)stats->misc_stats.last_ack_time, - (s64)val2.tv_sec, val2.tv_nsec, + (u64)stats->misc_stats.last_isr_time, &val1, + (u64)stats->misc_stats.last_ack_time, &val2, (u64)atomic64_read(&stats->misc_stats.max_isr_jiffies), (u64)atomic64_read(&stats->misc_stats.max_isr_time_ms), (u64)atomic64_read(&stats->misc_stats.corr_work_done), @@ -857,8 +849,8 @@ void copy_and_format_trace_data(struct fc_trace_hdr *tdata, len = *orig_len;
len += scnprintf(fnic_dbgfs_prt->buffer + len, max_size - len, - "%ptTs.%09lu ns%8x %c%8x\t", - &tdata->time_stamp.tv_sec, tdata->time_stamp.tv_nsec, + "%ptSs ns%8x %c%8x\t", + &tdata->time_stamp, tdata->host_no, tdata->frame_type, tdata->frame_len);
fc_trace = (char *)FC_TRACE_ADDRESS(tdata);
On Thursday, November 13, 2025 6:33 AM, Andy Shevchenko andriy.shevchenko@linux.intel.com wrote:
Use %ptSp instead of open coded variants to print content of struct timespec64 in human readable format.
Reviewed-by: Martin K. Petersen martin.petersen@oracle.com Signed-off-by: Andy Shevchenko andriy.shevchenko@linux.intel.com
drivers/scsi/fnic/fnic_trace.c | 52 ++++++++++++++-------------------- 1 file changed, 22 insertions(+), 30 deletions(-)
diff --git a/drivers/scsi/fnic/fnic_trace.c b/drivers/scsi/fnic/fnic_trace.c index cdc6b12b1ec2..0a849a195a8e 100644 --- a/drivers/scsi/fnic/fnic_trace.c +++ b/drivers/scsi/fnic/fnic_trace.c @@ -138,9 +138,8 @@ int fnic_get_trace_data(fnic_dbgfs_t *fnic_dbgfs_prt) */ len += scnprintf(fnic_dbgfs_prt->buffer + len, (trace_max_pages * PAGE_SIZE * 3) - len,
"%16llu.%09lu %-50s %8x %8x %16llx %16llx ""%16llx %16llx %16llx\n", (u64)val.tv_sec,val.tv_nsec, str, tbp->host_no, tbp->tag,
"%ptSp %-50s %8x %8x %16llx %16llx %16llx %16llx %16llx\n",&val, str, tbp->host_no, tbp->tag,tbp->data[0], tbp->data[1], tbp->data[2], tbp->data[3], tbp->data[4]); rd_idx++; @@ -180,9 +179,8 @@ int fnic_get_trace_data(fnic_dbgfs_t *fnic_dbgfs_prt) */ len += scnprintf(fnic_dbgfs_prt->buffer + len, (trace_max_pages * PAGE_SIZE * 3) - len,
"%16llu.%09lu %-50s %8x %8x %16llx %16llx ""%16llx %16llx %16llx\n", (u64)val.tv_sec,val.tv_nsec, str, tbp->host_no, tbp->tag,
"%ptSp %-50s %8x %8x %16llx %16llx %16llx %16llx %16llx\n",&val, str, tbp->host_no, tbp->tag,tbp->data[0], tbp->data[1], tbp->data[2], tbp->data[3], tbp->data[4]); rd_idx++; @@ -215,30 +213,26 @@ int fnic_get_stats_data(struct stats_debug_info *debug, { int len = 0; int buf_size = debug->buf_size;
struct timespec64 val1, val2;
struct timespec64 val, val1, val2;int i = 0;
ktime_get_real_ts64(&val1);
ktime_get_real_ts64(&val);len = scnprintf(debug->debug_buffer + len, buf_size - len, "------------------------------------------\n" "\t\tTime\n" "------------------------------------------\n");
val1 = timespec64_sub(val, stats->stats_timestamps.last_reset_time);val2 = timespec64_sub(val, stats->stats_timestamps.last_read_time);len += scnprintf(debug->debug_buffer + len, buf_size - len,
"Current time : [%lld:%ld]\n""Last stats reset time: [%lld:%09ld]\n""Last stats read time: [%lld:%ld]\n""delta since last reset: [%lld:%ld]\n""delta since last read: [%lld:%ld]\n",(s64)val1.tv_sec, val1.tv_nsec,(s64)stats->stats_timestamps.last_reset_time.tv_sec,stats->stats_timestamps.last_reset_time.tv_nsec,(s64)stats->stats_timestamps.last_read_time.tv_sec,stats->stats_timestamps.last_read_time.tv_nsec,(s64)timespec64_sub(val1, stats->stats_timestamps.last_reset_time).tv_sec,timespec64_sub(val1, stats->stats_timestamps.last_reset_time).tv_nsec,(s64)timespec64_sub(val1, stats->stats_timestamps.last_read_time).tv_sec,timespec64_sub(val1, stats->stats_timestamps.last_read_time).tv_nsec);
"Current time : [%ptSp]\n""Last stats reset time: [%ptSp]\n""Last stats read time: [%ptSp]\n""delta since last reset: [%ptSp]\n""delta since last read: [%ptSp]\n",&val,&stats->stats_timestamps.last_reset_time, &val1,&stats->stats_timestamps.last_read_time, &val2);stats->stats_timestamps.last_read_time = val1;
@@ -416,8 +410,8 @@ int fnic_get_stats_data(struct stats_debug_info *debug, jiffies_to_timespec64(stats->misc_stats.last_ack_time, &val2);
len += scnprintf(debug->debug_buffer + len, buf_size - len,
"Last ISR time: %llu (%8llu.%09lu)\n""Last ACK time: %llu (%8llu.%09lu)\n"
"Last ISR time: %llu (%ptSp)\n""Last ACK time: %llu (%ptSp)\n""Max ISR jiffies: %llu\n" "Max ISR time (ms) (0 denotes < 1 ms): %llu\n" "Corr. work done: %llu\n" @@ -437,10 +431,8 @@ int fnic_get_stats_data(struct stats_debug_info *debug, "Number of rport not ready: %lld\n" "Number of receive frame errors: %lld\n" "Port speed (in Mbps): %lld\n",
(u64)stats->misc_stats.last_isr_time,(s64)val1.tv_sec, val1.tv_nsec,(u64)stats->misc_stats.last_ack_time,(s64)val2.tv_sec, val2.tv_nsec,
(u64)stats->misc_stats.last_isr_time, &val1,(u64)stats->misc_stats.last_ack_time, &val2,(u64)atomic64_read(&stats->misc_stats.max_isr_jiffies), (u64)atomic64_read(&stats->misc_stats.max_isr_time_ms), (u64)atomic64_read(&stats->misc_stats.corr_work_done), @@ -857,8 +849,8 @@ void copy_and_format_trace_data(struct fc_trace_hdr *tdata, len = *orig_len;
len += scnprintf(fnic_dbgfs_prt->buffer + len, max_size - len,
"%ptTs.%09lu ns%8x %c%8x\t",&tdata->time_stamp.tv_sec, tdata->time_stamp.tv_nsec,
"%ptSs ns%8x %c%8x\t",&tdata->time_stamp,tdata->host_no, tdata->frame_type, tdata->frame_len);
fc_trace = (char *)FC_TRACE_ADDRESS(tdata);
2.50.1
Acked-by: Karan Tilak Kumar kartilak@cisco.com
Thanks for the change, Andy.
Can you please advise how I can compile test this change?
Regards, Karan
On Thu 2025-11-13 15:32:33, Andy Shevchenko wrote:
Use %ptSp instead of open coded variants to print content of struct timespec64 in human readable format.
I was about to commit the changes into printk/linux.git and found a mistake during the final double check, see below.
diff --git a/drivers/scsi/fnic/fnic_trace.c b/drivers/scsi/fnic/fnic_trace.c index cdc6b12b1ec2..0a849a195a8e 100644 --- a/drivers/scsi/fnic/fnic_trace.c +++ b/drivers/scsi/fnic/fnic_trace.c @@ -215,30 +213,26 @@ int fnic_get_stats_data(struct stats_debug_info *debug, { int len = 0; int buf_size = debug->buf_size;
- struct timespec64 val1, val2;
- struct timespec64 val, val1, val2; int i = 0;
- ktime_get_real_ts64(&val1);
- ktime_get_real_ts64(&val); len = scnprintf(debug->debug_buffer + len, buf_size - len, "------------------------------------------\n" "\t\tTime\n" "------------------------------------------\n");
- val1 = timespec64_sub(val, stats->stats_timestamps.last_reset_time);
- val2 = timespec64_sub(val, stats->stats_timestamps.last_read_time); len += scnprintf(debug->debug_buffer + len, buf_size - len,
"Current time : [%lld:%ld]\n""Last stats reset time: [%lld:%09ld]\n""Last stats read time: [%lld:%ld]\n""delta since last reset: [%lld:%ld]\n""delta since last read: [%lld:%ld]\n",- (s64)val1.tv_sec, val1.tv_nsec,
- (s64)stats->stats_timestamps.last_reset_time.tv_sec,
- stats->stats_timestamps.last_reset_time.tv_nsec,
- (s64)stats->stats_timestamps.last_read_time.tv_sec,
- stats->stats_timestamps.last_read_time.tv_nsec,
- (s64)timespec64_sub(val1, stats->stats_timestamps.last_reset_time).tv_sec,
- timespec64_sub(val1, stats->stats_timestamps.last_reset_time).tv_nsec,
- (s64)timespec64_sub(val1, stats->stats_timestamps.last_read_time).tv_sec,
- timespec64_sub(val1, stats->stats_timestamps.last_read_time).tv_nsec);
"Current time : [%ptSp]\n""Last stats reset time: [%ptSp]\n""Last stats read time: [%ptSp]\n""delta since last reset: [%ptSp]\n""delta since last read: [%ptSp]\n",
Both delta times are printed at the end.
&val,&stats->stats_timestamps.last_reset_time, &val1,&stats->stats_timestamps.last_read_time, &val2);
I think that this should be:
&stats->stats_timestamps.last_reset_time, &stats->stats_timestamps.last_read_time, &val1, &val2);
stats->stats_timestamps.last_read_time = val1;
The original code stored the current time in "val1". This should be:
stats->stats_timestamps.last_read_time = val;
@@ -416,8 +410,8 @@ int fnic_get_stats_data(struct stats_debug_info *debug, jiffies_to_timespec64(stats->misc_stats.last_ack_time, &val2);
Just for record. Another values are stored into @val1 and @val2 at this point.
len += scnprintf(debug->debug_buffer + len, buf_size - len,
"Last ISR time: %llu (%8llu.%09lu)\n""Last ACK time: %llu (%8llu.%09lu)\n"
"Last ISR time: %llu (%ptSp)\n" "Max ISR jiffies: %llu\n" "Max ISR time (ms) (0 denotes < 1 ms): %llu\n" "Corr. work done: %llu\n""Last ACK time: %llu (%ptSp)\n"@@ -437,10 +431,8 @@ int fnic_get_stats_data(struct stats_debug_info *debug, "Number of rport not ready: %lld\n" "Number of receive frame errors: %lld\n" "Port speed (in Mbps): %lld\n",
(u64)stats->misc_stats.last_isr_time,(s64)val1.tv_sec, val1.tv_nsec,(u64)stats->misc_stats.last_ack_time,(s64)val2.tv_sec, val2.tv_nsec,
(u64)stats->misc_stats.last_isr_time, &val1,(u64)stats->misc_stats.last_ack_time, &val2,
So, this is correct!
(u64)atomic64_read(&stats->misc_stats.max_isr_jiffies), (u64)atomic64_read(&stats->misc_stats.max_isr_time_ms), (u64)atomic64_read(&stats->misc_stats.corr_work_done),
Now, I think that there is no need to resend the entire huge patchset.
I could either fix this when comitting or commit the rest and you could send only this patch for review.
Best Regards, Petr
PS: All other patches look good. Well, nobody acked 7th patch yet. But I think that the change is pretty straightforward and we could do it even without an ack.
On Wed, Nov 19, 2025 at 11:08:01AM +0100, Petr Mladek wrote:
On Thu 2025-11-13 15:32:33, Andy Shevchenko wrote:
Use %ptSp instead of open coded variants to print content of struct timespec64 in human readable format.
I was about to commit the changes into printk/linux.git and found a mistake during the final double check, see below.
diff --git a/drivers/scsi/fnic/fnic_trace.c b/drivers/scsi/fnic/fnic_trace.c index cdc6b12b1ec2..0a849a195a8e 100644 --- a/drivers/scsi/fnic/fnic_trace.c +++ b/drivers/scsi/fnic/fnic_trace.c @@ -215,30 +213,26 @@ int fnic_get_stats_data(struct stats_debug_info *debug, { int len = 0; int buf_size = debug->buf_size;
- struct timespec64 val1, val2;
- struct timespec64 val, val1, val2; int i = 0;
- ktime_get_real_ts64(&val1);
- ktime_get_real_ts64(&val); len = scnprintf(debug->debug_buffer + len, buf_size - len, "------------------------------------------\n" "\t\tTime\n" "------------------------------------------\n");
- val1 = timespec64_sub(val, stats->stats_timestamps.last_reset_time);
- val2 = timespec64_sub(val, stats->stats_timestamps.last_read_time); len += scnprintf(debug->debug_buffer + len, buf_size - len,
"Current time : [%lld:%ld]\n""Last stats reset time: [%lld:%09ld]\n""Last stats read time: [%lld:%ld]\n""delta since last reset: [%lld:%ld]\n""delta since last read: [%lld:%ld]\n",- (s64)val1.tv_sec, val1.tv_nsec,
- (s64)stats->stats_timestamps.last_reset_time.tv_sec,
- stats->stats_timestamps.last_reset_time.tv_nsec,
- (s64)stats->stats_timestamps.last_read_time.tv_sec,
- stats->stats_timestamps.last_read_time.tv_nsec,
- (s64)timespec64_sub(val1, stats->stats_timestamps.last_reset_time).tv_sec,
- timespec64_sub(val1, stats->stats_timestamps.last_reset_time).tv_nsec,
- (s64)timespec64_sub(val1, stats->stats_timestamps.last_read_time).tv_sec,
- timespec64_sub(val1, stats->stats_timestamps.last_read_time).tv_nsec);
"Current time : [%ptSp]\n""Last stats reset time: [%ptSp]\n""Last stats read time: [%ptSp]\n""delta since last reset: [%ptSp]\n""delta since last read: [%ptSp]\n",Both delta times are printed at the end.
&val,&stats->stats_timestamps.last_reset_time, &val1,&stats->stats_timestamps.last_read_time, &val2);I think that this should be:
&stats->stats_timestamps.last_reset_time, &stats->stats_timestamps.last_read_time, &val1, &val2);stats->stats_timestamps.last_read_time = val1;
The original code stored the current time in "val1". This should be:
stats->stats_timestamps.last_read_time = val;
@@ -416,8 +410,8 @@ int fnic_get_stats_data(struct stats_debug_info *debug, jiffies_to_timespec64(stats->misc_stats.last_ack_time, &val2);
Just for record. Another values are stored into @val1 and @val2 at this point.
len += scnprintf(debug->debug_buffer + len, buf_size - len,
"Last ISR time: %llu (%8llu.%09lu)\n""Last ACK time: %llu (%8llu.%09lu)\n"
"Last ISR time: %llu (%ptSp)\n" "Max ISR jiffies: %llu\n" "Max ISR time (ms) (0 denotes < 1 ms): %llu\n" "Corr. work done: %llu\n""Last ACK time: %llu (%ptSp)\n"@@ -437,10 +431,8 @@ int fnic_get_stats_data(struct stats_debug_info *debug, "Number of rport not ready: %lld\n" "Number of receive frame errors: %lld\n" "Port speed (in Mbps): %lld\n",
(u64)stats->misc_stats.last_isr_time,(s64)val1.tv_sec, val1.tv_nsec,(u64)stats->misc_stats.last_ack_time,(s64)val2.tv_sec, val2.tv_nsec,
(u64)stats->misc_stats.last_isr_time, &val1,(u64)stats->misc_stats.last_ack_time, &val2,So, this is correct!
(u64)atomic64_read(&stats->misc_stats.max_isr_jiffies), (u64)atomic64_read(&stats->misc_stats.max_isr_time_ms), (u64)atomic64_read(&stats->misc_stats.corr_work_done),Now, I think that there is no need to resend the entire huge patchset.
I could either fix this when comitting or commit the rest and you could send only this patch for review.
Thank you for the thoroughly done review, I changed that patch between the versions and the problem is that for printf() specifiers (extensions) we do not have an automatic type checking. We starve for a GCC plugin for that, yeah...
In any case, if you fold your changes in, I will appreciate that! Otherwise it's also fine with me to send a patch separately later on.
PS: All other patches look good. Well, nobody acked 7th patch yet. But I think that the change is pretty straightforward and we could do it even without an ack.
This is my understanding as well. It changes the output, but that output is debug anyway. So I don't expect breakage of anything we have an obligation to keep working.
Use %ptSp instead of open coded variants to print content of struct timespec64 in human readable format.
Reviewed-by: Martin K. Petersen martin.petersen@oracle.com Signed-off-by: Andy Shevchenko andriy.shevchenko@linux.intel.com --- drivers/scsi/snic/snic_debugfs.c | 10 ++++------ drivers/scsi/snic/snic_trc.c | 5 ++--- 2 files changed, 6 insertions(+), 9 deletions(-)
diff --git a/drivers/scsi/snic/snic_debugfs.c b/drivers/scsi/snic/snic_debugfs.c index 9dd975b36b5b..edf3e5ef28a6 100644 --- a/drivers/scsi/snic/snic_debugfs.c +++ b/drivers/scsi/snic/snic_debugfs.c @@ -282,8 +282,8 @@ snic_stats_show(struct seq_file *sfp, void *data) jiffies_to_timespec64(stats->misc.last_ack_time, &last_ack_tms);
seq_printf(sfp, - "Last ISR Time : %llu (%8llu.%09lu)\n" - "Last Ack Time : %llu (%8llu.%09lu)\n" + "Last ISR Time : %llu (%ptSp)\n" + "Last Ack Time : %llu (%ptSp)\n" "Ack ISRs : %llu\n" "IO Cmpl ISRs : %llu\n" "Err Notify ISRs : %llu\n" @@ -298,10 +298,8 @@ snic_stats_show(struct seq_file *sfp, void *data) "Queue Ramp Down : %lld\n" "Queue Last Queue Depth : %lld\n" "Target Not Ready : %lld\n", - (u64) stats->misc.last_isr_time, - last_isr_tms.tv_sec, last_isr_tms.tv_nsec, - (u64)stats->misc.last_ack_time, - last_ack_tms.tv_sec, last_ack_tms.tv_nsec, + (u64) stats->misc.last_isr_time, &last_isr_tms, + (u64) stats->misc.last_ack_time, &last_ack_tms, (u64) atomic64_read(&stats->misc.ack_isr_cnt), (u64) atomic64_read(&stats->misc.cmpl_isr_cnt), (u64) atomic64_read(&stats->misc.errnotify_isr_cnt), diff --git a/drivers/scsi/snic/snic_trc.c b/drivers/scsi/snic/snic_trc.c index c2e5ab7e976c..6bad1ea9a6a7 100644 --- a/drivers/scsi/snic/snic_trc.c +++ b/drivers/scsi/snic/snic_trc.c @@ -56,9 +56,8 @@ snic_fmt_trc_data(struct snic_trc_data *td, char *buf, int buf_sz) jiffies_to_timespec64(td->ts, &tmspec);
len += snprintf(buf, buf_sz, - "%llu.%09lu %-25s %3d %4x %16llx %16llx %16llx %16llx %16llx\n", - tmspec.tv_sec, - tmspec.tv_nsec, + "%ptSp %-25s %3d %4x %16llx %16llx %16llx %16llx %16llx\n", + &tmspec, td->fn, td->hno, td->tag,
On Thursday, November 13, 2025 6:33 AM, Andy Shevchenko andriy.shevchenko@linux.intel.com wrote:
Use %ptSp instead of open coded variants to print content of struct timespec64 in human readable format.
Reviewed-by: Martin K. Petersen martin.petersen@oracle.com Signed-off-by: Andy Shevchenko andriy.shevchenko@linux.intel.com
drivers/scsi/snic/snic_debugfs.c | 10 ++++------ drivers/scsi/snic/snic_trc.c | 5 ++--- 2 files changed, 6 insertions(+), 9 deletions(-)
diff --git a/drivers/scsi/snic/snic_debugfs.c b/drivers/scsi/snic/snic_debugfs.c index 9dd975b36b5b..edf3e5ef28a6 100644 --- a/drivers/scsi/snic/snic_debugfs.c +++ b/drivers/scsi/snic/snic_debugfs.c @@ -282,8 +282,8 @@ snic_stats_show(struct seq_file *sfp, void *data) jiffies_to_timespec64(stats->misc.last_ack_time, &last_ack_tms);
seq_printf(sfp,
"Last ISR Time : %llu (%8llu.%09lu)\n""Last Ack Time : %llu (%8llu.%09lu)\n"
"Last ISR Time : %llu (%ptSp)\n""Last Ack Time : %llu (%ptSp)\n""Ack ISRs : %llu\n" "IO Cmpl ISRs : %llu\n" "Err Notify ISRs : %llu\n" @@ -298,10 +298,8 @@ snic_stats_show(struct seq_file *sfp, void *data) "Queue Ramp Down : %lld\n" "Queue Last Queue Depth : %lld\n" "Target Not Ready : %lld\n",
(u64) stats->misc.last_isr_time,last_isr_tms.tv_sec, last_isr_tms.tv_nsec,(u64)stats->misc.last_ack_time,last_ack_tms.tv_sec, last_ack_tms.tv_nsec,
(u64) stats->misc.last_isr_time, &last_isr_tms,(u64) stats->misc.last_ack_time, &last_ack_tms,(u64) atomic64_read(&stats->misc.ack_isr_cnt), (u64) atomic64_read(&stats->misc.cmpl_isr_cnt), (u64) atomic64_read(&stats->misc.errnotify_isr_cnt), diff --git a/drivers/scsi/snic/snic_trc.c b/drivers/scsi/snic/snic_trc.c index c2e5ab7e976c..6bad1ea9a6a7 100644 --- a/drivers/scsi/snic/snic_trc.c +++ b/drivers/scsi/snic/snic_trc.c @@ -56,9 +56,8 @@ snic_fmt_trc_data(struct snic_trc_data *td, char *buf, int buf_sz) jiffies_to_timespec64(td->ts, &tmspec);
len += snprintf(buf, buf_sz,
"%llu.%09lu %-25s %3d %4x %16llx %16llx %16llx %16llx %16llx\n",tmspec.tv_sec,tmspec.tv_nsec,
"%ptSp %-25s %3d %4x %16llx %16llx %16llx %16llx %16llx\n",&tmspec,td->fn, td->hno, td->tag, -- 2.50.1
Thanks for the change, Andy.
Acked-by: Karan Tilak Kumar kartilak@cisco.com
Regards, Karan
Use %ptSp instead of open coded variants to print content of struct timespec64 in human readable format.
Acked-by: Steven Rostedt (Google) rostedt@goodmis.org Signed-off-by: Andy Shevchenko andriy.shevchenko@linux.intel.com --- kernel/trace/trace_output.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-)
diff --git a/kernel/trace/trace_output.c b/kernel/trace/trace_output.c index ebbab3e9622b..cc2d3306bb60 100644 --- a/kernel/trace/trace_output.c +++ b/kernel/trace/trace_output.c @@ -1490,12 +1490,12 @@ trace_hwlat_print(struct trace_iterator *iter, int flags,
trace_assign_type(field, entry);
- trace_seq_printf(s, "#%-5u inner/outer(us): %4llu/%-5llu ts:%lld.%09ld count:%d", + trace_seq_printf(s, "#%-5u inner/outer(us): %4llu/%-5llu ts:%ptSp count:%d", field->seqnum, field->duration, field->outer_duration, - (long long)field->timestamp.tv_sec, - field->timestamp.tv_nsec, field->count); + &field->timestamp, + field->count);
if (field->nmi_count) { /*
On Thu 2025-11-13 15:32:14, Andy Shevchenko wrote:
Here is the third part of the unification time printing in the kernel. This time for struct timespec64. The first patch brings a support into printf() implementation (test cases and documentation update included) followed by the treewide conversion of the current users.
Petr, we got like more than a half being Acked, I think if you are okay with this, the patches that have been tagged can be applied.
Note, not everything was compile-tested. Kunit test has been passed, though.
JFYI, the patchset has been committed into printk/linux.git, branch for-6.19-vsprintf-timespec64.
Note, that I have:
+ fixed the 19th patch as proposed, see https://lore.kernel.org/all/aR2XAYWTEgMZu_Mx@pathway.suse.cz/
+ reviewed all patches but I triple checked 7th patch which did not have any ack yet. And I added my Reviewed-by tag there. ;-)
+ I tried build with allyesconfig. It succeeded. I am not 100% sure that it built all modified sources but...
Best Regards, Petr
On Wed, Nov 19, 2025 at 02:11:12PM +0100, Petr Mladek wrote:
On Thu 2025-11-13 15:32:14, Andy Shevchenko wrote:
Here is the third part of the unification time printing in the kernel. This time for struct timespec64. The first patch brings a support into printf() implementation (test cases and documentation update included) followed by the treewide conversion of the current users.
Petr, we got like more than a half being Acked, I think if you are okay with this, the patches that have been tagged can be applied.
Note, not everything was compile-tested. Kunit test has been passed, though.
JFYI, the patchset has been committed into printk/linux.git, branch for-6.19-vsprintf-timespec64.
Note, that I have:
fixed the 19th patch as proposed, see https://lore.kernel.org/all/aR2XAYWTEgMZu_Mx@pathway.suse.cz/
reviewed all patches but I triple checked 7th patch which did not have any ack yet. And I added my Reviewed-by tag there. ;-)
I tried build with allyesconfig. It succeeded. I am not 100% sure that it built all modified sources but...
Thank you!
linaro-mm-sig@lists.linaro.org