Message ID | 1259681414-30246-1-git-send-email-m-karicheri2@ti.com (mailing list archive) |
---|---|
State | Superseded, archived |
Headers |
Return-path: <linux-media-owner@vger.kernel.org> Envelope-to: mchehab@infradead.org Delivery-date: Tue, 01 Dec 2009 15:30:28 +0000 Received: from bombadil.infradead.org [18.85.46.34] by pedra with IMAP (fetchmail-6.3.6) for <mchehab@localhost> (single-drop); Tue, 01 Dec 2009 13:31:02 -0200 (BRST) Received: from vger.kernel.org ([209.132.176.167]) by bombadil.infradead.org with esmtp (Exim 4.69 #1 (Red Hat Linux)) id 1NFUgO-0001LT-9x; Tue, 01 Dec 2009 15:30:28 +0000 Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1753148AbZLAPaU (ORCPT <rfc822; kmpark@infradead.org> + 1 other); Tue, 1 Dec 2009 10:30:20 -0500 Received: (majordomo@vger.kernel.org) by vger.kernel.org id S1752199AbZLAPaT (ORCPT <rfc822;linux-media-outgoing>); Tue, 1 Dec 2009 10:30:19 -0500 Received: from comal.ext.ti.com ([198.47.26.152]:33345 "EHLO comal.ext.ti.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751944AbZLAPaT (ORCPT <rfc822;linux-media@vger.kernel.org>); Tue, 1 Dec 2009 10:30:19 -0500 Received: from dlep36.itg.ti.com ([157.170.170.91]) by comal.ext.ti.com (8.13.7/8.13.7) with ESMTP id nB1FUHZM019084 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO); Tue, 1 Dec 2009 09:30:17 -0600 Received: from legion.dal.design.ti.com (localhost [127.0.0.1]) by dlep36.itg.ti.com (8.13.8/8.13.8) with ESMTP id nB1FUGtR021399; Tue, 1 Dec 2009 09:30:17 -0600 (CST) Received: from gt516km11.gt.design.ti.com (gt516km11.gt.design.ti.com [158.218.100.179]) by legion.dal.design.ti.com (8.11.7p1+Sun/8.11.7) with ESMTP id nB1FUGZ12030; Tue, 1 Dec 2009 09:30:16 -0600 (CST) Received: from gt516km11.gt.design.ti.com (localhost.localdomain [127.0.0.1]) by gt516km11.gt.design.ti.com (8.13.1/8.13.1) with ESMTP id nB1FUFn9030273; Tue, 1 Dec 2009 10:30:16 -0500 Received: (from a0868495@localhost) by gt516km11.gt.design.ti.com (8.13.1/8.13.1/Submit) id nB1FUEYp030270; Tue, 1 Dec 2009 10:30:14 -0500 From: m-karicheri2@ti.com To: linux-media@vger.kernel.org, magnus.damm@gmail.com, mchehab@infradead.org Cc: davinci-linux-open-source@linux.davincidsp.com, Muralidharan Karicheri <m-karicheri2@ti.com> Subject: [PATCH] V4L - Fix videobuf_dma_contig_user_get() getting page aligned physical address Date: Tue, 1 Dec 2009 10:30:14 -0500 Message-Id: <1259681414-30246-1-git-send-email-m-karicheri2@ti.com> X-Mailer: git-send-email 1.6.0.4 Sender: linux-media-owner@vger.kernel.org Precedence: bulk List-ID: <linux-media.vger.kernel.org> X-Mailing-List: linux-media@vger.kernel.org |
Commit Message
m-karicheri2@ti.com
Dec. 1, 2009, 3:30 p.m. UTC
From: Muralidharan Karicheri <m-karicheri2@ti.com> If a USERPTR address that is not aligned to page boundary is passed to the videobuf_dma_contig_user_get() function, it saves a page aligned address to the dma_handle. This is not correct. This issue is observed when using USERPTR IO machism for buffer exchange. Signed-off-by: Muralidharan Karicheri <m-karicheri2@ti.com> --- Applies to V4L-DVB linux-next branch drivers/media/video/videobuf-dma-contig.c | 3 ++- 1 files changed, 2 insertions(+), 1 deletions(-)
Comments
On Wed, Dec 2, 2009 at 12:30 AM, <m-karicheri2@ti.com> wrote: > From: Muralidharan Karicheri <m-karicheri2@ti.com> > > If a USERPTR address that is not aligned to page boundary is passed to the > videobuf_dma_contig_user_get() function, it saves a page aligned address to > the dma_handle. This is not correct. This issue is observed when using USERPTR > IO machism for buffer exchange. > > Signed-off-by: Muralidharan Karicheri <m-karicheri2@ti.com> Thanks for the patch. For non-page aligned user space pointers I agree that a fix is needed. Don't you think the while loop in videobuf_dma_contig_user_get() also needs to be adjusted to include the last page? I think the while loop checks one page too little in the non-aligned case today. Cheers, / magnus -- To unsubscribe from this list: send the line "unsubscribe linux-media" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
Magnus, >Thanks for the patch. For non-page aligned user space pointers I agree >that a fix is needed. Don't you think the while loop in >videobuf_dma_contig_user_get() also needs to be adjusted to include >the last page? I think the while loop checks one page too little in >the non-aligned case today. > >Cheers, > >/ magnus Thanks for reviewing my patch. It had worked for non-aligned address in my testing. If I understand this code correctly, the physical address of the user page start is determined in the first loop (pages_done == 0) and additional loops are run to make sure the memory is physically contiguous. Initially the mem->size is set to number of pages aligned to page size. Assume we pass 4097 bytes as size. mem->size = PAGE_ALIGN(vb->size); => 2 Inside the loop, iteration is done for 0 to pages-1. pages_done < (mem->size >> 12) => pages_done < 2 => iterate 2 times For size of 4096, we iterate once. For size of 4095, we iterate once. So IMO the loop is already iterate one more time when we pass non-aligned address since size is aligned to include the last page. So based on this could you ack my patch so that we could ask Mauro to merge it with priority? Murali Karicheri Software Design Engineer Texas Instruments Inc. Germantown, MD 20874 phone: 301-407-9583 email: m-karicheri2@ti.com -- To unsubscribe from this list: send the line "unsubscribe linux-media" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
Hi again Murali, Thanks for your work on this. On Thu, Dec 3, 2009 at 12:48 AM, Karicheri, Muralidharan <m-karicheri2@ti.com> wrote: > Magnus, > >>Thanks for the patch. For non-page aligned user space pointers I agree >>that a fix is needed. Don't you think the while loop in >>videobuf_dma_contig_user_get() also needs to be adjusted to include >>the last page? I think the while loop checks one page too little in >>the non-aligned case today. > > Thanks for reviewing my patch. It had worked for non-aligned address in > my testing. If I understand this code correctly, the physical address of > the user page start is determined in the first loop (pages_done == 0) > and additional loops are run to make sure the memory is physically > contiguous. Initially the mem->size is set to number of pages aligned to > page size. > > Assume we pass 4097 bytes as size. > > mem->size = PAGE_ALIGN(vb->size); => 2 > > Inside the loop, iteration is done for 0 to pages-1. > > pages_done < (mem->size >> 12) => pages_done < 2 => iterate 2 times > > For size of 4096, we iterate once. > For size of 4095, we iterate once. > > So IMO the loop is already iterate one more time when we pass non-aligned address since size is aligned to include the last page. So based on this > could you ack my patch so that we could ask Mauro to merge it with priority? I think your observations are correct, but I also think there is one more hidden issue. In the case where the offset within the page is other than 0 then we should loop once more to also check the final page. Right now no one is checking if the last page is contiguous or not in the case on non-page-aligned offset.. So in your case with a 4096 or 4095 size, but if the offset withing the page is non-zero then we should loop twice to make sure the pages really are physically contiguous. Today we only loop once based on the size. We should also include the offset in the calculation of number of pages to check. If you can include that fix in your patch that would be great. If not then i'll fix it up myself. Thanks! / magnus -- To unsubscribe from this list: send the line "unsubscribe linux-media" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
Murali Karicheri Software Design Engineer Texas Instruments Inc. Germantown, MD 20874 phone: 301-407-9583 email: m-karicheri2@ti.com >-----Original Message----- >From: Magnus Damm [mailto:magnus.damm@gmail.com] >Sent: Friday, December 04, 2009 6:06 AM >To: Karicheri, Muralidharan >Cc: linux-media@vger.kernel.org; mchehab@infradead.org; davinci-linux-open- >source@linux.davincidsp.com >Subject: Re: [PATCH] V4L - Fix videobuf_dma_contig_user_get() getting page >aligned physical address > >Hi again Murali, > >Thanks for your work on this. > >On Thu, Dec 3, 2009 at 12:48 AM, Karicheri, Muralidharan ><m-karicheri2@ti.com> wrote: >> Magnus, >> >>>Thanks for the patch. For non-page aligned user space pointers I agree >>>that a fix is needed. Don't you think the while loop in >>>videobuf_dma_contig_user_get() also needs to be adjusted to include >>>the last page? I think the while loop checks one page too little in >>>the non-aligned case today. >> >> Thanks for reviewing my patch. It had worked for non-aligned address in >> my testing. If I understand this code correctly, the physical address of >> the user page start is determined in the first loop (pages_done == 0) >> and additional loops are run to make sure the memory is physically >> contiguous. Initially the mem->size is set to number of pages aligned to >> page size. >> >> Assume we pass 4097 bytes as size. >> >> mem->size = PAGE_ALIGN(vb->size); => 2 >> >> Inside the loop, iteration is done for 0 to pages-1. >> >> pages_done < (mem->size >> 12) => pages_done < 2 => iterate 2 times >> >> For size of 4096, we iterate once. >> For size of 4095, we iterate once. >> >> So IMO the loop is already iterate one more time when we pass non-aligned >address since size is aligned to include the last page. So based on this >> could you ack my patch so that we could ask Mauro to merge it with >priority? > >I think your observations are correct, but I also think there is one >more hidden issue. In the case where the offset within the page is >other than 0 then we should loop once more to also check the final >page. Right now no one is checking if the last page is contiguous or >not in the case on non-page-aligned offset.. > >So in your case with a 4096 or 4095 size, but if the offset withing >the page is non-zero then we should loop twice to make sure the pages >really are physically contiguous. Today we only loop once based on the >size. We should also include the offset in the calculation of number >of pages to check. Yes. You are right. For offsets that are non-aligned we need to check for the last one. Probably unsigned int offset = vb->baddr & ~PAGE_MASK; mem->size = PAGE_ALIGN(vb->size + offset); ...... if (pages_done == 0) mem->handle = (this_pfn << PAGE_SHIFT) + offset; If this is fine, I can send you a updated patch. If you can fix it that is fine too. regards, Murali > >If you can include that fix in your patch that would be great. If not >then i'll fix it up myself. > If you could do this it will be great! >Thanks! > >/ magnus -- To unsubscribe from this list: send the line "unsubscribe linux-media" 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/media/video/videobuf-dma-contig.c b/drivers/media/video/videobuf-dma-contig.c index d25f284..928dfa1 100644 --- a/drivers/media/video/videobuf-dma-contig.c +++ b/drivers/media/video/videobuf-dma-contig.c @@ -166,7 +166,8 @@ static int videobuf_dma_contig_user_get(struct videobuf_dma_contig_memory *mem, break; if (pages_done == 0) - mem->dma_handle = this_pfn << PAGE_SHIFT; + mem->dma_handle = (this_pfn << PAGE_SHIFT) + + (vb->baddr & ~PAGE_MASK); else if (this_pfn != (prev_pfn + 1)) ret = -EFAULT;