diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2010-08-13 13:38:37 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2010-08-13 13:38:37 -0400 |
commit | 36450e9c953b2a6838def5945de8ae508141e834 (patch) | |
tree | 13657a037a6f41bb915f5700a6b590bbe27ea167 /arch/x86/include | |
parent | 2f2c779583e9646097b57599f8efeb8eca7bd654 (diff) | |
parent | 93a7ca0c3ebe5d931126f1fb732cb9c4518383d4 (diff) |
Merge branch 'x86-uv-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/linux-2.6-tip
* 'x86-uv-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/linux-2.6-tip:
x86, UV: Initialize BAU MMRs only on hubs with cpus
x86, UV: Modularize BAU send and wait
x86, UV: BAU broadcast to the local hub
x86, UV: Correct BAU regular message type
x86, UV: Remove BAU check for stay-busy
x86, UV: Correct BAU discovery of hubs and sockets
x86, UV: Correct BAU software acknowledge
x86, UV: BAU structure rearranging
x86, UV: Shorten access to BAU statistics structure
x86, UV: Disable BAU on network congestion
x86, UV: BAU tunables into a debugfs file
x86, UV: Calculate BAU destination timeout
Diffstat (limited to 'arch/x86/include')
-rw-r--r-- | arch/x86/include/asm/uv/uv_bau.h | 151 |
1 files changed, 102 insertions, 49 deletions
diff --git a/arch/x86/include/asm/uv/uv_bau.h b/arch/x86/include/asm/uv/uv_bau.h index aa558ac0306e..42d412fd8b02 100644 --- a/arch/x86/include/asm/uv/uv_bau.h +++ b/arch/x86/include/asm/uv/uv_bau.h | |||
@@ -34,6 +34,7 @@ | |||
34 | */ | 34 | */ |
35 | 35 | ||
36 | #define UV_ITEMS_PER_DESCRIPTOR 8 | 36 | #define UV_ITEMS_PER_DESCRIPTOR 8 |
37 | /* the 'throttle' to prevent the hardware stay-busy bug */ | ||
37 | #define MAX_BAU_CONCURRENT 3 | 38 | #define MAX_BAU_CONCURRENT 3 |
38 | #define UV_CPUS_PER_ACT_STATUS 32 | 39 | #define UV_CPUS_PER_ACT_STATUS 32 |
39 | #define UV_ACT_STATUS_MASK 0x3 | 40 | #define UV_ACT_STATUS_MASK 0x3 |
@@ -45,10 +46,26 @@ | |||
45 | #define UV_DESC_BASE_PNODE_SHIFT 49 | 46 | #define UV_DESC_BASE_PNODE_SHIFT 49 |
46 | #define UV_PAYLOADQ_PNODE_SHIFT 49 | 47 | #define UV_PAYLOADQ_PNODE_SHIFT 49 |
47 | #define UV_PTC_BASENAME "sgi_uv/ptc_statistics" | 48 | #define UV_PTC_BASENAME "sgi_uv/ptc_statistics" |
49 | #define UV_BAU_BASENAME "sgi_uv/bau_tunables" | ||
50 | #define UV_BAU_TUNABLES_DIR "sgi_uv" | ||
51 | #define UV_BAU_TUNABLES_FILE "bau_tunables" | ||
52 | #define WHITESPACE " \t\n" | ||
48 | #define uv_physnodeaddr(x) ((__pa((unsigned long)(x)) & uv_mmask)) | 53 | #define uv_physnodeaddr(x) ((__pa((unsigned long)(x)) & uv_mmask)) |
49 | #define UV_ENABLE_INTD_SOFT_ACK_MODE_SHIFT 15 | 54 | #define UV_ENABLE_INTD_SOFT_ACK_MODE_SHIFT 15 |
50 | #define UV_INTD_SOFT_ACK_TIMEOUT_PERIOD_SHIFT 16 | 55 | #define UV_INTD_SOFT_ACK_TIMEOUT_PERIOD_SHIFT 16 |
51 | #define UV_INTD_SOFT_ACK_TIMEOUT_PERIOD 0x000000000bUL | 56 | #define UV_INTD_SOFT_ACK_TIMEOUT_PERIOD 0x0000000009UL |
57 | /* [19:16] SOFT_ACK timeout period 19: 1 is urgency 7 17:16 1 is multiplier */ | ||
58 | #define BAU_MISC_CONTROL_MULT_MASK 3 | ||
59 | |||
60 | #define UVH_AGING_PRESCALE_SEL 0x000000b000UL | ||
61 | /* [30:28] URGENCY_7 an index into a table of times */ | ||
62 | #define BAU_URGENCY_7_SHIFT 28 | ||
63 | #define BAU_URGENCY_7_MASK 7 | ||
64 | |||
65 | #define UVH_TRANSACTION_TIMEOUT 0x000000b200UL | ||
66 | /* [45:40] BAU - BAU transaction timeout select - a multiplier */ | ||
67 | #define BAU_TRANS_SHIFT 40 | ||
68 | #define BAU_TRANS_MASK 0x3f | ||
52 | 69 | ||
53 | /* | 70 | /* |
54 | * bits in UVH_LB_BAU_SB_ACTIVATION_STATUS_0/1 | 71 | * bits in UVH_LB_BAU_SB_ACTIVATION_STATUS_0/1 |
@@ -59,24 +76,21 @@ | |||
59 | #define DESC_STATUS_SOURCE_TIMEOUT 3 | 76 | #define DESC_STATUS_SOURCE_TIMEOUT 3 |
60 | 77 | ||
61 | /* | 78 | /* |
62 | * source side threshholds at which message retries print a warning | 79 | * delay for 'plugged' timeout retries, in microseconds |
63 | */ | ||
64 | #define SOURCE_TIMEOUT_LIMIT 20 | ||
65 | #define DESTINATION_TIMEOUT_LIMIT 20 | ||
66 | |||
67 | /* | ||
68 | * misc. delays, in microseconds | ||
69 | */ | 80 | */ |
70 | #define THROTTLE_DELAY 10 | 81 | #define PLUGGED_DELAY 10 |
71 | #define TIMEOUT_DELAY 10 | ||
72 | #define BIOS_TO 1000 | ||
73 | /* BIOS is assumed to set the destination timeout to 1003520 nanoseconds */ | ||
74 | 82 | ||
75 | /* | 83 | /* |
76 | * threshholds at which to use IPI to free resources | 84 | * threshholds at which to use IPI to free resources |
77 | */ | 85 | */ |
86 | /* after this # consecutive 'plugged' timeouts, use IPI to release resources */ | ||
78 | #define PLUGSB4RESET 100 | 87 | #define PLUGSB4RESET 100 |
79 | #define TIMEOUTSB4RESET 100 | 88 | /* after this many consecutive timeouts, use IPI to release resources */ |
89 | #define TIMEOUTSB4RESET 1 | ||
90 | /* at this number uses of IPI to release resources, giveup the request */ | ||
91 | #define IPI_RESET_LIMIT 1 | ||
92 | /* after this # consecutive successes, bump up the throttle if it was lowered */ | ||
93 | #define COMPLETE_THRESHOLD 5 | ||
80 | 94 | ||
81 | /* | 95 | /* |
82 | * number of entries in the destination side payload queue | 96 | * number of entries in the destination side payload queue |
@@ -96,6 +110,13 @@ | |||
96 | #define FLUSH_COMPLETE 4 | 110 | #define FLUSH_COMPLETE 4 |
97 | 111 | ||
98 | /* | 112 | /* |
113 | * tuning the action when the numalink network is extremely delayed | ||
114 | */ | ||
115 | #define CONGESTED_RESPONSE_US 1000 /* 'long' response time, in microseconds */ | ||
116 | #define CONGESTED_REPS 10 /* long delays averaged over this many broadcasts */ | ||
117 | #define CONGESTED_PERIOD 30 /* time for the bau to be disabled, in seconds */ | ||
118 | |||
119 | /* | ||
99 | * Distribution: 32 bytes (256 bits) (bytes 0-0x1f of descriptor) | 120 | * Distribution: 32 bytes (256 bits) (bytes 0-0x1f of descriptor) |
100 | * If the 'multilevel' flag in the header portion of the descriptor | 121 | * If the 'multilevel' flag in the header portion of the descriptor |
101 | * has been set to 0, then endpoint multi-unicast mode is selected. | 122 | * has been set to 0, then endpoint multi-unicast mode is selected. |
@@ -300,37 +321,16 @@ struct bau_payload_queue_entry { | |||
300 | /* bytes 24-31 */ | 321 | /* bytes 24-31 */ |
301 | }; | 322 | }; |
302 | 323 | ||
303 | /* | 324 | struct msg_desc { |
304 | * one per-cpu; to locate the software tables | 325 | struct bau_payload_queue_entry *msg; |
305 | */ | 326 | int msg_slot; |
306 | struct bau_control { | 327 | int sw_ack_slot; |
307 | struct bau_desc *descriptor_base; | ||
308 | struct bau_payload_queue_entry *va_queue_first; | 328 | struct bau_payload_queue_entry *va_queue_first; |
309 | struct bau_payload_queue_entry *va_queue_last; | 329 | struct bau_payload_queue_entry *va_queue_last; |
310 | struct bau_payload_queue_entry *bau_msg_head; | 330 | }; |
311 | struct bau_control *uvhub_master; | 331 | |
312 | struct bau_control *socket_master; | 332 | struct reset_args { |
313 | unsigned long timeout_interval; | 333 | int sender; |
314 | atomic_t active_descriptor_count; | ||
315 | int max_concurrent; | ||
316 | int max_concurrent_constant; | ||
317 | int retry_message_scans; | ||
318 | int plugged_tries; | ||
319 | int timeout_tries; | ||
320 | int ipi_attempts; | ||
321 | int conseccompletes; | ||
322 | short cpu; | ||
323 | short uvhub_cpu; | ||
324 | short uvhub; | ||
325 | short cpus_in_socket; | ||
326 | short cpus_in_uvhub; | ||
327 | unsigned short message_number; | ||
328 | unsigned short uvhub_quiesce; | ||
329 | short socket_acknowledge_count[DEST_Q_SIZE]; | ||
330 | cycles_t send_message; | ||
331 | spinlock_t masks_lock; | ||
332 | spinlock_t uvhub_lock; | ||
333 | spinlock_t queue_lock; | ||
334 | }; | 334 | }; |
335 | 335 | ||
336 | /* | 336 | /* |
@@ -344,18 +344,25 @@ struct ptc_stats { | |||
344 | unsigned long s_dtimeout; /* destination side timeouts */ | 344 | unsigned long s_dtimeout; /* destination side timeouts */ |
345 | unsigned long s_time; /* time spent in sending side */ | 345 | unsigned long s_time; /* time spent in sending side */ |
346 | unsigned long s_retriesok; /* successful retries */ | 346 | unsigned long s_retriesok; /* successful retries */ |
347 | unsigned long s_ntargcpu; /* number of cpus targeted */ | 347 | unsigned long s_ntargcpu; /* total number of cpu's targeted */ |
348 | unsigned long s_ntarguvhub; /* number of uvhubs targeted */ | 348 | unsigned long s_ntargself; /* times the sending cpu was targeted */ |
349 | unsigned long s_ntarguvhub16; /* number of times >= 16 target hubs */ | 349 | unsigned long s_ntarglocals; /* targets of cpus on the local blade */ |
350 | unsigned long s_ntarguvhub8; /* number of times >= 8 target hubs */ | 350 | unsigned long s_ntargremotes; /* targets of cpus on remote blades */ |
351 | unsigned long s_ntarguvhub4; /* number of times >= 4 target hubs */ | 351 | unsigned long s_ntarglocaluvhub; /* targets of the local hub */ |
352 | unsigned long s_ntarguvhub2; /* number of times >= 2 target hubs */ | 352 | unsigned long s_ntargremoteuvhub; /* remotes hubs targeted */ |
353 | unsigned long s_ntarguvhub1; /* number of times == 1 target hub */ | 353 | unsigned long s_ntarguvhub; /* total number of uvhubs targeted */ |
354 | unsigned long s_ntarguvhub16; /* number of times target hubs >= 16*/ | ||
355 | unsigned long s_ntarguvhub8; /* number of times target hubs >= 8 */ | ||
356 | unsigned long s_ntarguvhub4; /* number of times target hubs >= 4 */ | ||
357 | unsigned long s_ntarguvhub2; /* number of times target hubs >= 2 */ | ||
358 | unsigned long s_ntarguvhub1; /* number of times target hubs == 1 */ | ||
354 | unsigned long s_resets_plug; /* ipi-style resets from plug state */ | 359 | unsigned long s_resets_plug; /* ipi-style resets from plug state */ |
355 | unsigned long s_resets_timeout; /* ipi-style resets from timeouts */ | 360 | unsigned long s_resets_timeout; /* ipi-style resets from timeouts */ |
356 | unsigned long s_busy; /* status stayed busy past s/w timer */ | 361 | unsigned long s_busy; /* status stayed busy past s/w timer */ |
357 | unsigned long s_throttles; /* waits in throttle */ | 362 | unsigned long s_throttles; /* waits in throttle */ |
358 | unsigned long s_retry_messages; /* retry broadcasts */ | 363 | unsigned long s_retry_messages; /* retry broadcasts */ |
364 | unsigned long s_bau_reenabled; /* for bau enable/disable */ | ||
365 | unsigned long s_bau_disabled; /* for bau enable/disable */ | ||
359 | /* destination statistics */ | 366 | /* destination statistics */ |
360 | unsigned long d_alltlb; /* times all tlb's on this cpu were flushed */ | 367 | unsigned long d_alltlb; /* times all tlb's on this cpu were flushed */ |
361 | unsigned long d_onetlb; /* times just one tlb on this cpu was flushed */ | 368 | unsigned long d_onetlb; /* times just one tlb on this cpu was flushed */ |
@@ -370,6 +377,52 @@ struct ptc_stats { | |||
370 | unsigned long d_rcanceled; /* number of messages canceled by resets */ | 377 | unsigned long d_rcanceled; /* number of messages canceled by resets */ |
371 | }; | 378 | }; |
372 | 379 | ||
380 | /* | ||
381 | * one per-cpu; to locate the software tables | ||
382 | */ | ||
383 | struct bau_control { | ||
384 | struct bau_desc *descriptor_base; | ||
385 | struct bau_payload_queue_entry *va_queue_first; | ||
386 | struct bau_payload_queue_entry *va_queue_last; | ||
387 | struct bau_payload_queue_entry *bau_msg_head; | ||
388 | struct bau_control *uvhub_master; | ||
389 | struct bau_control *socket_master; | ||
390 | struct ptc_stats *statp; | ||
391 | unsigned long timeout_interval; | ||
392 | unsigned long set_bau_on_time; | ||
393 | atomic_t active_descriptor_count; | ||
394 | int plugged_tries; | ||
395 | int timeout_tries; | ||
396 | int ipi_attempts; | ||
397 | int conseccompletes; | ||
398 | int baudisabled; | ||
399 | int set_bau_off; | ||
400 | short cpu; | ||
401 | short uvhub_cpu; | ||
402 | short uvhub; | ||
403 | short cpus_in_socket; | ||
404 | short cpus_in_uvhub; | ||
405 | unsigned short message_number; | ||
406 | unsigned short uvhub_quiesce; | ||
407 | short socket_acknowledge_count[DEST_Q_SIZE]; | ||
408 | cycles_t send_message; | ||
409 | spinlock_t uvhub_lock; | ||
410 | spinlock_t queue_lock; | ||
411 | /* tunables */ | ||
412 | int max_bau_concurrent; | ||
413 | int max_bau_concurrent_constant; | ||
414 | int plugged_delay; | ||
415 | int plugsb4reset; | ||
416 | int timeoutsb4reset; | ||
417 | int ipi_reset_limit; | ||
418 | int complete_threshold; | ||
419 | int congested_response_us; | ||
420 | int congested_reps; | ||
421 | int congested_period; | ||
422 | cycles_t period_time; | ||
423 | long period_requests; | ||
424 | }; | ||
425 | |||
373 | static inline int bau_uvhub_isset(int uvhub, struct bau_target_uvhubmask *dstp) | 426 | static inline int bau_uvhub_isset(int uvhub, struct bau_target_uvhubmask *dstp) |
374 | { | 427 | { |
375 | return constant_test_bit(uvhub, &dstp->bits[0]); | 428 | return constant_test_bit(uvhub, &dstp->bits[0]); |