public inbox for linux-ia64@vger.kernel.org
 help / color / mirror / Atom feed
* [Linux-ia64] [PATCH] compilation fixes for i460 with 2.5.1[5-7] kernels
@ 2002-05-24  5:26 Peter Chubb
  2002-05-24 18:00 ` David Mosberger
  0 siblings, 1 reply; 2+ messages in thread
From: Peter Chubb @ 2002-05-24  5:26 UTC (permalink / raw)
  To: linux-ia64

Since 2.5.15, a few interfaces are no longer exported from filemap.c
--- which means the code for getting and releasing locked pages in
files .../agp/agpgart_be.c, .../drm/radeon.c, and .../drm/r128_cce.c
has to be changed.

Question:  Is it *really* necessary to lock these pages?  As they're
grabbed from the freepage list, they're not backed by a file, so noone
else will ever try to get the page.  (Or have I misunderstood
completely what's going on here?)  So what's it locking against? 

# This is a BitKeeper generated patch for the following project:
# Project Name: Linux kernel tree
# This patch format is intended for GNU patch command version 2.5 or higher.
# This patch includes the following deltas:
#	           ChangeSet	1.540   -> 1.541  
#	drivers/char/agp/agpgart_be.c	1.30    -> 1.31   
#	drivers/char/drm/r128_cce.c	1.6     -> 1.7    
#	drivers/char/drm/radeon_cp.c	1.7     -> 1.8    
#	drivers/char/drm/r128_drv.h	1.5     -> 1.6    
#
# The following is the BitKeeper ChangeSet Log
# --------------------------------------------
# 02/05/24	peterc@lemon.gelato.unsw.edu.au	1.541
# Replace explicit bit twiddling in struct page with calls to the correct interface functions
# in IA64-specific parts of the DRM/AGP stuff.
# 
# wake_up_page() is no longer available (as of 2.5.15)
# 
# Clean up r128_cce.c
# --------------------------------------------
#
diff -Nru a/drivers/char/agp/agpgart_be.c b/drivers/char/agp/agpgart_be.c
--- a/drivers/char/agp/agpgart_be.c	Fri May 24 15:31:15 2002
+++ b/drivers/char/agp/agpgart_be.c	Fri May 24 15:31:15 2002
@@ -1739,8 +1739,8 @@
 	bp_end = bp + ((PAGE_SIZE * (1 << (intel_i460_pageshift - PAGE_SHIFT))) - 1);
 
 	for (page = virt_to_page(bp); page <= virt_to_page(bp_end); page++) {
-		atomic_inc(&page->count);
-		set_bit(PG_locked, &page->flags);
+		get_page(page);
+		lock_page(page);
 		atomic_inc(&agp_bridge.current_memory_agp);
 	}
 	return bp;
@@ -1758,9 +1758,8 @@
 	i460_pg_detail[pg_num] = NULL;
 
 	for (page = virt_to_page(bp); page < virt_to_page(bp_end); page++) {
-		atomic_dec(&page->count);
-		clear_bit(PG_locked, &page->flags);
-		wake_up_page(page);
+		put_page(page);
+		unlock_page(page);
 		atomic_dec(&agp_bridge.current_memory_agp);
 	}
 
diff -Nru a/drivers/char/drm/r128_cce.c b/drivers/char/drm/r128_cce.c
--- a/drivers/char/drm/r128_cce.c	Fri May 24 15:31:15 2002
+++ b/drivers/char/drm/r128_cce.c	Fri May 24 15:31:15 2002
@@ -36,6 +36,11 @@
 #include <linux/interrupt.h>	/* For task queue support */
 #include <linux/delay.h>
 
+
+#ifdef CONFIG_AGP_I460
+# include <linux/pagemap.h> /* for unlock_page */
+#endif
+
 #define R128_FIFO_DEBUG		0
 
 
@@ -229,7 +234,7 @@
 		 * a better solution.
 		 */
  		if ( GET_RING_HEAD( &dev_priv->ring ) = dev_priv->ring.tail
-		     || ( dev->agp->agp_info.chipset = INTEL_460GX
+		     || ( dev_priv->cce_is_i460
 			  && ( dev_priv->ring.tail - GET_RING_HEAD( &dev_priv->ring ) ) = 2 ) )
 		{
 #endif
@@ -369,8 +374,10 @@
 			unsigned long alt_rh_off;
 
 			alt_rh_off = __get_free_page(GFP_KERNEL | GFP_DMA);
-			atomic_inc(&virt_to_page(alt_rh_off)->count);
-			set_bit(PG_locked, &virt_to_page(alt_rh_off)->flags);
+			if (alt_rh_off = 0UL)
+				BUG();
+			get_page(virt_to_page(alt_rh_off));
+			SetPageLocked(virt_to_page(alt_rh_off));
 
 			dev_priv->ring.head = (__volatile__ u32 *) alt_rh_off;
 			SET_RING_HEAD( &dev_priv->ring, 0 );
@@ -431,6 +438,10 @@
 	memset( dev_priv, 0, sizeof(drm_r128_private_t) );
 
 	dev_priv->is_pci = init->is_pci;
+#ifdef CONFIG_AGP_I460
+	dev_priv->cce_is_i460 = dev->agp->agp_info.chipset = INTEL_460GX;
+#endif
+
 
 	if ( dev_priv->is_pci && !dev->sg ) {
 		DRM_ERROR( "PCI GART memory not allocated!\n" );
@@ -687,10 +698,12 @@
 			unsigned long alt_rh_off  				(unsigned long) dev_priv->ring.head;
 
-			atomic_dec(&virt_to_page(alt_rh_off)->count);
-			clear_bit(PG_locked, &virt_to_page(alt_rh_off)->flags);
-			wake_up(&virt_to_page(alt_rh_off)->wait);
-			free_page(alt_rh_off);
+			if (alt_rh_off) {
+				struct page *p = virt_to_page(alt_rh_off);
+				put_page(p);
+				unlock_page(p);
+				__free_page(p);
+			}
 		}
 #endif
 	
diff -Nru a/drivers/char/drm/r128_drv.h b/drivers/char/drm/r128_drv.h
--- a/drivers/char/drm/r128_drv.h	Fri May 24 15:31:15 2002
+++ b/drivers/char/drm/r128_drv.h	Fri May 24 15:31:15 2002
@@ -65,7 +65,9 @@
 	int cce_mode;
 	int cce_fifo_size;
 	int cce_running;
-
+#ifdef CONFIG_AGP_I460
+	int is_i460;
+#endif
    	drm_r128_freelist_t *head;
    	drm_r128_freelist_t *tail;
 
diff -Nru a/drivers/char/drm/radeon_cp.c b/drivers/char/drm/radeon_cp.c
--- a/drivers/char/drm/radeon_cp.c	Fri May 24 15:31:15 2002
+++ b/drivers/char/drm/radeon_cp.c	Fri May 24 15:31:15 2002
@@ -36,6 +36,10 @@
 #include <linux/interrupt.h>	/* For task queue support */
 #include <linux/delay.h>
 
+#ifdef CONFIG_AGP_I460
+# include <linux/pagemap.h> /* for unlock_page */
+#endif
+
 #define RADEON_FIFO_DEBUG	0
 
 #if defined(__alpha__)
@@ -624,8 +628,10 @@
 			unsigned long alt_rh_off;
 
 			alt_rh_off = __get_free_page(GFP_KERNEL | GFP_DMA);
-			atomic_inc(&virt_to_page(alt_rh_off)->count);
-			set_bit(PG_locked, &virt_to_page(alt_rh_off)->flags);
+			if (alt_rh_off = 0UL)
+				BUG();
+			get_page(virt_to_page(alt_rh_off));
+			SetPageLocked(virt_to_page(alt_rh_off));
 
 			dev_priv->ring.head = (__volatile__ u32 *) alt_rh_off;
 			*dev_priv->ring.head = cur_read_ptr;
@@ -650,7 +656,7 @@
 #else
 		RADEON_WRITE( RADEON_CP_RB_RPTR_ADDR,
 			     entry->busaddr[page_ofs]);
-		DRM_DEBUG( "ring rptr: offset=0x%08x handle=0x%08lx\n",
+		DRM_DEBUG( "ring rptr: offset=%08lx handle=0x%08lx\n",
 			   entry->busaddr[page_ofs],
 			   entry->handle + tmp_ofs );
 #endif
@@ -1027,11 +1033,12 @@
 		 */
 		if( !dev_priv->is_pci && dev->agp->agp_info.chipset = INTEL_460GX ) {
 			unsigned long alt_rh_off = (unsigned long) dev_priv->ring.head;
-
-			atomic_dec(&virt_to_page(alt_rh_off)->count);
-			clear_bit(PG_locked, &virt_to_page(alt_rh_off)->flags);
-			wake_up(&virt_to_page(alt_rh_off)->wait);
-			free_page(alt_rh_off);
+			if (alt_rh_off) {
+				struct page *p = virt_to_page(alt_rh_off);
+				put_page(p);
+				unlock_page(p);
+				__free_page(p);
+			}
 		}
 #endif
 		DRM(free)( dev->dev_private, sizeof(drm_radeon_private_t), DRM_MEM_DRIVER );




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

* Re: [Linux-ia64] [PATCH] compilation fixes for i460 with 2.5.1[5-7] kernels
  2002-05-24  5:26 [Linux-ia64] [PATCH] compilation fixes for i460 with 2.5.1[5-7] kernels Peter Chubb
@ 2002-05-24 18:00 ` David Mosberger
  0 siblings, 0 replies; 2+ messages in thread
From: David Mosberger @ 2002-05-24 18:00 UTC (permalink / raw)
  To: linux-ia64

>>>>> On Fri, 24 May 2002 15:26:34 +1000, Peter Chubb <peter@chubb.wattle.id.au> said:

  Peter> Since 2.5.15, a few interfaces are no longer exported from
  Peter> filemap.c --- which means the code for getting and releasing
  Peter> locked pages in files .../agp/agpgart_be.c, .../drm/radeon.c,
  Peter> and .../drm/r128_cce.c has to be changed.

  Peter> Question: Is it *really* necessary to lock these pages?  As
  Peter> they're grabbed from the freepage list, they're not backed by
  Peter> a file, so noone else will ever try to get the page.  (Or
  Peter> have I misunderstood completely what's going on here?)  So
  Peter> what's it locking against?

I believe the locking is bogus.  I'm no AGP expert, but my
understanding is that what's going on there is that the agp code is
allocating an scatter/gather table which is accessed by the GART
("AGP's DMA engine").  This table can be mapped into user level.  I
suspect the intent of the original code was to prevent swap-outs
etc. on those pages.  However, that's already taken care of by the
vm-area which is used to map the memory into user level: it has the
VM_RESERVED flag set (see drm_vm.h).

BTW: I'm finally back to working on the 2.5 tree.  I hope to have a
(preliminary) 2.5.17 patch sometime today.

	--david


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

end of thread, other threads:[~2002-05-24 18:00 UTC | newest]

Thread overview: 2+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2002-05-24  5:26 [Linux-ia64] [PATCH] compilation fixes for i460 with 2.5.1[5-7] kernels Peter Chubb
2002-05-24 18:00 ` David Mosberger

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