From owner-freebsd-current@FreeBSD.ORG Thu Jun 25 11:44:48 2009 Return-Path: Delivered-To: freebsd-current@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 86AE9106566C; Thu, 25 Jun 2009 11:44:48 +0000 (UTC) (envelope-from kosmo@semihalf.com) Received: from smtp.semihalf.com (smtp.semihalf.com [213.17.239.109]) by mx1.freebsd.org (Postfix) with ESMTP id 37E5C8FC0C; Thu, 25 Jun 2009 11:44:48 +0000 (UTC) (envelope-from kosmo@semihalf.com) Received: from [10.0.0.5] (cardhu.semihalf.com [213.17.239.108]) by smtp.semihalf.com (Postfix) with ESMTPSA id 164ECC4026; Thu, 25 Jun 2009 13:28:10 +0200 (CEST) From: Piotr =?iso-8859-2?q?Zi=EAcik?= Organization: Semihalf To: freebsd-current@freebsd.org Date: Thu, 25 Jun 2009 13:29:35 +0200 User-Agent: PLD Linux KMail/1.9.10 MIME-Version: 1.0 Content-Type: text/plain; charset="iso-8859-2" Content-Transfer-Encoding: 7bit Content-Disposition: inline Message-Id: <200906251329.35200.kosmo@semihalf.com> Cc: scottl@freebsd.org Subject: [PATCH RFC]: Bus_dma eats all available memory X-BeenThere: freebsd-current@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: Discussions about the use of FreeBSD-current List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Thu, 25 Jun 2009 11:44:48 -0000 Hi While working on new driver for FreeBSD I have found a problem in bus_dma subsystem. Every time when bus_dmamap_create() is called on bus_dma tag using bounce zone, at least 1 page in bounce zone is allocated. This causes eating of all avaible memory by bounce zone. Problem affects i386, amd64 and arm. This behaviour was introduced by http://svn.freebsd.org/viewvc/base?view=revision&revision=143449 fixing another error in bus_dma. My patch, attached to this mail, fixes the problem by allocating new pages only when bounce zone is too small. Patch was sucessfuly tested on arm, but I am not sure that my change does not have any side effects, so if you see any please comment. Patch: diff --git a/sys/amd64/amd64/busdma_machdep.c b/sys/amd64/amd64/busdma_machdep.c index 775f142..083cbae 100644 --- a/sys/amd64/amd64/busdma_machdep.c +++ b/sys/amd64/amd64/busdma_machdep.c @@ -423,7 +423,7 @@ bus_dmamap_create(bus_dma_tag_t dmat, int flags, bus_dmamap_t *mapp) pages = MAX(atop(dmat->maxsize), 1); pages = MIN(maxpages - bz->total_bpages, pages); - pages = MAX(pages, 1); + pages = MAX(pages, 0); if (alloc_bounce_pages(dmat, pages) < pages) error = ENOMEM; diff --git a/sys/arm/arm/busdma_machdep.c b/sys/arm/arm/busdma_machdep.c index a8b2de9..ef1afad 100644 --- a/sys/arm/arm/busdma_machdep.c +++ b/sys/arm/arm/busdma_machdep.c @@ -529,7 +529,7 @@ bus_dmamap_create(bus_dma_tag_t dmat, int flags, bus_dmamap_t *mapp) pages = MAX(atop(dmat->maxsize), 1); pages = MIN(maxpages - bz->total_bpages, pages); - pages = MAX(pages, 1); + pages = MAX(pages, 0); if (alloc_bounce_pages(dmat, pages) < pages) error = ENOMEM; diff --git a/sys/i386/i386/busdma_machdep.c b/sys/i386/i386/busdma_machdep.c index 50c1545..f31d98f 100644 --- a/sys/i386/i386/busdma_machdep.c +++ b/sys/i386/i386/busdma_machdep.c @@ -436,7 +436,7 @@ bus_dmamap_create(bus_dma_tag_t dmat, int flags, bus_dmamap_t *mapp) pages = MAX(atop(dmat->maxsize), 1); pages = MIN(maxpages - bz->total_bpages, pages); - pages = MAX(pages, 1); + pages = MAX(pages, 0); if (alloc_bounce_pages(dmat, pages) < pages) -- Best Regards, Piotr Ziecik