summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--libre/linux-libre/PKGBUILD9
-rw-r--r--libre/linux-libre/config.i6864
-rw-r--r--libre/linux-libre/config.x86_644
-rw-r--r--libre/linux-libre/drm-fix-track-free-areas-3.7.patch153
-rw-r--r--libre/linux-libre/linux-libre.install2
5 files changed, 165 insertions, 7 deletions
diff --git a/libre/linux-libre/PKGBUILD b/libre/linux-libre/PKGBUILD
index 8ca135fc2..34949b78c 100644
--- a/libre/linux-libre/PKGBUILD
+++ b/libre/linux-libre/PKGBUILD
@@ -10,9 +10,9 @@
pkgbase=linux-libre # Build stock -LIBRE kernel
#pkgbase=linux-libre-custom # Build kernel with a different name
_basekernel=3.7
-_sublevel=1
+_sublevel=2
pkgver=${_basekernel}.${_sublevel}
-pkgrel=2.1
+pkgrel=1
_lxopkgver=${_basekernel}.1 # nearly always the same as pkgver
arch=('i686' 'x86_64' 'mips64el')
url="http://linux-libre.fsfla.org/"
@@ -31,6 +31,7 @@ source=("http://linux-libre.fsfla.org/pub/linux-libre/releases/${_basekernel}-gn
'change-default-console-loglevel.patch'
'fat-3.6.x.patch'
'fix-watchdog-3.7.patch'
+ 'drm-fix-track-free-areas-3.7.patch'
"http://www.linux-libre.fsfla.org/pub/linux-libre/lemote/gnewsense/pool/debuginfo/linux-patches-${_lxopkgver}-gnu_0loongsonlibre_mipsel.tar.bz2")
md5sums=('06bf9601d859531e7378eb43d4ca7dd3'
'6f4bb80d3d91b69daf5ccfea836d02df'
@@ -43,6 +44,7 @@ md5sums=('06bf9601d859531e7378eb43d4ca7dd3'
'9d3c56a4b999c8bfbd4018089a62f662'
'88d501404f172dac6fcb248978251560'
'3485d6c7ae3af35d16e09d6d9a7ed32a'
+ 'e365972f002482a7b25cd5360467d75f'
'b56c33eaee920970151fffdfc7df0766')
if [ "$CARCH" != "mips64el" ]; then
# Don't use the Loongson-specific patches on non-mips64el arches.
@@ -75,6 +77,9 @@ build() {
# fix watchdog enable/disable regression
# https://bugs.archlinux.org/task/33095
patch -Np1 -i "${srcdir}/fix-watchdog-3.7.patch"
+ # fix GPU hang
+ # https://bugs.archlinux.org/task/33160
+ patch -Np1 -i "${srcdir}/drm-fix-track-free-areas-3.7.patch"
if [ "$CARCH" == "mips64el" ]; then
sed -i "s|^EXTRAVERSION.*|EXTRAVERSION =-libre|" Makefile
diff --git a/libre/linux-libre/config.i686 b/libre/linux-libre/config.i686
index 5413daf03..5c6f3f62a 100644
--- a/libre/linux-libre/config.i686
+++ b/libre/linux-libre/config.i686
@@ -733,7 +733,7 @@ CONFIG_IP_MROUTE=y
# CONFIG_IP_MROUTE_MULTIPLE_TABLES is not set
CONFIG_IP_PIMSM_V1=y
CONFIG_IP_PIMSM_V2=y
-# CONFIG_ARPD is not set
+CONFIG_ARPD=y
CONFIG_SYN_COOKIES=y
CONFIG_NET_IPVTI=m
CONFIG_INET_AH=m
@@ -5735,7 +5735,7 @@ CONFIG_RING_BUFFER_BENCHMARK=m
# CONFIG_INTERVAL_TREE_TEST is not set
# CONFIG_PROVIDE_OHCI1394_DMA_INIT is not set
# CONFIG_FIREWIRE_OHCI_REMOTE_DMA is not set
-# CONFIG_DYNAMIC_DEBUG is not set
+CONFIG_DYNAMIC_DEBUG=y
# CONFIG_DMA_API_DEBUG is not set
# CONFIG_ATOMIC64_SELFTEST is not set
CONFIG_ASYNC_RAID6_TEST=m
diff --git a/libre/linux-libre/config.x86_64 b/libre/linux-libre/config.x86_64
index 19eb22d1f..c213f8707 100644
--- a/libre/linux-libre/config.x86_64
+++ b/libre/linux-libre/config.x86_64
@@ -703,7 +703,7 @@ CONFIG_IP_MROUTE=y
# CONFIG_IP_MROUTE_MULTIPLE_TABLES is not set
CONFIG_IP_PIMSM_V1=y
CONFIG_IP_PIMSM_V2=y
-# CONFIG_ARPD is not set
+CONFIG_ARPD=y
CONFIG_SYN_COOKIES=y
CONFIG_NET_IPVTI=m
CONFIG_INET_AH=m
@@ -5503,7 +5503,7 @@ CONFIG_RING_BUFFER_BENCHMARK=m
# CONFIG_INTERVAL_TREE_TEST is not set
# CONFIG_PROVIDE_OHCI1394_DMA_INIT is not set
# CONFIG_FIREWIRE_OHCI_REMOTE_DMA is not set
-# CONFIG_DYNAMIC_DEBUG is not set
+CONFIG_DYNAMIC_DEBUG=y
# CONFIG_DMA_API_DEBUG is not set
# CONFIG_ATOMIC64_SELFTEST is not set
CONFIG_ASYNC_RAID6_TEST=m
diff --git a/libre/linux-libre/drm-fix-track-free-areas-3.7.patch b/libre/linux-libre/drm-fix-track-free-areas-3.7.patch
new file mode 100644
index 000000000..6d00c6d3e
--- /dev/null
+++ b/libre/linux-libre/drm-fix-track-free-areas-3.7.patch
@@ -0,0 +1,153 @@
+From 9ff0ab9881bd47f7d8a95c07a2fa61f594a91d0a Mon Sep 17 00:00:00 2001
+From: Chris Wilson <chris@chris-wilson.co.uk>
+Date: Sun, 16 Dec 2012 16:15:00 +0000
+Subject: [PATCH] drm: Only evict the blocks required to create the requested
+ hole
+
+Avoid clobbering adjacent blocks if they happen to expire earlier and
+amalgamate together to form the requested hole.
+
+In passing this fixes a regression from
+commit ea7b1dd44867e9cd6bac67e7c9fc3f128b5b255c
+Author: Daniel Vetter <daniel.vetter@ffwll.ch>
+Date: Fri Feb 18 17:59:12 2011 +0100
+
+ drm: mm: track free areas implicitly
+
+which swaps the end address for size (with a potential overflow) and
+effectively causes the eviction code to clobber almost all earlier
+buffers above the evictee.
+
+v2: Check the original hole not the adjusted as the coloring may confuse
+us when later searching for the overlapping nodes. Also make sure that
+we do apply the range restriction and color adjustment in the same
+order for both scanning, searching and insertion.
+
+Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
+Cc: Daniel Vetter <daniel.vetter@ffwll.ch>
+---
+ drivers/gpu/drm/drm_mm.c | 45 +++++++++++++++++----------------------------
+ include/drm/drm_mm.h | 2 +-
+ 2 files changed, 18 insertions(+), 29 deletions(-)
+
+diff --git a/drivers/gpu/drm/drm_mm.c b/drivers/gpu/drm/drm_mm.c
+index 0761a03..665553c 100644
+--- a/drivers/gpu/drm/drm_mm.c
++++ b/drivers/gpu/drm/drm_mm.c
+@@ -213,11 +213,13 @@ static void drm_mm_insert_helper_range(struct drm_mm_node *hole_node,
+
+ BUG_ON(!hole_node->hole_follows || node->allocated);
+
+- if (mm->color_adjust)
+- mm->color_adjust(hole_node, color, &adj_start, &adj_end);
+-
+ if (adj_start < start)
+ adj_start = start;
++ if (adj_end > end)
++ adj_end = end;
++
++ if (mm->color_adjust)
++ mm->color_adjust(hole_node, color, &adj_start, &adj_end);
+
+ if (alignment) {
+ unsigned tmp = adj_start % alignment;
+@@ -489,7 +491,7 @@ void drm_mm_init_scan(struct drm_mm *mm,
+ mm->scan_size = size;
+ mm->scanned_blocks = 0;
+ mm->scan_hit_start = 0;
+- mm->scan_hit_size = 0;
++ mm->scan_hit_end = 0;
+ mm->scan_check_range = 0;
+ mm->prev_scanned_node = NULL;
+ }
+@@ -516,7 +518,7 @@ void drm_mm_init_scan_with_range(struct drm_mm *mm,
+ mm->scan_size = size;
+ mm->scanned_blocks = 0;
+ mm->scan_hit_start = 0;
+- mm->scan_hit_size = 0;
++ mm->scan_hit_end = 0;
+ mm->scan_start = start;
+ mm->scan_end = end;
+ mm->scan_check_range = 1;
+@@ -535,8 +537,7 @@ int drm_mm_scan_add_block(struct drm_mm_node *node)
+ struct drm_mm *mm = node->mm;
+ struct drm_mm_node *prev_node;
+ unsigned long hole_start, hole_end;
+- unsigned long adj_start;
+- unsigned long adj_end;
++ unsigned long adj_start, adj_end;
+
+ mm->scanned_blocks++;
+
+@@ -553,14 +554,8 @@ int drm_mm_scan_add_block(struct drm_mm_node *node)
+ node->node_list.next = &mm->prev_scanned_node->node_list;
+ mm->prev_scanned_node = node;
+
+- hole_start = drm_mm_hole_node_start(prev_node);
+- hole_end = drm_mm_hole_node_end(prev_node);
+-
+- adj_start = hole_start;
+- adj_end = hole_end;
+-
+- if (mm->color_adjust)
+- mm->color_adjust(prev_node, mm->scan_color, &adj_start, &adj_end);
++ adj_start = hole_start = drm_mm_hole_node_start(prev_node);
++ adj_end = hole_end = drm_mm_hole_node_end(prev_node);
+
+ if (mm->scan_check_range) {
+ if (adj_start < mm->scan_start)
+@@ -569,11 +564,14 @@ int drm_mm_scan_add_block(struct drm_mm_node *node)
+ adj_end = mm->scan_end;
+ }
+
++ if (mm->color_adjust)
++ mm->color_adjust(prev_node, mm->scan_color,
++ &adj_start, &adj_end);
++
+ if (check_free_hole(adj_start, adj_end,
+ mm->scan_size, mm->scan_alignment)) {
+ mm->scan_hit_start = hole_start;
+- mm->scan_hit_size = hole_end;
+-
++ mm->scan_hit_end = hole_end;
+ return 1;
+ }
+
+@@ -609,19 +607,10 @@ int drm_mm_scan_remove_block(struct drm_mm_node *node)
+ node_list);
+
+ prev_node->hole_follows = node->scanned_preceeds_hole;
+- INIT_LIST_HEAD(&node->node_list);
+ list_add(&node->node_list, &prev_node->node_list);
+
+- /* Only need to check for containement because start&size for the
+- * complete resulting free block (not just the desired part) is
+- * stored. */
+- if (node->start >= mm->scan_hit_start &&
+- node->start + node->size
+- <= mm->scan_hit_start + mm->scan_hit_size) {
+- return 1;
+- }
+-
+- return 0;
++ return (drm_mm_hole_node_end(node) > mm->scan_hit_start &&
++ node->start < mm->scan_hit_end);
+ }
+ EXPORT_SYMBOL(drm_mm_scan_remove_block);
+
+diff --git a/include/drm/drm_mm.h b/include/drm/drm_mm.h
+index 06d7f79..a1b66b7 100644
+--- a/include/drm/drm_mm.h
++++ b/include/drm/drm_mm.h
+@@ -70,7 +70,7 @@ struct drm_mm {
+ unsigned long scan_color;
+ unsigned long scan_size;
+ unsigned long scan_hit_start;
+- unsigned scan_hit_size;
++ unsigned long scan_hit_end;
+ unsigned scanned_blocks;
+ unsigned long scan_start;
+ unsigned long scan_end;
+--
+1.7.10.4
+
diff --git a/libre/linux-libre/linux-libre.install b/libre/linux-libre/linux-libre.install
index 61aa977c0..e958abbf4 100644
--- a/libre/linux-libre/linux-libre.install
+++ b/libre/linux-libre/linux-libre.install
@@ -2,7 +2,7 @@
# arg 2: the old package version
KERNEL_NAME=
-KERNEL_VERSION=3.7.1-2.1-LIBRE
+KERNEL_VERSION=3.7.2-1-LIBRE
# set a sane PATH to ensure that critical utils like depmod will be found
export PATH='/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin'