> On Jul 19, 2019, at 3:44 PM, Joe Perches <j...@perches.com> wrote:
> 
> On Fri, 2019-07-19 at 18:41 +0000, Nadav Amit wrote:
>>> On Jul 19, 2019, at 11:36 AM, Dave Hansen <dave.han...@intel.com> wrote:
>>> 
>>> On 7/18/19 5:58 PM, Nadav Amit wrote:
>>>> @@ -865,7 +893,7 @@ void arch_tlbbatch_flush(struct 
>>>> arch_tlbflush_unmap_batch *batch)
>>>>    if (cpumask_test_cpu(cpu, &batch->cpumask)) {
>>>>            lockdep_assert_irqs_enabled();
>>>>            local_irq_disable();
>>>> -          flush_tlb_func_local(&full_flush_tlb_info);
>>>> +          flush_tlb_func_local((void *)&full_flush_tlb_info);
>>>>            local_irq_enable();
>>>>    }
>>> 
>>> This looks like superfluous churn.  Is it?
>> 
>> Unfortunately not, since full_flush_tlb_info is defined as const. Without it
>> you would get:
>> 
>> warning: passing argument 1 of ‘flush_tlb_func_local’ discards ‘const’ 
>> qualifier from pointer target type [-Wdiscarded-qualifiers]
>> 
>> And flush_tlb_func_local() should get (void *) argument since it is also
>> used by the SMP infrastructure.
> 
> huh?
> 
> commit 3db6d5a5ecaf0a778d721ccf9809248350d4bfaf
> Author: Nadav Amit <na...@vmware.com>
> Date:   Thu Apr 25 16:01:43 2019 -0700
> 
> []
> 
> -static void flush_tlb_func_local(void *info, enum tlb_flush_reason reason)
> +static void flush_tlb_func_local(const void *info, enum tlb_flush_reason 
> reason)

Hopefully I decipher the “huh?” correctly...

When we moved the flush_tlb_info off the stack, in the patch that you
reference, we created a global full_flush_tlb_info variable, which was set
as const and delivered to flush_tlb_func_local. I changed the signature of
the function to avoid casting. IIRC, setting the variable as constant
slightly improved the generated assembly, and anyhow made sense.

In this patch-set I need to change the first argument of
flush_tlb_func_local to be non-const to match the SMP function signature
which takes a single non-const void * argument. Yes, there is what seems to
be non-safe casting, but flush_tlb_func_common() casts it back into a const
variable.

I know that I also added the infrastructure to run a function locally in the
SMP infrastructure, but it made sense to have the same signature for local
function and remote ones.

Does it make more sense now?

Reply via email to