mirror of https://lore.kernel.org/lkml/
 help / color / mirror / Atom feed
* [patch] agp: don't lock pages
@ 2007-07-25 11:19 Nick Piggin
  2007-07-25 18:44 ` Bret Towe
  2007-07-25 21:26 ` Benjamin Herrenschmidt
  0 siblings, 2 replies; 7+ messages in thread
From: Nick Piggin @ 2007-07-25 11:19 UTC (permalink / raw)
  To: Linux Kernel Mailing List, Benjamin Herrenschmidt, airlied, magnade

Hi,

Does this patch solve the X problem? Does anyone see anything wrong
with it or know why agp was locking the pages?

--
AGP should not need to lock pages. They are not protecting any race
because there is no lock_page calls, only SetPageLocked.

This is causing hangs with d00806b183152af6d24f46f0c33f14162ca1262a.

Signed-off-by: Nick Piggin <npiggin@suse.de>

diff --git a/drivers/char/agp/generic.c b/drivers/char/agp/generic.c
index d535c40..3db4f40 100644
--- a/drivers/char/agp/generic.c
+++ b/drivers/char/agp/generic.c
@@ -1170,7 +1170,6 @@ void *agp_generic_alloc_page(struct agp_
 	map_page_into_agp(page);
 
 	get_page(page);
-	SetPageLocked(page);
 	atomic_inc(&agp_bridge->current_memory_agp);
 	return page_address(page);
 }
@@ -1187,7 +1186,6 @@ void agp_generic_destroy_page(void *addr
 	page = virt_to_page(addr);
 	unmap_page_from_agp(page);
 	put_page(page);
-	unlock_page(page);
 	free_page((unsigned long)addr);
 	atomic_dec(&agp_bridge->current_memory_agp);
 }
diff --git a/drivers/char/agp/intel-agp.c b/drivers/char/agp/intel-agp.c
index a124060..2f319f4 100644
--- a/drivers/char/agp/intel-agp.c
+++ b/drivers/char/agp/intel-agp.c
@@ -213,7 +213,6 @@ static void *i8xx_alloc_pages(void)
 	}
 	global_flush_tlb();
 	get_page(page);
-	SetPageLocked(page);
 	atomic_inc(&agp_bridge->current_memory_agp);
 	return page_address(page);
 }
@@ -229,7 +228,6 @@ static void i8xx_destroy_pages(void *add
 	change_page_attr(page, 4, PAGE_KERNEL);
 	global_flush_tlb();
 	put_page(page);
-	unlock_page(page);
 	__free_pages(page, 2);
 	atomic_dec(&agp_bridge->current_memory_agp);
 }
diff --git a/drivers/char/agp/sgi-agp.c b/drivers/char/agp/sgi-agp.c
index cda608c..98cf8ab 100644
--- a/drivers/char/agp/sgi-agp.c
+++ b/drivers/char/agp/sgi-agp.c
@@ -51,7 +51,6 @@ static void *sgi_tioca_alloc_page(struct
 		return NULL;
 
 	get_page(page);
-	SetPageLocked(page);
 	atomic_inc(&agp_bridge->current_memory_agp);
 	return page_address(page);
 }

^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: [patch] agp: don't lock pages
  2007-07-25 11:19 [patch] agp: don't lock pages Nick Piggin
@ 2007-07-25 18:44 ` Bret Towe
  2007-07-25 21:26 ` Benjamin Herrenschmidt
  1 sibling, 0 replies; 7+ messages in thread
From: Bret Towe @ 2007-07-25 18:44 UTC (permalink / raw)
  To: Nick Piggin; +Cc: Linux Kernel Mailing List, Benjamin Herrenschmidt, airlied

On 7/25/07, Nick Piggin <npiggin@suse.de> wrote:
> Hi,
>
> Does this patch solve the X problem? Does anyone see anything wrong
> with it or know why agp was locking the pages?

Yeap the mac mini is happy again
Thanks

> --
> AGP should not need to lock pages. They are not protecting any race
> because there is no lock_page calls, only SetPageLocked.
>
> This is causing hangs with d00806b183152af6d24f46f0c33f14162ca1262a.
>
> Signed-off-by: Nick Piggin <npiggin@suse.de>
>
> diff --git a/drivers/char/agp/generic.c b/drivers/char/agp/generic.c
> index d535c40..3db4f40 100644
> --- a/drivers/char/agp/generic.c
> +++ b/drivers/char/agp/generic.c
> @@ -1170,7 +1170,6 @@ void *agp_generic_alloc_page(struct agp_
>         map_page_into_agp(page);
>
>         get_page(page);
> -       SetPageLocked(page);
>         atomic_inc(&agp_bridge->current_memory_agp);
>         return page_address(page);
>  }
> @@ -1187,7 +1186,6 @@ void agp_generic_destroy_page(void *addr
>         page = virt_to_page(addr);
>         unmap_page_from_agp(page);
>         put_page(page);
> -       unlock_page(page);
>         free_page((unsigned long)addr);
>         atomic_dec(&agp_bridge->current_memory_agp);
>  }
> diff --git a/drivers/char/agp/intel-agp.c b/drivers/char/agp/intel-agp.c
> index a124060..2f319f4 100644
> --- a/drivers/char/agp/intel-agp.c
> +++ b/drivers/char/agp/intel-agp.c
> @@ -213,7 +213,6 @@ static void *i8xx_alloc_pages(void)
>         }
>         global_flush_tlb();
>         get_page(page);
> -       SetPageLocked(page);
>         atomic_inc(&agp_bridge->current_memory_agp);
>         return page_address(page);
>  }
> @@ -229,7 +228,6 @@ static void i8xx_destroy_pages(void *add
>         change_page_attr(page, 4, PAGE_KERNEL);
>         global_flush_tlb();
>         put_page(page);
> -       unlock_page(page);
>         __free_pages(page, 2);
>         atomic_dec(&agp_bridge->current_memory_agp);
>  }
> diff --git a/drivers/char/agp/sgi-agp.c b/drivers/char/agp/sgi-agp.c
> index cda608c..98cf8ab 100644
> --- a/drivers/char/agp/sgi-agp.c
> +++ b/drivers/char/agp/sgi-agp.c
> @@ -51,7 +51,6 @@ static void *sgi_tioca_alloc_page(struct
>                 return NULL;
>
>         get_page(page);
> -       SetPageLocked(page);
>         atomic_inc(&agp_bridge->current_memory_agp);
>         return page_address(page);
>  }
> -
> To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at  http://vger.kernel.org/majordomo-info.html
> Please read the FAQ at  http://www.tux.org/lkml/
>

^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: [patch] agp: don't lock pages
  2007-07-25 11:19 [patch] agp: don't lock pages Nick Piggin
  2007-07-25 18:44 ` Bret Towe
@ 2007-07-25 21:26 ` Benjamin Herrenschmidt
  2007-07-26  0:41   ` Nick Piggin
  1 sibling, 1 reply; 7+ messages in thread
From: Benjamin Herrenschmidt @ 2007-07-25 21:26 UTC (permalink / raw)
  To: Nick Piggin; +Cc: Linux Kernel Mailing List, airlied, magnade

On Wed, 2007-07-25 at 13:19 +0200, Nick Piggin wrote:
> Hi,
> 
> Does this patch solve the X problem? Does anyone see anything wrong
> with it or know why agp was locking the pages?

We need to do a little bit of auditing here, but I suspect it will turn
out all right. I think the reason it locked them in the first place was
to avoid AGP pages mapped into process space from being swapped out.

I think that should be taken care of by appropriate vma flags nowadays,
but we need to double check. It also might have been a way around dodgy
refcounting at one point but I think we got that right nowadays (I
remember fixing issues in that area when we removed PageReserved from
those pages back then).

Ben.

> --
> AGP should not need to lock pages. They are not protecting any race
> because there is no lock_page calls, only SetPageLocked.
> 
> This is causing hangs with d00806b183152af6d24f46f0c33f14162ca1262a.
> 
> Signed-off-by: Nick Piggin <npiggin@suse.de>
> 
> diff --git a/drivers/char/agp/generic.c b/drivers/char/agp/generic.c
> index d535c40..3db4f40 100644
> --- a/drivers/char/agp/generic.c
> +++ b/drivers/char/agp/generic.c
> @@ -1170,7 +1170,6 @@ void *agp_generic_alloc_page(struct agp_
>  	map_page_into_agp(page);
>  
>  	get_page(page);
> -	SetPageLocked(page);
>  	atomic_inc(&agp_bridge->current_memory_agp);
>  	return page_address(page);
>  }
> @@ -1187,7 +1186,6 @@ void agp_generic_destroy_page(void *addr
>  	page = virt_to_page(addr);
>  	unmap_page_from_agp(page);
>  	put_page(page);
> -	unlock_page(page);
>  	free_page((unsigned long)addr);
>  	atomic_dec(&agp_bridge->current_memory_agp);
>  }
> diff --git a/drivers/char/agp/intel-agp.c b/drivers/char/agp/intel-agp.c
> index a124060..2f319f4 100644
> --- a/drivers/char/agp/intel-agp.c
> +++ b/drivers/char/agp/intel-agp.c
> @@ -213,7 +213,6 @@ static void *i8xx_alloc_pages(void)
>  	}
>  	global_flush_tlb();
>  	get_page(page);
> -	SetPageLocked(page);
>  	atomic_inc(&agp_bridge->current_memory_agp);
>  	return page_address(page);
>  }
> @@ -229,7 +228,6 @@ static void i8xx_destroy_pages(void *add
>  	change_page_attr(page, 4, PAGE_KERNEL);
>  	global_flush_tlb();
>  	put_page(page);
> -	unlock_page(page);
>  	__free_pages(page, 2);
>  	atomic_dec(&agp_bridge->current_memory_agp);
>  }
> diff --git a/drivers/char/agp/sgi-agp.c b/drivers/char/agp/sgi-agp.c
> index cda608c..98cf8ab 100644
> --- a/drivers/char/agp/sgi-agp.c
> +++ b/drivers/char/agp/sgi-agp.c
> @@ -51,7 +51,6 @@ static void *sgi_tioca_alloc_page(struct
>  		return NULL;
>  
>  	get_page(page);
> -	SetPageLocked(page);
>  	atomic_inc(&agp_bridge->current_memory_agp);
>  	return page_address(page);
>  }


^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: [patch] agp: don't lock pages
  2007-07-25 21:26 ` Benjamin Herrenschmidt
@ 2007-07-26  0:41   ` Nick Piggin
  2007-07-26  0:42     ` Nick Piggin
  2007-07-26  1:44     ` Dave Airlie
  0 siblings, 2 replies; 7+ messages in thread
From: Nick Piggin @ 2007-07-26  0:41 UTC (permalink / raw)
  To: Benjamin Herrenschmidt; +Cc: Linux Kernel Mailing List, airlied, magnade

[forgot to cc Dave Jones...]


On Thu, Jul 26, 2007 at 07:26:53AM +1000, Benjamin Herrenschmidt wrote:
> On Wed, 2007-07-25 at 13:19 +0200, Nick Piggin wrote:
> > Hi,
> > 
> > Does this patch solve the X problem? Does anyone see anything wrong
> > with it or know why agp was locking the pages?
> 
> We need to do a little bit of auditing here, but I suspect it will turn
> out all right. I think the reason it locked them in the first place was
> to avoid AGP pages mapped into process space from being swapped out.
> 
> I think that should be taken care of by appropriate vma flags nowadays,
> but we need to double check. It also might have been a way around dodgy
> refcounting at one point but I think we got that right nowadays (I
> remember fixing issues in that area when we removed PageReserved from
> those pages back then).

Yeah I had a bit of a look around, and it seems OK (but would
appreciate an ack from someone who knows the code).

These pages will never get seen by page reclaim, so we're OK
there. There is a get_page before the SetPageLocked and a put_page
right before the unlock_page, so refcounting should not be broken
if it wasn't already: note that the lock_page doesn't pin a
reference on a page in general -- we can use it as such for pagecache
(although it isn't very clean), because the lock pins the page in
pagecache and the pagecache holds a ref.

Anyway, if Dave or David can take a look, that would be appreciated.
We'll need this for 2.6.23.

Nick

> 
> Ben.
> 
> > --
> > AGP should not need to lock pages. They are not protecting any race
> > because there is no lock_page calls, only SetPageLocked.
> > 
> > This is causing hangs with d00806b183152af6d24f46f0c33f14162ca1262a.
> > 
> > Signed-off-by: Nick Piggin <npiggin@suse.de>
> > 
> > diff --git a/drivers/char/agp/generic.c b/drivers/char/agp/generic.c
> > index d535c40..3db4f40 100644
> > --- a/drivers/char/agp/generic.c
> > +++ b/drivers/char/agp/generic.c
> > @@ -1170,7 +1170,6 @@ void *agp_generic_alloc_page(struct agp_
> >  	map_page_into_agp(page);
> >  
> >  	get_page(page);
> > -	SetPageLocked(page);
> >  	atomic_inc(&agp_bridge->current_memory_agp);
> >  	return page_address(page);
> >  }
> > @@ -1187,7 +1186,6 @@ void agp_generic_destroy_page(void *addr
> >  	page = virt_to_page(addr);
> >  	unmap_page_from_agp(page);
> >  	put_page(page);
> > -	unlock_page(page);
> >  	free_page((unsigned long)addr);
> >  	atomic_dec(&agp_bridge->current_memory_agp);
> >  }
> > diff --git a/drivers/char/agp/intel-agp.c b/drivers/char/agp/intel-agp.c
> > index a124060..2f319f4 100644
> > --- a/drivers/char/agp/intel-agp.c
> > +++ b/drivers/char/agp/intel-agp.c
> > @@ -213,7 +213,6 @@ static void *i8xx_alloc_pages(void)
> >  	}
> >  	global_flush_tlb();
> >  	get_page(page);
> > -	SetPageLocked(page);
> >  	atomic_inc(&agp_bridge->current_memory_agp);
> >  	return page_address(page);
> >  }
> > @@ -229,7 +228,6 @@ static void i8xx_destroy_pages(void *add
> >  	change_page_attr(page, 4, PAGE_KERNEL);
> >  	global_flush_tlb();
> >  	put_page(page);
> > -	unlock_page(page);
> >  	__free_pages(page, 2);
> >  	atomic_dec(&agp_bridge->current_memory_agp);
> >  }
> > diff --git a/drivers/char/agp/sgi-agp.c b/drivers/char/agp/sgi-agp.c
> > index cda608c..98cf8ab 100644
> > --- a/drivers/char/agp/sgi-agp.c
> > +++ b/drivers/char/agp/sgi-agp.c
> > @@ -51,7 +51,6 @@ static void *sgi_tioca_alloc_page(struct
> >  		return NULL;
> >  
> >  	get_page(page);
> > -	SetPageLocked(page);
> >  	atomic_inc(&agp_bridge->current_memory_agp);
> >  	return page_address(page);
> >  }

^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: [patch] agp: don't lock pages
  2007-07-26  0:41   ` Nick Piggin
@ 2007-07-26  0:42     ` Nick Piggin
  2007-07-26  1:44     ` Dave Airlie
  1 sibling, 0 replies; 7+ messages in thread
From: Nick Piggin @ 2007-07-26  0:42 UTC (permalink / raw)
  To: Benjamin Herrenschmidt; +Cc: Linux Kernel Mailing List, airlied, magnade, davej

[one more try]

On Thu, Jul 26, 2007 at 02:41:14AM +0200, Nick Piggin wrote:
> [forgot to cc Dave Jones...]
> 
> 
> On Thu, Jul 26, 2007 at 07:26:53AM +1000, Benjamin Herrenschmidt wrote:
> > On Wed, 2007-07-25 at 13:19 +0200, Nick Piggin wrote:
> > > Hi,
> > > 
> > > Does this patch solve the X problem? Does anyone see anything wrong
> > > with it or know why agp was locking the pages?
> > 
> > We need to do a little bit of auditing here, but I suspect it will turn
> > out all right. I think the reason it locked them in the first place was
> > to avoid AGP pages mapped into process space from being swapped out.
> > 
> > I think that should be taken care of by appropriate vma flags nowadays,
> > but we need to double check. It also might have been a way around dodgy
> > refcounting at one point but I think we got that right nowadays (I
> > remember fixing issues in that area when we removed PageReserved from
> > those pages back then).
> 
> Yeah I had a bit of a look around, and it seems OK (but would
> appreciate an ack from someone who knows the code).
> 
> These pages will never get seen by page reclaim, so we're OK
> there. There is a get_page before the SetPageLocked and a put_page
> right before the unlock_page, so refcounting should not be broken
> if it wasn't already: note that the lock_page doesn't pin a
> reference on a page in general -- we can use it as such for pagecache
> (although it isn't very clean), because the lock pins the page in
> pagecache and the pagecache holds a ref.
> 
> Anyway, if Dave or David can take a look, that would be appreciated.
> We'll need this for 2.6.23.
> 
> Nick
> 
> > 
> > Ben.
> > 
> > > --
> > > AGP should not need to lock pages. They are not protecting any race
> > > because there is no lock_page calls, only SetPageLocked.
> > > 
> > > This is causing hangs with d00806b183152af6d24f46f0c33f14162ca1262a.
> > > 
> > > Signed-off-by: Nick Piggin <npiggin@suse.de>
> > > 
> > > diff --git a/drivers/char/agp/generic.c b/drivers/char/agp/generic.c
> > > index d535c40..3db4f40 100644
> > > --- a/drivers/char/agp/generic.c
> > > +++ b/drivers/char/agp/generic.c
> > > @@ -1170,7 +1170,6 @@ void *agp_generic_alloc_page(struct agp_
> > >  	map_page_into_agp(page);
> > >  
> > >  	get_page(page);
> > > -	SetPageLocked(page);
> > >  	atomic_inc(&agp_bridge->current_memory_agp);
> > >  	return page_address(page);
> > >  }
> > > @@ -1187,7 +1186,6 @@ void agp_generic_destroy_page(void *addr
> > >  	page = virt_to_page(addr);
> > >  	unmap_page_from_agp(page);
> > >  	put_page(page);
> > > -	unlock_page(page);
> > >  	free_page((unsigned long)addr);
> > >  	atomic_dec(&agp_bridge->current_memory_agp);
> > >  }
> > > diff --git a/drivers/char/agp/intel-agp.c b/drivers/char/agp/intel-agp.c
> > > index a124060..2f319f4 100644
> > > --- a/drivers/char/agp/intel-agp.c
> > > +++ b/drivers/char/agp/intel-agp.c
> > > @@ -213,7 +213,6 @@ static void *i8xx_alloc_pages(void)
> > >  	}
> > >  	global_flush_tlb();
> > >  	get_page(page);
> > > -	SetPageLocked(page);
> > >  	atomic_inc(&agp_bridge->current_memory_agp);
> > >  	return page_address(page);
> > >  }
> > > @@ -229,7 +228,6 @@ static void i8xx_destroy_pages(void *add
> > >  	change_page_attr(page, 4, PAGE_KERNEL);
> > >  	global_flush_tlb();
> > >  	put_page(page);
> > > -	unlock_page(page);
> > >  	__free_pages(page, 2);
> > >  	atomic_dec(&agp_bridge->current_memory_agp);
> > >  }
> > > diff --git a/drivers/char/agp/sgi-agp.c b/drivers/char/agp/sgi-agp.c
> > > index cda608c..98cf8ab 100644
> > > --- a/drivers/char/agp/sgi-agp.c
> > > +++ b/drivers/char/agp/sgi-agp.c
> > > @@ -51,7 +51,6 @@ static void *sgi_tioca_alloc_page(struct
> > >  		return NULL;
> > >  
> > >  	get_page(page);
> > > -	SetPageLocked(page);
> > >  	atomic_inc(&agp_bridge->current_memory_agp);
> > >  	return page_address(page);
> > >  }

^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: [patch] agp: don't lock pages
  2007-07-26  0:41   ` Nick Piggin
  2007-07-26  0:42     ` Nick Piggin
@ 2007-07-26  1:44     ` Dave Airlie
  2007-07-26  2:07       ` Nick Piggin
  1 sibling, 1 reply; 7+ messages in thread
From: Dave Airlie @ 2007-07-26  1:44 UTC (permalink / raw)
  To: Nick Piggin
  Cc: Benjamin Herrenschmidt, Linux Kernel Mailing List, magnade, davej

>
> On Thu, Jul 26, 2007 at 07:26:53AM +1000, Benjamin Herrenschmidt wrote:
> > On Wed, 2007-07-25 at 13:19 +0200, Nick Piggin wrote:
> > > Hi,
> > >
> > > Does this patch solve the X problem? Does anyone see anything wrong
> > > with it or know why agp was locking the pages?
> >
> > We need to do a little bit of auditing here, but I suspect it will turn
> > out all right. I think the reason it locked them in the first place was
> > to avoid AGP pages mapped into process space from being swapped out.
> >
> > I think that should be taken care of by appropriate vma flags nowadays,
> > but we need to double check. It also might have been a way around dodgy
> > refcounting at one point but I think we got that right nowadays (I
> > remember fixing issues in that area when we removed PageReserved from
> > those pages back then).
>
> Yeah I had a bit of a look around, and it seems OK (but would
> appreciate an ack from someone who knows the code).
>
> These pages will never get seen by page reclaim, so we're OK
> there. There is a get_page before the SetPageLocked and a put_page
> right before the unlock_page, so refcounting should not be broken
> if it wasn't already: note that the lock_page doesn't pin a
> reference on a page in general -- we can use it as such for pagecache
> (although it isn't very clean), because the lock pins the page in
> pagecache and the pagecache holds a ref.
>
> Anyway, if Dave or David can take a look, that would be appreciated.
> We'll need this for 2.6.23.

I talked with Ben earlier and I can't see anything inherently wrong
with removing the lock_page, I assume it was put there to stop things
getting swapped but if the get/put does that then I'd be happy to
remove it.

I'm just a bit confused how this didn't get picked up in -mm at all.

Dave.

^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: [patch] agp: don't lock pages
  2007-07-26  1:44     ` Dave Airlie
@ 2007-07-26  2:07       ` Nick Piggin
  0 siblings, 0 replies; 7+ messages in thread
From: Nick Piggin @ 2007-07-26  2:07 UTC (permalink / raw)
  To: Dave Airlie
  Cc: Benjamin Herrenschmidt, Linux Kernel Mailing List, magnade, davej

On Thu, Jul 26, 2007 at 11:44:22AM +1000, Dave Airlie wrote:
> >
> >Yeah I had a bit of a look around, and it seems OK (but would
> >appreciate an ack from someone who knows the code).
> >
> >These pages will never get seen by page reclaim, so we're OK
> >there. There is a get_page before the SetPageLocked and a put_page
> >right before the unlock_page, so refcounting should not be broken
> >if it wasn't already: note that the lock_page doesn't pin a
> >reference on a page in general -- we can use it as such for pagecache
> >(although it isn't very clean), because the lock pins the page in
> >pagecache and the pagecache holds a ref.
> >
> >Anyway, if Dave or David can take a look, that would be appreciated.
> >We'll need this for 2.6.23.
> 
> I talked with Ben earlier and I can't see anything inherently wrong
> with removing the lock_page, I assume it was put there to stop things
> getting swapped but if the get/put does that then I'd be happy to
> remove it.

Well it is prevented from being swapped out because it never gets
put on swapout lists, but the get/put certainly doesn't hurt :)
 

> I'm just a bit confused how this didn't get picked up in -mm at all.

Beats me. It was in there for nearly 5 months. Mustn't have been
tested or reported.

^ permalink raw reply	[flat|nested] 7+ messages in thread

end of thread, other threads:[~2007-07-26  2:07 UTC | newest]

Thread overview: 7+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2007-07-25 11:19 [patch] agp: don't lock pages Nick Piggin
2007-07-25 18:44 ` Bret Towe
2007-07-25 21:26 ` Benjamin Herrenschmidt
2007-07-26  0:41   ` Nick Piggin
2007-07-26  0:42     ` Nick Piggin
2007-07-26  1:44     ` Dave Airlie
2007-07-26  2:07       ` Nick Piggin

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox

all inboxes | Powered by JetHome®