From owner-freebsd-hackers@FreeBSD.ORG Sat Sep 25 01:22:57 2010 Return-Path: Delivered-To: freebsd-hackers@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 8DF311065673 for ; Sat, 25 Sep 2010 01:22:57 +0000 (UTC) (envelope-from neelnatu@gmail.com) Received: from mail-wy0-f182.google.com (mail-wy0-f182.google.com [74.125.82.182]) by mx1.freebsd.org (Postfix) with ESMTP id 283898FC0A for ; Sat, 25 Sep 2010 01:22:56 +0000 (UTC) Received: by wyb33 with SMTP id 33so4268945wyb.13 for ; Fri, 24 Sep 2010 18:22:56 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma; h=domainkey-signature:mime-version:received:received:date:message-id :subject:from:to:content-type; bh=FU+eW1D4ITpTLIHvkWrQ7uWGwPPpBYfiJcbaakDGVno=; b=W+2pWbf4h0GlY9IIjh+mrhTrDxGwocporWgiv0tsjHGWzq8wQ7n0JFPNgN8o8sa9MS obTKwAqHG4mQJrKrLSP03ixa3Wtns3XrTHkocLRwq4cat2oK1vbniXV5TlUAjs84TxmP ihZYlQRwh3I7SfLVCCjUPtYmi6zJsrQlszIHU= DomainKey-Signature: a=rsa-sha1; c=nofws; d=gmail.com; s=gamma; h=mime-version:date:message-id:subject:from:to:content-type; b=VKdP+MqPTA32gPLZSyMzbshT9ZxhE3kkM9Lzs12Nx1OrIudAU6Q4Oo/5DmCtL/iBh/ Ts0pUuRUwlGkFYUxbhjhFsfUVli6VIHaQ3BCUiE0IMyoujgE/MKCPzSL96+nyg9vbMRD u6N+nlqqgnFvFng2Bi86sYsPz/ZzE2cVAW+CU= MIME-Version: 1.0 Received: by 10.216.9.3 with SMTP id 3mr3379409wes.66.1285376445042; Fri, 24 Sep 2010 18:00:45 -0700 (PDT) Received: by 10.216.133.5 with HTTP; Fri, 24 Sep 2010 18:00:44 -0700 (PDT) Date: Fri, 24 Sep 2010 18:00:44 -0700 Message-ID: From: Neel Natu To: freebsd-hackers@freebsd.org Content-Type: text/plain; charset=ISO-8859-1 Subject: PATCH: fix bogus error message "bus_dmamem_alloc failed to align memory properly" X-BeenThere: freebsd-hackers@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: Technical Discussions relating to FreeBSD List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sat, 25 Sep 2010 01:22:57 -0000 Hi, This patch fixes the bogus error message from bus_dmamem_alloc() about the buffer not being aligned properly. The problem is that the check is against a virtual address as opposed to the physical address. contigmalloc() makes guarantees about the alignment of physical addresses but not the virtual address mapping it. Any objections if I commit this patch? best Neel Index: sys/powerpc/powerpc/busdma_machdep.c =================================================================== --- sys/powerpc/powerpc/busdma_machdep.c (revision 213113) +++ sys/powerpc/powerpc/busdma_machdep.c (working copy) @@ -529,7 +529,7 @@ CTR4(KTR_BUSDMA, "%s: tag %p tag flags 0x%x error %d", __func__, dmat, dmat->flags, ENOMEM); return (ENOMEM); - } else if ((uintptr_t)*vaddr & (dmat->alignment - 1)) { + } else if (vtophys(*vaddr) & (dmat->alignment - 1)) { printf("bus_dmamem_alloc failed to align memory properly.\n"); } #ifdef NOTYET Index: sys/sparc64/sparc64/bus_machdep.c =================================================================== --- sys/sparc64/sparc64/bus_machdep.c (revision 213113) +++ sys/sparc64/sparc64/bus_machdep.c (working copy) @@ -652,7 +652,7 @@ } if (*vaddr == NULL) return (ENOMEM); - if ((uintptr_t)*vaddr % dmat->dt_alignment) + if (vtophys(*vaddr) % dmat->dt_alignment) printf("%s: failed to align memory properly.\n", __func__); return (0); } Index: sys/ia64/ia64/busdma_machdep.c =================================================================== --- sys/ia64/ia64/busdma_machdep.c (revision 213113) +++ sys/ia64/ia64/busdma_machdep.c (working copy) @@ -455,7 +455,7 @@ } if (*vaddr == NULL) return (ENOMEM); - else if ((uintptr_t)*vaddr & (dmat->alignment - 1)) + else if (vtophys(*vaddr) & (dmat->alignment - 1)) printf("bus_dmamem_alloc failed to align memory properly.\n"); return (0); } Index: sys/i386/i386/busdma_machdep.c =================================================================== --- sys/i386/i386/busdma_machdep.c (revision 213113) +++ sys/i386/i386/busdma_machdep.c (working copy) @@ -540,7 +540,7 @@ CTR4(KTR_BUSDMA, "%s: tag %p tag flags 0x%x error %d", __func__, dmat, dmat->flags, ENOMEM); return (ENOMEM); - } else if ((uintptr_t)*vaddr & (dmat->alignment - 1)) { + } else if (vtophys(*vaddr) & (dmat->alignment - 1)) { printf("bus_dmamem_alloc failed to align memory properly.\n"); } if (flags & BUS_DMA_NOCACHE) Index: sys/amd64/amd64/busdma_machdep.c =================================================================== --- sys/amd64/amd64/busdma_machdep.c (revision 213113) +++ sys/amd64/amd64/busdma_machdep.c (working copy) @@ -526,7 +526,7 @@ CTR4(KTR_BUSDMA, "%s: tag %p tag flags 0x%x error %d", __func__, dmat, dmat->flags, ENOMEM); return (ENOMEM); - } else if ((uintptr_t)*vaddr & (dmat->alignment - 1)) { + } else if (vtophys(*vaddr) & (dmat->alignment - 1)) { printf("bus_dmamem_alloc failed to align memory properly.\n"); } if (flags & BUS_DMA_NOCACHE)