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.
The idea is to have one or a few biggest users included, the rest can be taken next release cycle on the subsystem basis, but I won't object if the respective maintainers already give their tags. Depending on the tags received it may go via dedicated subsystem or via PRINTK tree. Petr, what do you think?
Note, not everything was compile-tested. Kunit test has been passed, though.
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 %ptS 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 | 46 ++++++++--------- 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 | 25 ++++++++++ net/ceph/messenger_v2.c | 6 +-- 29 files changed, 126 insertions(+), 148 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 | 25 +++++++++++++++++++++++ 3 files changed, 38 insertions(+), 2 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 3f99834fd788..fdd06e8957a3 100644 --- a/lib/vsprintf.c +++ b/lib/vsprintf.c @@ -1989,6 +1989,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) @@ -1999,6 +2021,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: @@ -2464,6 +2488,7 @@ early_param("no_hash_pointers", no_hash_pointers_enable); * - 'g' For block_device name (gendisk + partition number) * - 't[RT][dt][r][s]' For time and date as represented by: * R struct rtc_time + * S struct timespec64 * T time64_t * - 'C' For a clock, it prints the name (Common Clock Framework) or address * (legacy clock framework) of the clock
On Tue 2025-11-11 13:20:01, 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
Documentation/core-api/printk-formats.rst | 11 ++++++++-- lib/tests/printf_kunit.c | 4 ++++ lib/vsprintf.c | 25 +++++++++++++++++++++++ 3 files changed, 38 insertions(+), 2 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>
I know that that there was no good choice. But I am curious. Does the 'p' stands for some particular word, for example, "plain" ?
I do not want to start bike shedding but I think about using 'n' as "number".
- %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/vsprintf.c b/lib/vsprintf.c index 3f99834fd788..fdd06e8957a3 100644 --- a/lib/vsprintf.c +++ b/lib/vsprintf.c @@ -2464,6 +2488,7 @@ early_param("no_hash_pointers", no_hash_pointers_enable);
- 'g' For block_device name (gendisk + partition number)
- 't[RT][dt][r][s]' For time and date as represented by:
We should add 'S' here as well:
* - 't[RST][dt][r][s]' For time and date as represented by:
That said, I am not sure about the optional '[p]'. We could either do:
* - 't[RST][p][dt][r][s]' For time and date as represented by:
or
* - 'tSp' For time represented by struct timespec64 printed as seconds.nanoseconds * - 't[RST][dt][r][s]' For time and date as represented by:
R struct rtc_time
S struct timespec64T time64_t
- 'C' For a clock, it prints the name (Common Clock Framework) or address
(legacy clock framework) of the clock
Otherwise, it looks good.
Best Regards, Petr
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.
Reviewed-by: Christian König christian.koenig@amd.com 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);
Hello Andy,
On Tue, 11 Nov 2025 at 17:57, 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: Christian König christian.koenig@amd.com Signed-off-by: Andy Shevchenko andriy.shevchenko@linux.intel.com
Thanks for the patch.
FWIW, please feel free to add Acked-by: Sumit Semwal sumit.semwal@linaro.org
Best, Sumit.
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);-- 2.50.1
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/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",
[Public]
-----Original Message----- From: Andy Shevchenko andriy.shevchenko@linux.intel.com Sent: Tuesday, November 11, 2025 7:20 AM To: Corey Minyard corey@minyard.net; Koenig, Christian Christian.Koenig@amd.com; Dr. David Alan Gilbert linux@treblig.org; Deucher, Alexander Alexander.Deucher@amd.com; Thomas Zimmermann tzimmermann@suse.de; Dmitry Baryshkov dmitry.baryshkov@oss.qualcomm.com; Rob Clark robin.clark@oss.qualcomm.com; Matthew Brost matthew.brost@intel.com; Ulf Hansson ulf.hansson@linaro.org; Andy Shevchenko andriy.shevchenko@linux.intel.com; Vitaly Lifshits vitaly.lifshits@intel.com; Manivannan Sadhasivam mani@kernel.org; Niklas Cassel cassel@kernel.org; Calvin Owens calvin@wbinvd.org; Vadim Fedorenko vadim.fedorenko@linux.dev; Sagi Maimon maimon.sagi@gmail.com; Martin K. Petersen martin.petersen@oracle.com; Karan Tilak Kumar kartilak@cisco.com; Hans Verkuil hverkuil+cisco@kernel.org; Casey Schaufler <casey@schaufler- ca.com>; Steven Rostedt rostedt@goodmis.org; Petr Mladek pmladek@suse.com; Viacheslav Dubeyko Slava.Dubeyko@ibm.com; Max Kellermann max.kellermann@ionos.com; linux-doc@vger.kernel.org; linux- kernel@vger.kernel.org; openipmi-developer@lists.sourceforge.net; linux- media@vger.kernel.org; dri-devel@lists.freedesktop.org; linaro-mm- sig@lists.linaro.org; amd-gfx@lists.freedesktop.org; linux-arm- msm@vger.kernel.org; freedreno@lists.freedesktop.org; intel- xe@lists.freedesktop.org; linux-mmc@vger.kernel.org; netdev@vger.kernel.org; intel-wired-lan@lists.osuosl.org; linux- pci@vger.kernel.org; linux-s390@vger.kernel.org; linux-scsi@vger.kernel.org; linux-staging@lists.linux.dev; ceph-devel@vger.kernel.org; linux-trace- kernel@vger.kernel.org Cc: Rasmus Villemoes linux@rasmusvillemoes.dk; Sergey Senozhatsky senozhatsky@chromium.org; Jonathan Corbet corbet@lwn.net; Sumit Semwal sumit.semwal@linaro.org; Gustavo Padovan gustavo@padovan.org; David Airlie airlied@gmail.com; Simona Vetter simona@ffwll.ch; Maarten Lankhorst maarten.lankhorst@linux.intel.com; Maxime Ripard mripard@kernel.org; Dmitry Baryshkov lumag@kernel.org; Abhinav Kumar abhinav.kumar@linux.dev; Jessica Zhang jesszhan0024@gmail.com; Sean Paul sean@poorly.run; Marijn Suijten marijn.suijten@somainline.org; Konrad Dybcio konradybcio@kernel.org; Lucas De Marchi lucas.demarchi@intel.com; Thomas Hellström thomas.hellstrom@linux.intel.com; Rodrigo Vivi rodrigo.vivi@intel.com; Vladimir Oltean olteanv@gmail.com; Andrew Lunn andrew@lunn.ch; David S. Miller davem@davemloft.net; Eric Dumazet edumazet@google.com; Jakub Kicinski kuba@kernel.org; Paolo Abeni pabeni@redhat.com; Tony Nguyen anthony.l.nguyen@intel.com; Przemek Kitszel przemyslaw.kitszel@intel.com; Krzysztof Wilczyński kwilczynski@kernel.org; Kishon Vijay Abraham I kishon@kernel.org; Bjorn Helgaas bhelgaas@google.com; Rodolfo Giometti giometti@enneenne.com; Richard Cochran richardcochran@gmail.com; Jonathan Lemon jonathan.lemon@gmail.com; Stefan Haberland sth@linux.ibm.com; Jan Hoeppner hoeppner@linux.ibm.com; Heiko Carstens hca@linux.ibm.com; Vasily Gorbik gor@linux.ibm.com; Alexander Gordeev agordeev@linux.ibm.com; Christian Borntraeger borntraeger@linux.ibm.com; Sven Schnelle svens@linux.ibm.com; Satish Kharat satishkh@cisco.com; Sesidhar Baddela sebaddel@cisco.com; James E.J. Bottomley James.Bottomley@HansenPartnership.com; Mauro Carvalho Chehab mchehab@kernel.org; Greg Kroah-Hartman gregkh@linuxfoundation.org; Xiubo Li xiubli@redhat.com; Ilya Dryomov idryomov@gmail.com; Masami Hiramatsu mhiramat@kernel.org; Mathieu Desnoyers mathieu.desnoyers@efficios.com; Andrew Morton akpm@linux-foundation.org Subject: [PATCH v2 05/21] drm/amdgpu: Switch to use %ptSp
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: Alex Deucher alexander.deucher@amd.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",-- 2.50.1
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)
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.
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/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);
-----Original Message----- From: Intel-wired-lan intel-wired-lan-bounces@osuosl.org On Behalf Of Andy Shevchenko Sent: Tuesday, November 11, 2025 1:20 PM To: Corey Minyard corey@minyard.net; Christian König christian.koenig@amd.com; Dr. David Alan Gilbert linux@treblig.org; Alex Deucher alexander.deucher@amd.com; Thomas Zimmermann tzimmermann@suse.de; Dmitry Baryshkov dmitry.baryshkov@oss.qualcomm.com; Rob Clark robin.clark@oss.qualcomm.com; Brost, Matthew matthew.brost@intel.com; Ulf Hansson ulf.hansson@linaro.org; Andy Shevchenko andriy.shevchenko@linux.intel.com; Lifshits, Vitaly vitaly.lifshits@intel.com; Manivannan Sadhasivam mani@kernel.org; Niklas Cassel cassel@kernel.org; Calvin Owens calvin@wbinvd.org; Vadim Fedorenko vadim.fedorenko@linux.dev; Sagi Maimon maimon.sagi@gmail.com; Martin K. Petersen martin.petersen@oracle.com; Karan Tilak Kumar kartilak@cisco.com; Hans Verkuil hverkuil+cisco@kernel.org; Casey Schaufler casey@schaufler-ca.com; Steven Rostedt rostedt@goodmis.org; Petr Mladek pmladek@suse.com; Viacheslav Dubeyko Slava.Dubeyko@ibm.com; Max Kellermann max.kellermann@ionos.com; linux-doc@vger.kernel.org; linux-kernel@vger.kernel.org; openipmi- developer@lists.sourceforge.net; linux-media@vger.kernel.org; dri- devel@lists.freedesktop.org; linaro-mm-sig@lists.linaro.org; amd- gfx@lists.freedesktop.org; linux-arm-msm@vger.kernel.org; freedreno@lists.freedesktop.org; intel-xe@lists.freedesktop.org; linux-mmc@vger.kernel.org; netdev@vger.kernel.org; intel-wired- lan@lists.osuosl.org; linux-pci@vger.kernel.org; linux- s390@vger.kernel.org; linux-scsi@vger.kernel.org; linux- staging@lists.linux.dev; ceph-devel@vger.kernel.org; linux-trace- kernel@vger.kernel.org Cc: Rasmus Villemoes linux@rasmusvillemoes.dk; Sergey Senozhatsky senozhatsky@chromium.org; Jonathan Corbet corbet@lwn.net; Sumit Semwal sumit.semwal@linaro.org; Gustavo Padovan gustavo@padovan.org; David Airlie airlied@gmail.com; Simona Vetter simona@ffwll.ch; Maarten Lankhorst maarten.lankhorst@linux.intel.com; Maxime Ripard mripard@kernel.org; Dmitry Baryshkov lumag@kernel.org; Abhinav Kumar abhinav.kumar@linux.dev; Jessica Zhang jesszhan0024@gmail.com; Sean Paul sean@poorly.run; Marijn Suijten marijn.suijten@somainline.org; Konrad Dybcio konradybcio@kernel.org; De Marchi, Lucas lucas.demarchi@intel.com; Thomas Hellström thomas.hellstrom@linux.intel.com; Vivi, Rodrigo rodrigo.vivi@intel.com; Vladimir Oltean olteanv@gmail.com; Andrew Lunn andrew@lunn.ch; David S. Miller davem@davemloft.net; Eric Dumazet edumazet@google.com; Jakub Kicinski kuba@kernel.org; Paolo Abeni pabeni@redhat.com; Nguyen, Anthony L anthony.l.nguyen@intel.com; Kitszel, Przemyslaw przemyslaw.kitszel@intel.com; Krzysztof Wilczyński kwilczynski@kernel.org; Kishon Vijay Abraham I kishon@kernel.org; Bjorn Helgaas bhelgaas@google.com; Rodolfo Giometti giometti@enneenne.com; Richard Cochran richardcochran@gmail.com; Jonathan Lemon jonathan.lemon@gmail.com; Stefan Haberland sth@linux.ibm.com; Jan Hoeppner hoeppner@linux.ibm.com; Heiko Carstens hca@linux.ibm.com; Vasily Gorbik gor@linux.ibm.com; Alexander Gordeev agordeev@linux.ibm.com; Christian Borntraeger borntraeger@linux.ibm.com; Sven Schnelle svens@linux.ibm.com; Satish Kharat satishkh@cisco.com; Baddela, Sesidhar sebaddel@cisco.com; James E.J. Bottomley James.Bottomley@HansenPartnership.com; Mauro Carvalho Chehab mchehab@kernel.org; Greg Kroah-Hartman gregkh@linuxfoundation.org; Xiubo Li xiubli@redhat.com; Ilya Dryomov idryomov@gmail.com; Masami Hiramatsu mhiramat@kernel.org; Mathieu Desnoyers mathieu.desnoyers@efficios.com; Andrew Morton <akpm@linux- foundation.org> Subject: [Intel-wired-lan] [PATCH v2 09/21] e1000e: Switch to use %ptSp
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/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);
-- 2.50.1
Reviewed-by: Aleksandr Loktionov aleksandr.loktionov@intel.com
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.
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/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);
-----Original Message----- From: Intel-wired-lan intel-wired-lan-bounces@osuosl.org On Behalf Of Andy Shevchenko Sent: Tuesday, November 11, 2025 1:20 PM To: Corey Minyard corey@minyard.net; Christian König christian.koenig@amd.com; Dr. David Alan Gilbert linux@treblig.org; Alex Deucher alexander.deucher@amd.com; Thomas Zimmermann tzimmermann@suse.de; Dmitry Baryshkov dmitry.baryshkov@oss.qualcomm.com; Rob Clark robin.clark@oss.qualcomm.com; Brost, Matthew matthew.brost@intel.com; Ulf Hansson ulf.hansson@linaro.org; Andy Shevchenko andriy.shevchenko@linux.intel.com; Lifshits, Vitaly vitaly.lifshits@intel.com; Manivannan Sadhasivam mani@kernel.org; Niklas Cassel cassel@kernel.org; Calvin Owens calvin@wbinvd.org; Vadim Fedorenko vadim.fedorenko@linux.dev; Sagi Maimon maimon.sagi@gmail.com; Martin K. Petersen martin.petersen@oracle.com; Karan Tilak Kumar kartilak@cisco.com; Hans Verkuil hverkuil+cisco@kernel.org; Casey Schaufler casey@schaufler-ca.com; Steven Rostedt rostedt@goodmis.org; Petr Mladek pmladek@suse.com; Viacheslav Dubeyko Slava.Dubeyko@ibm.com; Max Kellermann max.kellermann@ionos.com; linux-doc@vger.kernel.org; linux-kernel@vger.kernel.org; openipmi- developer@lists.sourceforge.net; linux-media@vger.kernel.org; dri- devel@lists.freedesktop.org; linaro-mm-sig@lists.linaro.org; amd- gfx@lists.freedesktop.org; linux-arm-msm@vger.kernel.org; freedreno@lists.freedesktop.org; intel-xe@lists.freedesktop.org; linux-mmc@vger.kernel.org; netdev@vger.kernel.org; intel-wired- lan@lists.osuosl.org; linux-pci@vger.kernel.org; linux- s390@vger.kernel.org; linux-scsi@vger.kernel.org; linux- staging@lists.linux.dev; ceph-devel@vger.kernel.org; linux-trace- kernel@vger.kernel.org Cc: Rasmus Villemoes linux@rasmusvillemoes.dk; Sergey Senozhatsky senozhatsky@chromium.org; Jonathan Corbet corbet@lwn.net; Sumit Semwal sumit.semwal@linaro.org; Gustavo Padovan gustavo@padovan.org; David Airlie airlied@gmail.com; Simona Vetter simona@ffwll.ch; Maarten Lankhorst maarten.lankhorst@linux.intel.com; Maxime Ripard mripard@kernel.org; Dmitry Baryshkov lumag@kernel.org; Abhinav Kumar abhinav.kumar@linux.dev; Jessica Zhang jesszhan0024@gmail.com; Sean Paul sean@poorly.run; Marijn Suijten marijn.suijten@somainline.org; Konrad Dybcio konradybcio@kernel.org; De Marchi, Lucas lucas.demarchi@intel.com; Thomas Hellström thomas.hellstrom@linux.intel.com; Vivi, Rodrigo rodrigo.vivi@intel.com; Vladimir Oltean olteanv@gmail.com; Andrew Lunn andrew@lunn.ch; David S. Miller davem@davemloft.net; Eric Dumazet edumazet@google.com; Jakub Kicinski kuba@kernel.org; Paolo Abeni pabeni@redhat.com; Nguyen, Anthony L anthony.l.nguyen@intel.com; Kitszel, Przemyslaw przemyslaw.kitszel@intel.com; Krzysztof Wilczyński kwilczynski@kernel.org; Kishon Vijay Abraham I kishon@kernel.org; Bjorn Helgaas bhelgaas@google.com; Rodolfo Giometti giometti@enneenne.com; Richard Cochran richardcochran@gmail.com; Jonathan Lemon jonathan.lemon@gmail.com; Stefan Haberland sth@linux.ibm.com; Jan Hoeppner hoeppner@linux.ibm.com; Heiko Carstens hca@linux.ibm.com; Vasily Gorbik gor@linux.ibm.com; Alexander Gordeev agordeev@linux.ibm.com; Christian Borntraeger borntraeger@linux.ibm.com; Sven Schnelle svens@linux.ibm.com; Satish Kharat satishkh@cisco.com; Baddela, Sesidhar sebaddel@cisco.com; James E.J. Bottomley James.Bottomley@HansenPartnership.com; Mauro Carvalho Chehab mchehab@kernel.org; Greg Kroah-Hartman gregkh@linuxfoundation.org; Xiubo Li xiubli@redhat.com; Ilya Dryomov idryomov@gmail.com; Masami Hiramatsu mhiramat@kernel.org; Mathieu Desnoyers mathieu.desnoyers@efficios.com; Andrew Morton <akpm@linux- foundation.org> Subject: [Intel-wired-lan] [PATCH v2 10/21] igb: Switch to use %ptSp
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/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);
-- 2.50.1
Reviewed-by: Aleksandr Loktionov aleksandr.loktionov@intel.com
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); } }
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/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; }
-----Original Message----- From: Intel-wired-lan intel-wired-lan-bounces@osuosl.org On Behalf Of Andy Shevchenko Sent: Tuesday, November 11, 2025 1:20 PM To: Corey Minyard corey@minyard.net; Christian König christian.koenig@amd.com; Dr. David Alan Gilbert linux@treblig.org; Alex Deucher alexander.deucher@amd.com; Thomas Zimmermann tzimmermann@suse.de; Dmitry Baryshkov dmitry.baryshkov@oss.qualcomm.com; Rob Clark robin.clark@oss.qualcomm.com; Brost, Matthew matthew.brost@intel.com; Ulf Hansson ulf.hansson@linaro.org; Andy Shevchenko andriy.shevchenko@linux.intel.com; Lifshits, Vitaly vitaly.lifshits@intel.com; Manivannan Sadhasivam mani@kernel.org; Niklas Cassel cassel@kernel.org; Calvin Owens calvin@wbinvd.org; Vadim Fedorenko vadim.fedorenko@linux.dev; Sagi Maimon maimon.sagi@gmail.com; Martin K. Petersen martin.petersen@oracle.com; Karan Tilak Kumar kartilak@cisco.com; Hans Verkuil hverkuil+cisco@kernel.org; Casey Schaufler casey@schaufler-ca.com; Steven Rostedt rostedt@goodmis.org; Petr Mladek pmladek@suse.com; Viacheslav Dubeyko Slava.Dubeyko@ibm.com; Max Kellermann max.kellermann@ionos.com; linux-doc@vger.kernel.org; linux-kernel@vger.kernel.org; openipmi- developer@lists.sourceforge.net; linux-media@vger.kernel.org; dri- devel@lists.freedesktop.org; linaro-mm-sig@lists.linaro.org; amd- gfx@lists.freedesktop.org; linux-arm-msm@vger.kernel.org; freedreno@lists.freedesktop.org; intel-xe@lists.freedesktop.org; linux-mmc@vger.kernel.org; netdev@vger.kernel.org; intel-wired- lan@lists.osuosl.org; linux-pci@vger.kernel.org; linux- s390@vger.kernel.org; linux-scsi@vger.kernel.org; linux- staging@lists.linux.dev; ceph-devel@vger.kernel.org; linux-trace- kernel@vger.kernel.org Cc: Rasmus Villemoes linux@rasmusvillemoes.dk; Sergey Senozhatsky senozhatsky@chromium.org; Jonathan Corbet corbet@lwn.net; Sumit Semwal sumit.semwal@linaro.org; Gustavo Padovan gustavo@padovan.org; David Airlie airlied@gmail.com; Simona Vetter simona@ffwll.ch; Maarten Lankhorst maarten.lankhorst@linux.intel.com; Maxime Ripard mripard@kernel.org; Dmitry Baryshkov lumag@kernel.org; Abhinav Kumar abhinav.kumar@linux.dev; Jessica Zhang jesszhan0024@gmail.com; Sean Paul sean@poorly.run; Marijn Suijten marijn.suijten@somainline.org; Konrad Dybcio konradybcio@kernel.org; De Marchi, Lucas lucas.demarchi@intel.com; Thomas Hellström thomas.hellstrom@linux.intel.com; Vivi, Rodrigo rodrigo.vivi@intel.com; Vladimir Oltean olteanv@gmail.com; Andrew Lunn andrew@lunn.ch; David S. Miller davem@davemloft.net; Eric Dumazet edumazet@google.com; Jakub Kicinski kuba@kernel.org; Paolo Abeni pabeni@redhat.com; Nguyen, Anthony L anthony.l.nguyen@intel.com; Kitszel, Przemyslaw przemyslaw.kitszel@intel.com; Krzysztof Wilczyński kwilczynski@kernel.org; Kishon Vijay Abraham I kishon@kernel.org; Bjorn Helgaas bhelgaas@google.com; Rodolfo Giometti giometti@enneenne.com; Richard Cochran richardcochran@gmail.com; Jonathan Lemon jonathan.lemon@gmail.com; Stefan Haberland sth@linux.ibm.com; Jan Hoeppner hoeppner@linux.ibm.com; Heiko Carstens hca@linux.ibm.com; Vasily Gorbik gor@linux.ibm.com; Alexander Gordeev agordeev@linux.ibm.com; Christian Borntraeger borntraeger@linux.ibm.com; Sven Schnelle svens@linux.ibm.com; Satish Kharat satishkh@cisco.com; Baddela, Sesidhar sebaddel@cisco.com; James E.J. Bottomley James.Bottomley@HansenPartnership.com; Mauro Carvalho Chehab mchehab@kernel.org; Greg Kroah-Hartman gregkh@linuxfoundation.org; Xiubo Li xiubli@redhat.com; Ilya Dryomov idryomov@gmail.com; Masami Hiramatsu mhiramat@kernel.org; Mathieu Desnoyers mathieu.desnoyers@efficios.com; Andrew Morton <akpm@linux- foundation.org> Subject: [Intel-wired-lan] [PATCH v2 14/21] net: dsa: sja1105: Switch to use %ptSp
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/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; }
-- 2.50.1
Reviewed-by: Aleksandr Loktionov aleksandr.loktionov@intel.com
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,
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.
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.
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);
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) { /*
Use %ptS 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/scsi/fnic/fnic_trace.c | 46 +++++++++++++++------------------- 1 file changed, 20 insertions(+), 26 deletions(-)
diff --git a/drivers/scsi/fnic/fnic_trace.c b/drivers/scsi/fnic/fnic_trace.c index cdc6b12b1ec2..f5543bb92ee4 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++; @@ -225,20 +223,16 @@ int fnic_get_stats_data(struct stats_debug_info *debug, "------------------------------------------\n");
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", + &val1, + &stats->stats_timestamps.last_reset_time, + &stats->stats_timestamps.last_read_time, + ×pec64_sub(val1, stats->stats_timestamps.last_reset_time), + ×pec64_sub(val1, stats->stats_timestamps.last_read_time));
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" @@ -438,9 +432,9 @@ int fnic_get_stats_data(struct stats_debug_info *debug, "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, + &val1, (u64)stats->misc_stats.last_ack_time, - (s64)val2.tv_sec, val2.tv_nsec, + &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 +851,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);
Andy,
Use %ptS instead of open coded variants to print content of struct timespec64 in human readable format.
Reviewed-by: Martin K. Petersen martin.petersen@oracle.com
Hi Andy,
kernel test robot noticed the following build errors:
[auto build test ERROR on ceph-client/testing] [also build test ERROR on ceph-client/for-linus cminyard-ipmi/for-next mkp-scsi/for-next jejb-scsi/for-next linus/master v6.18-rc5 next-20251112] [If your patch is applied to the wrong git tree, kindly drop us a note. And when submitting patch, we suggest to use '--base' as documented in https://git-scm.com/docs/git-format-patch#_base_tree_information]
url: https://github.com/intel-lab-lkp/linux/commits/Andy-Shevchenko/lib-vsprintf-... base: https://github.com/ceph/ceph-client.git testing patch link: https://lore.kernel.org/r/20251111122735.880607-20-andriy.shevchenko%40linux... patch subject: [PATCH v2 19/21] scsi: fnic: Switch to use %ptS config: x86_64-kexec (https://download.01.org/0day-ci/archive/20251113/202511130449.Q1mCZRpT-lkp@i...) compiler: clang version 20.1.8 (https://github.com/llvm/llvm-project 87f0227cb60147a26a1eeb4fb06e3b505e9c7261) reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20251113/202511130449.Q1mCZRpT-lkp@i...)
If you fix the issue in a separate patch/commit (i.e. not just a new version of the same patch/commit), kindly add following tags | Reported-by: kernel test robot lkp@intel.com | Closes: https://lore.kernel.org/oe-kbuild-all/202511130449.Q1mCZRpT-lkp@intel.com/
All errors (new ones prefixed by >>):
drivers/scsi/fnic/fnic_trace.c:234:2: error: cannot take the address of an rvalue of type 'struct timespec64'
234 | ×pec64_sub(val1, stats->stats_timestamps.last_reset_time), | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ drivers/scsi/fnic/fnic_trace.c:235:2: error: cannot take the address of an rvalue of type 'struct timespec64' 235 | ×pec64_sub(val1, stats->stats_timestamps.last_read_time)); | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2 errors generated.
vim +234 drivers/scsi/fnic/fnic_trace.c
198 199 /* 200 * fnic_get_stats_data - Copy fnic stats buffer to a memory file 201 * @fnic_dbgfs_t: pointer to debugfs fnic stats buffer 202 * 203 * Description: 204 * This routine gathers the fnic stats debugfs data from the fnic_stats struct 205 * and dumps it to stats_debug_info. 206 * 207 * Return Value: 208 * This routine returns the amount of bytes that were dumped into 209 * stats_debug_info 210 */ 211 int fnic_get_stats_data(struct stats_debug_info *debug, 212 struct fnic_stats *stats) 213 { 214 int len = 0; 215 int buf_size = debug->buf_size; 216 struct timespec64 val1, val2; 217 int i = 0; 218 219 ktime_get_real_ts64(&val1); 220 len = scnprintf(debug->debug_buffer + len, buf_size - len, 221 "------------------------------------------\n" 222 "\t\tTime\n" 223 "------------------------------------------\n"); 224 225 len += scnprintf(debug->debug_buffer + len, buf_size - len, 226 "Current time : [%ptSp]\n" 227 "Last stats reset time: [%ptSp]\n" 228 "Last stats read time: [%ptSp]\n" 229 "delta since last reset: [%ptSp]\n" 230 "delta since last read: [%ptSp]\n", 231 &val1, 232 &stats->stats_timestamps.last_reset_time, 233 &stats->stats_timestamps.last_read_time,
234 ×pec64_sub(val1, stats->stats_timestamps.last_reset_time),
235 ×pec64_sub(val1, stats->stats_timestamps.last_read_time)); 236 237 stats->stats_timestamps.last_read_time = val1; 238 239 len += scnprintf(debug->debug_buffer + len, buf_size - len, 240 "------------------------------------------\n" 241 "\t\tIO Statistics\n" 242 "------------------------------------------\n"); 243 len += scnprintf(debug->debug_buffer + len, buf_size - len, 244 "Number of Active IOs: %lld\nMaximum Active IOs: %lld\n" 245 "Number of IOs: %lld\nNumber of IO Completions: %lld\n" 246 "Number of IO Failures: %lld\nNumber of IO NOT Found: %lld\n" 247 "Number of Memory alloc Failures: %lld\n" 248 "Number of IOREQ Null: %lld\n" 249 "Number of SCSI cmd pointer Null: %lld\n" 250 251 "\nIO completion times: \n" 252 " < 10 ms : %lld\n" 253 " 10 ms - 100 ms : %lld\n" 254 " 100 ms - 500 ms : %lld\n" 255 " 500 ms - 5 sec: %lld\n" 256 " 5 sec - 10 sec: %lld\n" 257 " 10 sec - 30 sec: %lld\n" 258 " > 30 sec: %lld\n", 259 (u64)atomic64_read(&stats->io_stats.active_ios), 260 (u64)atomic64_read(&stats->io_stats.max_active_ios), 261 (u64)atomic64_read(&stats->io_stats.num_ios), 262 (u64)atomic64_read(&stats->io_stats.io_completions), 263 (u64)atomic64_read(&stats->io_stats.io_failures), 264 (u64)atomic64_read(&stats->io_stats.io_not_found), 265 (u64)atomic64_read(&stats->io_stats.alloc_failures), 266 (u64)atomic64_read(&stats->io_stats.ioreq_null), 267 (u64)atomic64_read(&stats->io_stats.sc_null), 268 (u64)atomic64_read(&stats->io_stats.io_btw_0_to_10_msec), 269 (u64)atomic64_read(&stats->io_stats.io_btw_10_to_100_msec), 270 (u64)atomic64_read(&stats->io_stats.io_btw_100_to_500_msec), 271 (u64)atomic64_read(&stats->io_stats.io_btw_500_to_5000_msec), 272 (u64)atomic64_read(&stats->io_stats.io_btw_5000_to_10000_msec), 273 (u64)atomic64_read(&stats->io_stats.io_btw_10000_to_30000_msec), 274 (u64)atomic64_read(&stats->io_stats.io_greater_than_30000_msec)); 275 276 len += scnprintf(debug->debug_buffer + len, buf_size - len, 277 "------------------------------------------\n" 278 "\t\tIO Queues and cumulative IOs\n" 279 "------------------------------------------\n"); 280 281 for (i = 0; i < FNIC_MQ_MAX_QUEUES; i++) { 282 len += scnprintf(debug->debug_buffer + len, buf_size - len, 283 "Q:%d -> %lld\n", i, (u64)atomic64_read(&stats->io_stats.ios[i])); 284 } 285 286 len += scnprintf(debug->debug_buffer + len, buf_size - len, 287 "\nCurrent Max IO time : %lld\n", 288 (u64)atomic64_read(&stats->io_stats.current_max_io_time)); 289 290 len += scnprintf(debug->debug_buffer + len, buf_size - len, 291 "\n------------------------------------------\n" 292 "\t\tAbort Statistics\n" 293 "------------------------------------------\n"); 294 295 len += scnprintf(debug->debug_buffer + len, buf_size - len, 296 "Number of Aborts: %lld\n" 297 "Number of Abort Failures: %lld\n" 298 "Number of Abort Driver Timeouts: %lld\n" 299 "Number of Abort FW Timeouts: %lld\n" 300 "Number of Abort IO NOT Found: %lld\n" 301 302 "Abort issued times: \n" 303 " < 6 sec : %lld\n" 304 " 6 sec - 20 sec : %lld\n" 305 " 20 sec - 30 sec : %lld\n" 306 " 30 sec - 40 sec : %lld\n" 307 " 40 sec - 50 sec : %lld\n" 308 " 50 sec - 60 sec : %lld\n" 309 " > 60 sec: %lld\n", 310 311 (u64)atomic64_read(&stats->abts_stats.aborts), 312 (u64)atomic64_read(&stats->abts_stats.abort_failures), 313 (u64)atomic64_read(&stats->abts_stats.abort_drv_timeouts), 314 (u64)atomic64_read(&stats->abts_stats.abort_fw_timeouts), 315 (u64)atomic64_read(&stats->abts_stats.abort_io_not_found), 316 (u64)atomic64_read(&stats->abts_stats.abort_issued_btw_0_to_6_sec), 317 (u64)atomic64_read(&stats->abts_stats.abort_issued_btw_6_to_20_sec), 318 (u64)atomic64_read(&stats->abts_stats.abort_issued_btw_20_to_30_sec), 319 (u64)atomic64_read(&stats->abts_stats.abort_issued_btw_30_to_40_sec), 320 (u64)atomic64_read(&stats->abts_stats.abort_issued_btw_40_to_50_sec), 321 (u64)atomic64_read(&stats->abts_stats.abort_issued_btw_50_to_60_sec), 322 (u64)atomic64_read(&stats->abts_stats.abort_issued_greater_than_60_sec)); 323 324 len += scnprintf(debug->debug_buffer + len, buf_size - len, 325 "\n------------------------------------------\n" 326 "\t\tTerminate Statistics\n" 327 "------------------------------------------\n"); 328 329 len += scnprintf(debug->debug_buffer + len, buf_size - len, 330 "Number of Terminates: %lld\n" 331 "Maximum Terminates: %lld\n" 332 "Number of Terminate Driver Timeouts: %lld\n" 333 "Number of Terminate FW Timeouts: %lld\n" 334 "Number of Terminate IO NOT Found: %lld\n" 335 "Number of Terminate Failures: %lld\n", 336 (u64)atomic64_read(&stats->term_stats.terminates), 337 (u64)atomic64_read(&stats->term_stats.max_terminates), 338 (u64)atomic64_read(&stats->term_stats.terminate_drv_timeouts), 339 (u64)atomic64_read(&stats->term_stats.terminate_fw_timeouts), 340 (u64)atomic64_read(&stats->term_stats.terminate_io_not_found), 341 (u64)atomic64_read(&stats->term_stats.terminate_failures)); 342 343 len += scnprintf(debug->debug_buffer + len, buf_size - len, 344 "\n------------------------------------------\n" 345 "\t\tReset Statistics\n" 346 "------------------------------------------\n"); 347 348 len += scnprintf(debug->debug_buffer + len, buf_size - len, 349 "Number of Device Resets: %lld\n" 350 "Number of Device Reset Failures: %lld\n" 351 "Number of Device Reset Aborts: %lld\n" 352 "Number of Device Reset Timeouts: %lld\n" 353 "Number of Device Reset Terminates: %lld\n" 354 "Number of FW Resets: %lld\n" 355 "Number of FW Reset Completions: %lld\n" 356 "Number of FW Reset Failures: %lld\n" 357 "Number of Fnic Reset: %lld\n" 358 "Number of Fnic Reset Completions: %lld\n" 359 "Number of Fnic Reset Failures: %lld\n", 360 (u64)atomic64_read(&stats->reset_stats.device_resets), 361 (u64)atomic64_read(&stats->reset_stats.device_reset_failures), 362 (u64)atomic64_read(&stats->reset_stats.device_reset_aborts), 363 (u64)atomic64_read(&stats->reset_stats.device_reset_timeouts), 364 (u64)atomic64_read( 365 &stats->reset_stats.device_reset_terminates), 366 (u64)atomic64_read(&stats->reset_stats.fw_resets), 367 (u64)atomic64_read(&stats->reset_stats.fw_reset_completions), 368 (u64)atomic64_read(&stats->reset_stats.fw_reset_failures), 369 (u64)atomic64_read(&stats->reset_stats.fnic_resets), 370 (u64)atomic64_read( 371 &stats->reset_stats.fnic_reset_completions), 372 (u64)atomic64_read(&stats->reset_stats.fnic_reset_failures)); 373 374 len += scnprintf(debug->debug_buffer + len, buf_size - len, 375 "\n------------------------------------------\n" 376 "\t\tFirmware Statistics\n" 377 "------------------------------------------\n"); 378 379 len += scnprintf(debug->debug_buffer + len, buf_size - len, 380 "Number of Active FW Requests %lld\n" 381 "Maximum FW Requests: %lld\n" 382 "Number of FW out of resources: %lld\n" 383 "Number of FW IO errors: %lld\n", 384 (u64)atomic64_read(&stats->fw_stats.active_fw_reqs), 385 (u64)atomic64_read(&stats->fw_stats.max_fw_reqs), 386 (u64)atomic64_read(&stats->fw_stats.fw_out_of_resources), 387 (u64)atomic64_read(&stats->fw_stats.io_fw_errs)); 388 389 len += scnprintf(debug->debug_buffer + len, buf_size - len, 390 "\n------------------------------------------\n" 391 "\t\tVlan Discovery Statistics\n" 392 "------------------------------------------\n"); 393 394 len += scnprintf(debug->debug_buffer + len, buf_size - len, 395 "Number of Vlan Discovery Requests Sent %lld\n" 396 "Vlan Response Received with no FCF VLAN ID: %lld\n" 397 "No solicitations recvd after vlan set, expiry count: %lld\n" 398 "Flogi rejects count: %lld\n", 399 (u64)atomic64_read(&stats->vlan_stats.vlan_disc_reqs), 400 (u64)atomic64_read(&stats->vlan_stats.resp_withno_vlanID), 401 (u64)atomic64_read(&stats->vlan_stats.sol_expiry_count), 402 (u64)atomic64_read(&stats->vlan_stats.flogi_rejects)); 403 404 len += scnprintf(debug->debug_buffer + len, buf_size - len, 405 "\n------------------------------------------\n" 406 "\t\tOther Important Statistics\n" 407 "------------------------------------------\n"); 408 409 jiffies_to_timespec64(stats->misc_stats.last_isr_time, &val1); 410 jiffies_to_timespec64(stats->misc_stats.last_ack_time, &val2); 411 412 len += scnprintf(debug->debug_buffer + len, buf_size - len, 413 "Last ISR time: %llu (%ptSp)\n" 414 "Last ACK time: %llu (%ptSp)\n" 415 "Max ISR jiffies: %llu\n" 416 "Max ISR time (ms) (0 denotes < 1 ms): %llu\n" 417 "Corr. work done: %llu\n" 418 "Number of ISRs: %lld\n" 419 "Maximum CQ Entries: %lld\n" 420 "Number of ACK index out of range: %lld\n" 421 "Number of data count mismatch: %lld\n" 422 "Number of FCPIO Timeouts: %lld\n" 423 "Number of FCPIO Aborted: %lld\n" 424 "Number of SGL Invalid: %lld\n" 425 "Number of Copy WQ Alloc Failures for ABTs: %lld\n" 426 "Number of Copy WQ Alloc Failures for Device Reset: %lld\n" 427 "Number of Copy WQ Alloc Failures for IOs: %lld\n" 428 "Number of no icmnd itmf Completions: %lld\n" 429 "Number of Check Conditions encountered: %lld\n" 430 "Number of QUEUE Fulls: %lld\n" 431 "Number of rport not ready: %lld\n" 432 "Number of receive frame errors: %lld\n" 433 "Port speed (in Mbps): %lld\n", 434 (u64)stats->misc_stats.last_isr_time, 435 &val1, 436 (u64)stats->misc_stats.last_ack_time, 437 &val2, 438 (u64)atomic64_read(&stats->misc_stats.max_isr_jiffies), 439 (u64)atomic64_read(&stats->misc_stats.max_isr_time_ms), 440 (u64)atomic64_read(&stats->misc_stats.corr_work_done), 441 (u64)atomic64_read(&stats->misc_stats.isr_count), 442 (u64)atomic64_read(&stats->misc_stats.max_cq_entries), 443 (u64)atomic64_read(&stats->misc_stats.ack_index_out_of_range), 444 (u64)atomic64_read(&stats->misc_stats.data_count_mismatch), 445 (u64)atomic64_read(&stats->misc_stats.fcpio_timeout), 446 (u64)atomic64_read(&stats->misc_stats.fcpio_aborted), 447 (u64)atomic64_read(&stats->misc_stats.sgl_invalid), 448 (u64)atomic64_read( 449 &stats->misc_stats.abts_cpwq_alloc_failures), 450 (u64)atomic64_read( 451 &stats->misc_stats.devrst_cpwq_alloc_failures), 452 (u64)atomic64_read(&stats->misc_stats.io_cpwq_alloc_failures), 453 (u64)atomic64_read(&stats->misc_stats.no_icmnd_itmf_cmpls), 454 (u64)atomic64_read(&stats->misc_stats.check_condition), 455 (u64)atomic64_read(&stats->misc_stats.queue_fulls), 456 (u64)atomic64_read(&stats->misc_stats.tport_not_ready), 457 (u64)atomic64_read(&stats->misc_stats.frame_errors), 458 (u64)atomic64_read(&stats->misc_stats.port_speed_in_mbps)); 459 460 return len; 461
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/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,
Andy,
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
linaro-mm-sig@lists.linaro.org