Re: apparent regressions from TLB range flushing page set

2012-08-24 Thread Alex Shi
On 08/22/2012 09:22 PM, Jan Beulich wrote:

 On 22.08.12 at 10:54, Alex Shi  wrote:
>> On 08/22/2012 03:39 PM, Jan Beulich wrote:
>>
>> Alex Shi  08/22/12 5:24 AM >>>
 On 08/20/2012 10:12 PM, Jan Beulich wrote:
 I was thought you have 'Agreed' for xen part code. :)
>>>
>>> I had agreed to it being done the right way, and I had pointed out the
>>> problem once. I can't say for sure that I looked at the most recent rev
>>> closely enough to spot the issue still being unfixed.
>>>
> For one, while TLB_FLUSH_ALL gets passed as 'end' argument to
> flush_tlb_others(), the Xen code was made to check its 'start'
> parameter.

 Do you mean need the following change? --untested.
>>>
>>> Yes. I'd question though whether for that special case it shouldn't be
>>> start _and_ end to get passed the special value.
>>
>>
>> Actually the special value is already there in old code.
>> so, what's your meaning of the question?
> 
> I'm saying that I'd rather see
> 
> #define flush_tlb_mm(mm)  flush_tlb_mm_range(mm, TLB_FLUSH_ALL, 
> TLB_FLUSH_ALL, 0UL)


It bring logical confusing, and is no much help.
flush_tlb_mm_range still will call:
flush_tlb_others(mm_cpumask(mm), mm, 0UL, TLB_FLUSH_ALL);

So, since we already fix code error, we'd better not to do this change.


>

> Jan
> 


--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


Re: apparent regressions from TLB range flushing page set

2012-08-24 Thread Alex Shi
On 08/22/2012 09:22 PM, Jan Beulich wrote:

 On 22.08.12 at 10:54, Alex Shi alex@intel.com wrote:
 On 08/22/2012 03:39 PM, Jan Beulich wrote:

 Alex Shi alex@intel.com 08/22/12 5:24 AM 
 On 08/20/2012 10:12 PM, Jan Beulich wrote:
 I was thought you have 'Agreed' for xen part code. :)

 I had agreed to it being done the right way, and I had pointed out the
 problem once. I can't say for sure that I looked at the most recent rev
 closely enough to spot the issue still being unfixed.

 For one, while TLB_FLUSH_ALL gets passed as 'end' argument to
 flush_tlb_others(), the Xen code was made to check its 'start'
 parameter.

 Do you mean need the following change? --untested.

 Yes. I'd question though whether for that special case it shouldn't be
 start _and_ end to get passed the special value.


 Actually the special value is already there in old code.
 so, what's your meaning of the question?
 
 I'm saying that I'd rather see
 
 #define flush_tlb_mm(mm)  flush_tlb_mm_range(mm, TLB_FLUSH_ALL, 
 TLB_FLUSH_ALL, 0UL)


It bring logical confusing, and is no much help.
flush_tlb_mm_range still will call:
flush_tlb_others(mm_cpumask(mm), mm, 0UL, TLB_FLUSH_ALL);

So, since we already fix code error, we'd better not to do this change.




 Jan
 


--
To unsubscribe from this list: send the line unsubscribe linux-kernel in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


Re: apparent regressions from TLB range flushing page set

2012-08-22 Thread Jan Beulich
>>> On 22.08.12 at 10:54, Alex Shi  wrote:
> On 08/22/2012 03:39 PM, Jan Beulich wrote:
> 
> Alex Shi  08/22/12 5:24 AM >>>
>>> On 08/20/2012 10:12 PM, Jan Beulich wrote:
>>> I was thought you have 'Agreed' for xen part code. :)
>> 
>> I had agreed to it being done the right way, and I had pointed out the
>> problem once. I can't say for sure that I looked at the most recent rev
>> closely enough to spot the issue still being unfixed.
>> 
 For one, while TLB_FLUSH_ALL gets passed as 'end' argument to
 flush_tlb_others(), the Xen code was made to check its 'start'
 parameter.
>>>
>>> Do you mean need the following change? --untested.
>> 
>> Yes. I'd question though whether for that special case it shouldn't be
>> start _and_ end to get passed the special value.
> 
> 
> Actually the special value is already there in old code.
> so, what's your meaning of the question?

I'm saying that I'd rather see

#define flush_tlb_mm(mm)flush_tlb_mm_range(mm, TLB_FLUSH_ALL, 
TLB_FLUSH_ALL, 0UL)

Jan

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


Re: apparent regressions from TLB range flushing page set

2012-08-22 Thread Alex Shi
On 08/22/2012 03:39 PM, Jan Beulich wrote:

 Alex Shi  08/22/12 5:24 AM >>>
>> On 08/20/2012 10:12 PM, Jan Beulich wrote:
>> I was thought you have 'Agreed' for xen part code. :)
> 
> I had agreed to it being done the right way, and I had pointed out the
> problem once. I can't say for sure that I looked at the most recent rev
> closely enough to spot the issue still being unfixed.
> 
>>> For one, while TLB_FLUSH_ALL gets passed as 'end' argument to
>>> flush_tlb_others(), the Xen code was made to check its 'start'
>>> parameter.
>>
>> Do you mean need the following change? --untested.
> 
> Yes. I'd question though whether for that special case it shouldn't be
> start _and_ end to get passed the special value.


Actually the special value is already there in old code.
so, what's your meaning of the question?

> 
> Jan
> 


--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


Re: apparent regressions from TLB range flushing page set

2012-08-22 Thread Alex Shi
On 08/22/2012 03:44 PM, Jan Beulich wrote:

 Alex Shi  08/22/12 5:27 AM >>>
>>> Second, the UV code doesn't flush the full range at all, it simply
>>> ignores its 'end' parameter (and hence also the "all" indicator).
>>
>> Sure. the following rfc patch try to fix it. untested since no hardware.
> 
> Sure - this needs to be looked at by a person knowing UV (and I would
> have thought a change like the one we're discussing here would also
> have required an ack from such a person), but ...
> 
>> --- a/arch/x86/platform/uv/tlb_uv.c
>> +++ b/arch/x86/platform/uv/tlb_uv.c
>> @@ -280,12 +280,12 @@ static void bau_process_message(struct msg_desc *mdp, 
>> struct bau_control *bcp,
>>/*
>> * This must be a normal message, or retry of a normal message
>> */
>> -if (msg->address == TLB_FLUSH_ALL) {
>> +if (msg->end == 0) {
> 
> How would "end" end up being 0 here? Don't you rather mean "start and
> end on the same page"?


yes,

> And even if you do, aren't you then losing the
> intended optimization?


Sure, TLB optimization is relatively complex and specific on different
hardware. I am not sure this platform needs this, and even so, I can not
give reasonable flushall_shift value. So, it is better to recover the
system as before.

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


Re: apparent regressions from TLB range flushing page set

2012-08-22 Thread Jan Beulich
>>> Alex Shi  08/22/12 5:27 AM >>>
>> Second, the UV code doesn't flush the full range at all, it simply
>> ignores its 'end' parameter (and hence also the "all" indicator).
> 
>Sure. the following rfc patch try to fix it. untested since no hardware.

Sure - this needs to be looked at by a person knowing UV (and I would
have thought a change like the one we're discussing here would also
have required an ack from such a person), but ...

>--- a/arch/x86/platform/uv/tlb_uv.c
>+++ b/arch/x86/platform/uv/tlb_uv.c
>@@ -280,12 +280,12 @@ static void bau_process_message(struct msg_desc *mdp, 
>struct bau_control *bcp,
>/*
> * This must be a normal message, or retry of a normal message
> */
>-if (msg->address == TLB_FLUSH_ALL) {
>+if (msg->end == 0) {

How would "end" end up being 0 here? Don't you rather mean "start and
end on the same page"? And even if you do, aren't you then losing the
intended optimization?

>+__flush_tlb_one(msg->start);
>+stat->d_onetlb++;
>+} else {
 >local_flush_tlb();
>stat->d_alltlb++;
>-} else {
>-__flush_tlb_one(msg->address);
>-stat->d_onetlb++;
>}
>stat->d_requestee++;
 >
>@@ -1113,7 +1114,8 @@ const struct cpumask *uv_flush_tlb_others(const struct 
>cpumask *cpumask,
 >
>record_send_statistics(stat, locals, hubs, remotes, bau_desc);
 >
>-bau_desc->payload.address = start;
>+bau_desc->payload.start = start;
>+bau_desc->payload.end= end;
>bau_desc->payload.sending_cpu = cpu;
>/*
> * uv_flush_send_and_wait returns 0 if all cpu's were messaged,

Jan

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


Re: apparent regressions from TLB range flushing page set

2012-08-22 Thread Jan Beulich
>>> Alex Shi  08/22/12 5:24 AM >>>
>On 08/20/2012 10:12 PM, Jan Beulich wrote:
>I was thought you have 'Agreed' for xen part code. :)

I had agreed to it being done the right way, and I had pointed out the
problem once. I can't say for sure that I looked at the most recent rev
closely enough to spot the issue still being unfixed.

>> For one, while TLB_FLUSH_ALL gets passed as 'end' argument to
>> flush_tlb_others(), the Xen code was made to check its 'start'
>> parameter.
>
>Do you mean need the following change? --untested.

Yes. I'd question though whether for that special case it shouldn't be
start _and_ end to get passed the special value.

Jan

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


Re: apparent regressions from TLB range flushing page set

2012-08-22 Thread Jan Beulich
 Alex Shi alex@intel.com 08/22/12 5:24 AM 
On 08/20/2012 10:12 PM, Jan Beulich wrote:
I was thought you have 'Agreed' for xen part code. :)

I had agreed to it being done the right way, and I had pointed out the
problem once. I can't say for sure that I looked at the most recent rev
closely enough to spot the issue still being unfixed.

 For one, while TLB_FLUSH_ALL gets passed as 'end' argument to
 flush_tlb_others(), the Xen code was made to check its 'start'
 parameter.

Do you mean need the following change? --untested.

Yes. I'd question though whether for that special case it shouldn't be
start _and_ end to get passed the special value.

Jan

--
To unsubscribe from this list: send the line unsubscribe linux-kernel in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


Re: apparent regressions from TLB range flushing page set

2012-08-22 Thread Jan Beulich
 Alex Shi alex@intel.com 08/22/12 5:27 AM 
 Second, the UV code doesn't flush the full range at all, it simply
 ignores its 'end' parameter (and hence also the all indicator).
 
Sure. the following rfc patch try to fix it. untested since no hardware.

Sure - this needs to be looked at by a person knowing UV (and I would
have thought a change like the one we're discussing here would also
have required an ack from such a person), but ...

--- a/arch/x86/platform/uv/tlb_uv.c
+++ b/arch/x86/platform/uv/tlb_uv.c
@@ -280,12 +280,12 @@ static void bau_process_message(struct msg_desc *mdp, 
struct bau_control *bcp,
/*
 * This must be a normal message, or retry of a normal message
 */
-if (msg-address == TLB_FLUSH_ALL) {
+if (msg-end == 0) {

How would end end up being 0 here? Don't you rather mean start and
end on the same page? And even if you do, aren't you then losing the
intended optimization?

+__flush_tlb_one(msg-start);
+stat-d_onetlb++;
+} else {
 local_flush_tlb();
stat-d_alltlb++;
-} else {
-__flush_tlb_one(msg-address);
-stat-d_onetlb++;
}
stat-d_requestee++;
 
@@ -1113,7 +1114,8 @@ const struct cpumask *uv_flush_tlb_others(const struct 
cpumask *cpumask,
 
record_send_statistics(stat, locals, hubs, remotes, bau_desc);
 
-bau_desc-payload.address = start;
+bau_desc-payload.start = start;
+bau_desc-payload.end= end;
bau_desc-payload.sending_cpu = cpu;
/*
 * uv_flush_send_and_wait returns 0 if all cpu's were messaged,

Jan

--
To unsubscribe from this list: send the line unsubscribe linux-kernel in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


Re: apparent regressions from TLB range flushing page set

2012-08-22 Thread Alex Shi
On 08/22/2012 03:44 PM, Jan Beulich wrote:

 Alex Shi alex@intel.com 08/22/12 5:27 AM 
 Second, the UV code doesn't flush the full range at all, it simply
 ignores its 'end' parameter (and hence also the all indicator).

 Sure. the following rfc patch try to fix it. untested since no hardware.
 
 Sure - this needs to be looked at by a person knowing UV (and I would
 have thought a change like the one we're discussing here would also
 have required an ack from such a person), but ...
 
 --- a/arch/x86/platform/uv/tlb_uv.c
 +++ b/arch/x86/platform/uv/tlb_uv.c
 @@ -280,12 +280,12 @@ static void bau_process_message(struct msg_desc *mdp, 
 struct bau_control *bcp,
/*
 * This must be a normal message, or retry of a normal message
 */
 -if (msg-address == TLB_FLUSH_ALL) {
 +if (msg-end == 0) {
 
 How would end end up being 0 here? Don't you rather mean start and
 end on the same page?


yes,

 And even if you do, aren't you then losing the
 intended optimization?


Sure, TLB optimization is relatively complex and specific on different
hardware. I am not sure this platform needs this, and even so, I can not
give reasonable flushall_shift value. So, it is better to recover the
system as before.

--
To unsubscribe from this list: send the line unsubscribe linux-kernel in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


Re: apparent regressions from TLB range flushing page set

2012-08-22 Thread Alex Shi
On 08/22/2012 03:39 PM, Jan Beulich wrote:

 Alex Shi alex@intel.com 08/22/12 5:24 AM 
 On 08/20/2012 10:12 PM, Jan Beulich wrote:
 I was thought you have 'Agreed' for xen part code. :)
 
 I had agreed to it being done the right way, and I had pointed out the
 problem once. I can't say for sure that I looked at the most recent rev
 closely enough to spot the issue still being unfixed.
 
 For one, while TLB_FLUSH_ALL gets passed as 'end' argument to
 flush_tlb_others(), the Xen code was made to check its 'start'
 parameter.

 Do you mean need the following change? --untested.
 
 Yes. I'd question though whether for that special case it shouldn't be
 start _and_ end to get passed the special value.


Actually the special value is already there in old code.
so, what's your meaning of the question?

 
 Jan
 


--
To unsubscribe from this list: send the line unsubscribe linux-kernel in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


Re: apparent regressions from TLB range flushing page set

2012-08-22 Thread Jan Beulich
 On 22.08.12 at 10:54, Alex Shi alex@intel.com wrote:
 On 08/22/2012 03:39 PM, Jan Beulich wrote:
 
 Alex Shi alex@intel.com 08/22/12 5:24 AM 
 On 08/20/2012 10:12 PM, Jan Beulich wrote:
 I was thought you have 'Agreed' for xen part code. :)
 
 I had agreed to it being done the right way, and I had pointed out the
 problem once. I can't say for sure that I looked at the most recent rev
 closely enough to spot the issue still being unfixed.
 
 For one, while TLB_FLUSH_ALL gets passed as 'end' argument to
 flush_tlb_others(), the Xen code was made to check its 'start'
 parameter.

 Do you mean need the following change? --untested.
 
 Yes. I'd question though whether for that special case it shouldn't be
 start _and_ end to get passed the special value.
 
 
 Actually the special value is already there in old code.
 so, what's your meaning of the question?

I'm saying that I'd rather see

#define flush_tlb_mm(mm)flush_tlb_mm_range(mm, TLB_FLUSH_ALL, 
TLB_FLUSH_ALL, 0UL)

Jan

--
To unsubscribe from this list: send the line unsubscribe linux-kernel in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


Re: apparent regressions from TLB range flushing page set

2012-08-21 Thread Alex Shi

> Second, the UV code doesn't flush the full range at all, it simply
> ignores its 'end' parameter (and hence also the "all" indicator).
> 




Sure. the following rfc patch try to fix it. untested since no hardware.

=

diff --git a/arch/x86/include/asm/uv/uv_bau.h b/arch/x86/include/asm/uv/uv_bau.h
index a06983c..ac6f326 100644
--- a/arch/x86/include/asm/uv/uv_bau.h
+++ b/arch/x86/include/asm/uv/uv_bau.h
@@ -225,8 +225,10 @@ struct bau_local_cpumask {
  * The payload is software-defined for INTD transactions
  */
 struct bau_msg_payload {
-   unsigned long   address;/* signifies a page or all
-  TLB's of the cpu */
+   unsigned long   start;  /* start address to flush TLB
+  of the cpu */
+   unsigned long   end;/* end address to flush TLB
+  of the cpu */
/* 64 bits */
unsigned short  sending_cpu;/* filled in by sender */
/* 16 bits */
diff --git a/arch/x86/platform/uv/tlb_uv.c b/arch/x86/platform/uv/tlb_uv.c
index b8b3a37..c603d15 100644
--- a/arch/x86/platform/uv/tlb_uv.c
+++ b/arch/x86/platform/uv/tlb_uv.c
@@ -280,12 +280,12 @@ static void bau_process_message(struct msg_desc *mdp, 
struct bau_control *bcp,
/*
 * This must be a normal message, or retry of a normal message
 */
-   if (msg->address == TLB_FLUSH_ALL) {
+   if (msg->end == 0) {
+   __flush_tlb_one(msg->start);
+   stat->d_onetlb++;
+   } else {
local_flush_tlb();
stat->d_alltlb++;
-   } else {
-   __flush_tlb_one(msg->address);
-   stat->d_onetlb++;
}
stat->d_requestee++;
 
@@ -1034,7 +1034,8 @@ static int set_distrib_bits(struct cpumask *flush_mask, 
struct bau_control *bcp,
  * globally purge translation cache of a virtual address or all TLB's
  * @cpumask: mask of all cpu's in which the address is to be removed
  * @mm: mm_struct containing virtual address range
- * @va: virtual address to be removed (or TLB_FLUSH_ALL for all TLB's on cpu)
+ * @start: start virtual address to be removed from TLB
+ * @end: end virtual address to be remove from TLB
  * @cpu: the current cpu
  *
  * This is the entry point for initiating any UV global TLB shootdown.
@@ -1113,7 +1114,8 @@ const struct cpumask *uv_flush_tlb_others(const struct 
cpumask *cpumask,
 
record_send_statistics(stat, locals, hubs, remotes, bau_desc);
 
-   bau_desc->payload.address = start;
+   bau_desc->payload.start = start;
+   bau_desc->payload.end   = end;
bau_desc->payload.sending_cpu = cpu;
/*
 * uv_flush_send_and_wait returns 0 if all cpu's were messaged,

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


Re: apparent regressions from TLB range flushing page set

2012-08-21 Thread Alex Shi
On 08/20/2012 10:12 PM, Jan Beulich wrote:

> Alex,
> 
> without even having run that code yet, I think I see two bugs here,
> both of which I'm pretty sure I pointed out at least once during the
> review cycle:


I was thought you have 'Agreed' for xen part code. :)

> 
> For one, while TLB_FLUSH_ALL gets passed as 'end' argument to
> flush_tlb_others(), the Xen code was made to check its 'start'
> parameter.


Do you mean need the following change? --untested.

>From the logical of flush_tlb_others, the old code should cause unflushed TLB 
>issue
(when end == -1, xen just executed INVLPG_MULTI, not whole TLB_FLUSH_MULTI). 
but we
 didn't find this problem in xen test. So, guess the xen code has other bug 
cover this. 

=
diff --git a/arch/x86/xen/mmu.c b/arch/x86/xen/mmu.c
index b65a761..5141d80 100644
--- a/arch/x86/xen/mmu.c
+++ b/arch/x86/xen/mmu.c
@@ -1283,7 +1283,7 @@ static void xen_flush_tlb_others(const struct cpumask 
*cpus,
cpumask_clear_cpu(smp_processor_id(), to_cpumask(args->mask));
 
args->op.cmd = MMUEXT_TLB_FLUSH_MULTI;
-   if (start != TLB_FLUSH_ALL && (end - start) <= PAGE_SIZE) {
+   if (end != TLB_FLUSH_ALL && (end - start) <= PAGE_SIZE) {
args->op.cmd = MMUEXT_INVLPG_MULTI;
args->op.arg1.linear_addr = start;
}

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


Re: apparent regressions from TLB range flushing page set

2012-08-21 Thread Alex Shi
On 08/20/2012 10:12 PM, Jan Beulich wrote:

 Alex,
 
 without even having run that code yet, I think I see two bugs here,
 both of which I'm pretty sure I pointed out at least once during the
 review cycle:


I was thought you have 'Agreed' for xen part code. :)

 
 For one, while TLB_FLUSH_ALL gets passed as 'end' argument to
 flush_tlb_others(), the Xen code was made to check its 'start'
 parameter.


Do you mean need the following change? --untested.

From the logical of flush_tlb_others, the old code should cause unflushed TLB 
issue
(when end == -1, xen just executed INVLPG_MULTI, not whole TLB_FLUSH_MULTI). 
but we
 didn't find this problem in xen test. So, guess the xen code has other bug 
cover this. 

=
diff --git a/arch/x86/xen/mmu.c b/arch/x86/xen/mmu.c
index b65a761..5141d80 100644
--- a/arch/x86/xen/mmu.c
+++ b/arch/x86/xen/mmu.c
@@ -1283,7 +1283,7 @@ static void xen_flush_tlb_others(const struct cpumask 
*cpus,
cpumask_clear_cpu(smp_processor_id(), to_cpumask(args-mask));
 
args-op.cmd = MMUEXT_TLB_FLUSH_MULTI;
-   if (start != TLB_FLUSH_ALL  (end - start) = PAGE_SIZE) {
+   if (end != TLB_FLUSH_ALL  (end - start) = PAGE_SIZE) {
args-op.cmd = MMUEXT_INVLPG_MULTI;
args-op.arg1.linear_addr = start;
}

--
To unsubscribe from this list: send the line unsubscribe linux-kernel in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


Re: apparent regressions from TLB range flushing page set

2012-08-21 Thread Alex Shi

 Second, the UV code doesn't flush the full range at all, it simply
 ignores its 'end' parameter (and hence also the all indicator).
 




Sure. the following rfc patch try to fix it. untested since no hardware.

=

diff --git a/arch/x86/include/asm/uv/uv_bau.h b/arch/x86/include/asm/uv/uv_bau.h
index a06983c..ac6f326 100644
--- a/arch/x86/include/asm/uv/uv_bau.h
+++ b/arch/x86/include/asm/uv/uv_bau.h
@@ -225,8 +225,10 @@ struct bau_local_cpumask {
  * The payload is software-defined for INTD transactions
  */
 struct bau_msg_payload {
-   unsigned long   address;/* signifies a page or all
-  TLB's of the cpu */
+   unsigned long   start;  /* start address to flush TLB
+  of the cpu */
+   unsigned long   end;/* end address to flush TLB
+  of the cpu */
/* 64 bits */
unsigned short  sending_cpu;/* filled in by sender */
/* 16 bits */
diff --git a/arch/x86/platform/uv/tlb_uv.c b/arch/x86/platform/uv/tlb_uv.c
index b8b3a37..c603d15 100644
--- a/arch/x86/platform/uv/tlb_uv.c
+++ b/arch/x86/platform/uv/tlb_uv.c
@@ -280,12 +280,12 @@ static void bau_process_message(struct msg_desc *mdp, 
struct bau_control *bcp,
/*
 * This must be a normal message, or retry of a normal message
 */
-   if (msg-address == TLB_FLUSH_ALL) {
+   if (msg-end == 0) {
+   __flush_tlb_one(msg-start);
+   stat-d_onetlb++;
+   } else {
local_flush_tlb();
stat-d_alltlb++;
-   } else {
-   __flush_tlb_one(msg-address);
-   stat-d_onetlb++;
}
stat-d_requestee++;
 
@@ -1034,7 +1034,8 @@ static int set_distrib_bits(struct cpumask *flush_mask, 
struct bau_control *bcp,
  * globally purge translation cache of a virtual address or all TLB's
  * @cpumask: mask of all cpu's in which the address is to be removed
  * @mm: mm_struct containing virtual address range
- * @va: virtual address to be removed (or TLB_FLUSH_ALL for all TLB's on cpu)
+ * @start: start virtual address to be removed from TLB
+ * @end: end virtual address to be remove from TLB
  * @cpu: the current cpu
  *
  * This is the entry point for initiating any UV global TLB shootdown.
@@ -1113,7 +1114,8 @@ const struct cpumask *uv_flush_tlb_others(const struct 
cpumask *cpumask,
 
record_send_statistics(stat, locals, hubs, remotes, bau_desc);
 
-   bau_desc-payload.address = start;
+   bau_desc-payload.start = start;
+   bau_desc-payload.end   = end;
bau_desc-payload.sending_cpu = cpu;
/*
 * uv_flush_send_and_wait returns 0 if all cpu's were messaged,

--
To unsubscribe from this list: send the line unsubscribe linux-kernel in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


apparent regressions from TLB range flushing page set

2012-08-20 Thread Jan Beulich
Alex,

without even having run that code yet, I think I see two bugs here,
both of which I'm pretty sure I pointed out at least once during the
review cycle:

For one, while TLB_FLUSH_ALL gets passed as 'end' argument to
flush_tlb_others(), the Xen code was made to check its 'start'
parameter.

Second, the UV code doesn't flush the full range at all, it simply
ignores its 'end' parameter (and hence also the "all" indicator).

While the Xen one is simple to fix, I have no clue what to do for
the UV code.

Jan

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


apparent regressions from TLB range flushing page set

2012-08-20 Thread Jan Beulich
Alex,

without even having run that code yet, I think I see two bugs here,
both of which I'm pretty sure I pointed out at least once during the
review cycle:

For one, while TLB_FLUSH_ALL gets passed as 'end' argument to
flush_tlb_others(), the Xen code was made to check its 'start'
parameter.

Second, the UV code doesn't flush the full range at all, it simply
ignores its 'end' parameter (and hence also the all indicator).

While the Xen one is simple to fix, I have no clue what to do for
the UV code.

Jan

--
To unsubscribe from this list: send the line unsubscribe linux-kernel in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/