* [PATCH v2 1/2] pseries: Fix endian issues in onlining cpu threads
@ 2014-09-12 19:11 Thomas Falcon
2014-09-12 19:11 ` [PATCH v2 2/2] pseries: Fix endian issues in cpu hot-removal Thomas Falcon
2014-09-15 3:01 ` [PATCH v2 1/2] pseries: Fix endian issues in onlining cpu threads Michael Ellerman
0 siblings, 2 replies; 5+ messages in thread
From: Thomas Falcon @ 2014-09-12 19:11 UTC (permalink / raw)
To: mpe; +Cc: Thomas Falcon, linuxppc-dev
The ibm,ppc-interrupt-server#s property is in big endian format.
These values need to be converted when used by little endian
architectures.
Signed-off-by: Thomas Falcon <tlfalcon@linux.vnet.ibm.com>
---
Changes in v2:
Followed suggestions from Michael Ellerman
conversion of intserv values occur once
---
arch/powerpc/platforms/pseries/dlpar.c | 8 +++++---
1 file changed, 5 insertions(+), 3 deletions(-)
diff --git a/arch/powerpc/platforms/pseries/dlpar.c b/arch/powerpc/platforms/pseries/dlpar.c
index c2806c8..9e9f30b2 100644
--- a/arch/powerpc/platforms/pseries/dlpar.c
+++ b/arch/powerpc/platforms/pseries/dlpar.c
@@ -363,7 +363,8 @@ static int dlpar_online_cpu(struct device_node *dn)
int rc = 0;
unsigned int cpu;
int len, nthreads, i;
- const u32 *intserv;
+ const __be32 *intserv;
+ u32 thread;
intserv = of_get_property(dn, "ibm,ppc-interrupt-server#s", &len);
if (!intserv)
@@ -373,8 +374,9 @@ static int dlpar_online_cpu(struct device_node *dn)
cpu_maps_update_begin();
for (i = 0; i < nthreads; i++) {
+ thread = be32_to_cpu(intserv[i]);
for_each_present_cpu(cpu) {
- if (get_hard_smp_processor_id(cpu) != intserv[i])
+ if (get_hard_smp_processor_id(cpu) != thread)
continue;
BUG_ON(get_cpu_current_state(cpu)
!= CPU_STATE_OFFLINE);
@@ -388,7 +390,7 @@ static int dlpar_online_cpu(struct device_node *dn)
}
if (cpu == num_possible_cpus())
printk(KERN_WARNING "Could not find cpu to online "
- "with physical id 0x%x\n", intserv[i]);
+ "with physical id 0x%x\n", thread);
}
cpu_maps_update_done();
--
1.8.5.2
^ permalink raw reply related [flat|nested] 5+ messages in thread
* [PATCH v2 2/2] pseries: Fix endian issues in cpu hot-removal
2014-09-12 19:11 [PATCH v2 1/2] pseries: Fix endian issues in onlining cpu threads Thomas Falcon
@ 2014-09-12 19:11 ` Thomas Falcon
2014-09-15 6:46 ` Bharata B Rao
2014-09-15 3:01 ` [PATCH v2 1/2] pseries: Fix endian issues in onlining cpu threads Michael Ellerman
1 sibling, 1 reply; 5+ messages in thread
From: Thomas Falcon @ 2014-09-12 19:11 UTC (permalink / raw)
To: mpe; +Cc: Thomas Falcon, linuxppc-dev
When removing a cpu, this patch makes sure that values
gotten from or passed to firmware are in the correct
endian format.
Signed-off-by: Thomas Falcon <tlfalcon@linux.vnet.ibm.com>
---
Changes in v2:
Followed suggestions from Michael Ellerman:
Conversion of intserv to cpu endian occurs once.
Conversion of drc_index to cpu endian occurs once
using of_property_read_u32.
---
arch/powerpc/platforms/pseries/dlpar.c | 20 +++++++++++---------
arch/powerpc/platforms/pseries/hotplug-cpu.c | 10 ++++++----
2 files changed, 17 insertions(+), 13 deletions(-)
diff --git a/arch/powerpc/platforms/pseries/dlpar.c b/arch/powerpc/platforms/pseries/dlpar.c
index 9e9f30b2..343dfdf 100644
--- a/arch/powerpc/platforms/pseries/dlpar.c
+++ b/arch/powerpc/platforms/pseries/dlpar.c
@@ -444,7 +444,8 @@ static int dlpar_offline_cpu(struct device_node *dn)
int rc = 0;
unsigned int cpu;
int len, nthreads, i;
- const u32 *intserv;
+ const __be32 *intserv;
+ u32 thread;
intserv = of_get_property(dn, "ibm,ppc-interrupt-server#s", &len);
if (!intserv)
@@ -454,8 +455,9 @@ static int dlpar_offline_cpu(struct device_node *dn)
cpu_maps_update_begin();
for (i = 0; i < nthreads; i++) {
+ thread = be32_to_cpu(intserv[i]);
for_each_present_cpu(cpu) {
- if (get_hard_smp_processor_id(cpu) != intserv[i])
+ if (get_hard_smp_processor_id(cpu) != thread)
continue;
if (get_cpu_current_state(cpu) == CPU_STATE_OFFLINE)
@@ -477,14 +479,14 @@ static int dlpar_offline_cpu(struct device_node *dn)
* Upgrade it's state to CPU_STATE_OFFLINE.
*/
set_preferred_offline_state(cpu, CPU_STATE_OFFLINE);
- BUG_ON(plpar_hcall_norets(H_PROD, intserv[i])
+ BUG_ON(plpar_hcall_norets(H_PROD, thread)
!= H_SUCCESS);
__cpu_die(cpu);
break;
}
if (cpu == num_possible_cpus())
printk(KERN_WARNING "Could not find cpu to offline "
- "with physical id 0x%x\n", intserv[i]);
+ "with physical id 0x%x\n", thread);
}
cpu_maps_update_done();
@@ -496,15 +498,15 @@ out:
static ssize_t dlpar_cpu_release(const char *buf, size_t count)
{
struct device_node *dn;
- const u32 *drc_index;
+ const u32 drc_index;
int rc;
dn = of_find_node_by_path(buf);
if (!dn)
return -EINVAL;
- drc_index = of_get_property(dn, "ibm,my-drc-index", NULL);
- if (!drc_index) {
+ rc = of_property_read_u32(dn, "ibm,my-drc-index", &drc_index);
+ if (rc) {
of_node_put(dn);
return -EINVAL;
}
@@ -515,7 +517,7 @@ static ssize_t dlpar_cpu_release(const char *buf, size_t count)
return -EINVAL;
}
- rc = dlpar_release_drc(*drc_index);
+ rc = dlpar_release_drc(drc_index);
if (rc) {
of_node_put(dn);
return rc;
@@ -523,7 +525,7 @@ static ssize_t dlpar_cpu_release(const char *buf, size_t count)
rc = dlpar_detach_node(dn);
if (rc) {
- dlpar_acquire_drc(*drc_index);
+ dlpar_acquire_drc(drc_index);
return rc;
}
diff --git a/arch/powerpc/platforms/pseries/hotplug-cpu.c b/arch/powerpc/platforms/pseries/hotplug-cpu.c
index 447f8c6..5c375f9 100644
--- a/arch/powerpc/platforms/pseries/hotplug-cpu.c
+++ b/arch/powerpc/platforms/pseries/hotplug-cpu.c
@@ -90,7 +90,7 @@ static void rtas_stop_self(void)
{
static struct rtas_args args = {
.nargs = 0,
- .nret = 1,
+ .nret = cpu_to_be32(1),
.rets = &args.args[0],
};
@@ -312,7 +312,8 @@ static void pseries_remove_processor(struct device_node *np)
{
unsigned int cpu;
int len, nthreads, i;
- const u32 *intserv;
+ const __be32 *intserv;
+ u32 thread;
intserv = of_get_property(np, "ibm,ppc-interrupt-server#s", &len);
if (!intserv)
@@ -322,8 +323,9 @@ static void pseries_remove_processor(struct device_node *np)
cpu_maps_update_begin();
for (i = 0; i < nthreads; i++) {
+ thread = be32_to_cpu(intserv[i]);
for_each_present_cpu(cpu) {
- if (get_hard_smp_processor_id(cpu) != intserv[i])
+ if (get_hard_smp_processor_id(cpu) != thread)
continue;
BUG_ON(cpu_online(cpu));
set_cpu_present(cpu, false);
@@ -332,7 +334,7 @@ static void pseries_remove_processor(struct device_node *np)
}
if (cpu >= nr_cpu_ids)
printk(KERN_WARNING "Could not find cpu to remove "
- "with physical id 0x%x\n", intserv[i]);
+ "with physical id 0x%x\n", thread);
}
cpu_maps_update_done();
}
--
1.8.5.2
^ permalink raw reply related [flat|nested] 5+ messages in thread
* Re: [PATCH v2 1/2] pseries: Fix endian issues in onlining cpu threads
2014-09-12 19:11 [PATCH v2 1/2] pseries: Fix endian issues in onlining cpu threads Thomas Falcon
2014-09-12 19:11 ` [PATCH v2 2/2] pseries: Fix endian issues in cpu hot-removal Thomas Falcon
@ 2014-09-15 3:01 ` Michael Ellerman
1 sibling, 0 replies; 5+ messages in thread
From: Michael Ellerman @ 2014-09-15 3:01 UTC (permalink / raw)
To: Thomas Falcon; +Cc: Nathan Fontenot, linuxppc-dev
On Fri, 2014-09-12 at 14:11 -0500, Thomas Falcon wrote:
> The ibm,ppc-interrupt-server#s property is in big endian format.
> These values need to be converted when used by little endian
> architectures.
>
> Signed-off-by: Thomas Falcon <tlfalcon@linux.vnet.ibm.com>
> ---
> Changes in v2:
>
> Followed suggestions from Michael Ellerman
> conversion of intserv values occur once
Thanks Tom.
I think I saw that you'd already discussed these with Nathan in another thread,
so I'll assume he's OK with them unless he says otherwise.
cheers
^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [PATCH v2 2/2] pseries: Fix endian issues in cpu hot-removal
2014-09-12 19:11 ` [PATCH v2 2/2] pseries: Fix endian issues in cpu hot-removal Thomas Falcon
@ 2014-09-15 6:46 ` Bharata B Rao
2014-09-16 7:00 ` Michael Ellerman
0 siblings, 1 reply; 5+ messages in thread
From: Bharata B Rao @ 2014-09-15 6:46 UTC (permalink / raw)
To: Thomas Falcon; +Cc: linuxppc-dev
On Sat, Sep 13, 2014 at 12:41 AM, Thomas Falcon
<tlfalcon@linux.vnet.ibm.com> wrote:
> When removing a cpu, this patch makes sure that values
> gotten from or passed to firmware are in the correct
> endian format.
>
> Signed-off-by: Thomas Falcon <tlfalcon@linux.vnet.ibm.com>
> ---
> Changes in v2:
>
> Followed suggestions from Michael Ellerman:
> Conversion of intserv to cpu endian occurs once.
> Conversion of drc_index to cpu endian occurs once
> using of_property_read_u32.
> ---
> arch/powerpc/platforms/pseries/dlpar.c | 20 +++++++++++---------
> arch/powerpc/platforms/pseries/hotplug-cpu.c | 10 ++++++----
> 2 files changed, 17 insertions(+), 13 deletions(-)
>
> diff --git a/arch/powerpc/platforms/pseries/dlpar.c b/arch/powerpc/platfo=
rms/pseries/dlpar.c
> index 9e9f30b2..343dfdf 100644
> --- a/arch/powerpc/platforms/pseries/dlpar.c
> +++ b/arch/powerpc/platforms/pseries/dlpar.c
> @@ -444,7 +444,8 @@ static int dlpar_offline_cpu(struct device_node *dn)
> int rc =3D 0;
> unsigned int cpu;
> int len, nthreads, i;
> - const u32 *intserv;
> + const __be32 *intserv;
> + u32 thread;
>
> intserv =3D of_get_property(dn, "ibm,ppc-interrupt-server#s", &le=
n);
> if (!intserv)
> @@ -454,8 +455,9 @@ static int dlpar_offline_cpu(struct device_node *dn)
>
> cpu_maps_update_begin();
> for (i =3D 0; i < nthreads; i++) {
> + thread =3D be32_to_cpu(intserv[i]);
> for_each_present_cpu(cpu) {
> - if (get_hard_smp_processor_id(cpu) !=3D intserv[i=
])
> + if (get_hard_smp_processor_id(cpu) !=3D thread)
> continue;
>
> if (get_cpu_current_state(cpu) =3D=3D CPU_STATE_O=
FFLINE)
> @@ -477,14 +479,14 @@ static int dlpar_offline_cpu(struct device_node *dn=
)
> * Upgrade it's state to CPU_STATE_OFFLINE.
> */
> set_preferred_offline_state(cpu, CPU_STATE_OFFLIN=
E);
> - BUG_ON(plpar_hcall_norets(H_PROD, intserv[i])
> + BUG_ON(plpar_hcall_norets(H_PROD, thread)
> !=3D H_SU=
CCESS);
> __cpu_die(cpu);
> break;
> }
> if (cpu =3D=3D num_possible_cpus())
> printk(KERN_WARNING "Could not find cpu to offlin=
e "
> - "with physical id 0x%x\n", intserv[i]);
> + "with physical id 0x%x\n", thread);
> }
> cpu_maps_update_done();
>
> @@ -496,15 +498,15 @@ out:
> static ssize_t dlpar_cpu_release(const char *buf, size_t count)
> {
> struct device_node *dn;
> - const u32 *drc_index;
> + const u32 drc_index;
> int rc;
>
> dn =3D of_find_node_by_path(buf);
> if (!dn)
> return -EINVAL;
>
> - drc_index =3D of_get_property(dn, "ibm,my-drc-index", NULL);
> - if (!drc_index) {
> + rc =3D of_property_read_u32(dn, "ibm,my-drc-index", &drc_index);
Use of const for drc_index causes compilation problems.
Warning on Fedora 20 BE
arch/powerpc/platforms/pseries/dlpar.c: In function =E2=80=98dlpar_cpu_rele=
ase=E2=80=99:
arch/powerpc/platforms/pseries/dlpar.c:508:2: warning: passing
argument 3 of =E2=80=98of_property_read_u32=E2=80=99 discards =E2=80=98cons=
t=E2=80=99 qualifier from
pointer target type [enabled by default]
rc =3D of_property_read_u32(dn, "ibm,my-drc-index", &drc_index);
^
In file included from arch/powerpc/platforms/pseries/dlpar.c:18:0:
include/linux/of.h:699:19: note: expected =E2=80=98u32 *=E2=80=99 but argum=
ent is of
type =E2=80=98const u32 *=E2=80=99
static inline int of_property_read_u32(const struct device_node *np,
Error on Ubuntu 14.04 LE
arch/powerpc/platforms/pseries/dlpar.c: In function =E2=80=98dlpar_cpu_rele=
ase=E2=80=99:
arch/powerpc/platforms/pseries/dlpar.c:508:2: error: passing argument
3 of =E2=80=98of_property_read_u32=E2=80=99 discards =E2=80=98const=E2=80=
=99 qualifier from pointer
target type [-Werror]
rc =3D of_property_read_u32(dn, "ibm,my-drc-index", &drc_index);
^
In file included from arch/powerpc/platforms/pseries/dlpar.c:18:0:
include/linux/of.h:699:19: note: expected =E2=80=98u32 *=E2=80=99 but argum=
ent is of
type =E2=80=98const u32 *=E2=80=99
static inline int of_property_read_u32(const struct device_node *np,
^
cc1: all warnings being treated as errors
Regards,
Bharata.
^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [PATCH v2 2/2] pseries: Fix endian issues in cpu hot-removal
2014-09-15 6:46 ` Bharata B Rao
@ 2014-09-16 7:00 ` Michael Ellerman
0 siblings, 0 replies; 5+ messages in thread
From: Michael Ellerman @ 2014-09-16 7:00 UTC (permalink / raw)
To: Bharata B Rao; +Cc: linuxppc-dev, Thomas Falcon
On Mon, 2014-09-15 at 12:16 +0530, Bharata B Rao wrote:
> On Sat, Sep 13, 2014 at 12:41 AM, Thomas Falcon
> <tlfalcon@linux.vnet.ibm.com> wrote:
> >
> > diff --git a/arch/powerpc/platforms/pseries/dlpar.c b/arch/powerpc/platforms/pseries/dlpar.c
> > index 9e9f30b2..343dfdf 100644
> > --- a/arch/powerpc/platforms/pseries/dlpar.c
> > +++ b/arch/powerpc/platforms/pseries/dlpar.c
> > @@ -496,15 +498,15 @@ out:
> > static ssize_t dlpar_cpu_release(const char *buf, size_t count)
> > {
> > struct device_node *dn;
> > - const u32 *drc_index;
> > + const u32 drc_index;
> > int rc;
> >
> > dn = of_find_node_by_path(buf);
> > if (!dn)
> > return -EINVAL;
> >
> > - drc_index = of_get_property(dn, "ibm,my-drc-index", NULL);
> > - if (!drc_index) {
> > + rc = of_property_read_u32(dn, "ibm,my-drc-index", &drc_index);
>
> Use of const for drc_index causes compilation problems.
Yes that's clearly wrong.
Please fix and retest.
cheers
^ permalink raw reply [flat|nested] 5+ messages in thread
end of thread, other threads:[~2014-09-16 7:00 UTC | newest]
Thread overview: 5+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2014-09-12 19:11 [PATCH v2 1/2] pseries: Fix endian issues in onlining cpu threads Thomas Falcon
2014-09-12 19:11 ` [PATCH v2 2/2] pseries: Fix endian issues in cpu hot-removal Thomas Falcon
2014-09-15 6:46 ` Bharata B Rao
2014-09-16 7:00 ` Michael Ellerman
2014-09-15 3:01 ` [PATCH v2 1/2] pseries: Fix endian issues in onlining cpu threads Michael Ellerman
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.