2021-05-11 15:42:00

by Andy Shevchenko

[permalink] [raw]
Subject: [PATCH v2 1/4] lib/vsprintf: Allow to override ISO 8601 date and time separator

ISO 8601 defines 'T' as a separator between date and time. Though,
some ABIs use time and date with ' ' (space) separator instead.

Add a flavour to the %pt specifier to override default separator.

Signed-off-by: Andy Shevchenko <[email protected]>
---
v2: fixed the parameters set, renamed variable and dropped comment (Petr)
Documentation/core-api/printk-formats.rst | 7 ++++++-
lib/test_printf.c | 5 +++++
lib/vsprintf.c | 22 +++++++++++++++++-----
3 files changed, 28 insertions(+), 6 deletions(-)

diff --git a/Documentation/core-api/printk-formats.rst b/Documentation/core-api/printk-formats.rst
index f063a384c7c8..1dd4ebf0be79 100644
--- a/Documentation/core-api/printk-formats.rst
+++ b/Documentation/core-api/printk-formats.rst
@@ -514,9 +514,10 @@ Time and date
::

%pt[RT] YYYY-mm-ddTHH:MM:SS
+ %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]
+ %pt[RT][dt][r][s]

For printing date and time as represented by::

@@ -528,6 +529,10 @@ in human readable format.
By default year will be incremented by 1900 and month by 1.
Use %pt[RT]r (raw) to suppress this behaviour.

+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.
+
Passed by reference.

struct clk
diff --git a/lib/test_printf.c b/lib/test_printf.c
index ec0d5976bb69..8ac71aee46af 100644
--- a/lib/test_printf.c
+++ b/lib/test_printf.c
@@ -528,6 +528,11 @@ time_and_date(void)
test("0119-00-04T15:32:23", "%ptTr", &t);
test("15:32:23|2019-01-04", "%ptTt|%ptTd", &t, &t);
test("15:32:23|0119-00-04", "%ptTtr|%ptTdr", &t, &t);
+
+ test("2019-01-04 15:32:23", "%ptTs", &t);
+ 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);
}

static void __init
diff --git a/lib/vsprintf.c b/lib/vsprintf.c
index f0c35d9b65bf..14a4e4e8a657 100644
--- a/lib/vsprintf.c
+++ b/lib/vsprintf.c
@@ -1834,7 +1834,8 @@ char *rtc_str(char *buf, char *end, const struct rtc_time *tm,
struct printf_spec spec, const char *fmt)
{
bool have_t = true, have_d = true;
- bool raw = false;
+ bool raw = false, iso8601_separator = true;
+ bool found = true;
int count = 2;

if (check_pointer(&buf, end, tm, spec))
@@ -1851,14 +1852,25 @@ char *rtc_str(char *buf, char *end, const struct rtc_time *tm,
break;
}

- raw = fmt[count] == 'r';
+ do {
+ switch (fmt[count++]) {
+ case 'r':
+ raw = true;
+ break;
+ case 's':
+ iso8601_separator = false;
+ break;
+ default:
+ found = false;
+ break;
+ }
+ } while (found);

if (have_d)
buf = date_str(buf, end, tm, raw);
if (have_d && have_t) {
- /* Respect ISO 8601 */
if (buf < end)
- *buf = 'T';
+ *buf = iso8601_separator ? 'T' : ' ';
buf++;
}
if (have_t)
@@ -2298,7 +2310,7 @@ 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]' For time and date as represented by:
+ * - 't[RT][dt][r][s]' For time and date as represented by:
* R struct rtc_time
* T time64_t
* - 'C' For a clock, it prints the name (Common Clock Framework) or address
--
2.30.2


2021-05-11 15:43:39

by Andy Shevchenko

[permalink] [raw]
Subject: [PATCH v2 2/4] kdb: Switch to use %ptTs

Use %ptTs instead of open-coded variant to print contents
of time64_t type in human readable form.

Cc: Jason Wessel <[email protected]>
Cc: Daniel Thompson <[email protected]>
Cc: [email protected]
Signed-off-by: Andy Shevchenko <[email protected]>
Reviewed-by: Petr Mladek <[email protected]>
Reviewed-by: Douglas Anderson <[email protected]>
---
v2: collected tags
kernel/debug/kdb/kdb_main.c | 9 +--------
1 file changed, 1 insertion(+), 8 deletions(-)

diff --git a/kernel/debug/kdb/kdb_main.c b/kernel/debug/kdb/kdb_main.c
index 1baa96a2ecb8..622410c45da1 100644
--- a/kernel/debug/kdb/kdb_main.c
+++ b/kernel/debug/kdb/kdb_main.c
@@ -2488,7 +2488,6 @@ static void kdb_sysinfo(struct sysinfo *val)
static int kdb_summary(int argc, const char **argv)
{
time64_t now;
- struct tm tm;
struct sysinfo val;

if (argc)
@@ -2502,13 +2501,7 @@ static int kdb_summary(int argc, const char **argv)
kdb_printf("domainname %s\n", init_uts_ns.name.domainname);

now = __ktime_get_real_seconds();
- time64_to_tm(now, 0, &tm);
- kdb_printf("date %04ld-%02d-%02d %02d:%02d:%02d "
- "tz_minuteswest %d\n",
- 1900+tm.tm_year, tm.tm_mon+1, tm.tm_mday,
- tm.tm_hour, tm.tm_min, tm.tm_sec,
- sys_tz.tz_minuteswest);
-
+ kdb_printf("date %ptTs tz_minuteswest %d\n", &now, sys_tz.tz_minuteswest);
kdb_sysinfo(&val);
kdb_printf("uptime ");
if (val.uptime > (24*60*60)) {
--
2.30.2

2021-05-13 10:08:19

by Daniel Thompson

[permalink] [raw]
Subject: Re: [PATCH v2 2/4] kdb: Switch to use %ptTs

On Tue, May 11, 2021 at 06:39:56PM +0300, Andy Shevchenko wrote:
> Use %ptTs instead of open-coded variant to print contents
> of time64_t type in human readable form.
>
> Cc: Jason Wessel <[email protected]>
> Cc: Daniel Thompson <[email protected]>
> Cc: [email protected]
> Signed-off-by: Andy Shevchenko <[email protected]>
> Reviewed-by: Petr Mladek <[email protected]>
> Reviewed-by: Douglas Anderson <[email protected]>

Reviewed-by: Daniel Thompson <[email protected]>

Any clue what route this will take into the kernel? I'm certainly happy
for someone else to take the kdb bits alongside the vsprintf stuff
(so here's an acked-by too in case they are fussy about that sort of
thing ;-) ):
Acked-by: Daniel Thompson <[email protected]>


Daniel.

> ---
> v2: collected tags
> kernel/debug/kdb/kdb_main.c | 9 +--------
> 1 file changed, 1 insertion(+), 8 deletions(-)
>
> diff --git a/kernel/debug/kdb/kdb_main.c b/kernel/debug/kdb/kdb_main.c
> index 1baa96a2ecb8..622410c45da1 100644
> --- a/kernel/debug/kdb/kdb_main.c
> +++ b/kernel/debug/kdb/kdb_main.c
> @@ -2488,7 +2488,6 @@ static void kdb_sysinfo(struct sysinfo *val)
> static int kdb_summary(int argc, const char **argv)
> {
> time64_t now;
> - struct tm tm;
> struct sysinfo val;
>
> if (argc)
> @@ -2502,13 +2501,7 @@ static int kdb_summary(int argc, const char **argv)
> kdb_printf("domainname %s\n", init_uts_ns.name.domainname);
>
> now = __ktime_get_real_seconds();
> - time64_to_tm(now, 0, &tm);
> - kdb_printf("date %04ld-%02d-%02d %02d:%02d:%02d "
> - "tz_minuteswest %d\n",
> - 1900+tm.tm_year, tm.tm_mon+1, tm.tm_mday,
> - tm.tm_hour, tm.tm_min, tm.tm_sec,
> - sys_tz.tz_minuteswest);
> -
> + kdb_printf("date %ptTs tz_minuteswest %d\n", &now, sys_tz.tz_minuteswest);
> kdb_sysinfo(&val);
> kdb_printf("uptime ");
> if (val.uptime > (24*60*60)) {
> --
> 2.30.2
>

2021-05-13 10:09:45

by Petr Mladek

[permalink] [raw]
Subject: Re: [PATCH v2 1/4] lib/vsprintf: Allow to override ISO 8601 date and time separator

On Tue 2021-05-11 18:39:55, Andy Shevchenko wrote:
> ISO 8601 defines 'T' as a separator between date and time. Though,
> some ABIs use time and date with ' ' (space) separator instead.
>
> Add a flavour to the %pt specifier to override default separator.
>
> Signed-off-by: Andy Shevchenko <[email protected]>

Reviewed-by: Petr Mladek <[email protected]>

I am going to queue the entire patchset for 5.14 via the printk tree
the following week unless anyone complains in the meantime.

Best Regards,
Petr

2021-05-13 20:21:24

by Sergey Senozhatsky

[permalink] [raw]
Subject: Re: [PATCH v2 1/4] lib/vsprintf: Allow to override ISO 8601 date and time separator

On (21/05/13 11:34), Petr Mladek wrote:
> On Tue 2021-05-11 18:39:55, Andy Shevchenko wrote:
> > ISO 8601 defines 'T' as a separator between date and time. Though,
> > some ABIs use time and date with ' ' (space) separator instead.
> >
> > Add a flavour to the %pt specifier to override default separator.
> >
> > Signed-off-by: Andy Shevchenko <[email protected]>
>
> Reviewed-by: Petr Mladek <[email protected]>
>
> I am going to queue the entire patchset for 5.14 via the printk tree
> the following week unless anyone complains in the meantime.

Looks good to me

Reviewed-by: Sergey Senozhatsky <[email protected]>

2021-05-17 06:41:54

by Andy Shevchenko

[permalink] [raw]
Subject: Re: [PATCH v2 2/4] kdb: Switch to use %ptTs

On Thu, May 13, 2021 at 10:31:30AM +0100, Daniel Thompson wrote:
> On Tue, May 11, 2021 at 06:39:56PM +0300, Andy Shevchenko wrote:
> > Use %ptTs instead of open-coded variant to print contents
> > of time64_t type in human readable form.
> >
> > Cc: Jason Wessel <[email protected]>
> > Cc: Daniel Thompson <[email protected]>
> > Cc: [email protected]
> > Signed-off-by: Andy Shevchenko <[email protected]>
> > Reviewed-by: Petr Mladek <[email protected]>
> > Reviewed-by: Douglas Anderson <[email protected]>
>
> Reviewed-by: Daniel Thompson <[email protected]>
>
> Any clue what route this will take into the kernel? I'm certainly happy
> for someone else to take the kdb bits alongside the vsprintf stuff
> (so here's an acked-by too in case they are fussy about that sort of
> thing ;-) ):

I hope Petr will take it thru PRINTK tree.

> Acked-by: Daniel Thompson <[email protected]>

Thanks!

--
With Best Regards,
Andy Shevchenko



2021-05-17 19:23:06

by Petr Mladek

[permalink] [raw]
Subject: Re: [PATCH v2 1/4] lib/vsprintf: Allow to override ISO 8601 date and time separator

On Thu 2021-05-13 11:34:18, Petr Mladek wrote:
> On Tue 2021-05-11 18:39:55, Andy Shevchenko wrote:
> > ISO 8601 defines 'T' as a separator between date and time. Though,
> > some ABIs use time and date with ' ' (space) separator instead.
> >
> > Add a flavour to the %pt specifier to override default separator.
> >
> > Signed-off-by: Andy Shevchenko <[email protected]>
>
> Reviewed-by: Petr Mladek <[email protected]>
>
> I am going to queue the entire patchset for 5.14 via the printk tree
> the following week unless anyone complains in the meantime.

The patchset has been committed into print/linux.git, branch
for-5.14-vsprintf-pts.

Best Regards,
Petr