2012-05-27 16:48:40

by Shuah Khan

[permalink] [raw]
Subject: [PATCH] x86: kernel/early_printk.c simple_strtoul cleanup

Change early_serial_init() to call kstrtoul() instead of calling obsoleted
simple_strtoul().

Signed-off-by: Shuah Khan <[email protected]>
---
arch/x86/kernel/early_printk.c | 21 ++++++++++++++-------
1 file changed, 14 insertions(+), 7 deletions(-)

diff --git a/arch/x86/kernel/early_printk.c b/arch/x86/kernel/early_printk.c
index 9b9f18b..a078f4d 100644
--- a/arch/x86/kernel/early_printk.c
+++ b/arch/x86/kernel/early_printk.c
@@ -119,22 +119,27 @@ static __init void early_serial_init(char *s)
unsigned char c;
unsigned divisor;
unsigned baud = DEFAULT_BAUD;
- char *e;
+ unsigned long val;
+ ssize_t ret;

if (*s == ',')
++s;

if (*s) {
- unsigned port;
+ unsigned port = 0;
if (!strncmp(s, "0x", 2)) {
- early_serial_base = simple_strtoul(s, &e, 16);
+ ret = kstrtoul(s, 16, &val);
+ if (!ret)
+ early_serial_base = val;
} else {
static const int __initconst bases[] = { 0x3f8, 0x2f8 };

if (!strncmp(s, "ttyS", 4))
s += 4;
- port = simple_strtoul(s, &e, 10);
- if (port > 1 || s == e)
+ ret = kstrtoul(s, 10, &val);
+ if (!ret)
+ port = val;
+ if (port > 1)
port = 0;
early_serial_base = bases[port];
}
@@ -149,8 +154,10 @@ static __init void early_serial_init(char *s)
outb(0x3, early_serial_base + MCR); /* DTR + RTS */

if (*s) {
- baud = simple_strtoul(s, &e, 0);
- if (baud == 0 || s == e)
+ ret = kstrtoul(s, 0, &val);
+ if (!ret)
+ baud = val;
+ if (baud == 0)
baud = DEFAULT_BAUD;
}

--
1.7.9.5



2012-05-27 20:51:19

by Joe Perches

[permalink] [raw]
Subject: Re: [PATCH] x86: kernel/early_printk.c simple_strtoul cleanup

On Sun, 2012-05-27 at 10:48 -0600, Shuah Khan wrote:
> Change early_serial_init() to call kstrtoul() instead of calling obsoleted
> simple_strtoul().
[]
> diff --git a/arch/x86/kernel/early_printk.c b/arch/x86/kernel/early_printk.c
[]
> @@ -119,22 +119,27 @@ static __init void early_serial_init(char *s)
> unsigned char c;
> unsigned divisor;
> unsigned baud = DEFAULT_BAUD;
> - char *e;
> + unsigned long val;
> + ssize_t ret;
>
> if (*s == ',')
> ++s;
>
> if (*s) {
> - unsigned port;
> + unsigned port = 0;
> if (!strncmp(s, "0x", 2)) {
> - early_serial_base = simple_strtoul(s, &e, 16);
> + ret = kstrtoul(s, 16, &val);
> + if (!ret)
> + early_serial_base = val;

I believe none of the kstrto<foo> calls set
the value in the pointer unless successful so
you don't need a temporary and can simply use:

ret = kstrtoint(s, 16, &early_serial_base)
if (ret)

etc...

2012-05-29 20:41:35

by Shuah Khan

[permalink] [raw]
Subject: Re: [PATCH] x86: kernel/early_printk.c simple_strtoul cleanup

On Sun, 2012-05-27 at 13:51 -0700, Joe Perches wrote:
> On Sun, 2012-05-27 at 10:48 -0600, Shuah Khan wrote:
> > Change early_serial_init() to call kstrtoul() instead of calling obsoleted
> > simple_strtoul().
> []
> > diff --git a/arch/x86/kernel/early_printk.c b/arch/x86/kernel/early_printk.c
> []
> > @@ -119,22 +119,27 @@ static __init void early_serial_init(char *s)
> > unsigned char c;
> > unsigned divisor;
> > unsigned baud = DEFAULT_BAUD;
> > - char *e;
> > + unsigned long val;
> > + ssize_t ret;
> >
> > if (*s == ',')
> > ++s;
> >
> > if (*s) {
> > - unsigned port;
> > + unsigned port = 0;
> > if (!strncmp(s, "0x", 2)) {
> > - early_serial_base = simple_strtoul(s, &e, 16);
> > + ret = kstrtoul(s, 16, &val);
> > + if (!ret)
> > + early_serial_base = val;
>
> I believe none of the kstrto<foo> calls set
> the value in the pointer unless successful so
> you don't need a temporary and can simply use:
>
> ret = kstrtoint(s, 16, &early_serial_base)
> if (ret)
>
> etc...

Will re-work the patch and resend it.

Thanks,
-- Shuah

2012-05-31 00:40:07

by Shuah Khan

[permalink] [raw]
Subject: [PATCH RESEND] x86: kernel/early_printk.c simple_strtoul cleanup

Change early_serial_init() to call kstrtoul() instead of calling obsoleted
simple_strtoul().

Signed-off-by: Shuah Khan <[email protected]>
---
arch/x86/kernel/early_printk.c | 12 ++++++------
1 file changed, 6 insertions(+), 6 deletions(-)

diff --git a/arch/x86/kernel/early_printk.c b/arch/x86/kernel/early_printk.c
index 9b9f18b..5e47712 100644
--- a/arch/x86/kernel/early_printk.c
+++ b/arch/x86/kernel/early_printk.c
@@ -119,7 +119,7 @@ static __init void early_serial_init(char *s)
unsigned char c;
unsigned divisor;
unsigned baud = DEFAULT_BAUD;
- char *e;
+ ssize_t ret;

if (*s == ',')
++s;
@@ -127,14 +127,14 @@ static __init void early_serial_init(char *s)
if (*s) {
unsigned port;
if (!strncmp(s, "0x", 2)) {
- early_serial_base = simple_strtoul(s, &e, 16);
+ ret = kstrtoint(s, 16, &early_serial_base);
} else {
static const int __initconst bases[] = { 0x3f8, 0x2f8 };

if (!strncmp(s, "ttyS", 4))
s += 4;
- port = simple_strtoul(s, &e, 10);
- if (port > 1 || s == e)
+ ret = kstrtouint(s, 10, &port);
+ if (ret || port > 1)
port = 0;
early_serial_base = bases[port];
}
@@ -149,8 +149,8 @@ static __init void early_serial_init(char *s)
outb(0x3, early_serial_base + MCR); /* DTR + RTS */

if (*s) {
- baud = simple_strtoul(s, &e, 0);
- if (baud == 0 || s == e)
+ ret = kstrtouint(s, 0, &baud);
+ if (ret || baud == 0)
baud = DEFAULT_BAUD;
}

--
1.7.9.5


2012-06-06 15:15:32

by Shuah Khan

[permalink] [raw]
Subject: [tip:x86/cleanups] x86/early_printk: Replace obsolete simple_strtoul() usage with kstrtoint()

Commit-ID: fbd24153c48b8425b09c161a020483cd77da870e
Gitweb: http://git.kernel.org/tip/fbd24153c48b8425b09c161a020483cd77da870e
Author: Shuah Khan <[email protected]>
AuthorDate: Wed, 30 May 2012 18:40:03 -0600
Committer: Ingo Molnar <[email protected]>
CommitDate: Wed, 6 Jun 2012 11:44:22 +0200

x86/early_printk: Replace obsolete simple_strtoul() usage with kstrtoint()

Change early_serial_init() to call kstrtoul() instead of calling
obsoleted simple_strtoul().

Signed-off-by: Shuah Khan <[email protected]>
Cc: Joe Perches <[email protected]>
Link: http://lkml.kernel.org/r/1338424803.3569.5.camel@lorien2
Signed-off-by: Ingo Molnar <[email protected]>
---
arch/x86/kernel/early_printk.c | 12 ++++++------
1 files changed, 6 insertions(+), 6 deletions(-)

diff --git a/arch/x86/kernel/early_printk.c b/arch/x86/kernel/early_printk.c
index 9b9f18b..5e47712 100644
--- a/arch/x86/kernel/early_printk.c
+++ b/arch/x86/kernel/early_printk.c
@@ -119,7 +119,7 @@ static __init void early_serial_init(char *s)
unsigned char c;
unsigned divisor;
unsigned baud = DEFAULT_BAUD;
- char *e;
+ ssize_t ret;

if (*s == ',')
++s;
@@ -127,14 +127,14 @@ static __init void early_serial_init(char *s)
if (*s) {
unsigned port;
if (!strncmp(s, "0x", 2)) {
- early_serial_base = simple_strtoul(s, &e, 16);
+ ret = kstrtoint(s, 16, &early_serial_base);
} else {
static const int __initconst bases[] = { 0x3f8, 0x2f8 };

if (!strncmp(s, "ttyS", 4))
s += 4;
- port = simple_strtoul(s, &e, 10);
- if (port > 1 || s == e)
+ ret = kstrtouint(s, 10, &port);
+ if (ret || port > 1)
port = 0;
early_serial_base = bases[port];
}
@@ -149,8 +149,8 @@ static __init void early_serial_init(char *s)
outb(0x3, early_serial_base + MCR); /* DTR + RTS */

if (*s) {
- baud = simple_strtoul(s, &e, 0);
- if (baud == 0 || s == e)
+ ret = kstrtouint(s, 0, &baud);
+ if (ret || baud == 0)
baud = DEFAULT_BAUD;
}

2012-06-22 14:25:07

by Ingo Molnar

[permalink] [raw]
Subject: Re: [tip:x86/cleanups] x86/early_printk: Replace obsolete simple_strtoul() usage with kstrtoint()


* tip-bot for Shuah Khan <[email protected]> wrote:

> Commit-ID: fbd24153c48b8425b09c161a020483cd77da870e
> Gitweb: http://git.kernel.org/tip/fbd24153c48b8425b09c161a020483cd77da870e
> Author: Shuah Khan <[email protected]>
> AuthorDate: Wed, 30 May 2012 18:40:03 -0600
> Committer: Ingo Molnar <[email protected]>
> CommitDate: Wed, 6 Jun 2012 11:44:22 +0200
>
> x86/early_printk: Replace obsolete simple_strtoul() usage with kstrtoint()
>
> Change early_serial_init() to call kstrtoul() instead of calling
> obsoleted simple_strtoul().
>
> Signed-off-by: Shuah Khan <[email protected]>
> Cc: Joe Perches <[email protected]>
> Link: http://lkml.kernel.org/r/1338424803.3569.5.camel@lorien2
> Signed-off-by: Ingo Molnar <[email protected]>
> ---
> arch/x86/kernel/early_printk.c | 12 ++++++------
> 1 files changed, 6 insertions(+), 6 deletions(-)
>
> diff --git a/arch/x86/kernel/early_printk.c b/arch/x86/kernel/early_printk.c
> index 9b9f18b..5e47712 100644
> --- a/arch/x86/kernel/early_printk.c
> +++ b/arch/x86/kernel/early_printk.c
> @@ -119,7 +119,7 @@ static __init void early_serial_init(char *s)
> unsigned char c;
> unsigned divisor;
> unsigned baud = DEFAULT_BAUD;
> - char *e;
> + ssize_t ret;
>
> if (*s == ',')
> ++s;
> @@ -127,14 +127,14 @@ static __init void early_serial_init(char *s)
> if (*s) {
> unsigned port;
> if (!strncmp(s, "0x", 2)) {
> - early_serial_base = simple_strtoul(s, &e, 16);
> + ret = kstrtoint(s, 16, &early_serial_base);
> } else {
> static const int __initconst bases[] = { 0x3f8, 0x2f8 };
>
> if (!strncmp(s, "ttyS", 4))
> s += 4;
> - port = simple_strtoul(s, &e, 10);
> - if (port > 1 || s == e)
> + ret = kstrtouint(s, 10, &port);
> + if (ret || port > 1)
> port = 0;
> early_serial_base = bases[port];
> }
> @@ -149,8 +149,8 @@ static __init void early_serial_init(char *s)
> outb(0x3, early_serial_base + MCR); /* DTR + RTS */
>
> if (*s) {
> - baud = simple_strtoul(s, &e, 0);
> - if (baud == 0 || s == e)
> + ret = kstrtouint(s, 0, &baud);
> + if (ret || baud == 0)
> baud = DEFAULT_BAUD;
> }

This commit is quite buggy: kstrto*int() can return an error but
it's not checked in every path above. simple_strtoul() on the
other hand could not fail, so this patch subtly intruduces new
failure modes.

I'm dropping this patch.

Thanks,

Ingo

2012-06-22 14:40:36

by Ingo Molnar

[permalink] [raw]
Subject: [tip:x86/cleanups] Revert "x86/early_printk: Replace obsolete simple_strtoul() usage with kstrtoint()"

Commit-ID: 3f44392e7872bdc9470134f29cead2e06ed4d426
Gitweb: http://git.kernel.org/tip/3f44392e7872bdc9470134f29cead2e06ed4d426
Author: Ingo Molnar <[email protected]>
AuthorDate: Fri, 22 Jun 2012 16:25:19 +0200
Committer: Ingo Molnar <[email protected]>
CommitDate: Fri, 22 Jun 2012 16:25:19 +0200

Revert "x86/early_printk: Replace obsolete simple_strtoul() usage with kstrtoint()"

This reverts commit fbd24153c48b8425b09c161a020483cd77da870e.

This commit is subtly buggy: kstrto*int() can return an error but
it's not checked in every path. simple_strtoul() on the other hand
could not fail, so this patch subtly intruduces new failure modes.

Signed-off-by: Shuah Khan <[email protected]>
Link: http://lkml.kernel.org/r/1338424803.3569.5.camel@lorien2
Signed-off-by: Ingo Molnar <[email protected]>
---
arch/x86/kernel/early_printk.c | 12 ++++++------
1 files changed, 6 insertions(+), 6 deletions(-)

diff --git a/arch/x86/kernel/early_printk.c b/arch/x86/kernel/early_printk.c
index 5e47712..9b9f18b 100644
--- a/arch/x86/kernel/early_printk.c
+++ b/arch/x86/kernel/early_printk.c
@@ -119,7 +119,7 @@ static __init void early_serial_init(char *s)
unsigned char c;
unsigned divisor;
unsigned baud = DEFAULT_BAUD;
- ssize_t ret;
+ char *e;

if (*s == ',')
++s;
@@ -127,14 +127,14 @@ static __init void early_serial_init(char *s)
if (*s) {
unsigned port;
if (!strncmp(s, "0x", 2)) {
- ret = kstrtoint(s, 16, &early_serial_base);
+ early_serial_base = simple_strtoul(s, &e, 16);
} else {
static const int __initconst bases[] = { 0x3f8, 0x2f8 };

if (!strncmp(s, "ttyS", 4))
s += 4;
- ret = kstrtouint(s, 10, &port);
- if (ret || port > 1)
+ port = simple_strtoul(s, &e, 10);
+ if (port > 1 || s == e)
port = 0;
early_serial_base = bases[port];
}
@@ -149,8 +149,8 @@ static __init void early_serial_init(char *s)
outb(0x3, early_serial_base + MCR); /* DTR + RTS */

if (*s) {
- ret = kstrtouint(s, 0, &baud);
- if (ret || baud == 0)
+ baud = simple_strtoul(s, &e, 0);
+ if (baud == 0 || s == e)
baud = DEFAULT_BAUD;
}

2012-06-25 17:17:12

by Shuah Khan

[permalink] [raw]
Subject: Re: [tip:x86/cleanups] x86/early_printk: Replace obsolete simple_strtoul() usage with kstrtoint()


>
> I'm dropping this patch.

No problem. I missed return value check in one path. Will fix it and
send the fixed patch. I probably will pool this change with other
simple_strtoul() cleanup related changes I am working on.

-- Shuah

2012-06-29 12:50:58

by Ingo Molnar

[permalink] [raw]
Subject: Re: [tip:x86/cleanups] x86/early_printk: Replace obsolete simple_strtoul() usage with kstrtoint()


* Shuah Khan <[email protected]> wrote:

> > I'm dropping this patch.
>
> No problem. I missed return value check in one path. Will fix
> it and send the fixed patch. I probably will pool this change
> with other simple_strtoul() cleanup related changes I am
> working on.

Yep, that will probably make it easier to review in a batch,
looking for side effects and such.

Thanks,

Ingo