]> git.ipfire.org Git - thirdparty/kernel/stable-queue.git/commitdiff
2 patches for 2.6.22 added
authorGreg Kroah-Hartman <gregkh@suse.de>
Mon, 26 Nov 2007 22:06:37 +0000 (14:06 -0800)
committerGreg Kroah-Hartman <gregkh@suse.de>
Mon, 26 Nov 2007 22:06:37 +0000 (14:06 -0800)
queue-2.6.22/atl1-disable-broken-64-bit-dma.patch [new file with mode: 0644]
queue-2.6.22/rd-fix-data-corruption-on-memory-pressure.patch [new file with mode: 0644]
queue-2.6.22/series [new file with mode: 0644]

diff --git a/queue-2.6.22/atl1-disable-broken-64-bit-dma.patch b/queue-2.6.22/atl1-disable-broken-64-bit-dma.patch
new file mode 100644 (file)
index 0000000..4b124e0
--- /dev/null
@@ -0,0 +1,88 @@
+From jcliburn@hogchain.net Sat Nov 24 11:23:59 2007
+From: Luca Tettamanti <kronos.it@gmail.com>
+Date: Sat, 24 Nov 2007 13:15:18 -0600
+Subject: atl1: disable broken 64-bit DMA
+To: greg@kroah.com, chrisw@sous-sol.org
+Cc: csnook@redhat.com, kronos.it@gmail.com, linux-kernel@vger.kernel.org, stable@kernel.org
+Message-ID: <20071124191518.GA3672@osprey.hogchain.net>
+Content-Disposition: inline
+
+From: Luca Tettamanti <kronos.it@gmail.com>
+
+atl1: disable broken 64-bit DMA
+
+[ Upstream commit: 5f08e46b621a769e52a9545a23ab1d5fb2aec1d4 ]
+
+The L1 network chip can DMA to 64-bit addresses, but multiple descriptor
+rings share a single register for the high 32 bits of their address, so
+only a single, aligned, 4 GB physical address range can be used at a time.
+As a result, we need to confine the driver to a 32-bit DMA mask, otherwise
+we see occasional data corruption errors in systems containing 4 or more
+gigabytes of RAM.
+
+Signed-off-by: Luca Tettamanti <kronos.it@gmail.com>
+Signed-off-by: Jay Cliburn <jacliburn@bellsouth.net>
+Acked-by: Chris Snook <csnook@redhat.com>
+Signed-off-by: Jeff Garzik <jeff@garzik.org>
+Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
+
+
+---
+ drivers/net/atl1/atl1_main.c |   25 +++++++++++++------------
+ 1 file changed, 13 insertions(+), 12 deletions(-)
+
+--- a/drivers/net/atl1/atl1_main.c
++++ b/drivers/net/atl1/atl1_main.c
+@@ -2097,21 +2097,26 @@ static int __devinit atl1_probe(struct p
+       struct net_device *netdev;
+       struct atl1_adapter *adapter;
+       static int cards_found = 0;
+-      bool pci_using_64 = true;
+       int err;
+       err = pci_enable_device(pdev);
+       if (err)
+               return err;
+-      err = pci_set_dma_mask(pdev, DMA_64BIT_MASK);
++      /*
++       * The atl1 chip can DMA to 64-bit addresses, but it uses a single
++       * shared register for the high 32 bits, so only a single, aligned,
++       * 4 GB physical address range can be used at a time.
++       *
++       * Supporting 64-bit DMA on this hardware is more trouble than it's
++       * worth.  It is far easier to limit to 32-bit DMA than update
++       * various kernel subsystems to support the mechanics required by a
++       * fixed-high-32-bit system.
++       */
++      err = pci_set_dma_mask(pdev, DMA_32BIT_MASK);
+       if (err) {
+-              err = pci_set_dma_mask(pdev, DMA_32BIT_MASK);
+-              if (err) {
+-                      dev_err(&pdev->dev, "no usable DMA configuration\n");
+-                      goto err_dma;
+-              }
+-              pci_using_64 = false;
++              dev_err(&pdev->dev, "no usable DMA configuration\n");
++              goto err_dma;
+       }
+       /* Mark all PCI regions associated with PCI device
+        * pdev as being reserved by owner atl1_driver_name
+@@ -2176,7 +2181,6 @@ static int __devinit atl1_probe(struct p
+       netdev->ethtool_ops = &atl1_ethtool_ops;
+       adapter->bd_number = cards_found;
+-      adapter->pci_using_64 = pci_using_64;
+       /* setup the private structure */
+       err = atl1_sw_init(adapter);
+@@ -2193,9 +2197,6 @@ static int __devinit atl1_probe(struct p
+        */
+       /* netdev->features |= NETIF_F_TSO; */
+-      if (pci_using_64)
+-              netdev->features |= NETIF_F_HIGHDMA;
+-
+       netdev->features |= NETIF_F_LLTX;
+       /*
diff --git a/queue-2.6.22/rd-fix-data-corruption-on-memory-pressure.patch b/queue-2.6.22/rd-fix-data-corruption-on-memory-pressure.patch
new file mode 100644 (file)
index 0000000..0601d5a
--- /dev/null
@@ -0,0 +1,73 @@
+From jack+f-061107@ucw.cz Tue Nov  6 03:26:18 2007
+From: Christian Borntraeger <borntraeger@de.ibm.com>
+Date: Tue, 6 Nov 2007 12:26:15 +0100
+Subject: rd: fix data corruption on memory pressure
+Subject: Re: Future of Linux 2.6.22.y series
+To: Greg Kroah-Hartman <gregkh@suse.de>
+Cc: linux-kernel@vger.kernel.org, Christian Borntraeger <borntraeger@de.ibm.com>
+Message-ID: <20071106112615.GG32704@atrey.karlin.mff.cuni.cz>
+Content-Disposition: inline
+
+From: Christian Borntraeger <borntraeger@de.ibm.com>
+
+commit 5d0360ee96a5ef953dbea45873c2a8c87e77d59b upstream.
+
+We have seen ramdisk based install systems, where some pages of mapped
+libraries and programs were suddendly zeroed under memory pressure. This
+should not happen, as the ramdisk avoids freeing its pages by keeping
+them dirty all the time.
+
+It turns out that there is a case, where the VM makes a ramdisk page
+clean, without telling the ramdisk driver.  On memory pressure
+shrink_zone runs and it starts to run shrink_active_list.  There is a
+check for buffer_heads_over_limit, and if true, pagevec_strip is called.
+pagevec_strip calls try_to_release_page. If the mapping has no
+releasepage callback, try_to_free_buffers is called. try_to_free_buffers
+has now a special logic for some file systems to make a dirty page
+clean, if all buffers are clean. Thats what happened in our test case.
+
+The simplest solution is to provide a noop-releasepage callback for the
+ramdisk driver. This avoids try_to_free_buffers for ramdisk pages.
+
+Signed-off-by: Christian Borntraeger <borntraeger@de.ibm.com>
+Signed-off-by: Jan Kara <jack@suse.cz>
+Acked-by: Nick Piggin <npiggin@suse.de>
+Cc: "Eric W. Biederman" <ebiederm@xmission.com>
+Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
+Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
+Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
+
+
+---
+ drivers/block/rd.c |   13 +++++++++++++
+ 1 file changed, 13 insertions(+)
+
+--- a/drivers/block/rd.c
++++ b/drivers/block/rd.c
+@@ -189,6 +189,18 @@ static int ramdisk_set_page_dirty(struct
+       return 0;
+ }
++/*
++ * releasepage is called by pagevec_strip/try_to_release_page if
++ * buffers_heads_over_limit is true. Without a releasepage function
++ * try_to_free_buffers is called instead. That can unset the dirty
++ * bit of our ram disk pages, which will be eventually freed, even
++ * if the page is still in use.
++ */
++static int ramdisk_releasepage(struct page *page, gfp_t dummy)
++{
++      return 0;
++}
++
+ static const struct address_space_operations ramdisk_aops = {
+       .readpage       = ramdisk_readpage,
+       .prepare_write  = ramdisk_prepare_write,
+@@ -196,6 +208,7 @@ static const struct address_space_operat
+       .writepage      = ramdisk_writepage,
+       .set_page_dirty = ramdisk_set_page_dirty,
+       .writepages     = ramdisk_writepages,
++      .releasepage    = ramdisk_releasepage,
+ };
+ static int rd_blkdev_pagecache_IO(int rw, struct bio_vec *vec, sector_t sector,
diff --git a/queue-2.6.22/series b/queue-2.6.22/series
new file mode 100644 (file)
index 0000000..ad601d1
--- /dev/null
@@ -0,0 +1,2 @@
+atl1-disable-broken-64-bit-dma.patch
+rd-fix-data-corruption-on-memory-pressure.patch