Commit 1ecaded8 authored by Dean Nelson's avatar Dean Nelson Committed by Tony Luck

[IA64-SGI] cleanup XPC disengage related messages

Cleanup the XPC disengage related messages that are printed to the log.
Signed-off-by: default avatarDean Nelson <dcn@sgi.com>
Signed-off-by: default avatarTony Luck <tony.luck@intel.com>
parent 246c7e33
...@@ -663,6 +663,7 @@ extern struct xpc_registration xpc_registrations[]; ...@@ -663,6 +663,7 @@ extern struct xpc_registration xpc_registrations[];
extern struct device *xpc_part; extern struct device *xpc_part;
extern struct device *xpc_chan; extern struct device *xpc_chan;
extern int xpc_disengage_request_timelimit; extern int xpc_disengage_request_timelimit;
extern int xpc_disengage_request_timedout;
extern irqreturn_t xpc_notify_IRQ_handler(int, void *, struct pt_regs *); extern irqreturn_t xpc_notify_IRQ_handler(int, void *, struct pt_regs *);
extern void xpc_dropped_IPI_check(struct xpc_partition *); extern void xpc_dropped_IPI_check(struct xpc_partition *);
extern void xpc_activate_partition(struct xpc_partition *); extern void xpc_activate_partition(struct xpc_partition *);
......
...@@ -162,6 +162,8 @@ static ctl_table xpc_sys_dir[] = { ...@@ -162,6 +162,8 @@ static ctl_table xpc_sys_dir[] = {
}; };
static struct ctl_table_header *xpc_sysctl; static struct ctl_table_header *xpc_sysctl;
/* non-zero if any remote partition disengage request was timed out */
int xpc_disengage_request_timedout;
/* #of IRQs received */ /* #of IRQs received */
static atomic_t xpc_act_IRQ_rcvd; static atomic_t xpc_act_IRQ_rcvd;
...@@ -921,9 +923,9 @@ static void ...@@ -921,9 +923,9 @@ static void
xpc_do_exit(enum xpc_retval reason) xpc_do_exit(enum xpc_retval reason)
{ {
partid_t partid; partid_t partid;
int active_part_count; int active_part_count, printed_waiting_msg = 0;
struct xpc_partition *part; struct xpc_partition *part;
unsigned long printmsg_time; unsigned long printmsg_time, disengage_request_timeout = 0;
/* a 'rmmod XPC' and a 'reboot' cannot both end up here together */ /* a 'rmmod XPC' and a 'reboot' cannot both end up here together */
...@@ -953,7 +955,8 @@ xpc_do_exit(enum xpc_retval reason) ...@@ -953,7 +955,8 @@ xpc_do_exit(enum xpc_retval reason)
/* wait for all partitions to become inactive */ /* wait for all partitions to become inactive */
printmsg_time = jiffies; printmsg_time = jiffies + (XPC_DISENGAGE_PRINTMSG_INTERVAL * HZ);
xpc_disengage_request_timedout = 0;
do { do {
active_part_count = 0; active_part_count = 0;
...@@ -969,20 +972,39 @@ xpc_do_exit(enum xpc_retval reason) ...@@ -969,20 +972,39 @@ xpc_do_exit(enum xpc_retval reason)
active_part_count++; active_part_count++;
XPC_DEACTIVATE_PARTITION(part, reason); XPC_DEACTIVATE_PARTITION(part, reason);
}
if (active_part_count == 0) { if (part->disengage_request_timeout >
break; disengage_request_timeout) {
disengage_request_timeout =
part->disengage_request_timeout;
}
} }
if (jiffies >= printmsg_time) { if (xpc_partition_engaged(-1UL)) {
dev_info(xpc_part, "waiting for partitions to " if (time_after(jiffies, printmsg_time)) {
"deactivate/disengage, active count=%d, remote " dev_info(xpc_part, "waiting for remote "
"engaged=0x%lx\n", active_part_count, "partitions to disengage, timeout in "
xpc_partition_engaged(1UL << partid)); "%ld seconds\n",
(disengage_request_timeout - jiffies)
/ HZ);
printmsg_time = jiffies + printmsg_time = jiffies +
(XPC_DISENGAGE_PRINTMSG_INTERVAL * HZ); (XPC_DISENGAGE_PRINTMSG_INTERVAL * HZ);
printed_waiting_msg = 1;
}
} else if (active_part_count > 0) {
if (printed_waiting_msg) {
dev_info(xpc_part, "waiting for local partition"
" to disengage\n");
printed_waiting_msg = 0;
}
} else {
if (!xpc_disengage_request_timedout) {
dev_info(xpc_part, "all partitions have "
"disengaged\n");
}
break;
} }
/* sleep for a 1/3 of a second or so */ /* sleep for a 1/3 of a second or so */
...@@ -1028,7 +1050,7 @@ xpc_die_disengage(void) ...@@ -1028,7 +1050,7 @@ xpc_die_disengage(void)
struct xpc_partition *part; struct xpc_partition *part;
partid_t partid; partid_t partid;
unsigned long engaged; unsigned long engaged;
long time, print_time, disengage_request_timeout; long time, printmsg_time, disengage_request_timeout;
/* keep xpc_hb_checker thread from doing anything (just in case) */ /* keep xpc_hb_checker thread from doing anything (just in case) */
...@@ -1055,24 +1077,43 @@ xpc_die_disengage(void) ...@@ -1055,24 +1077,43 @@ xpc_die_disengage(void)
} }
} }
print_time = rtc_time(); time = rtc_time();
disengage_request_timeout = print_time + printmsg_time = time +
(XPC_DISENGAGE_PRINTMSG_INTERVAL * sn_rtc_cycles_per_second);
disengage_request_timeout = time +
(xpc_disengage_request_timelimit * sn_rtc_cycles_per_second); (xpc_disengage_request_timelimit * sn_rtc_cycles_per_second);
/* wait for all other partitions to disengage from us */ /* wait for all other partitions to disengage from us */
while ((engaged = xpc_partition_engaged(-1UL)) && while (1) {
(time = rtc_time()) < disengage_request_timeout) { engaged = xpc_partition_engaged(-1UL);
if (!engaged) {
dev_info(xpc_part, "all partitions have disengaged\n");
break;
}
time = rtc_time();
if (time >= disengage_request_timeout) {
for (partid = 1; partid < XP_MAX_PARTITIONS; partid++) {
if (engaged & (1UL << partid)) {
dev_info(xpc_part, "disengage from "
"remote partition %d timed "
"out\n", partid);
}
}
break;
}
if (time >= print_time) { if (time >= printmsg_time) {
dev_info(xpc_part, "waiting for remote partitions to " dev_info(xpc_part, "waiting for remote partitions to "
"disengage, engaged=0x%lx\n", engaged); "disengage, timeout in %ld seconds\n",
print_time = time + (XPC_DISENGAGE_PRINTMSG_INTERVAL * (disengage_request_timeout - time) /
sn_rtc_cycles_per_second);
printmsg_time = time +
(XPC_DISENGAGE_PRINTMSG_INTERVAL *
sn_rtc_cycles_per_second); sn_rtc_cycles_per_second);
} }
} }
dev_info(xpc_part, "finished waiting for remote partitions to "
"disengage, engaged=0x%lx\n", engaged);
} }
......
...@@ -874,6 +874,9 @@ xpc_partition_disengaged(struct xpc_partition *part) ...@@ -874,6 +874,9 @@ xpc_partition_disengaged(struct xpc_partition *part)
* request in a timely fashion, so assume it's dead. * request in a timely fashion, so assume it's dead.
*/ */
dev_info(xpc_part, "disengage from remote partition %d "
"timed out\n", partid);
xpc_disengage_request_timedout = 1;
xpc_clear_partition_engaged(1UL << partid); xpc_clear_partition_engaged(1UL << partid);
disengaged = 1; disengaged = 1;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment