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
This commit is contained in:
commit
36450e9c95
@ -34,6 +34,7 @@
|
||||
*/
|
||||
|
||||
#define UV_ITEMS_PER_DESCRIPTOR 8
|
||||
/* the 'throttle' to prevent the hardware stay-busy bug */
|
||||
#define MAX_BAU_CONCURRENT 3
|
||||
#define UV_CPUS_PER_ACT_STATUS 32
|
||||
#define UV_ACT_STATUS_MASK 0x3
|
||||
@ -45,10 +46,26 @@
|
||||
#define UV_DESC_BASE_PNODE_SHIFT 49
|
||||
#define UV_PAYLOADQ_PNODE_SHIFT 49
|
||||
#define UV_PTC_BASENAME "sgi_uv/ptc_statistics"
|
||||
#define UV_BAU_BASENAME "sgi_uv/bau_tunables"
|
||||
#define UV_BAU_TUNABLES_DIR "sgi_uv"
|
||||
#define UV_BAU_TUNABLES_FILE "bau_tunables"
|
||||
#define WHITESPACE " \t\n"
|
||||
#define uv_physnodeaddr(x) ((__pa((unsigned long)(x)) & uv_mmask))
|
||||
#define UV_ENABLE_INTD_SOFT_ACK_MODE_SHIFT 15
|
||||
#define UV_INTD_SOFT_ACK_TIMEOUT_PERIOD_SHIFT 16
|
||||
#define UV_INTD_SOFT_ACK_TIMEOUT_PERIOD 0x000000000bUL
|
||||
#define UV_INTD_SOFT_ACK_TIMEOUT_PERIOD 0x0000000009UL
|
||||
/* [19:16] SOFT_ACK timeout period 19: 1 is urgency 7 17:16 1 is multiplier */
|
||||
#define BAU_MISC_CONTROL_MULT_MASK 3
|
||||
|
||||
#define UVH_AGING_PRESCALE_SEL 0x000000b000UL
|
||||
/* [30:28] URGENCY_7 an index into a table of times */
|
||||
#define BAU_URGENCY_7_SHIFT 28
|
||||
#define BAU_URGENCY_7_MASK 7
|
||||
|
||||
#define UVH_TRANSACTION_TIMEOUT 0x000000b200UL
|
||||
/* [45:40] BAU - BAU transaction timeout select - a multiplier */
|
||||
#define BAU_TRANS_SHIFT 40
|
||||
#define BAU_TRANS_MASK 0x3f
|
||||
|
||||
/*
|
||||
* bits in UVH_LB_BAU_SB_ACTIVATION_STATUS_0/1
|
||||
@ -59,24 +76,21 @@
|
||||
#define DESC_STATUS_SOURCE_TIMEOUT 3
|
||||
|
||||
/*
|
||||
* source side threshholds at which message retries print a warning
|
||||
* delay for 'plugged' timeout retries, in microseconds
|
||||
*/
|
||||
#define SOURCE_TIMEOUT_LIMIT 20
|
||||
#define DESTINATION_TIMEOUT_LIMIT 20
|
||||
|
||||
/*
|
||||
* misc. delays, in microseconds
|
||||
*/
|
||||
#define THROTTLE_DELAY 10
|
||||
#define TIMEOUT_DELAY 10
|
||||
#define BIOS_TO 1000
|
||||
/* BIOS is assumed to set the destination timeout to 1003520 nanoseconds */
|
||||
#define PLUGGED_DELAY 10
|
||||
|
||||
/*
|
||||
* threshholds at which to use IPI to free resources
|
||||
*/
|
||||
/* after this # consecutive 'plugged' timeouts, use IPI to release resources */
|
||||
#define PLUGSB4RESET 100
|
||||
#define TIMEOUTSB4RESET 100
|
||||
/* after this many consecutive timeouts, use IPI to release resources */
|
||||
#define TIMEOUTSB4RESET 1
|
||||
/* at this number uses of IPI to release resources, giveup the request */
|
||||
#define IPI_RESET_LIMIT 1
|
||||
/* after this # consecutive successes, bump up the throttle if it was lowered */
|
||||
#define COMPLETE_THRESHOLD 5
|
||||
|
||||
/*
|
||||
* number of entries in the destination side payload queue
|
||||
@ -95,6 +109,13 @@
|
||||
#define FLUSH_GIVEUP 3
|
||||
#define FLUSH_COMPLETE 4
|
||||
|
||||
/*
|
||||
* tuning the action when the numalink network is extremely delayed
|
||||
*/
|
||||
#define CONGESTED_RESPONSE_US 1000 /* 'long' response time, in microseconds */
|
||||
#define CONGESTED_REPS 10 /* long delays averaged over this many broadcasts */
|
||||
#define CONGESTED_PERIOD 30 /* time for the bau to be disabled, in seconds */
|
||||
|
||||
/*
|
||||
* Distribution: 32 bytes (256 bits) (bytes 0-0x1f of descriptor)
|
||||
* If the 'multilevel' flag in the header portion of the descriptor
|
||||
@ -300,37 +321,16 @@ struct bau_payload_queue_entry {
|
||||
/* bytes 24-31 */
|
||||
};
|
||||
|
||||
/*
|
||||
* one per-cpu; to locate the software tables
|
||||
*/
|
||||
struct bau_control {
|
||||
struct bau_desc *descriptor_base;
|
||||
struct msg_desc {
|
||||
struct bau_payload_queue_entry *msg;
|
||||
int msg_slot;
|
||||
int sw_ack_slot;
|
||||
struct bau_payload_queue_entry *va_queue_first;
|
||||
struct bau_payload_queue_entry *va_queue_last;
|
||||
struct bau_payload_queue_entry *bau_msg_head;
|
||||
struct bau_control *uvhub_master;
|
||||
struct bau_control *socket_master;
|
||||
unsigned long timeout_interval;
|
||||
atomic_t active_descriptor_count;
|
||||
int max_concurrent;
|
||||
int max_concurrent_constant;
|
||||
int retry_message_scans;
|
||||
int plugged_tries;
|
||||
int timeout_tries;
|
||||
int ipi_attempts;
|
||||
int conseccompletes;
|
||||
short cpu;
|
||||
short uvhub_cpu;
|
||||
short uvhub;
|
||||
short cpus_in_socket;
|
||||
short cpus_in_uvhub;
|
||||
unsigned short message_number;
|
||||
unsigned short uvhub_quiesce;
|
||||
short socket_acknowledge_count[DEST_Q_SIZE];
|
||||
cycles_t send_message;
|
||||
spinlock_t masks_lock;
|
||||
spinlock_t uvhub_lock;
|
||||
spinlock_t queue_lock;
|
||||
};
|
||||
|
||||
struct reset_args {
|
||||
int sender;
|
||||
};
|
||||
|
||||
/*
|
||||
@ -344,18 +344,25 @@ struct ptc_stats {
|
||||
unsigned long s_dtimeout; /* destination side timeouts */
|
||||
unsigned long s_time; /* time spent in sending side */
|
||||
unsigned long s_retriesok; /* successful retries */
|
||||
unsigned long s_ntargcpu; /* number of cpus targeted */
|
||||
unsigned long s_ntarguvhub; /* number of uvhubs targeted */
|
||||
unsigned long s_ntarguvhub16; /* number of times >= 16 target hubs */
|
||||
unsigned long s_ntarguvhub8; /* number of times >= 8 target hubs */
|
||||
unsigned long s_ntarguvhub4; /* number of times >= 4 target hubs */
|
||||
unsigned long s_ntarguvhub2; /* number of times >= 2 target hubs */
|
||||
unsigned long s_ntarguvhub1; /* number of times == 1 target hub */
|
||||
unsigned long s_ntargcpu; /* total number of cpu's targeted */
|
||||
unsigned long s_ntargself; /* times the sending cpu was targeted */
|
||||
unsigned long s_ntarglocals; /* targets of cpus on the local blade */
|
||||
unsigned long s_ntargremotes; /* targets of cpus on remote blades */
|
||||
unsigned long s_ntarglocaluvhub; /* targets of the local hub */
|
||||
unsigned long s_ntargremoteuvhub; /* remotes hubs targeted */
|
||||
unsigned long s_ntarguvhub; /* total number of uvhubs targeted */
|
||||
unsigned long s_ntarguvhub16; /* number of times target hubs >= 16*/
|
||||
unsigned long s_ntarguvhub8; /* number of times target hubs >= 8 */
|
||||
unsigned long s_ntarguvhub4; /* number of times target hubs >= 4 */
|
||||
unsigned long s_ntarguvhub2; /* number of times target hubs >= 2 */
|
||||
unsigned long s_ntarguvhub1; /* number of times target hubs == 1 */
|
||||
unsigned long s_resets_plug; /* ipi-style resets from plug state */
|
||||
unsigned long s_resets_timeout; /* ipi-style resets from timeouts */
|
||||
unsigned long s_busy; /* status stayed busy past s/w timer */
|
||||
unsigned long s_throttles; /* waits in throttle */
|
||||
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 */
|
||||
/* destination statistics */
|
||||
unsigned long d_alltlb; /* times all tlb's on this cpu were flushed */
|
||||
unsigned long d_onetlb; /* times just one tlb on this cpu was flushed */
|
||||
@ -370,6 +377,52 @@ struct ptc_stats {
|
||||
unsigned long d_rcanceled; /* number of messages canceled by resets */
|
||||
};
|
||||
|
||||
/*
|
||||
* one per-cpu; to locate the software tables
|
||||
*/
|
||||
struct bau_control {
|
||||
struct bau_desc *descriptor_base;
|
||||
struct bau_payload_queue_entry *va_queue_first;
|
||||
struct bau_payload_queue_entry *va_queue_last;
|
||||
struct bau_payload_queue_entry *bau_msg_head;
|
||||
struct bau_control *uvhub_master;
|
||||
struct bau_control *socket_master;
|
||||
struct ptc_stats *statp;
|
||||
unsigned long timeout_interval;
|
||||
unsigned long set_bau_on_time;
|
||||
atomic_t active_descriptor_count;
|
||||
int plugged_tries;
|
||||
int timeout_tries;
|
||||
int ipi_attempts;
|
||||
int conseccompletes;
|
||||
int baudisabled;
|
||||
int set_bau_off;
|
||||
short cpu;
|
||||
short uvhub_cpu;
|
||||
short uvhub;
|
||||
short cpus_in_socket;
|
||||
short cpus_in_uvhub;
|
||||
unsigned short message_number;
|
||||
unsigned short uvhub_quiesce;
|
||||
short socket_acknowledge_count[DEST_Q_SIZE];
|
||||
cycles_t send_message;
|
||||
spinlock_t uvhub_lock;
|
||||
spinlock_t queue_lock;
|
||||
/* tunables */
|
||||
int max_bau_concurrent;
|
||||
int max_bau_concurrent_constant;
|
||||
int plugged_delay;
|
||||
int plugsb4reset;
|
||||
int timeoutsb4reset;
|
||||
int ipi_reset_limit;
|
||||
int complete_threshold;
|
||||
int congested_response_us;
|
||||
int congested_reps;
|
||||
int congested_period;
|
||||
cycles_t period_time;
|
||||
long period_requests;
|
||||
};
|
||||
|
||||
static inline int bau_uvhub_isset(int uvhub, struct bau_target_uvhubmask *dstp)
|
||||
{
|
||||
return constant_test_bit(uvhub, &dstp->bits[0]);
|
||||
|
File diff suppressed because it is too large
Load Diff
Loading…
Reference in New Issue
Block a user