From owner-svn-src-user@FreeBSD.ORG Fri Dec 28 22:18:42 2012 Return-Path: Delivered-To: svn-src-user@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [69.147.83.52]) by hub.freebsd.org (Postfix) with ESMTP id B577DD6A; Fri, 28 Dec 2012 22:18:42 +0000 (UTC) (envelope-from attilio@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:1900:2254:2068::e6a:0]) by mx1.freebsd.org (Postfix) with ESMTP id 9927D8FC0A; Fri, 28 Dec 2012 22:18:42 +0000 (UTC) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.5/8.14.5) with ESMTP id qBSMIgPo015063; Fri, 28 Dec 2012 22:18:42 GMT (envelope-from attilio@svn.freebsd.org) Received: (from attilio@localhost) by svn.freebsd.org (8.14.5/8.14.5/Submit) id qBSMIfX2015054; Fri, 28 Dec 2012 22:18:41 GMT (envelope-from attilio@svn.freebsd.org) Message-Id: <201212282218.qBSMIfX2015054@svn.freebsd.org> From: Attilio Rao Date: Fri, 28 Dec 2012 22:18:41 +0000 (UTC) To: src-committers@freebsd.org, svn-src-user@freebsd.org Subject: svn commit: r244793 - in user/attilio/membarclean/dev: drm drm2 netmap virtio X-SVN-Group: user MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-BeenThere: svn-src-user@freebsd.org X-Mailman-Version: 2.1.14 Precedence: list List-Id: "SVN commit messages for the experimental " user" src tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Fri, 28 Dec 2012 22:18:42 -0000 Author: attilio Date: Fri Dec 28 22:18:41 2012 New Revision: 244793 URL: http://svnweb.freebsd.org/changeset/base/244793 Log: - Remove rmb() usage from netmap and replace it with intended operation to do actual memory fetching reads. - GC unused DRM_WRITEMEMORYBARRIER() from drm and drm2. - Use atomic_load_acq_*() in virtio and drm2 in places that don't need to use rmb(). All these changes remove completely rmb() from MI code, with the exception of cxgbe which will be hammered in a followup commit. Modified: user/attilio/membarclean/dev/drm/drmP.h user/attilio/membarclean/dev/drm2/drmP.h user/attilio/membarclean/dev/drm2/drm_atomic.h user/attilio/membarclean/dev/drm2/drm_irq.c user/attilio/membarclean/dev/netmap/netmap.c user/attilio/membarclean/dev/virtio/virtqueue.c Modified: user/attilio/membarclean/dev/drm/drmP.h ============================================================================== --- user/attilio/membarclean/dev/drm/drmP.h Fri Dec 28 22:06:50 2012 (r244792) +++ user/attilio/membarclean/dev/drm/drmP.h Fri Dec 28 22:18:41 2012 (r244793) @@ -241,11 +241,9 @@ typedef u_int32_t u32; typedef u_int16_t u16; typedef u_int8_t u8; -/* DRM_READMEMORYBARRIER() prevents reordering of reads. - * DRM_WRITEMEMORYBARRIER() prevents reordering of writes. +/* DRM_WRITEMEMORYBARRIER() prevents reordering of writes. * DRM_MEMORYBARRIER() prevents reordering of reads and writes. */ -#define DRM_READMEMORYBARRIER() rmb() #define DRM_WRITEMEMORYBARRIER() wmb() #define DRM_MEMORYBARRIER() mb() Modified: user/attilio/membarclean/dev/drm2/drmP.h ============================================================================== --- user/attilio/membarclean/dev/drm2/drmP.h Fri Dec 28 22:06:50 2012 (r244792) +++ user/attilio/membarclean/dev/drm2/drmP.h Fri Dec 28 22:18:41 2012 (r244793) @@ -263,11 +263,9 @@ typedef int32_t s32; typedef int16_t s16; typedef int8_t s8; -/* DRM_READMEMORYBARRIER() prevents reordering of reads. - * DRM_WRITEMEMORYBARRIER() prevents reordering of writes. +/* DRM_WRITEMEMORYBARRIER() prevents reordering of writes. * DRM_MEMORYBARRIER() prevents reordering of reads and writes. */ -#define DRM_READMEMORYBARRIER() rmb() #define DRM_WRITEMEMORYBARRIER() wmb() #define DRM_MEMORYBARRIER() mb() Modified: user/attilio/membarclean/dev/drm2/drm_atomic.h ============================================================================== --- user/attilio/membarclean/dev/drm2/drm_atomic.h Fri Dec 28 22:06:50 2012 (r244792) +++ user/attilio/membarclean/dev/drm2/drm_atomic.h Fri Dec 28 22:18:41 2012 (r244793) @@ -38,6 +38,7 @@ typedef u_int32_t atomic_t; #define atomic_set(p, v) (*(p) = (v)) #define atomic_read(p) (*(p)) +#define atomic_read_acq(p) atomic_load_acq_int(p) #define atomic_inc(p) atomic_add_int(p, 1) #define atomic_dec(p) atomic_subtract_int(p, 1) #define atomic_add(n, p) atomic_add_int(p, n) Modified: user/attilio/membarclean/dev/drm2/drm_irq.c ============================================================================== --- user/attilio/membarclean/dev/drm2/drm_irq.c Fri Dec 28 22:06:50 2012 (r244792) +++ user/attilio/membarclean/dev/drm2/drm_irq.c Fri Dec 28 22:18:41 2012 (r244793) @@ -701,8 +701,7 @@ u32 drm_vblank_count_and_time(struct drm do { cur_vblank = atomic_read(&dev->_vblank_count[crtc]); *vblanktime = vblanktimestamp(dev, crtc, cur_vblank); - rmb(); - } while (cur_vblank != atomic_read(&dev->_vblank_count[crtc])); + } while (cur_vblank != atomic_read_acq(&dev->_vblank_count[crtc])); return cur_vblank; } Modified: user/attilio/membarclean/dev/netmap/netmap.c ============================================================================== --- user/attilio/membarclean/dev/netmap/netmap.c Fri Dec 28 22:06:50 2012 (r244792) +++ user/attilio/membarclean/dev/netmap/netmap.c Fri Dec 28 22:18:41 2012 (r244793) @@ -98,6 +98,9 @@ MALLOC_DEFINE(M_NETMAP, "netmap", "Netwo #include #include +#define MEMFETCH(var) \ + (__DEVOLATILE(__typeof(var), *((volatile __typeof(var) *)&var))) + u_int netmap_total_buffers; u_int netmap_buf_size; char *netmap_buffer_base; /* address of an invalid buffer */ @@ -1081,10 +1084,7 @@ error: error = ENXIO; break; } - rmb(); /* make sure following reads are not from cache */ - - - ifp = priv->np_ifp; /* we have a reference */ + ifp = MEMFETCH(priv->np_ifp); if (ifp == NULL) { D("Internal error: nifp != NULL && ifp == NULL"); @@ -1194,9 +1194,7 @@ netmap_poll(struct cdev *dev, int events D("No if registered"); return POLLERR; } - rmb(); /* make sure following reads are not from cache */ - - ifp = priv->np_ifp; + ifp = MEMFETCH(priv->np_ifp); // XXX check for deleting() ? if ( (ifp->if_capenable & IFCAP_NETMAP) == 0) return POLLERR; Modified: user/attilio/membarclean/dev/virtio/virtqueue.c ============================================================================== --- user/attilio/membarclean/dev/virtio/virtqueue.c Fri Dec 28 22:06:50 2012 (r244792) +++ user/attilio/membarclean/dev/virtio/virtqueue.c Fri Dec 28 22:18:41 2012 (r244793) @@ -525,8 +525,7 @@ virtqueue_dequeue(struct virtqueue *vq, used_idx = vq->vq_used_cons_idx++ & (vq->vq_nentries - 1); uep = &vq->vq_ring.used->ring[used_idx]; - rmb(); - desc_idx = (uint16_t) uep->id; + desc_idx = (uint16_t)atomic_load_acq_32(&uep->id); if (len != NULL) *len = uep->len;