All of lore.kernel.org
 help / color / mirror / Atom feed
From: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
To: linux-arm-kernel@lists.infradead.org
Subject: Re: [PATCH 3/4] mm: cma: Ensure that reservations never cross the low/high mem boundary
Date: Fri, 24 Oct 2014 10:00:11 +0000	[thread overview]
Message-ID: <1874192.vbdvJooA5D@avalon> (raw)
In-Reply-To: <20141024025325.GB15243@js1304-P5Q-DELUXE>

Hi Joonsoo,

Thank you for the review.

On Friday 24 October 2014 11:53:25 Joonsoo Kim wrote:
> On Thu, Oct 23, 2014 at 05:33:47PM +0300, Laurent Pinchart wrote:
> > Commit 95b0e655f914 ("ARM: mm: don't limit default CMA region only to
> > low memory") extended CMA memory reservation to allow usage of high
> > memory. It relied on commit f7426b983a6a ("mm: cma: adjust address limit
> > to avoid hitting low/high memory boundary") to ensure that the reserved
> > block never crossed the low/high memory boundary. While the
> > implementation correctly lowered the limit, it failed to consider the
> > case where the base..limit range crossed the low/high memory boundary
> > with enough space on each side to reserve the requested size on either
> > low or high memory.
> > 
> > Rework the base and limit adjustment to fix the problem. The function
> > now starts by rejecting the reservation altogether for fixed
> > reservations that cross the boundary, then adjust the limit if
> > reservation from high memory is impossible, and finally first try to
> > reserve from high memory first and then falls back to low memory.
> > 
> > Signed-off-by: Laurent Pinchart
> > <laurent.pinchart+renesas@ideasonboard.com>
> > ---
> > 
> >  mm/cma.c | 58 ++++++++++++++++++++++++++++++++++++++++++++--------------
> >  1 file changed, 44 insertions(+), 14 deletions(-)
> > 
> > diff --git a/mm/cma.c b/mm/cma.c
> > index 6b14346..b83597b 100644
> > --- a/mm/cma.c
> > +++ b/mm/cma.c
> > @@ -247,23 +247,38 @@ int __init cma_declare_contiguous(phys_addr_t base,
> >  		return -EINVAL;
> >  	
> >  	/*
> > -	 * adjust limit to avoid crossing low/high memory boundary for
> > +	 * Adjust limit and base to avoid crossing low/high memory boundary
> > for
> >  	 * automatically allocated regions
> >  	 */
> > 
> > -	if (((limit = 0 || limit > memblock_end) &&
> > -	     (memblock_end - size < highmem_start &&
> > -	      memblock_end > highmem_start)) ||
> > -	    (!fixed && limit > highmem_start && limit - size <
> > highmem_start)) {
> > -		limit = highmem_start;
> > -	}
> > 
> > -	if (fixed && base < highmem_start && base+size > highmem_start) {
> > +	/*
> > +	 * If allocating at a fixed base the request region must not cross
> > the
> > +	 * low/high memory boundary.
> > +	 */
> > +	if (fixed && base < highmem_start && base + size > highmem_start) {
> >  		ret = -EINVAL;
> >  		pr_err("Region at %08lx defined on low/high memory boundary
> >  		(%08lx)\n",
> >  			(unsigned long)base, (unsigned long)highmem_start);
> >  		goto err;
> >  	}
> > 
> > +	/*
> > +	 * If the limit is unspecified or above the memblock end, its
> > effective
> > +	 * value will be the memblock end. Set it explicitly to simplify
> > further
> > +	 * checks.
> > +	 */
> > +	if (limit = 0 || limit > memblock_end)
> > +		limit = memblock_end;
> > +
> > +	/*
> > +	 * If the limit is above the highmem start by less than the reserved
> > +	 * size allocation in highmem won't be possible. Lower the limit to
> > the
> > +	 * lowmem end.
> > +	 */
> > +	if (limit > highmem_start && limit - size < highmem_start)
> > +		limit = highmem_start;
> > +
> 
> How about removing this check?
> Without this check, memblock_alloc_range would be failed and we can
> go fallback correctly. So, this is redundant, IMO.

Good point. I'll remove the check in v2.

-- 
Regards,

Laurent Pinchart


WARNING: multiple messages have this Message-ID (diff)
From: laurent.pinchart@ideasonboard.com (Laurent Pinchart)
To: linux-arm-kernel@lists.infradead.org
Subject: [PATCH 3/4] mm: cma: Ensure that reservations never cross the low/high mem boundary
Date: Fri, 24 Oct 2014 13:00:11 +0300	[thread overview]
Message-ID: <1874192.vbdvJooA5D@avalon> (raw)
In-Reply-To: <20141024025325.GB15243@js1304-P5Q-DELUXE>

Hi Joonsoo,

Thank you for the review.

On Friday 24 October 2014 11:53:25 Joonsoo Kim wrote:
> On Thu, Oct 23, 2014 at 05:33:47PM +0300, Laurent Pinchart wrote:
> > Commit 95b0e655f914 ("ARM: mm: don't limit default CMA region only to
> > low memory") extended CMA memory reservation to allow usage of high
> > memory. It relied on commit f7426b983a6a ("mm: cma: adjust address limit
> > to avoid hitting low/high memory boundary") to ensure that the reserved
> > block never crossed the low/high memory boundary. While the
> > implementation correctly lowered the limit, it failed to consider the
> > case where the base..limit range crossed the low/high memory boundary
> > with enough space on each side to reserve the requested size on either
> > low or high memory.
> > 
> > Rework the base and limit adjustment to fix the problem. The function
> > now starts by rejecting the reservation altogether for fixed
> > reservations that cross the boundary, then adjust the limit if
> > reservation from high memory is impossible, and finally first try to
> > reserve from high memory first and then falls back to low memory.
> > 
> > Signed-off-by: Laurent Pinchart
> > <laurent.pinchart+renesas@ideasonboard.com>
> > ---
> > 
> >  mm/cma.c | 58 ++++++++++++++++++++++++++++++++++++++++++++--------------
> >  1 file changed, 44 insertions(+), 14 deletions(-)
> > 
> > diff --git a/mm/cma.c b/mm/cma.c
> > index 6b14346..b83597b 100644
> > --- a/mm/cma.c
> > +++ b/mm/cma.c
> > @@ -247,23 +247,38 @@ int __init cma_declare_contiguous(phys_addr_t base,
> >  		return -EINVAL;
> >  	
> >  	/*
> > -	 * adjust limit to avoid crossing low/high memory boundary for
> > +	 * Adjust limit and base to avoid crossing low/high memory boundary
> > for
> >  	 * automatically allocated regions
> >  	 */
> > 
> > -	if (((limit == 0 || limit > memblock_end) &&
> > -	     (memblock_end - size < highmem_start &&
> > -	      memblock_end > highmem_start)) ||
> > -	    (!fixed && limit > highmem_start && limit - size <
> > highmem_start)) {
> > -		limit = highmem_start;
> > -	}
> > 
> > -	if (fixed && base < highmem_start && base+size > highmem_start) {
> > +	/*
> > +	 * If allocating at a fixed base the request region must not cross
> > the
> > +	 * low/high memory boundary.
> > +	 */
> > +	if (fixed && base < highmem_start && base + size > highmem_start) {
> >  		ret = -EINVAL;
> >  		pr_err("Region at %08lx defined on low/high memory boundary
> >  		(%08lx)\n",
> >  			(unsigned long)base, (unsigned long)highmem_start);
> >  		goto err;
> >  	}
> > 
> > +	/*
> > +	 * If the limit is unspecified or above the memblock end, its
> > effective
> > +	 * value will be the memblock end. Set it explicitly to simplify
> > further
> > +	 * checks.
> > +	 */
> > +	if (limit == 0 || limit > memblock_end)
> > +		limit = memblock_end;
> > +
> > +	/*
> > +	 * If the limit is above the highmem start by less than the reserved
> > +	 * size allocation in highmem won't be possible. Lower the limit to
> > the
> > +	 * lowmem end.
> > +	 */
> > +	if (limit > highmem_start && limit - size < highmem_start)
> > +		limit = highmem_start;
> > +
> 
> How about removing this check?
> Without this check, memblock_alloc_range would be failed and we can
> go fallback correctly. So, this is redundant, IMO.

Good point. I'll remove the check in v2.

-- 
Regards,

Laurent Pinchart

WARNING: multiple messages have this Message-ID (diff)
From: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
To: Joonsoo Kim <iamjoonsoo.kim@lge.com>
Cc: Laurent Pinchart <laurent.pinchart+renesas@ideasonboard.com>,
	linux-mm@kvack.org, linux-kernel@vger.kernel.org,
	linux-arm-kernel@lists.infradead.org, linux-sh@vger.kernel.org,
	Marek Szyprowski <m.szyprowski@samsung.com>,
	Russell King - ARM Linux <linux@arm.linux.org.uk>,
	Michal Nazarewicz <mina86@mina86.com>
Subject: Re: [PATCH 3/4] mm: cma: Ensure that reservations never cross the low/high mem boundary
Date: Fri, 24 Oct 2014 13:00:11 +0300	[thread overview]
Message-ID: <1874192.vbdvJooA5D@avalon> (raw)
In-Reply-To: <20141024025325.GB15243@js1304-P5Q-DELUXE>

Hi Joonsoo,

Thank you for the review.

On Friday 24 October 2014 11:53:25 Joonsoo Kim wrote:
> On Thu, Oct 23, 2014 at 05:33:47PM +0300, Laurent Pinchart wrote:
> > Commit 95b0e655f914 ("ARM: mm: don't limit default CMA region only to
> > low memory") extended CMA memory reservation to allow usage of high
> > memory. It relied on commit f7426b983a6a ("mm: cma: adjust address limit
> > to avoid hitting low/high memory boundary") to ensure that the reserved
> > block never crossed the low/high memory boundary. While the
> > implementation correctly lowered the limit, it failed to consider the
> > case where the base..limit range crossed the low/high memory boundary
> > with enough space on each side to reserve the requested size on either
> > low or high memory.
> > 
> > Rework the base and limit adjustment to fix the problem. The function
> > now starts by rejecting the reservation altogether for fixed
> > reservations that cross the boundary, then adjust the limit if
> > reservation from high memory is impossible, and finally first try to
> > reserve from high memory first and then falls back to low memory.
> > 
> > Signed-off-by: Laurent Pinchart
> > <laurent.pinchart+renesas@ideasonboard.com>
> > ---
> > 
> >  mm/cma.c | 58 ++++++++++++++++++++++++++++++++++++++++++++--------------
> >  1 file changed, 44 insertions(+), 14 deletions(-)
> > 
> > diff --git a/mm/cma.c b/mm/cma.c
> > index 6b14346..b83597b 100644
> > --- a/mm/cma.c
> > +++ b/mm/cma.c
> > @@ -247,23 +247,38 @@ int __init cma_declare_contiguous(phys_addr_t base,
> >  		return -EINVAL;
> >  	
> >  	/*
> > -	 * adjust limit to avoid crossing low/high memory boundary for
> > +	 * Adjust limit and base to avoid crossing low/high memory boundary
> > for
> >  	 * automatically allocated regions
> >  	 */
> > 
> > -	if (((limit == 0 || limit > memblock_end) &&
> > -	     (memblock_end - size < highmem_start &&
> > -	      memblock_end > highmem_start)) ||
> > -	    (!fixed && limit > highmem_start && limit - size <
> > highmem_start)) {
> > -		limit = highmem_start;
> > -	}
> > 
> > -	if (fixed && base < highmem_start && base+size > highmem_start) {
> > +	/*
> > +	 * If allocating at a fixed base the request region must not cross
> > the
> > +	 * low/high memory boundary.
> > +	 */
> > +	if (fixed && base < highmem_start && base + size > highmem_start) {
> >  		ret = -EINVAL;
> >  		pr_err("Region at %08lx defined on low/high memory boundary
> >  		(%08lx)\n",
> >  			(unsigned long)base, (unsigned long)highmem_start);
> >  		goto err;
> >  	}
> > 
> > +	/*
> > +	 * If the limit is unspecified or above the memblock end, its
> > effective
> > +	 * value will be the memblock end. Set it explicitly to simplify
> > further
> > +	 * checks.
> > +	 */
> > +	if (limit == 0 || limit > memblock_end)
> > +		limit = memblock_end;
> > +
> > +	/*
> > +	 * If the limit is above the highmem start by less than the reserved
> > +	 * size allocation in highmem won't be possible. Lower the limit to
> > the
> > +	 * lowmem end.
> > +	 */
> > +	if (limit > highmem_start && limit - size < highmem_start)
> > +		limit = highmem_start;
> > +
> 
> How about removing this check?
> Without this check, memblock_alloc_range would be failed and we can
> go fallback correctly. So, this is redundant, IMO.

Good point. I'll remove the check in v2.

-- 
Regards,

Laurent Pinchart

--
To unsubscribe, send a message with 'unsubscribe linux-mm' in
the body to majordomo@kvack.org.  For more info on Linux MM,
see: http://www.linux-mm.org/ .
Don't email: <a href=mailto:"dont@kvack.org"> email@kvack.org </a>

WARNING: multiple messages have this Message-ID (diff)
From: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
To: Joonsoo Kim <iamjoonsoo.kim@lge.com>
Cc: Laurent Pinchart <laurent.pinchart+renesas@ideasonboard.com>,
	linux-mm@kvack.org, linux-kernel@vger.kernel.org,
	linux-arm-kernel@lists.infradead.org, linux-sh@vger.kernel.org,
	Marek Szyprowski <m.szyprowski@samsung.com>,
	Russell King - ARM Linux <linux@arm.linux.org.uk>,
	Michal Nazarewicz <mina86@mina86.com>
Subject: Re: [PATCH 3/4] mm: cma: Ensure that reservations never cross the low/high mem boundary
Date: Fri, 24 Oct 2014 13:00:11 +0300	[thread overview]
Message-ID: <1874192.vbdvJooA5D@avalon> (raw)
In-Reply-To: <20141024025325.GB15243@js1304-P5Q-DELUXE>

Hi Joonsoo,

Thank you for the review.

On Friday 24 October 2014 11:53:25 Joonsoo Kim wrote:
> On Thu, Oct 23, 2014 at 05:33:47PM +0300, Laurent Pinchart wrote:
> > Commit 95b0e655f914 ("ARM: mm: don't limit default CMA region only to
> > low memory") extended CMA memory reservation to allow usage of high
> > memory. It relied on commit f7426b983a6a ("mm: cma: adjust address limit
> > to avoid hitting low/high memory boundary") to ensure that the reserved
> > block never crossed the low/high memory boundary. While the
> > implementation correctly lowered the limit, it failed to consider the
> > case where the base..limit range crossed the low/high memory boundary
> > with enough space on each side to reserve the requested size on either
> > low or high memory.
> > 
> > Rework the base and limit adjustment to fix the problem. The function
> > now starts by rejecting the reservation altogether for fixed
> > reservations that cross the boundary, then adjust the limit if
> > reservation from high memory is impossible, and finally first try to
> > reserve from high memory first and then falls back to low memory.
> > 
> > Signed-off-by: Laurent Pinchart
> > <laurent.pinchart+renesas@ideasonboard.com>
> > ---
> > 
> >  mm/cma.c | 58 ++++++++++++++++++++++++++++++++++++++++++++--------------
> >  1 file changed, 44 insertions(+), 14 deletions(-)
> > 
> > diff --git a/mm/cma.c b/mm/cma.c
> > index 6b14346..b83597b 100644
> > --- a/mm/cma.c
> > +++ b/mm/cma.c
> > @@ -247,23 +247,38 @@ int __init cma_declare_contiguous(phys_addr_t base,
> >  		return -EINVAL;
> >  	
> >  	/*
> > -	 * adjust limit to avoid crossing low/high memory boundary for
> > +	 * Adjust limit and base to avoid crossing low/high memory boundary
> > for
> >  	 * automatically allocated regions
> >  	 */
> > 
> > -	if (((limit == 0 || limit > memblock_end) &&
> > -	     (memblock_end - size < highmem_start &&
> > -	      memblock_end > highmem_start)) ||
> > -	    (!fixed && limit > highmem_start && limit - size <
> > highmem_start)) {
> > -		limit = highmem_start;
> > -	}
> > 
> > -	if (fixed && base < highmem_start && base+size > highmem_start) {
> > +	/*
> > +	 * If allocating at a fixed base the request region must not cross
> > the
> > +	 * low/high memory boundary.
> > +	 */
> > +	if (fixed && base < highmem_start && base + size > highmem_start) {
> >  		ret = -EINVAL;
> >  		pr_err("Region at %08lx defined on low/high memory boundary
> >  		(%08lx)\n",
> >  			(unsigned long)base, (unsigned long)highmem_start);
> >  		goto err;
> >  	}
> > 
> > +	/*
> > +	 * If the limit is unspecified or above the memblock end, its
> > effective
> > +	 * value will be the memblock end. Set it explicitly to simplify
> > further
> > +	 * checks.
> > +	 */
> > +	if (limit == 0 || limit > memblock_end)
> > +		limit = memblock_end;
> > +
> > +	/*
> > +	 * If the limit is above the highmem start by less than the reserved
> > +	 * size allocation in highmem won't be possible. Lower the limit to
> > the
> > +	 * lowmem end.
> > +	 */
> > +	if (limit > highmem_start && limit - size < highmem_start)
> > +		limit = highmem_start;
> > +
> 
> How about removing this check?
> Without this check, memblock_alloc_range would be failed and we can
> go fallback correctly. So, this is redundant, IMO.

Good point. I'll remove the check in v2.

-- 
Regards,

Laurent Pinchart


  reply	other threads:[~2014-10-24 10:00 UTC|newest]

Thread overview: 66+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2014-10-23 14:33 [PATCH 0/4] Low/high memory CMA reservation fixes Laurent Pinchart
2014-10-23 14:33 ` Laurent Pinchart
2014-10-23 14:33 ` Laurent Pinchart
2014-10-23 14:33 ` Laurent Pinchart
2014-10-23 14:33 ` [PATCH 1/4] mm: cma: Don't crash on allocation if CMA area can't be activated Laurent Pinchart
2014-10-23 14:33   ` Laurent Pinchart
2014-10-23 14:33   ` Laurent Pinchart
2014-10-23 14:33   ` Laurent Pinchart
2014-10-23 16:53   ` Michal Nazarewicz
2014-10-23 16:53     ` Michal Nazarewicz
2014-10-23 16:53     ` Michal Nazarewicz
2014-10-23 16:53     ` Michal Nazarewicz
2014-10-23 23:42     ` Laurent Pinchart
2014-10-23 23:42       ` Laurent Pinchart
2014-10-23 23:42       ` Laurent Pinchart
2014-10-23 23:42       ` Laurent Pinchart
2014-10-24  2:02       ` Weijie Yang
2014-10-24  2:02         ` Weijie Yang
2014-10-24  2:02         ` Weijie Yang
2014-10-24  2:02         ` Weijie Yang
2014-10-24  2:50         ` Joonsoo Kim
2014-10-24  2:50           ` Joonsoo Kim
2014-10-24  2:50           ` Joonsoo Kim
2014-10-24  9:54           ` Laurent Pinchart
2014-10-24  9:54             ` Laurent Pinchart
2014-10-24  9:54             ` Laurent Pinchart
2014-10-24  9:54             ` Laurent Pinchart
2014-10-24 16:34       ` Michal Nazarewicz
2014-10-24 16:34         ` Michal Nazarewicz
2014-10-24 16:34         ` Michal Nazarewicz
2014-10-24 16:34         ` Michal Nazarewicz
2014-10-23 14:33 ` [PATCH 2/4] mm: cma: Always consider a 0 base address reservation as dynamic Laurent Pinchart
2014-10-23 14:33   ` Laurent Pinchart
2014-10-23 14:33   ` Laurent Pinchart
2014-10-23 14:33   ` Laurent Pinchart
2014-10-23 16:55   ` Michal Nazarewicz
2014-10-23 16:55     ` Michal Nazarewicz
2014-10-23 16:55     ` Michal Nazarewicz
2014-10-23 16:55     ` Michal Nazarewicz
2014-10-23 23:50     ` Laurent Pinchart
2014-10-23 23:50       ` Laurent Pinchart
2014-10-23 23:50       ` Laurent Pinchart
2014-10-23 23:50       ` Laurent Pinchart
2014-10-23 14:33 ` [PATCH 3/4] mm: cma: Ensure that reservations never cross the low/high mem boundary Laurent Pinchart
2014-10-23 14:33   ` Laurent Pinchart
2014-10-23 14:33   ` Laurent Pinchart
2014-10-23 14:33   ` Laurent Pinchart
2014-10-24  2:53   ` Joonsoo Kim
2014-10-24  2:53     ` Joonsoo Kim
2014-10-24  2:53     ` Joonsoo Kim
2014-10-24 10:00     ` Laurent Pinchart [this message]
2014-10-24 10:00       ` Laurent Pinchart
2014-10-24 10:00       ` Laurent Pinchart
2014-10-24 10:00       ` Laurent Pinchart
2014-10-23 14:33 ` [PATCH 4/4] mm: cma: Use %pa to print physical addresses Laurent Pinchart
2014-10-23 14:33   ` Laurent Pinchart
2014-10-23 14:33   ` Laurent Pinchart
2014-10-23 14:33   ` Laurent Pinchart
2014-10-23 16:56   ` Michal Nazarewicz
2014-10-23 16:56     ` Michal Nazarewicz
2014-10-23 16:56     ` Michal Nazarewicz
2014-10-23 16:56     ` Michal Nazarewicz
2014-10-23 17:51   ` Geert Uytterhoeven
2014-10-23 17:51     ` Geert Uytterhoeven
2014-10-23 17:51     ` Geert Uytterhoeven
2014-10-23 17:51     ` Geert Uytterhoeven

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1874192.vbdvJooA5D@avalon \
    --to=laurent.pinchart@ideasonboard.com \
    --cc=linux-arm-kernel@lists.infradead.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.