x86, UV2: BAU fixes for UV version 2
Subsystems (2)
cover x86, UV2: BAU fixes for UV version 2
Following are 6 patches for using SGI's Altix UV2's Broadcast Assist Unit for TLB shootdown.
The first 3 patches are very necessary to using the BAU on this new hardware. Number 3 is a large one.
The last 3 are not so vital, but fairly trivial.
All have been fully tested.
[PATCH 1/6] x86, UV2: use native UV2 broadcast mode
a new UV2 message format
[PATCH 2/6] x86, UV2: calc BAU destination timeout
a fix for timeout calculation
[PATCH 3/6] x86: workaround for UV2 BAU bug
workaround for a UV2 hardware bug
[PATCH 4/6] x86 UV2: remove no-resources test for UV2 BAU
remove an unneeded test
[PATCH 5/6] x86, UV2: ack BAU interrupt earlier
faster reaction to BAU interrupts
[PATCH 6/6] x86, UV2: accounting for BAU strong nacks
add 3 new statistics
Signature · 4 lines
Cliff Wickman SGI [email protected] (651) 683-3824
PATCH 1/6 x86, UV2: use native UV2 broadcast mode
Update the use of the Broadcast Assist Unit on SGI Altix UV2 to the use of native UV2 mode (not the legacy mode).
UV2 native mode has a different format for a broadcast message. We also need quick differentiaton between UV1 and UV2.
--- arch/x86/include/asm/uv/uv_bau.h | 93 ++++++++++++++++++++++++++++++++++++--- arch/x86/platform/uv/tlb_uv.c | 88 +++++++++++++++++++++++++++--------- 2 files changed, 151 insertions(+), 30 deletions(-)
arch/x86/include/asm/uv/uv_bau.h +86 -7
@@ -65,7 +65,7 @@* UV2: Bit 19 selects between * (0): 10 microsecond timebase and * (1): 80 microseconds -* we're using 655us, similar to UV1: 65 units of 10us +* we're using 560us, similar to UV1: 65 units of 10us */ #define UV1_INTD_SOFT_ACK_TIMEOUT_PERIOD (9UL)#define UV2_INTD_SOFT_ACK_TIMEOUT_PERIOD (15UL)
@@ -235,10 +235,10 @@ struct bau_msg_payload {/* -* Message header: 16 bytes (128 bits) (bytes 0x30-0x3f of descriptor) +* UV1 Message header: 16 bytes (128 bits) (bytes 0x30-0x3f of descriptor) * see table 4.2.3.0.1 in broacast_assist spec. */ -struct bau_msg_header { +struct uv1_bau_msg_header {unsigned int dest_subnodeid:6 ;/* must be 0x10, for the LB */ /* bits 5:0 */ unsigned int base_dest_nasid:15 ;/* nasid of the first bit */
@@ -318,19 +318,87 @@ struct bau_msg_header { };/* +* UV2 Message header: 16 bytes (128 bits) (bytes 0x30-0x3f of descriptor) +* see figure 9-2 of harp_sys.pdf +*/ +struct uv2_bau_msg_header { +unsigned int base_dest_nasid:15 ;/* nasid of the first bit */ +/* bits 14:0 */ /* in uvhub map */ +unsigned int dest_subnodeid:5 ;/* must be 0x10, for the LB */ +/* bits 19:15 */ +unsigned int rsvd_1:1 ;/* must be zero */ +/* bit 20 */ +/* Address bits 59:21 */ +/* bits 25:2 of address (44:21) are payload */ +/* these next 24 bits become bytes 12-14 of msg */ +/* bits 28:21 land in byte 12 */ +unsigned int replied_to:1 ;/* sent as 0 by the source to +byte 12 */ +/* bit 21 */ +unsigned int msg_type:3 ;/* software type of the +message */ +/* bits 24:22 */ +unsigned int canceled:1 ;/* message canceled, resource +is to be freed*/ +/* bit 25 */ +unsigned int payload_1:3 ;/* not currently used */ +/* bits 28:26 */ + +/* bits 36:29 land in byte 13 */ +unsigned int payload_2a:3 ;/* not currently used */ +unsigned int payload_2b:5 ;/* not currently used */ +/* bits 36:29 */ + +/* bits 44:37 land in byte 14 */ +unsigned int payload_3:8 ;/* not currently used */ +/* bits 44:37 */ + +unsigned int rsvd_2:7 ;/* reserved */ +/* bits 51:45 */ +unsigned int swack_flag:1 ;/* software acknowledge flag */ +/* bit 52 */ +unsigned int rsvd_3a:3 ;/* must be zero */ +unsigned int rsvd_3b:8 ;/* must be zero */ +unsigned int rsvd_3c:8 ;/* must be zero */ +unsigned int rsvd_3d:3 ;/* must be zero */ +/* bits 74:53 */ +unsigned int fairness:3 ;/* usually zero */ +/* bits 77:75 */ + +unsigned int sequence:16 ;/* message sequence number */ +/* bits 93:78 Suppl_A */ +unsigned int chaining:1 ;/* next descriptor is part of +this activation*/ +/* bit 94 */ +unsigned int multilevel:1 ;/* multi-level multicast +format */ +/* bit 95 */ +unsigned int rsvd_4:24 ;/* ordered / source node / +source subnode / aging +must be zero */ +/* bits 119:96 */ +unsigned int command:8 ;/* message type */ +/* bits 127:120 */ +}; + +/* * The activation descriptor: * The format of the message to send, plus all accompanying control * Should be 64 bytes */ struct bau_desc { -struct pnmask distribution; +struct pnmask distribution;/* * message template, consisting of header and payload: */ -struct bau_msg_header header; -struct bau_msg_payload payload; +union bau_msg_header { +struct uv1_bau_msg_header uv1_hdr; +struct uv2_bau_msg_header uv2_hdr; + } header; + +struct bau_msg_payload payload; }; -/* +/* UV1: * -payload-- ---------header------ * bytes 0-11 bits 41-56 bits 58-81 * A B (2) C (3)
@@ -340,6 +408,16 @@ struct bau_desc {* bytes 0-11 bytes 12-14 bytes 16-17 (byte 15 filled in by hw as vector) * ------------payload queue----------- */ +/* UV2: +* -payload-- ---------header------ +* bytes 0-11 bits 70-78 bits 21-44 +* A B (2) C (3) +* +* A/B/C are moved to: +* A C B +* bytes 0-11 bytes 12-14 bytes 16-17 (byte 15 filled in by hw as vector) +* ------------payload queue----------- +*/ /* * The payload queue on the destination side is an array of these.
@@ -511,6 +589,7 @@ struct bau_control {short osnode;short uvhub_cpu;short uvhub; +short uvhub_version;short cpus_in_socket;short cpus_in_uvhub;short partition_base_pnode;
arch/x86/platform/uv/tlb_uv.c +65 -23
167 lines not on this page · raw message
[tip:x86/urgent] x86/UV2: Fix new UV2 hardware by using native UV2 broadcast mode
Commit-ID: da87c937e5a2374686edd58df06cfd5050b125fa Gitweb: http://git.kernel.org/tip/da87c937e5a2374686edd58df06cfd5050b125fa Author: Cliff Wickman <[email protected]> AuthorDate: Mon, 16 Jan 2012 15:17:50 -0600 Committer: Ingo Molnar <[email protected]> CommitDate: Tue, 17 Jan 2012 09:09:51 +0100
x86/UV2: Fix new UV2 hardware by using native UV2 broadcast mode
Update the use of the Broadcast Assist Unit on SGI Altix UV2 to the use of native UV2 mode on new hardware (not the legacy mode).
UV2 native mode has a different format for a broadcast message. We also need quick differentiaton between UV1 and UV2.
--- arch/x86/include/asm/uv/uv_bau.h | 93 +++++++++++++++++++++++++++++++++++--- arch/x86/platform/uv/tlb_uv.c | 88 ++++++++++++++++++++++++++--------- 2 files changed, 151 insertions(+), 30 deletions(-)
arch/x86/include/asm/uv/uv_bau.h +86 -7
@@ -65,7 +65,7 @@* UV2: Bit 19 selects between * (0): 10 microsecond timebase and * (1): 80 microseconds -* we're using 655us, similar to UV1: 65 units of 10us +* we're using 560us, similar to UV1: 65 units of 10us */ #define UV1_INTD_SOFT_ACK_TIMEOUT_PERIOD (9UL)#define UV2_INTD_SOFT_ACK_TIMEOUT_PERIOD (15UL)
@@ -235,10 +235,10 @@ struct bau_msg_payload {/* -* Message header: 16 bytes (128 bits) (bytes 0x30-0x3f of descriptor) +* UV1 Message header: 16 bytes (128 bits) (bytes 0x30-0x3f of descriptor) * see table 4.2.3.0.1 in broacast_assist spec. */ -struct bau_msg_header { +struct uv1_bau_msg_header {unsigned int dest_subnodeid:6 ;/* must be 0x10, for the LB */ /* bits 5:0 */ unsigned int base_dest_nasid:15 ;/* nasid of the first bit */
@@ -318,19 +318,87 @@ struct bau_msg_header { };/* +* UV2 Message header: 16 bytes (128 bits) (bytes 0x30-0x3f of descriptor) +* see figure 9-2 of harp_sys.pdf +*/ +struct uv2_bau_msg_header { +unsigned int base_dest_nasid:15 ;/* nasid of the first bit */ +/* bits 14:0 */ /* in uvhub map */ +unsigned int dest_subnodeid:5 ;/* must be 0x10, for the LB */ +/* bits 19:15 */ +unsigned int rsvd_1:1 ;/* must be zero */ +/* bit 20 */ +/* Address bits 59:21 */ +/* bits 25:2 of address (44:21) are payload */ +/* these next 24 bits become bytes 12-14 of msg */ +/* bits 28:21 land in byte 12 */ +unsigned int replied_to:1 ;/* sent as 0 by the source to +byte 12 */ +/* bit 21 */ +unsigned int msg_type:3 ;/* software type of the +message */ +/* bits 24:22 */ +unsigned int canceled:1 ;/* message canceled, resource +is to be freed*/ +/* bit 25 */ +unsigned int payload_1:3 ;/* not currently used */ +/* bits 28:26 */ + +/* bits 36:29 land in byte 13 */ +unsigned int payload_2a:3 ;/* not currently used */ +unsigned int payload_2b:5 ;/* not currently used */ +/* bits 36:29 */ + +/* bits 44:37 land in byte 14 */ +unsigned int payload_3:8 ;/* not currently used */ +/* bits 44:37 */ + +unsigned int rsvd_2:7 ;/* reserved */ +/* bits 51:45 */ +unsigned int swack_flag:1 ;/* software acknowledge flag */ +/* bit 52 */ +unsigned int rsvd_3a:3 ;/* must be zero */ +unsigned int rsvd_3b:8 ;/* must be zero */ +unsigned int rsvd_3c:8 ;/* must be zero */ +unsigned int rsvd_3d:3 ;/* must be zero */ +/* bits 74:53 */ +unsigned int fairness:3 ;/* usually zero */ +/* bits 77:75 */ + +unsigned int sequence:16 ;/* message sequence number */ +/* bits 93:78 Suppl_A */ +unsigned int chaining:1 ;/* next descriptor is part of +this activation*/ +/* bit 94 */ +unsigned int multilevel:1 ;/* multi-level multicast +format */ +/* bit 95 */ +unsigned int rsvd_4:24 ;/* ordered / source node / +source subnode / aging +must be zero */ +/* bits 119:96 */ +unsigned int command:8 ;/* message type */ +/* bits 127:120 */ +}; + +/* * The activation descriptor: * The format of the message to send, plus all accompanying control * Should be 64 bytes */ struct bau_desc { -struct pnmask distribution; +struct pnmask distribution;/* * message template, consisting of header and payload: */ -struct bau_msg_header header; -struct bau_msg_payload payload; +union bau_msg_header { +struct uv1_bau_msg_header uv1_hdr; +struct uv2_bau_msg_header uv2_hdr; + } header; + +struct bau_msg_payload payload; }; -/* +/* UV1: * -payload-- ---------header------ * bytes 0-11 bits 41-56 bits 58-81 * A B (2) C (3)
@@ -340,6 +408,16 @@ struct bau_desc {* bytes 0-11 bytes 12-14 bytes 16-17 (byte 15 filled in by hw as vector) * ------------payload queue----------- */ +/* UV2: +* -payload-- ---------header------ +* bytes 0-11 bits 70-78 bits 21-44 +* A B (2) C (3) +* +* A/B/C are moved to: +* A C B +* bytes 0-11 bytes 12-14 bytes 16-17 (byte 15 filled in by hw as vector) +* ------------payload queue----------- +*/ /* * The payload queue on the destination side is an array of these.
@@ -511,6 +589,7 @@ struct bau_control {short osnode;short uvhub_cpu;short uvhub; +short uvhub_version;short cpus_in_socket;short cpus_in_uvhub;short partition_base_pnode;
arch/x86/platform/uv/tlb_uv.c +65 -23
167 lines not on this page · raw message
PATCH 2/6 x86, UV2: calc BAU destination timeout
In reply to Cliff WickmanMove the call to enable_timeouts() forward so that BAU_MISC_CONTROL is initialized before using it in calculate_destination_timeout().
Fix the calculation of a BAU destination timeout for UV2 (in calculate_destination_timeout()).
--- arch/x86/platform/uv/tlb_uv.c | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-)
arch/x86/platform/uv/tlb_uv.c +7 -6
@@ -1617,14 +1617,14 @@ static int calculate_destination_timeout ts_ns = base * mult1 * mult2; ret = ts_ns /1000 ; }else { -/* 4 bits 0/1 for 10/80us, 3 bits of multiplier */ - mmr_image =uv_read_local_mmr (UVH_AGING_PRESCALE_SEL ); +/* 4 bits 0/1 for 10/80us base, 3 bits of multiplier */ + mmr_image =uv_read_local_mmr (UVH_LB_BAU_MISC_CONTROL ); mmr_image = (mmr_image &UV_SA_MASK ) >>UV_SA_SHFT ;if (mmr_image & (1L <<UV2_ACK_UNITS_SHFT )) - mult1 =80 ; + base =80 ;else - mult1 =10 ; - base = mmr_image &UV2_ACK_MASK ; + base =10 ; + mult1 = mmr_image &UV2_ACK_MASK ; ret = mult1 * base; }return ret;
@@ -1886,6 +1886,8 @@ static int __init uv_bau_init(void) uv_base_pnode =uv_blade_to_pnode (uvhub); } +enable_timeouts (); +if (init_per_cpu (nuvhubs, uv_base_pnode)) { nobau =1 ;return 0 ;
@@ -1896,7 +1898,6 @@ static int __init uv_bau_init(void)if (uv_blade_nr_possible_cpus (uvhub))init_uvhub (uvhub, vector, uv_base_pnode); -enable_timeouts ();alloc_intr_gate (vector, uv_bau_message_intr1);for_each_possible_blade (uvhub) {
[tip:x86/urgent] x86/UV2: Fix BAU destination timeout initialization
Commit-ID: d059f9fa84a30e04279c6ff615e9e2cf3b260191 Gitweb: http://git.kernel.org/tip/d059f9fa84a30e04279c6ff615e9e2cf3b260191 Author: Cliff Wickman <[email protected]> AuthorDate: Mon, 16 Jan 2012 15:18:48 -0600 Committer: Ingo Molnar <[email protected]> CommitDate: Tue, 17 Jan 2012 09:09:53 +0100
x86/UV2: Fix BAU destination timeout initialization
Move the call to enable_timeouts() forward so that BAU_MISC_CONTROL is initialized before using it in calculate_destination_timeout().
Fix the calculation of a BAU destination timeout for UV2 (in calculate_destination_timeout()).
--- arch/x86/platform/uv/tlb_uv.c | 13 +++++++------ 1 files changed, 7 insertions(+), 6 deletions(-)
arch/x86/platform/uv/tlb_uv.c +7 -6
@@ -1617,14 +1617,14 @@ static int calculate_destination_timeout(void) ts_ns = base * mult1 * mult2; ret = ts_ns /1000 ; }else { -/* 4 bits 0/1 for 10/80us, 3 bits of multiplier */ - mmr_image =uv_read_local_mmr (UVH_AGING_PRESCALE_SEL ); +/* 4 bits 0/1 for 10/80us base, 3 bits of multiplier */ + mmr_image =uv_read_local_mmr (UVH_LB_BAU_MISC_CONTROL ); mmr_image = (mmr_image &UV_SA_MASK ) >>UV_SA_SHFT ;if (mmr_image & (1L <<UV2_ACK_UNITS_SHFT )) - mult1 =80 ; + base =80 ;else - mult1 =10 ; - base = mmr_image &UV2_ACK_MASK ; + base =10 ; + mult1 = mmr_image &UV2_ACK_MASK ; ret = mult1 * base; }return ret;
@@ -1886,6 +1886,8 @@ static int __init uv_bau_init(void) uv_base_pnode =uv_blade_to_pnode (uvhub); } +enable_timeouts (); +if (init_per_cpu (nuvhubs, uv_base_pnode)) { nobau =1 ;return 0 ;
@@ -1896,7 +1898,6 @@ static int __init uv_bau_init(void)if (uv_blade_nr_possible_cpus (uvhub))init_uvhub (uvhub, vector, uv_base_pnode); -enable_timeouts ();alloc_intr_gate (vector, uv_bau_message_intr1);for_each_possible_blade (uvhub) {
PATCH 3/6 x86: workaround for UV2 BAU bug
In reply to Cliff WickmanThis patch implements a workaround for a UV2 hardware bug.
The bug is a non-atomic update of a memory-mapped register. When hardware message delivery and software message acknowledge occur simultaneously the pending message acknowledge for the arriving message may be lost. This causes the sender's message status to stay busy.
Part of the workaround is to not acknowledge a completed message until it is verified that no other message is actually using the resource that is mistakenly recorded in the completed message.
Part of the workaround is to test for long elapsed time in such a busy condition, then handle it by using a spare sending descriptor. The stay-busy condition is eventually timed out by hardware, and then the original sending descriptor can be re-used.
Most of that logic change is in keeping track of the current descriptor and the state of the spares.
The occurrences of the workaround are added to the BAU statistics.
--- arch/x86/include/asm/uv/uv_bau.h | 13 + arch/x86/platform/uv/tlb_uv.c | 274 ++++++++++++++++++++++++++++++++++----- 2 files changed, 254 insertions(+), 33 deletions(-)
arch/x86/include/asm/uv/uv_bau.h +12 -1
@@ -167,6 +167,7 @@#define FLUSH_RETRY_TIMEOUT 2#define FLUSH_GIVEUP 3#define FLUSH_COMPLETE 4 +#define FLUSH_RETRY_BUSYBUG 5/* * tuning the action when the numalink network is extremely delayed
@@ -463,7 +464,6 @@ struct bau_pq_entry {struct msg_desc {struct bau_pq_entry *msg;int msg_slot; -int swack_slot;struct bau_pq_entry *queue_first;struct bau_pq_entry *queue_last; };
@@ -517,6 +517,9 @@ struct ptc_stats {unsigned long s_retry_messages;/* retry broadcasts */ unsigned long s_bau_reenabled;/* for bau enable/disable */ unsigned long s_bau_disabled;/* for bau enable/disable */ +unsigned long s_uv2_wars;/* uv2 workaround, perm. busy */ +unsigned long s_uv2_wars_hw;/* uv2 workaround, hiwater */ +unsigned long s_uv2_war_waits;/* uv2 workaround, long waits */ /* destination statistics */ unsigned long d_alltlb;/* times all tlb's on this cpu were flushed */
@@ -593,6 +596,8 @@ struct bau_control {short cpus_in_socket;short cpus_in_uvhub;short partition_base_pnode; +short using_desc;/* an index, like uvhub_cpu */ +unsigned int inuse_map;unsigned short message_number;unsigned short uvhub_quiesce;short socket_acknowledge_count[DEST_Q_SIZE ];
@@ -610,6 +615,7 @@ struct bau_control {int cong_response_us;int cong_reps;int cong_period; +unsigned long clocks_per_100_usec;cycles_t period_time;long period_requests;struct hub_and_pnode *thp;
@@ -670,6 +676,11 @@ static inline void write_mmr_sw_ack(unsiuv_write_local_mmr (UVH_LB_BAU_INTD_SOFTWARE_ACKNOWLEDGE_ALIAS , mr); } +static inline void write_gmmr_sw_ack (int pnode,unsigned long mr) +{ +write_gmmr (pnode,UVH_LB_BAU_INTD_SOFTWARE_ACKNOWLEDGE_ALIAS , mr); +} +static inline unsigned long read_mmr_sw_ack (void ) {return read_lmmr (UVH_LB_BAU_INTD_SOFTWARE_ACKNOWLEDGE );
arch/x86/platform/uv/tlb_uv.c +242 -32
447 lines not on this page · raw message
[tip:x86/urgent] x86/UV2: Work around BAU bug
Commit-ID: c5d35d399e685acccc85a675e8765c26b2a9813a Gitweb: http://git.kernel.org/tip/c5d35d399e685acccc85a675e8765c26b2a9813a Author: Cliff Wickman <[email protected]> AuthorDate: Mon, 16 Jan 2012 15:19:47 -0600 Committer: Ingo Molnar <[email protected]> CommitDate: Tue, 17 Jan 2012 09:09:54 +0100
x86/UV2: Work around BAU bug
This patch implements a workaround for a UV2 hardware bug. The bug is a non-atomic update of a memory-mapped register. When hardware message delivery and software message acknowledge occur simultaneously the pending message acknowledge for the arriving message may be lost. This causes the sender's message status to stay busy.
Part of the workaround is to not acknowledge a completed message until it is verified that no other message is actually using the resource that is mistakenly recorded in the completed message.
Part of the workaround is to test for long elapsed time in such a busy condition, then handle it by using a spare sending descriptor. The stay-busy condition is eventually timed out by hardware, and then the original sending descriptor can be re-used. Most of that logic change is in keeping track of the current descriptor and the state of the spares.
The occurrences of the workaround are added to the BAU statistics.
--- arch/x86/include/asm/uv/uv_bau.h | 13 ++- arch/x86/platform/uv/tlb_uv.c | 274 +++++++++++++++++++++++++++++++++----- 2 files changed, 254 insertions(+), 33 deletions(-)
arch/x86/include/asm/uv/uv_bau.h +12 -1
@@ -167,6 +167,7 @@#define FLUSH_RETRY_TIMEOUT 2#define FLUSH_GIVEUP 3#define FLUSH_COMPLETE 4 +#define FLUSH_RETRY_BUSYBUG 5/* * tuning the action when the numalink network is extremely delayed
@@ -463,7 +464,6 @@ struct bau_pq_entry {struct msg_desc {struct bau_pq_entry *msg;int msg_slot; -int swack_slot;struct bau_pq_entry *queue_first;struct bau_pq_entry *queue_last; };
@@ -517,6 +517,9 @@ struct ptc_stats {unsigned long s_retry_messages;/* retry broadcasts */ unsigned long s_bau_reenabled;/* for bau enable/disable */ unsigned long s_bau_disabled;/* for bau enable/disable */ +unsigned long s_uv2_wars;/* uv2 workaround, perm. busy */ +unsigned long s_uv2_wars_hw;/* uv2 workaround, hiwater */ +unsigned long s_uv2_war_waits;/* uv2 workaround, long waits */ /* destination statistics */ unsigned long d_alltlb;/* times all tlb's on this cpu were flushed */
@@ -593,6 +596,8 @@ struct bau_control {short cpus_in_socket;short cpus_in_uvhub;short partition_base_pnode; +short using_desc;/* an index, like uvhub_cpu */ +unsigned int inuse_map;unsigned short message_number;unsigned short uvhub_quiesce;short socket_acknowledge_count[DEST_Q_SIZE ];
@@ -610,6 +615,7 @@ struct bau_control {int cong_response_us;int cong_reps;int cong_period; +unsigned long clocks_per_100_usec;cycles_t period_time;long period_requests;struct hub_and_pnode *thp;
@@ -670,6 +676,11 @@ static inline void write_mmr_sw_ack(unsigned long mr)uv_write_local_mmr (UVH_LB_BAU_INTD_SOFTWARE_ACKNOWLEDGE_ALIAS , mr); } +static inline void write_gmmr_sw_ack (int pnode,unsigned long mr) +{ +write_gmmr (pnode,UVH_LB_BAU_INTD_SOFTWARE_ACKNOWLEDGE_ALIAS , mr); +} +static inline unsigned long read_mmr_sw_ack (void ) {return read_lmmr (UVH_LB_BAU_INTD_SOFTWARE_ACKNOWLEDGE );
arch/x86/platform/uv/tlb_uv.c +242 -32
447 lines not on this page · raw message
PATCH 4/6 x86 UV2: remove no-resources test for UV2 BAU
In reply to Cliff WickmanThis patch removes an unnecessary test for a no-destination-resources-available condition that looks like a destination timeout in UV1, but is separately distinguishable in UV2.
--- arch/x86/platform/uv/tlb_uv.c | 10 ---------- 1 file changed, 10 deletions(-)
arch/x86/platform/uv/tlb_uv.c +0 -10
@@ -642,16 +642,6 @@ static int uv2_wait_completion(struct ba }else if (descriptor_stat ==UV2H_DESC_DEST_TIMEOUT ) { stat->s_dtimeout++; ttm =get_cycles (); -/* -* Our retries may be blocked by all destination -* swack resources being consumed, and a timeout -* pending. In that case hardware returns the -* ERROR that looks like a destination timeout. -*/ -if (cycles_2_us (ttm - bcp->send_message) < timeout_us) { - bcp->conseccompletes =0 ; -return FLUSH_RETRY_PLUGGED ; - } bcp->conseccompletes =0 ;return FLUSH_RETRY_TIMEOUT ; }else {
[tip:x86/urgent] x86/UV2: Remove stale no-resources test for UV2 BAU
Commit-ID: 478c6e529e7bd7c6ef8994c55bd252c287c35893 Gitweb: http://git.kernel.org/tip/478c6e529e7bd7c6ef8994c55bd252c287c35893 Author: Cliff Wickman <[email protected]> AuthorDate: Mon, 16 Jan 2012 15:20:50 -0600 Committer: Ingo Molnar <[email protected]> CommitDate: Tue, 17 Jan 2012 09:09:56 +0100
x86/UV2: Remove stale no-resources test for UV2 BAU
This patch removes an unnecessary test for a no-destination-resources-available condition that looks like a destination timeout in UV1, but is separately distinguishable in UV2.
--- arch/x86/platform/uv/tlb_uv.c | 10 ---------- 1 files changed, 0 insertions(+), 10 deletions(-)
arch/x86/platform/uv/tlb_uv.c +0 -10
@@ -642,16 +642,6 @@ static int uv2_wait_completion(struct bau_desc *bau_desc, }else if (descriptor_stat ==UV2H_DESC_DEST_TIMEOUT ) { stat->s_dtimeout++; ttm =get_cycles (); -/* -* Our retries may be blocked by all destination -* swack resources being consumed, and a timeout -* pending. In that case hardware returns the -* ERROR that looks like a destination timeout. -*/ -if (cycles_2_us (ttm - bcp->send_message) < timeout_us) { - bcp->conseccompletes =0 ; -return FLUSH_RETRY_PLUGGED ; - } bcp->conseccompletes =0 ;return FLUSH_RETRY_TIMEOUT ; }else {
PATCH 5/6 x86, UV2: ack BAU interrupt earlier
In reply to Cliff WickmanThis patch moves the ack of the BAU interrupt to the beginning of the interrupt handler so that there is less possibility of a lost interrupt and slower response to a shootdown message.
--- arch/x86/platform/uv/tlb_uv.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-)
arch/x86/platform/uv/tlb_uv.c +1 -2
@@ -1218,6 +1218,7 @@ void uv_bau_message_interrupt(struct pt_struct ptc_stats *stat;struct msg_desc msgdesc; +ack_APIC_irq (); time_start =get_cycles (); bcp = &per_cpu (bau_control,smp_processor_id ());
@@ -1247,8 +1248,6 @@ void uv_bau_message_interrupt(struct pt_ stat->d_nomsg++; else if (count > 1) stat->d_multmsg++; - - ack_APIC_irq(); }/*
[tip:x86/urgent] x86/UV2: Ack BAU interrupt earlier
Commit-ID: 88ed9dd7f63c3ae71c1984d99ee2dced0b386dea Gitweb: http://git.kernel.org/tip/88ed9dd7f63c3ae71c1984d99ee2dced0b386dea Author: Cliff Wickman <[email protected]> AuthorDate: Mon, 16 Jan 2012 15:21:46 -0600 Committer: Ingo Molnar <[email protected]> CommitDate: Tue, 17 Jan 2012 09:09:57 +0100
x86/UV2: Ack BAU interrupt earlier
This patch moves the ack of the BAU interrupt to the beginning of the interrupt handler so that there is less possibility of a lost interrupt and slower response to a shootdown message.
--- arch/x86/platform/uv/tlb_uv.c | 3 +-- 1 files changed, 1 insertions(+), 2 deletions(-)
arch/x86/platform/uv/tlb_uv.c +1 -2
@@ -1218,6 +1218,7 @@ void uv_bau_message_interrupt(struct pt_regs *regs)struct ptc_stats *stat;struct msg_desc msgdesc; +ack_APIC_irq (); time_start =get_cycles (); bcp = &per_cpu (bau_control,smp_processor_id ());
@@ -1247,8 +1248,6 @@ void uv_bau_message_interrupt(struct pt_regs *regs) stat->d_nomsg++; else if (count > 1) stat->d_multmsg++; - - ack_APIC_irq(); }/*
PATCH 6/6 x86, UV2: accounting for BAU strong nacks
In reply to Cliff WickmanThis patch adds separate accounting of UV2 message "strong nack's" in the BAU statistics.
--- arch/x86/include/asm/uv/uv_bau.h | 1 + arch/x86/platform/uv/tlb_uv.c | 12 +++++++----- 2 files changed, 8 insertions(+), 5 deletions(-)
arch/x86/include/asm/uv/uv_bau.h +1 -0
@@ -483,6 +483,7 @@ struct ptc_stats {requests */ unsigned long s_stimeout;/* source side timeouts */ unsigned long s_dtimeout;/* destination side timeouts */ +unsigned long s_strongnacks;/* number of strong nack's */ unsigned long s_time;/* time spent in sending side */ unsigned long s_retriesok;/* successful retries */ unsigned long s_ntargcpu;/* total number of cpu's
arch/x86/platform/uv/tlb_uv.c +7 -5
@@ -635,13 +635,15 @@ static int uv2_wait_completion(struct ba* our message and its state will stay IDLE. */ if ((descriptor_stat ==UV2H_DESC_SOURCE_TIMEOUT ) || - (descriptor_stat ==UV2H_DESC_DEST_STRONG_NACK ) || (descriptor_stat ==UV2H_DESC_DEST_PUT_ERR )) { stat->s_stimeout++;return FLUSH_GIVEUP ; + }else if (descriptor_stat ==UV2H_DESC_DEST_STRONG_NACK ) { + stat->s_strongnacks++; + bcp->conseccompletes =0 ; +return FLUSH_GIVEUP ; }else if (descriptor_stat ==UV2H_DESC_DEST_TIMEOUT ) { stat->s_dtimeout++; - ttm =get_cycles (); bcp->conseccompletes =0 ;return FLUSH_RETRY_TIMEOUT ; }else {
@@ -1346,7 +1348,7 @@ static int ptc_seq_show(struct seq_fileseq_printf (file,"remotehub numuvhubs numuvhubs16 numuvhubs8 " );seq_printf (file, -"numuvhubs4 numuvhubs2 numuvhubs1 dto retries rok " ); +"numuvhubs4 numuvhubs2 numuvhubs1 dto snacks retries rok " );seq_printf (file,"resetp resett giveup sto bz throt swack recv rtime " ); seq_printf(file,
@@ -1364,10 +1366,10 @@ static int ptc_seq_show(struct seq_file stat->s_ntargremotes, stat->s_ntargcpu, stat->s_ntarglocaluvhub, stat->s_ntargremoteuvhub, stat->s_ntarguvhub, stat->s_ntarguvhub16); -seq_printf (file,"%ld %ld %ld %ld %ld " , +seq_printf (file,"%ld %ld %ld %ld %ld %ld " , stat->s_ntarguvhub8, stat->s_ntarguvhub4, stat->s_ntarguvhub2, stat->s_ntarguvhub1, - stat->s_dtimeout); + stat->s_dtimeout, stat->s_strongnacks); seq_printf(file, "%ld %ld %ld %ld %ld %ld %ld %ld ", stat->s_retry_messages, stat->s_retriesok, stat->s_resets_plug, stat->s_resets_timeout,
[tip:x86/urgent] x86/UV2: Add accounting for BAU strong nacks
Commit-ID: b54bd9be35f4084edb3eb9ee054a43f722a67483 Gitweb: http://git.kernel.org/tip/b54bd9be35f4084edb3eb9ee054a43f722a67483 Author: Cliff Wickman <[email protected]> AuthorDate: Mon, 16 Jan 2012 15:22:38 -0600 Committer: Ingo Molnar <[email protected]> CommitDate: Tue, 17 Jan 2012 09:09:59 +0100
x86/UV2: Add accounting for BAU strong nacks
This patch adds separate accounting of UV2 message "strong nack's" in the BAU statistics.
--- arch/x86/include/asm/uv/uv_bau.h | 1 + arch/x86/platform/uv/tlb_uv.c | 12 +++++++----- 2 files changed, 8 insertions(+), 5 deletions(-)
arch/x86/include/asm/uv/uv_bau.h +1 -0
@@ -483,6 +483,7 @@ struct ptc_stats {requests */ unsigned long s_stimeout;/* source side timeouts */ unsigned long s_dtimeout;/* destination side timeouts */ +unsigned long s_strongnacks;/* number of strong nack's */ unsigned long s_time;/* time spent in sending side */ unsigned long s_retriesok;/* successful retries */ unsigned long s_ntargcpu;/* total number of cpu's
arch/x86/platform/uv/tlb_uv.c +7 -5
@@ -635,13 +635,15 @@ static int uv2_wait_completion(struct bau_desc *bau_desc,* our message and its state will stay IDLE. */ if ((descriptor_stat ==UV2H_DESC_SOURCE_TIMEOUT ) || - (descriptor_stat ==UV2H_DESC_DEST_STRONG_NACK ) || (descriptor_stat ==UV2H_DESC_DEST_PUT_ERR )) { stat->s_stimeout++;return FLUSH_GIVEUP ; + }else if (descriptor_stat ==UV2H_DESC_DEST_STRONG_NACK ) { + stat->s_strongnacks++; + bcp->conseccompletes =0 ; +return FLUSH_GIVEUP ; }else if (descriptor_stat ==UV2H_DESC_DEST_TIMEOUT ) { stat->s_dtimeout++; - ttm =get_cycles (); bcp->conseccompletes =0 ;return FLUSH_RETRY_TIMEOUT ; }else {
@@ -1346,7 +1348,7 @@ static int ptc_seq_show(struct seq_file *file, void *data)seq_printf (file,"remotehub numuvhubs numuvhubs16 numuvhubs8 " );seq_printf (file, -"numuvhubs4 numuvhubs2 numuvhubs1 dto retries rok " ); +"numuvhubs4 numuvhubs2 numuvhubs1 dto snacks retries rok " );seq_printf (file,"resetp resett giveup sto bz throt swack recv rtime " ); seq_printf(file,
@@ -1364,10 +1366,10 @@ static int ptc_seq_show(struct seq_file *file, void *data) stat->s_ntargremotes, stat->s_ntargcpu, stat->s_ntarglocaluvhub, stat->s_ntargremoteuvhub, stat->s_ntarguvhub, stat->s_ntarguvhub16); -seq_printf (file,"%ld %ld %ld %ld %ld " , +seq_printf (file,"%ld %ld %ld %ld %ld %ld " , stat->s_ntarguvhub8, stat->s_ntarguvhub4, stat->s_ntarguvhub2, stat->s_ntarguvhub1, - stat->s_dtimeout); + stat->s_dtimeout, stat->s_strongnacks); seq_printf(file, "%ld %ld %ld %ld %ld %ld %ld %ld ", stat->s_retry_messages, stat->s_retriesok, stat->s_resets_plug, stat->s_resets_timeout,
Quoted 5 lines · Cliff Wickman
Following are 6 patches for using SGI's Altix UV2's Broadcast Assist Unit for TLB shootdown.
The first 3 patches are very necessary to using the BAU on this new hardware. Number 3 is a large one.
Note that when patches are fixing hardware support it's better to name them accordingly. I changed all the commit titles to reflect this fact.
I also added a Cc: stable backporting tag to the first three commits, they only affect UV code and it's useful to have a uniform hw platform driver across the stable kernels.
Thanks,
Ingo