From owner-svn-src-all@FreeBSD.ORG Thu Feb 12 04:31:18 2015 Return-Path: Delivered-To: svn-src-all@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:1900:2254:206a::19:1]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by hub.freebsd.org (Postfix) with ESMTPS id 87E769FE; Thu, 12 Feb 2015 04:31:18 +0000 (UTC) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:1900:2254:2068::e6a:0]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (Client did not present a certificate) by mx1.freebsd.org (Postfix) with ESMTPS id 594D61EC; Thu, 12 Feb 2015 04:31:18 +0000 (UTC) Received: from svn.freebsd.org ([127.0.1.70]) by svn.freebsd.org (8.14.9/8.14.9) with ESMTP id t1C4VIm3031287; Thu, 12 Feb 2015 04:31:18 GMT (envelope-from gonzo@FreeBSD.org) Received: (from gonzo@localhost) by svn.freebsd.org (8.14.9/8.14.9/Submit) id t1C4VIVD031286; Thu, 12 Feb 2015 04:31:18 GMT (envelope-from gonzo@FreeBSD.org) Message-Id: <201502120431.t1C4VIVD031286@svn.freebsd.org> X-Authentication-Warning: svn.freebsd.org: gonzo set sender to gonzo@FreeBSD.org using -f From: Oleksandr Tymoshenko Date: Thu, 12 Feb 2015 04:31:18 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org Subject: svn commit: r278615 - head/sys/contrib/vchiq/interface/vchiq_arm X-SVN-Group: head MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-BeenThere: svn-src-all@freebsd.org X-Mailman-Version: 2.1.18-1 Precedence: list List-Id: "SVN commit messages for the entire src tree \(except for " user" and " projects" \)" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Thu, 12 Feb 2015 04:31:18 -0000 Author: gonzo Date: Thu Feb 12 04:31:17 2015 New Revision: 278615 URL: https://svnweb.freebsd.org/changeset/base/278615 Log: - Perform bus_dmamap_sync on pagelist structure - Wire pages of bulk transfer buffer when preparing pagelist Modified: head/sys/contrib/vchiq/interface/vchiq_arm/vchiq_2835_arm.c Modified: head/sys/contrib/vchiq/interface/vchiq_arm/vchiq_2835_arm.c ============================================================================== --- head/sys/contrib/vchiq/interface/vchiq_arm/vchiq_2835_arm.c Thu Feb 12 04:15:55 2015 (r278614) +++ head/sys/contrib/vchiq/interface/vchiq_arm/vchiq_2835_arm.c Thu Feb 12 04:31:17 2015 (r278615) @@ -353,6 +353,16 @@ vchiq_platform_handle_timeout(VCHIQ_STAT * Local functions */ +static void +pagelist_page_free(vm_page_t pp) +{ + vm_page_lock(pp); + vm_page_unwire(pp, PQ_INACTIVE); + if (pp->wire_count == 0 && pp->object == NULL) + vm_page_free(pp); + vm_page_unlock(pp); +} + /* There is a potential problem with partial cache lines (pages?) ** at the ends of the block when reading. If the CPU accessed anything in ** the same line (page?) then it may have pulled old data into the cache, @@ -406,8 +416,6 @@ create_pagelist(char __user *buf, size_t NULL, NULL, /* lockfunc, lockarg */ &bi->pagelist_dma_tag); - - err = bus_dmamem_alloc(bi->pagelist_dma_tag, (void **)&pagelist, BUS_DMA_COHERENT | BUS_DMA_WAITOK, &bi->pagelist_dma_map); if (err) { @@ -444,6 +452,13 @@ create_pagelist(char __user *buf, size_t return (-ENOMEM); } + for (i = 0; i < actual_pages; i++) { + vm_page_lock(pages[i]); + vm_page_wire(pages[i]); + vm_page_unhold(pages[i]); + vm_page_unlock(pages[i]); + } + pagelist->length = count; pagelist->type = type; pagelist->offset = offset; @@ -496,9 +511,10 @@ create_pagelist(char __user *buf, size_t g_fragments_base); } - /* XXX: optimize? INV operation for read WBINV for write? */ cpu_dcache_wbinv_range((vm_offset_t)buf, count); + bus_dmamap_sync(bi->pagelist_dma_tag, bi->pagelist_dma_map, BUS_DMASYNC_PREWRITE); + bi->pagelist = pagelist; return 0; @@ -563,12 +579,12 @@ free_pagelist(BULKINFO_T *bi, int actual } for (i = 0; i < num_pages; i++) { - if (pagelist->type != PAGELIST_WRITE) + if (pagelist->type != PAGELIST_WRITE) { vm_page_dirty(pages[i]); + pagelist_page_free(pages[i]); + } } - vm_page_unhold_pages(pages, num_pages); - bus_dmamap_unload(bi->pagelist_dma_tag, bi->pagelist_dma_map); bus_dmamem_free(bi->pagelist_dma_tag, bi->pagelist, bi->pagelist_dma_map); bus_dmamap_destroy(bi->pagelist_dma_tag, bi->pagelist_dma_map);