sgi-xp: move xpc_check_remote_hb() to support both SN2 and UV
Move xpc_check_remote_hb() so it can support both SN2 and UV. Signed-off-by: Dean Nelson <dcn@sgi.com> Cc: Jack Steiner <steiner@sgi.com> Cc: "Luck, Tony" <tony.luck@intel.com> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
This commit is contained in:
committed by
Linus Torvalds
parent
a812dcc3a2
commit
61deb86e98
@@ -632,7 +632,7 @@ extern void (*xpc_heartbeat_exit) (void);
|
|||||||
extern void (*xpc_increment_heartbeat) (void);
|
extern void (*xpc_increment_heartbeat) (void);
|
||||||
extern void (*xpc_offline_heartbeat) (void);
|
extern void (*xpc_offline_heartbeat) (void);
|
||||||
extern void (*xpc_online_heartbeat) (void);
|
extern void (*xpc_online_heartbeat) (void);
|
||||||
extern void (*xpc_check_remote_hb) (void);
|
extern enum xp_retval (*xpc_get_remote_heartbeat) (struct xpc_partition *);
|
||||||
extern enum xp_retval (*xpc_make_first_contact) (struct xpc_partition *);
|
extern enum xp_retval (*xpc_make_first_contact) (struct xpc_partition *);
|
||||||
extern u64 (*xpc_get_chctl_all_flags) (struct xpc_partition *);
|
extern u64 (*xpc_get_chctl_all_flags) (struct xpc_partition *);
|
||||||
extern enum xp_retval (*xpc_allocate_msgqueues) (struct xpc_channel *);
|
extern enum xp_retval (*xpc_allocate_msgqueues) (struct xpc_channel *);
|
||||||
|
@@ -178,7 +178,7 @@ void (*xpc_heartbeat_exit) (void);
|
|||||||
void (*xpc_increment_heartbeat) (void);
|
void (*xpc_increment_heartbeat) (void);
|
||||||
void (*xpc_offline_heartbeat) (void);
|
void (*xpc_offline_heartbeat) (void);
|
||||||
void (*xpc_online_heartbeat) (void);
|
void (*xpc_online_heartbeat) (void);
|
||||||
void (*xpc_check_remote_hb) (void);
|
enum xp_retval (*xpc_get_remote_heartbeat) (struct xpc_partition *part);
|
||||||
|
|
||||||
enum xp_retval (*xpc_make_first_contact) (struct xpc_partition *part);
|
enum xp_retval (*xpc_make_first_contact) (struct xpc_partition *part);
|
||||||
void (*xpc_notify_senders_of_disconnect) (struct xpc_channel *ch);
|
void (*xpc_notify_senders_of_disconnect) (struct xpc_channel *ch);
|
||||||
@@ -269,6 +269,38 @@ xpc_stop_hb_beater(void)
|
|||||||
xpc_heartbeat_exit();
|
xpc_heartbeat_exit();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* At periodic intervals, scan through all active partitions and ensure
|
||||||
|
* their heartbeat is still active. If not, the partition is deactivated.
|
||||||
|
*/
|
||||||
|
static void
|
||||||
|
xpc_check_remote_hb(void)
|
||||||
|
{
|
||||||
|
struct xpc_partition *part;
|
||||||
|
short partid;
|
||||||
|
enum xp_retval ret;
|
||||||
|
|
||||||
|
for (partid = 0; partid < xp_max_npartitions; partid++) {
|
||||||
|
|
||||||
|
if (xpc_exiting)
|
||||||
|
break;
|
||||||
|
|
||||||
|
if (partid == xp_partition_id)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
part = &xpc_partitions[partid];
|
||||||
|
|
||||||
|
if (part->act_state == XPC_P_INACTIVE ||
|
||||||
|
part->act_state == XPC_P_DEACTIVATING) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
ret = xpc_get_remote_heartbeat(part);
|
||||||
|
if (ret != xpSuccess)
|
||||||
|
XPC_DEACTIVATE_PARTITION(part, ret);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* This thread is responsible for nearly all of the partition
|
* This thread is responsible for nearly all of the partition
|
||||||
* activation/deactivation.
|
* activation/deactivation.
|
||||||
|
@@ -704,61 +704,37 @@ xpc_heartbeat_exit_sn2(void)
|
|||||||
xpc_offline_heartbeat_sn2();
|
xpc_offline_heartbeat_sn2();
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
static enum xp_retval
|
||||||
* At periodic intervals, scan through all active partitions and ensure
|
xpc_get_remote_heartbeat_sn2(struct xpc_partition *part)
|
||||||
* their heartbeat is still active. If not, the partition is deactivated.
|
|
||||||
*/
|
|
||||||
static void
|
|
||||||
xpc_check_remote_hb_sn2(void)
|
|
||||||
{
|
{
|
||||||
struct xpc_vars_sn2 *remote_vars;
|
struct xpc_vars_sn2 *remote_vars;
|
||||||
struct xpc_partition *part;
|
|
||||||
short partid;
|
|
||||||
enum xp_retval ret;
|
enum xp_retval ret;
|
||||||
|
|
||||||
remote_vars = (struct xpc_vars_sn2 *)xpc_remote_copy_buffer_sn2;
|
remote_vars = (struct xpc_vars_sn2 *)xpc_remote_copy_buffer_sn2;
|
||||||
|
|
||||||
for (partid = 0; partid < XP_MAX_NPARTITIONS_SN2; partid++) {
|
/* pull the remote vars structure that contains the heartbeat */
|
||||||
|
ret = xp_remote_memcpy(xp_pa(remote_vars),
|
||||||
|
part->sn.sn2.remote_vars_pa,
|
||||||
|
XPC_RP_VARS_SIZE);
|
||||||
|
if (ret != xpSuccess)
|
||||||
|
return ret;
|
||||||
|
|
||||||
if (xpc_exiting)
|
dev_dbg(xpc_part, "partid=%d, heartbeat=%ld, last_heartbeat=%ld, "
|
||||||
break;
|
"heartbeat_offline=%ld, HB_mask[0]=0x%lx\n", XPC_PARTID(part),
|
||||||
|
remote_vars->heartbeat, part->last_heartbeat,
|
||||||
if (partid == sn_partition_id)
|
remote_vars->heartbeat_offline,
|
||||||
continue;
|
remote_vars->heartbeating_to_mask[0]);
|
||||||
|
|
||||||
part = &xpc_partitions[partid];
|
|
||||||
|
|
||||||
if (part->act_state == XPC_P_INACTIVE ||
|
|
||||||
part->act_state == XPC_P_DEACTIVATING) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* pull the remote_hb cache line */
|
|
||||||
ret = xp_remote_memcpy(xp_pa(remote_vars),
|
|
||||||
part->sn.sn2.remote_vars_pa,
|
|
||||||
XPC_RP_VARS_SIZE);
|
|
||||||
if (ret != xpSuccess) {
|
|
||||||
XPC_DEACTIVATE_PARTITION(part, ret);
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
dev_dbg(xpc_part, "partid = %d, heartbeat = %ld, last_heartbeat"
|
|
||||||
" = %ld, heartbeat_offline = %ld, HB_mask[0] = 0x%lx\n",
|
|
||||||
partid, remote_vars->heartbeat, part->last_heartbeat,
|
|
||||||
remote_vars->heartbeat_offline,
|
|
||||||
remote_vars->heartbeating_to_mask[0]);
|
|
||||||
|
|
||||||
if (((remote_vars->heartbeat == part->last_heartbeat) &&
|
|
||||||
(remote_vars->heartbeat_offline == 0)) ||
|
|
||||||
!xpc_hb_allowed(sn_partition_id,
|
|
||||||
&remote_vars->heartbeating_to_mask)) {
|
|
||||||
|
|
||||||
XPC_DEACTIVATE_PARTITION(part, xpNoHeartbeat);
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
if ((remote_vars->heartbeat == part->last_heartbeat &&
|
||||||
|
remote_vars->heartbeat_offline == 0) ||
|
||||||
|
!xpc_hb_allowed(sn_partition_id,
|
||||||
|
&remote_vars->heartbeating_to_mask)) {
|
||||||
|
ret = xpNoHeartbeat;
|
||||||
|
} else {
|
||||||
part->last_heartbeat = remote_vars->heartbeat;
|
part->last_heartbeat = remote_vars->heartbeat;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@@ -2416,7 +2392,7 @@ xpc_init_sn2(void)
|
|||||||
xpc_online_heartbeat = xpc_online_heartbeat_sn2;
|
xpc_online_heartbeat = xpc_online_heartbeat_sn2;
|
||||||
xpc_heartbeat_init = xpc_heartbeat_init_sn2;
|
xpc_heartbeat_init = xpc_heartbeat_init_sn2;
|
||||||
xpc_heartbeat_exit = xpc_heartbeat_exit_sn2;
|
xpc_heartbeat_exit = xpc_heartbeat_exit_sn2;
|
||||||
xpc_check_remote_hb = xpc_check_remote_hb_sn2;
|
xpc_get_remote_heartbeat = xpc_get_remote_heartbeat_sn2;
|
||||||
|
|
||||||
xpc_request_partition_activation = xpc_request_partition_activation_sn2;
|
xpc_request_partition_activation = xpc_request_partition_activation_sn2;
|
||||||
xpc_request_partition_reactivation =
|
xpc_request_partition_reactivation =
|
||||||
|
Reference in New Issue
Block a user