|
@@ -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.
|
|
@@ -1056,7 +1057,7 @@ static int set_distrib_bits(struct cpumask *flush_mask, struct bau_control *bcp,
|
|
|
*/
|
|
|
const struct cpumask *uv_flush_tlb_others(const struct cpumask *cpumask,
|
|
|
struct mm_struct *mm, unsigned long start,
|
|
|
- unsigned end, unsigned int cpu)
|
|
|
+ unsigned long end, unsigned int cpu)
|
|
|
{
|
|
|
int locals = 0;
|
|
|
int remotes = 0;
|
|
@@ -1113,7 +1114,10 @@ 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;
|
|
|
+ if (!end || (end - start) <= PAGE_SIZE)
|
|
|
+ bau_desc->payload.address = start;
|
|
|
+ else
|
|
|
+ bau_desc->payload.address = TLB_FLUSH_ALL;
|
|
|
bau_desc->payload.sending_cpu = cpu;
|
|
|
/*
|
|
|
* uv_flush_send_and_wait returns 0 if all cpu's were messaged,
|