[PATCH 1/5] MTD: mtdram: properly handle the phys argument in the point method

Richard Weinberger richard.weinberger at gmail.com
Wed Oct 11 13:47:09 PDT 2017


On Wed, Oct 11, 2017 at 5:26 AM, Nicolas Pitre <nicolas.pitre at linaro.org> wrote:
> When the phys pointer is non null, the point method is expected to return
> the physical address for the pointed area. In the case of the mtdram
> driver we have to retrieve the physical address for the corresponding
> vmalloc area. However, there is no guarantee that the vmalloc area is
> made of physically contiguous pages. In that case we simply limit retlen
> to the actually contiguous pages.
>
> Signed-off-by: Nicolas Pitre <nico at linaro.org>
> ---
>  drivers/mtd/devices/mtdram.c | 22 ++++++++++++++++++++++
>  1 file changed, 22 insertions(+)
>
> diff --git a/drivers/mtd/devices/mtdram.c b/drivers/mtd/devices/mtdram.c
> index cbd8547d7a..7dbee8e62f 100644
> --- a/drivers/mtd/devices/mtdram.c
> +++ b/drivers/mtd/devices/mtdram.c
> @@ -13,6 +13,7 @@
>  #include <linux/slab.h>
>  #include <linux/ioport.h>
>  #include <linux/vmalloc.h>
> +#include <linux/mm.h>
>  #include <linux/init.h>
>  #include <linux/mtd/mtd.h>
>  #include <linux/mtd/mtdram.h>
> @@ -69,6 +70,27 @@ static int ram_point(struct mtd_info *mtd, loff_t from, size_t len,
>  {
>         *virt = mtd->priv + from;
>         *retlen = len;
> +
> +       if (phys) {
> +               /* limit retlen to the number of contiguous physical pages */
> +               unsigned long page_ofs = offset_in_page(*virt);
> +               void *addr = *virt - page_ofs;
> +               unsigned long pfn1, pfn0 = vmalloc_to_pfn(addr);
> +
> +               *phys = __pfn_to_phys(pfn0) + page_ofs;
> +               len += page_ofs;
> +               while (len > PAGE_SIZE) {
> +                       len -= PAGE_SIZE;
> +                       addr += PAGE_SIZE;
> +                       pfn0++;
> +                       pfn1 = vmalloc_to_pfn(addr);
> +                       if (pfn1 != pfn0) {
> +                               *retlen = *virt - addr;
> +                               break;
> +                       }
> +               }
> +       }
> +
>         return 0;
>  }

Reviewed-by: Richard Weinberger <richard at nod.at>

-- 
Thanks,
//richard



More information about the linux-mtd mailing list