[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Xen-devel] [PATCH v10 3/6] xen/arm: use DEFINE_SYMBOL as required

On Tue, 26 Feb 2019, Ian Jackson wrote:
> Having written all that down (what a palaver), we can see that your
> cast, above, is a breach of the rules.  Instead you can just pass the
> struct abstract_alt_instr*, and all is well.  Then you don't need a
> comment at the use site, either, since you are doing things which are
> entirely supported and explained.

The in-code comment is great, and I have added it to the right patch.

Let me get a clarification on the rest of the suggestion: I would
have to change the type of region->end to const struct
abstract_alt_instr* (see xen/arch/arm/alternative.c).

If I do that, I get a compilation failure at:

alternative.c:245:16: error: initialization from incompatible pointer type 
         .end = end,

because apply_alternatives currently expects two struct alt_instr* as
parameters. I cannot change the type of the second parameter of
apply_alternatives, because actually it might not be a linker symbol, it
might not be a struct abstract_alt_instr*. So I would still have to cast
to struct abstract_alt_instr* somewhere?

> > -    memset(p, 0, __per_cpu_data_end - __per_cpu_start);
> > -    __per_cpu_offset[cpu] = p - __per_cpu_start;
> > +    memset(p, 0, per_cpu_diff(__per_cpu_start, __per_cpu_data_end));
> > +    __per_cpu_offset[cpu] = (uintptr_t)p - (uintptr_t)__per_cpu_start;
> If per_cpu_diff(__per_cpu_start, __per_cpu_data_end) gives the right
> value for memset, isn't it the right value for offset[cpu] too ?
> Ie I don't know why you are using uintptr_t here.

I am using uintptr_t because p is not a abstract_per_cpu type. I could

  __per_cpu_offset[cpu] = per_cpu_diff(__per_cpu_start,
                             (struct abstract_per_cpu *)p);

I didn't think it was better though. What do you think?

> > @@ -37,7 +38,7 @@ static void _free_percpu_area(struct rcu_head *head)
> >  {
> >      struct free_info *info = container_of(head, struct free_info, rcu);
> >      unsigned int cpu = info->cpu;
> > -    char *p = __per_cpu_start + __per_cpu_offset[cpu];
> > +    char *p = (char *)__per_cpu_start + __per_cpu_offset[cpu];
> I also don't know why you are casting to char* here if you didn't need
> to do so before.

That is because __per_cpu_start is now const, it wasn't before.

> The rest in this patch looks fine to me.

Thanks again for your help!

Xen-devel mailing list



Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.