From patchwork Sat Nov 22 00:34:13 2008 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Scott Feldman X-Patchwork-Id: 10172 X-Patchwork-Delegate: davem@davemloft.net Return-Path: X-Original-To: patchwork-incoming@ozlabs.org Delivered-To: patchwork-incoming@ozlabs.org Received: from vger.kernel.org (vger.kernel.org [209.132.176.167]) by ozlabs.org (Postfix) with ESMTP id D7838DDE04 for ; Sat, 22 Nov 2008 11:41:52 +1100 (EST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1754867AbYKVAlt (ORCPT ); Fri, 21 Nov 2008 19:41:49 -0500 Received: (majordomo@vger.kernel.org) by vger.kernel.org id S1754819AbYKVAls (ORCPT ); Fri, 21 Nov 2008 19:41:48 -0500 Received: from sj-iport-2.cisco.com ([171.71.176.71]:43497 "EHLO sj-iport-2.cisco.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1754722AbYKVAlq (ORCPT ); Fri, 21 Nov 2008 19:41:46 -0500 X-IronPort-AV: E=Sophos;i="4.33,647,1220227200"; d="scan'208";a="107902067" Received: from sj-dkim-2.cisco.com ([171.71.179.186]) by sj-iport-2.cisco.com with ESMTP; 22 Nov 2008 00:41:46 +0000 Received: from sj-core-1.cisco.com (sj-core-1.cisco.com [171.71.177.237]) by sj-dkim-2.cisco.com (8.12.11/8.12.11) with ESMTP id mAM0fkTW018466; Fri, 21 Nov 2008 16:41:46 -0800 Received: from palito_client100.nuovasystems.com (savbu-palito-client100.cisco.com [10.193.70.13]) by sj-core-1.cisco.com (8.13.8/8.13.8) with ESMTP id mAM0fkQt025943; Sat, 22 Nov 2008 00:41:46 GMT From: Scott Feldman Subject: [PATCH 4/5] enic: move wmb closer to where needed: before writing posted_index to hw To: jgarzik@pobox.com Cc: netdev@vger.kernel.org Date: Fri, 21 Nov 2008 16:34:13 -0800 Message-ID: <20081122003413.15540.83477.stgit@palito_client100.nuovasystems.com> In-Reply-To: <20081122003219.15540.26759.stgit@palito_client100.nuovasystems.com> References: <20081122003219.15540.26759.stgit@palito_client100.nuovasystems.com> User-Agent: StGIT/0.12.1 MIME-Version: 1.0 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; l=2363; t=1227314506; x=1228178506; c=relaxed/simple; s=sjdkim2002; h=Content-Type:From:Subject:Content-Transfer-Encoding:MIME-Version; d=cisco.com; i=scofeldm@cisco.com; z=From:=20Scott=20Feldman=20 |Subject:=20[PATCH=204/5]=20enic=3A=20move=20wmb=20closer=2 0to=20where=20needed=3A=20before=20writing=0A=09posted_index =20to=20hw |Sender:=20; bh=nchQYzetP3n3u3EwCLMJTKxFMHjHfVcRSYOngyvc7Ok=; b=psBfI1lVpO27wycVOT95ktWY1m6LBOYQFmQDKJTAOHj1yVvHlQPyL77r6r E/YJX4czcafn5oicw0X2N4f6JEvV9qrXz1ZRrUu15guqO/gjY+STHqw0jTDp f2MKHamiEi; Authentication-Results: sj-dkim-2; header.From=scofeldm@cisco.com; dkim=pass ( sig from cisco.com/sjdkim2002 verified; ); Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org enic: move wmb closer to where needed: before writing posted_index to hw Signed-off-by: Scott Feldman --- drivers/net/enic/enic_res.h | 4 ---- drivers/net/enic/vnic_rq.h | 9 ++++++++- drivers/net/enic/vnic_wq.h | 9 ++++++++- 3 files changed, 16 insertions(+), 6 deletions(-) -- To unsubscribe from this list: send the line "unsubscribe netdev" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html diff --git a/drivers/net/enic/enic_res.h b/drivers/net/enic/enic_res.h index 68534a2..7bf272f 100644 --- a/drivers/net/enic/enic_res.h +++ b/drivers/net/enic/enic_res.h @@ -58,8 +58,6 @@ static inline void enic_queue_wq_desc_ex(struct vnic_wq *wq, (u16)vlan_tag, 0 /* loopback */); - wmb(); - vnic_wq_post(wq, os_buf, dma_addr, len, sop, eop); } @@ -127,8 +125,6 @@ static inline void enic_queue_rq_desc(struct vnic_rq *rq, (u64)dma_addr | VNIC_PADDR_TARGET, type, (u16)len); - wmb(); - vnic_rq_post(rq, os_buf, os_buf_index, dma_addr, len); } diff --git a/drivers/net/enic/vnic_rq.h b/drivers/net/enic/vnic_rq.h index 82bfca6..fd0ef66 100644 --- a/drivers/net/enic/vnic_rq.h +++ b/drivers/net/enic/vnic_rq.h @@ -132,8 +132,15 @@ static inline void vnic_rq_post(struct vnic_rq *rq, #define VNIC_RQ_RETURN_RATE 0xf /* keep 2^n - 1 */ #endif - if ((buf->index & VNIC_RQ_RETURN_RATE) == 0) + if ((buf->index & VNIC_RQ_RETURN_RATE) == 0) { + /* Adding write memory barrier prevents compiler and/or CPU + * reordering, thus avoiding descriptor posting before + * descriptor is initialized. Otherwise, hardware can read + * stale descriptor fields. + */ + wmb(); iowrite32(buf->index, &rq->ctrl->posted_index); + } } static inline void vnic_rq_return_descs(struct vnic_rq *rq, unsigned int count) diff --git a/drivers/net/enic/vnic_wq.h b/drivers/net/enic/vnic_wq.h index 7081828..c826137 100644 --- a/drivers/net/enic/vnic_wq.h +++ b/drivers/net/enic/vnic_wq.h @@ -108,8 +108,15 @@ static inline void vnic_wq_post(struct vnic_wq *wq, buf->len = len; buf = buf->next; - if (eop) + if (eop) { + /* Adding write memory barrier prevents compiler and/or CPU + * reordering, thus avoiding descriptor posting before + * descriptor is initialized. Otherwise, hardware can read + * stale descriptor fields. + */ + wmb(); iowrite32(buf->index, &wq->ctrl->posted_index); + } wq->to_use = buf; wq->ring.desc_avail--;