From d598dd49fe0e3e807760ebf727c4ad25d3afe414 Mon Sep 17 00:00:00 2001 From: Greg Kroah-Hartman Date: Mon, 26 Nov 2007 14:06:37 -0800 Subject: [PATCH] 2 patches for 2.6.22 added --- .../atl1-disable-broken-64-bit-dma.patch | 88 +++++++++++++++++++ ...x-data-corruption-on-memory-pressure.patch | 73 +++++++++++++++ queue-2.6.22/series | 2 + 3 files changed, 163 insertions(+) create mode 100644 queue-2.6.22/atl1-disable-broken-64-bit-dma.patch create mode 100644 queue-2.6.22/rd-fix-data-corruption-on-memory-pressure.patch create mode 100644 queue-2.6.22/series 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 index 00000000000..4b124e091c7 --- /dev/null +++ b/queue-2.6.22/atl1-disable-broken-64-bit-dma.patch @@ -0,0 +1,88 @@ +From jcliburn@hogchain.net Sat Nov 24 11:23:59 2007 +From: Luca Tettamanti +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 + +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 +Signed-off-by: Jay Cliburn +Acked-by: Chris Snook +Signed-off-by: Jeff Garzik +Signed-off-by: Greg Kroah-Hartman + + +--- + 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 index 00000000000..0601d5ae3ac --- /dev/null +++ b/queue-2.6.22/rd-fix-data-corruption-on-memory-pressure.patch @@ -0,0 +1,73 @@ +From jack+f-061107@ucw.cz Tue Nov 6 03:26:18 2007 +From: Christian Borntraeger +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 +Cc: linux-kernel@vger.kernel.org, Christian Borntraeger +Message-ID: <20071106112615.GG32704@atrey.karlin.mff.cuni.cz> +Content-Disposition: inline + +From: Christian Borntraeger + +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 +Signed-off-by: Jan Kara +Acked-by: Nick Piggin +Cc: "Eric W. Biederman" +Signed-off-by: Andrew Morton +Signed-off-by: Linus Torvalds +Signed-off-by: Greg Kroah-Hartman + + +--- + 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 index 00000000000..ad601d18993 --- /dev/null +++ b/queue-2.6.22/series @@ -0,0 +1,2 @@ +atl1-disable-broken-64-bit-dma.patch +rd-fix-data-corruption-on-memory-pressure.patch -- 2.47.2