diff options
author | Dean Nelson <dcn@sgi.com> | 2005-12-22 15:32:56 -0500 |
---|---|---|
committer | Tony Luck <tony.luck@intel.com> | 2006-01-13 13:16:36 -0500 |
commit | 246c7e33d51afe99890b2caab7ad482c0296d5ba (patch) | |
tree | 20d96a5182dd5971d9d51d6626cf02d4a1c19c85 /arch/ia64 | |
parent | 7ae69d2aa4ed3ee8cef18a072346366f019d6a4a (diff) |
[IA64-SGI] ensure XPC disengage request is processed
This patch fixes a problem in XPC disengage processing whereby it was not
seeing the request to disengage from a remote partition, so the disengage
wasn't happening. The disengagement is suppose to transpire during the time
a XPC channel is disconnecting, and should be completed before the channel
is declared to be disconnected.
Signed-off-by: Dean Nelson <dcn@sgi.com>
Signed-off-by: Tony Luck <tony.luck@intel.com>
Diffstat (limited to 'arch/ia64')
-rw-r--r-- | arch/ia64/sn/kernel/xpc.h | 2 | ||||
-rw-r--r-- | arch/ia64/sn/kernel/xpc_channel.c | 20 | ||||
-rw-r--r-- | arch/ia64/sn/kernel/xpc_main.c | 2 | ||||
-rw-r--r-- | arch/ia64/sn/kernel/xpc_partition.c | 3 |
4 files changed, 16 insertions, 11 deletions
diff --git a/arch/ia64/sn/kernel/xpc.h b/arch/ia64/sn/kernel/xpc.h index 5483a9f227d4..66b17b6aa81f 100644 --- a/arch/ia64/sn/kernel/xpc.h +++ b/arch/ia64/sn/kernel/xpc.h | |||
@@ -707,7 +707,7 @@ extern void xpc_connected_callout(struct xpc_channel *); | |||
707 | extern void xpc_deliver_msg(struct xpc_channel *); | 707 | extern void xpc_deliver_msg(struct xpc_channel *); |
708 | extern void xpc_disconnect_channel(const int, struct xpc_channel *, | 708 | extern void xpc_disconnect_channel(const int, struct xpc_channel *, |
709 | enum xpc_retval, unsigned long *); | 709 | enum xpc_retval, unsigned long *); |
710 | extern void xpc_disconnecting_callout(struct xpc_channel *); | 710 | extern void xpc_disconnect_callout(struct xpc_channel *, enum xpc_retval); |
711 | extern void xpc_partition_going_down(struct xpc_partition *, enum xpc_retval); | 711 | extern void xpc_partition_going_down(struct xpc_partition *, enum xpc_retval); |
712 | extern void xpc_teardown_infrastructure(struct xpc_partition *); | 712 | extern void xpc_teardown_infrastructure(struct xpc_partition *); |
713 | 713 | ||
diff --git a/arch/ia64/sn/kernel/xpc_channel.c b/arch/ia64/sn/kernel/xpc_channel.c index abf4fc2a87bb..272ab4deb573 100644 --- a/arch/ia64/sn/kernel/xpc_channel.c +++ b/arch/ia64/sn/kernel/xpc_channel.c | |||
@@ -779,6 +779,12 @@ xpc_process_disconnect(struct xpc_channel *ch, unsigned long *irq_flags) | |||
779 | 779 | ||
780 | /* both sides are disconnected now */ | 780 | /* both sides are disconnected now */ |
781 | 781 | ||
782 | if (ch->flags & XPC_C_CONNECTCALLOUT) { | ||
783 | spin_unlock_irqrestore(&ch->lock, *irq_flags); | ||
784 | xpc_disconnect_callout(ch, xpcDisconnected); | ||
785 | spin_lock_irqsave(&ch->lock, *irq_flags); | ||
786 | } | ||
787 | |||
782 | /* it's now safe to free the channel's message queues */ | 788 | /* it's now safe to free the channel's message queues */ |
783 | xpc_free_msgqueues(ch); | 789 | xpc_free_msgqueues(ch); |
784 | 790 | ||
@@ -1645,7 +1651,7 @@ xpc_disconnect_channel(const int line, struct xpc_channel *ch, | |||
1645 | 1651 | ||
1646 | 1652 | ||
1647 | void | 1653 | void |
1648 | xpc_disconnecting_callout(struct xpc_channel *ch) | 1654 | xpc_disconnect_callout(struct xpc_channel *ch, enum xpc_retval reason) |
1649 | { | 1655 | { |
1650 | /* | 1656 | /* |
1651 | * Let the channel's registerer know that the channel is being | 1657 | * Let the channel's registerer know that the channel is being |
@@ -1654,15 +1660,13 @@ xpc_disconnecting_callout(struct xpc_channel *ch) | |||
1654 | */ | 1660 | */ |
1655 | 1661 | ||
1656 | if (ch->func != NULL) { | 1662 | if (ch->func != NULL) { |
1657 | dev_dbg(xpc_chan, "ch->func() called, reason=xpcDisconnecting," | 1663 | dev_dbg(xpc_chan, "ch->func() called, reason=%d, partid=%d, " |
1658 | " partid=%d, channel=%d\n", ch->partid, ch->number); | 1664 | "channel=%d\n", reason, ch->partid, ch->number); |
1659 | 1665 | ||
1660 | ch->func(xpcDisconnecting, ch->partid, ch->number, NULL, | 1666 | ch->func(reason, ch->partid, ch->number, NULL, ch->key); |
1661 | ch->key); | ||
1662 | 1667 | ||
1663 | dev_dbg(xpc_chan, "ch->func() returned, reason=" | 1668 | dev_dbg(xpc_chan, "ch->func() returned, reason=%d, partid=%d, " |
1664 | "xpcDisconnecting, partid=%d, channel=%d\n", | 1669 | "channel=%d\n", reason, ch->partid, ch->number); |
1665 | ch->partid, ch->number); | ||
1666 | } | 1670 | } |
1667 | } | 1671 | } |
1668 | 1672 | ||
diff --git a/arch/ia64/sn/kernel/xpc_main.c b/arch/ia64/sn/kernel/xpc_main.c index b617236524c6..6708ef6e0618 100644 --- a/arch/ia64/sn/kernel/xpc_main.c +++ b/arch/ia64/sn/kernel/xpc_main.c | |||
@@ -773,7 +773,7 @@ xpc_daemonize_kthread(void *args) | |||
773 | ch->flags |= XPC_C_DISCONNECTCALLOUT; | 773 | ch->flags |= XPC_C_DISCONNECTCALLOUT; |
774 | spin_unlock_irqrestore(&ch->lock, irq_flags); | 774 | spin_unlock_irqrestore(&ch->lock, irq_flags); |
775 | 775 | ||
776 | xpc_disconnecting_callout(ch); | 776 | xpc_disconnect_callout(ch, xpcDisconnecting); |
777 | } else { | 777 | } else { |
778 | spin_unlock_irqrestore(&ch->lock, irq_flags); | 778 | spin_unlock_irqrestore(&ch->lock, irq_flags); |
779 | } | 779 | } |
diff --git a/arch/ia64/sn/kernel/xpc_partition.c b/arch/ia64/sn/kernel/xpc_partition.c index cdd6431853a1..cf02a9bcd245 100644 --- a/arch/ia64/sn/kernel/xpc_partition.c +++ b/arch/ia64/sn/kernel/xpc_partition.c | |||
@@ -771,7 +771,8 @@ xpc_identify_act_IRQ_req(int nasid) | |||
771 | } | 771 | } |
772 | } | 772 | } |
773 | 773 | ||
774 | if (!xpc_partition_disengaged(part)) { | 774 | if (part->disengage_request_timeout > 0 && |
775 | !xpc_partition_disengaged(part)) { | ||
775 | /* still waiting on other side to disengage from us */ | 776 | /* still waiting on other side to disengage from us */ |
776 | return; | 777 | return; |
777 | } | 778 | } |