| From stable-bounces@linux.kernel.org Fri Oct 12 14:48:02 2007 |
| From: Roland Dreier <rdreier@cisco.com> |
| Date: Fri, 12 Oct 2007 14:47:25 -0700 |
| Subject: IB/mthca: Use mmiowb() to avoid firmware commands getting jumbled up |
| To: stable@kernel.org |
| Message-ID: <adasl4gngya.fsf@cisco.com> |
| |
| From: Roland Dreier <rdreier@cisco.com> |
| |
| Upstream as 76d7cc0345a037e8eea426f8abc710abd22946dd |
| |
| Firmware commands are sent to the HCA by writing multiple words to a |
| command register block. Access to this block of registers is |
| serialized with a mutex. However, on large SGI systems, problems were |
| seen with multiple CPUs issuing FW commands at the same time, because |
| the writes to the register block may be reordered within the system |
| interconnect and reach the HCA in a different order than they were |
| issued (even with the mutex). Fix this by adding an mmiowb() before |
| dropping the mutex. |
| |
| Tested-by: Arthur Kepner <akepner@sgi.com> |
| Signed-off-by: Roland Dreier <rolandd@cisco.com> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de> |
| |
| --- |
| drivers/infiniband/hw/mthca/mthca_cmd.c | 6 ++++++ |
| 1 file changed, 6 insertions(+) |
| |
| --- a/drivers/infiniband/hw/mthca/mthca_cmd.c |
| +++ b/drivers/infiniband/hw/mthca/mthca_cmd.c |
| @@ -290,6 +290,12 @@ static int mthca_cmd_post(struct mthca_d |
| err = mthca_cmd_post_hcr(dev, in_param, out_param, in_modifier, |
| op_modifier, op, token, event); |
| |
| + /* |
| + * Make sure that our HCR writes don't get mixed in with |
| + * writes from another CPU starting a FW command. |
| + */ |
| + mmiowb(); |
| + |
| mutex_unlock(&dev->cmd.hcr_mutex); |
| return err; |
| } |