Update to 3.2.40
Drop various patches which went into this. Avoid ABI change in PPS, and ignore ABI change in rtlwifi. rt patch 0134 no longer applies and I can't see how to fix it, but hopefully this will be resolved in a new stable-rt update shortly. svn path=/dists/sid/linux/; revision=19903
This commit is contained in:
parent
cbb351bb23
commit
279ac0273f
|
@ -1,4 +1,51 @@
|
|||
linux (3.2.39-3) UNRELEASED; urgency=low
|
||||
linux (3.2.40-1) UNRELEASED; urgency=low
|
||||
|
||||
* New upstream stable update:
|
||||
http://www.kernel.org/pub/linux/kernel/v3.x/ChangeLog-3.2.40
|
||||
- ext4: return ENOMEM if sb_getblk() fails
|
||||
- ext4: fix possible use-after-free with AIO
|
||||
- s390/kvm: Fix store status for ACRS/FPRS
|
||||
- staging: comedi: disallow COMEDI_DEVCONFIG on non-board minors
|
||||
- ext4: fix race in ext4_mb_add_n_trim()
|
||||
- UBIFS: fix double free of ubifs_orphan objects
|
||||
- hrtimer: Prevent hrtimer_enqueue_reprogram race
|
||||
- nfsd: Fix memleak
|
||||
- x86: Do not leak kernel page mapping locations
|
||||
- USB: usb-storage: unusual_devs update for Super TOP SATA bridge
|
||||
- posix-cpu-timers: Fix nanosleep task_struct leak
|
||||
- NFSv4.1: Don't decode skipped layoutgets
|
||||
- cgroup: fix exit() vs rmdir() race
|
||||
- cpuset: fix cpuset_print_task_mems_allowed() vs rename() race
|
||||
- ext4: fix xattr block allocation/release with bigalloc
|
||||
- mm: fix pageblock bitmap allocation
|
||||
- target: Add missing mapped_lun bounds checking during make_mappedlun
|
||||
setup
|
||||
- b43: Increase number of RX DMA slots
|
||||
- posix-timer: Don't call idr_find() with out-of-range ID
|
||||
- fs: Fix possible use-after-free with AIO
|
||||
- powerpc/kexec: Disable hard IRQ before kexec
|
||||
- mmu_notifier_unregister NULL Pointer deref and multiple ->release()
|
||||
callouts
|
||||
- tmpfs: fix use-after-free of mempolicy object (CVE-2013-1767)
|
||||
- ocfs2: fix possible use-after-free with AIO
|
||||
- ocfs2: fix ocfs2_init_security_and_acl() to initialize acl correctly
|
||||
- ocfs2: ac->ac_allow_chain_relink=0 won't disable group relink
|
||||
- idr: fix a subtle bug in idr_get_next()
|
||||
- idr: make idr_get_next() good for rcu_read_lock()
|
||||
- idr: fix top layer handling
|
||||
- sysctl: fix null checking in bin_dn_node_address()
|
||||
- nbd: fsync and kill block device on shutdown
|
||||
- s390/timer: avoid overflow when programming clock comparator
|
||||
(regression in 3.2.38)
|
||||
- xen-pciback: rate limit error messages from xen_pcibk_enable_msi{,x}()
|
||||
(CVE-2013-0231)
|
||||
- xen-netback: correctly return errors from netbk_count_requests()
|
||||
- xen-netback: cancel the credit timer when taking the vif down
|
||||
- ipv6: use a stronger hash for tcp
|
||||
- staging: comedi: ni_labpc: correct differential channel sequence for
|
||||
AI commands
|
||||
- staging: comedi: ni_labpc: set up command4 register *after* command3
|
||||
- vhost: fix length for cross region descriptor (CVE-2013-0311)
|
||||
|
||||
[ Aurelien Jarno]
|
||||
* [mips,mipsel] Disable VGA_CONSOLE and ignore the corresponding ABI
|
||||
|
@ -11,7 +58,6 @@ linux (3.2.39-3) UNRELEASED; urgency=low
|
|||
[ Ben Hutchings ]
|
||||
* [x86] ata_piix: reenable MS Virtual PC guests (fixes regression in
|
||||
3.2.19-1)
|
||||
* vhost: fix length for cross region descriptor (CVE-2013-0311)
|
||||
* test-patches: Clean up all previous test patches, whether or not they
|
||||
were applied
|
||||
* test-patches: Add --fuzz option to allow testing patches that have fuzz
|
||||
|
|
|
@ -39,6 +39,8 @@ ignore-changes:
|
|||
vring_*
|
||||
# No-one should depend on staging from OOT
|
||||
module:drivers/staging/*
|
||||
# Private to this family of drivers
|
||||
module:drivers/net/wireless/rtlwifi/*
|
||||
|
||||
[base]
|
||||
arches:
|
||||
|
|
|
@ -1,38 +0,0 @@
|
|||
From: Josh Boyer <jwboyer@redhat.com>
|
||||
Date: Thu, 14 Feb 2013 09:39:09 -0500
|
||||
Subject: USB: usb-storage: unusual_devs update for Super TOP SATA bridge
|
||||
|
||||
commit 18e03310b5caa6d11c1a8c61b982c37047693fba upstream.
|
||||
|
||||
The current entry in unusual_cypress.h for the Super TOP SATA bridge devices
|
||||
seems to be causing corruption on newer revisions of this device. This has
|
||||
been reported in Arch Linux and Fedora. The original patch was tested on
|
||||
devices with bcdDevice of 1.60, whereas the newer devices report bcdDevice
|
||||
as 2.20. Limit the UNUSUAL_DEV entry to devices less than 2.20.
|
||||
|
||||
This fixes https://bugzilla.redhat.com/show_bug.cgi?id=909591
|
||||
|
||||
The Arch Forum post on this is here:
|
||||
https://bbs.archlinux.org/viewtopic.php?id=152011
|
||||
|
||||
Reported-by: Carsten S. <carsteniq@yahoo.com>
|
||||
Tested-by: Carsten S. <carsteniq@yahoo.com>
|
||||
Signed-off-by: Josh Boyer <jwboyer@redhat.com>
|
||||
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
||||
---
|
||||
drivers/usb/storage/unusual_cypress.h | 2 +-
|
||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
|
||||
diff --git a/drivers/usb/storage/unusual_cypress.h b/drivers/usb/storage/unusual_cypress.h
|
||||
index 2c85530..65a6a75 100644
|
||||
--- a/drivers/usb/storage/unusual_cypress.h
|
||||
+++ b/drivers/usb/storage/unusual_cypress.h
|
||||
@@ -31,7 +31,7 @@ UNUSUAL_DEV( 0x04b4, 0x6831, 0x0000, 0x9999,
|
||||
"Cypress ISD-300LP",
|
||||
USB_SC_CYP_ATACB, USB_PR_DEVICE, NULL, 0),
|
||||
|
||||
-UNUSUAL_DEV( 0x14cd, 0x6116, 0x0000, 0x9999,
|
||||
+UNUSUAL_DEV( 0x14cd, 0x6116, 0x0000, 0x0219,
|
||||
"Super Top",
|
||||
"USB 2.0 SATA BRIDGE",
|
||||
USB_SC_CYP_ATACB, USB_PR_DEVICE, NULL, 0),
|
|
@ -1,133 +0,0 @@
|
|||
From: Kees Cook <keescook@chromium.org>
|
||||
Date: Thu, 6 Dec 2012 17:00:21 +1100
|
||||
Subject: [2/2] exec: use -ELOOP for max recursion depth
|
||||
|
||||
commit d740269867021faf4ce38a449353d2b986c34a67 upstream.
|
||||
|
||||
To avoid an explosion of request_module calls on a chain of abusive
|
||||
scripts, fail maximum recursion with -ELOOP instead of -ENOEXEC. As soon
|
||||
as maximum recursion depth is hit, the error will fail all the way back
|
||||
up the chain, aborting immediately.
|
||||
|
||||
This also has the side-effect of stopping the user's shell from attempting
|
||||
to reexecute the top-level file as a shell script. As seen in the
|
||||
dash source:
|
||||
|
||||
if (cmd != path_bshell && errno == ENOEXEC) {
|
||||
*argv-- = cmd;
|
||||
*argv = cmd = path_bshell;
|
||||
goto repeat;
|
||||
}
|
||||
|
||||
The above logic was designed for running scripts automatically that lacked
|
||||
the "#!" header, not to re-try failed recursion. On a legitimate -ENOEXEC,
|
||||
things continue to behave as the shell expects.
|
||||
|
||||
Additionally, when tracking recursion, the binfmt handlers should not be
|
||||
involved. The recursion being tracked is the depth of calls through
|
||||
search_binary_handler(), so that function should be exclusively responsible
|
||||
for tracking the depth.
|
||||
|
||||
Signed-off-by: Kees Cook <keescook@chromium.org>
|
||||
Cc: halfdog <me@halfdog.net>
|
||||
Cc: P J P <ppandit@redhat.com>
|
||||
Cc: Alexander Viro <viro@zeniv.linux.org.uk>
|
||||
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
|
||||
[bwh: Backported to 3.2: adjust context]
|
||||
---
|
||||
fs/binfmt_em86.c | 1 -
|
||||
fs/binfmt_misc.c | 6 ------
|
||||
fs/binfmt_script.c | 4 +---
|
||||
fs/exec.c | 10 +++++-----
|
||||
include/linux/binfmts.h | 2 --
|
||||
5 files changed, 6 insertions(+), 17 deletions(-)
|
||||
|
||||
--- a/fs/binfmt_em86.c
|
||||
+++ b/fs/binfmt_em86.c
|
||||
@@ -42,7 +42,6 @@ static int load_em86(struct linux_binprm
|
||||
return -ENOEXEC;
|
||||
}
|
||||
|
||||
- bprm->recursion_depth++; /* Well, the bang-shell is implicit... */
|
||||
allow_write_access(bprm->file);
|
||||
fput(bprm->file);
|
||||
bprm->file = NULL;
|
||||
--- a/fs/binfmt_misc.c
|
||||
+++ b/fs/binfmt_misc.c
|
||||
@@ -116,10 +116,6 @@ static int load_misc_binary(struct linux
|
||||
if (!enabled)
|
||||
goto _ret;
|
||||
|
||||
- retval = -ENOEXEC;
|
||||
- if (bprm->recursion_depth > BINPRM_MAX_RECURSION)
|
||||
- goto _ret;
|
||||
-
|
||||
/* to keep locking time low, we copy the interpreter string */
|
||||
read_lock(&entries_lock);
|
||||
fmt = check_file(bprm);
|
||||
@@ -199,8 +195,6 @@ static int load_misc_binary(struct linux
|
||||
if (retval < 0)
|
||||
goto _error;
|
||||
|
||||
- bprm->recursion_depth++;
|
||||
-
|
||||
retval = search_binary_handler (bprm, regs);
|
||||
if (retval < 0)
|
||||
goto _error;
|
||||
--- a/fs/binfmt_script.c
|
||||
+++ b/fs/binfmt_script.c
|
||||
@@ -22,15 +22,13 @@ static int load_script(struct linux_binp
|
||||
char interp[BINPRM_BUF_SIZE];
|
||||
int retval;
|
||||
|
||||
- if ((bprm->buf[0] != '#') || (bprm->buf[1] != '!') ||
|
||||
- (bprm->recursion_depth > BINPRM_MAX_RECURSION))
|
||||
+ if ((bprm->buf[0] != '#') || (bprm->buf[1] != '!'))
|
||||
return -ENOEXEC;
|
||||
/*
|
||||
* This section does the #! interpretation.
|
||||
* Sorta complicated, but hopefully it will work. -TYT
|
||||
*/
|
||||
|
||||
- bprm->recursion_depth++;
|
||||
allow_write_access(bprm->file);
|
||||
fput(bprm->file);
|
||||
bprm->file = NULL;
|
||||
--- a/fs/exec.c
|
||||
+++ b/fs/exec.c
|
||||
@@ -1384,6 +1384,10 @@ int search_binary_handler(struct linux_b
|
||||
struct linux_binfmt *fmt;
|
||||
pid_t old_pid;
|
||||
|
||||
+ /* This allows 4 levels of binfmt rewrites before failing hard. */
|
||||
+ if (depth > 5)
|
||||
+ return -ELOOP;
|
||||
+
|
||||
retval = security_bprm_check(bprm);
|
||||
if (retval)
|
||||
return retval;
|
||||
@@ -1407,12 +1411,8 @@ int search_binary_handler(struct linux_b
|
||||
if (!try_module_get(fmt->module))
|
||||
continue;
|
||||
read_unlock(&binfmt_lock);
|
||||
+ bprm->recursion_depth = depth + 1;
|
||||
retval = fn(bprm, regs);
|
||||
- /*
|
||||
- * Restore the depth counter to its starting value
|
||||
- * in this call, so we don't have to rely on every
|
||||
- * load_binary function to restore it on return.
|
||||
- */
|
||||
bprm->recursion_depth = depth;
|
||||
if (retval >= 0) {
|
||||
if (depth == 0)
|
||||
--- a/include/linux/binfmts.h
|
||||
+++ b/include/linux/binfmts.h
|
||||
@@ -67,8 +67,6 @@ struct linux_binprm {
|
||||
#define BINPRM_FLAGS_EXECFD_BIT 1
|
||||
#define BINPRM_FLAGS_EXECFD (1 << BINPRM_FLAGS_EXECFD_BIT)
|
||||
|
||||
-#define BINPRM_MAX_RECURSION 4
|
||||
-
|
||||
/* Function parameter for binfmt->coredump */
|
||||
struct coredump_params {
|
||||
long signr;
|
|
@ -1,120 +0,0 @@
|
|||
From: Ashish Sangwan <ashishsangwan2@gmail.com>
|
||||
Date: Sun, 22 Jul 2012 22:49:08 -0400
|
||||
Subject: [PATCH 2/3] ext4: fix hole punch failure when depth is greater than 0
|
||||
|
||||
commit 968dee77220768a5f52cf8b21d0bdb73486febef upstream.
|
||||
|
||||
Whether to continue removing extents or not is decided by the return
|
||||
value of function ext4_ext_more_to_rm() which checks 2 conditions:
|
||||
a) if there are no more indexes to process.
|
||||
b) if the number of entries are decreased in the header of "depth -1".
|
||||
|
||||
In case of hole punch, if the last block to be removed is not part of
|
||||
the last extent index than this index will not be deleted, hence the
|
||||
number of valid entries in the extent header of "depth - 1" will
|
||||
remain as it is and ext4_ext_more_to_rm will return 0 although the
|
||||
required blocks are not yet removed.
|
||||
|
||||
This patch fixes the above mentioned problem as instead of removing
|
||||
the extents from the end of file, it starts removing the blocks from
|
||||
the particular extent from which removing blocks is actually required
|
||||
and continue backward until done.
|
||||
|
||||
Signed-off-by: Ashish Sangwan <ashish.sangwan2@gmail.com>
|
||||
Signed-off-by: Namjae Jeon <linkinjeon@gmail.com>
|
||||
Reviewed-by: Lukas Czerner <lczerner@redhat.com>
|
||||
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
||||
---
|
||||
fs/ext4/extents.c | 46 +++++++++++++++++++++++++++++-----------------
|
||||
1 file changed, 29 insertions(+), 17 deletions(-)
|
||||
|
||||
--- a/fs/ext4/extents.c
|
||||
+++ b/fs/ext4/extents.c
|
||||
@@ -2518,10 +2518,10 @@ static int ext4_ext_remove_space(struct
|
||||
{
|
||||
struct super_block *sb = inode->i_sb;
|
||||
int depth = ext_depth(inode);
|
||||
- struct ext4_ext_path *path;
|
||||
+ struct ext4_ext_path *path = NULL;
|
||||
ext4_fsblk_t partial_cluster = 0;
|
||||
handle_t *handle;
|
||||
- int i, err;
|
||||
+ int i = 0, err;
|
||||
|
||||
ext_debug("truncate since %u to %u\n", start, end);
|
||||
|
||||
@@ -2554,8 +2554,12 @@ again:
|
||||
}
|
||||
depth = ext_depth(inode);
|
||||
ex = path[depth].p_ext;
|
||||
- if (!ex)
|
||||
+ if (!ex) {
|
||||
+ ext4_ext_drop_refs(path);
|
||||
+ kfree(path);
|
||||
+ path = NULL;
|
||||
goto cont;
|
||||
+ }
|
||||
|
||||
ee_block = le32_to_cpu(ex->ee_block);
|
||||
|
||||
@@ -2585,8 +2589,6 @@ again:
|
||||
if (err < 0)
|
||||
goto out;
|
||||
}
|
||||
- ext4_ext_drop_refs(path);
|
||||
- kfree(path);
|
||||
}
|
||||
cont:
|
||||
|
||||
@@ -2595,19 +2597,27 @@ cont:
|
||||
* after i_size and walking into the tree depth-wise.
|
||||
*/
|
||||
depth = ext_depth(inode);
|
||||
- path = kzalloc(sizeof(struct ext4_ext_path) * (depth + 1), GFP_NOFS);
|
||||
- if (path == NULL) {
|
||||
- ext4_journal_stop(handle);
|
||||
- return -ENOMEM;
|
||||
- }
|
||||
- path[0].p_depth = depth;
|
||||
- path[0].p_hdr = ext_inode_hdr(inode);
|
||||
-
|
||||
- if (ext4_ext_check(inode, path[0].p_hdr, depth)) {
|
||||
- err = -EIO;
|
||||
- goto out;
|
||||
+ if (path) {
|
||||
+ int k = i = depth;
|
||||
+ while (--k > 0)
|
||||
+ path[k].p_block =
|
||||
+ le16_to_cpu(path[k].p_hdr->eh_entries)+1;
|
||||
+ } else {
|
||||
+ path = kzalloc(sizeof(struct ext4_ext_path) * (depth + 1),
|
||||
+ GFP_NOFS);
|
||||
+ if (path == NULL) {
|
||||
+ ext4_journal_stop(handle);
|
||||
+ return -ENOMEM;
|
||||
+ }
|
||||
+ path[0].p_depth = depth;
|
||||
+ path[0].p_hdr = ext_inode_hdr(inode);
|
||||
+
|
||||
+ if (ext4_ext_check(inode, path[0].p_hdr, depth)) {
|
||||
+ err = -EIO;
|
||||
+ goto out;
|
||||
+ }
|
||||
}
|
||||
- i = err = 0;
|
||||
+ err = 0;
|
||||
|
||||
while (i >= 0 && err == 0) {
|
||||
if (i == depth) {
|
||||
@@ -2721,8 +2731,10 @@ cont:
|
||||
out:
|
||||
ext4_ext_drop_refs(path);
|
||||
kfree(path);
|
||||
- if (err == -EAGAIN)
|
||||
+ if (err == -EAGAIN) {
|
||||
+ path = NULL;
|
||||
goto again;
|
||||
+ }
|
||||
ext4_journal_stop(handle);
|
||||
|
||||
return err;
|
|
@ -1,63 +0,0 @@
|
|||
From: Theodore Ts'o <tytso@mit.edu>
|
||||
Date: Fri, 17 Aug 2012 08:54:52 -0400
|
||||
Subject: [PATCH 3/3] ext4: fix kernel BUG on large-scale rm -rf commands
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
commit 89a4e48f8479f8145eca9698f39fe188c982212f upstream.
|
||||
|
||||
Commit 968dee7722: "ext4: fix hole punch failure when depth is greater
|
||||
than 0" introduced a regression in v3.5.1/v3.6-rc1 which caused kernel
|
||||
crashes when users ran run "rm -rf" on large directory hierarchy on
|
||||
ext4 filesystems on RAID devices:
|
||||
|
||||
BUG: unable to handle kernel NULL pointer dereference at 0000000000000028
|
||||
|
||||
Process rm (pid: 18229, threadinfo ffff8801276bc000, task ffff880123631710)
|
||||
Call Trace:
|
||||
[<ffffffff81236483>] ? __ext4_handle_dirty_metadata+0x83/0x110
|
||||
[<ffffffff812353d3>] ext4_ext_truncate+0x193/0x1d0
|
||||
[<ffffffff8120a8cf>] ? ext4_mark_inode_dirty+0x7f/0x1f0
|
||||
[<ffffffff81207e05>] ext4_truncate+0xf5/0x100
|
||||
[<ffffffff8120cd51>] ext4_evict_inode+0x461/0x490
|
||||
[<ffffffff811a1312>] evict+0xa2/0x1a0
|
||||
[<ffffffff811a1513>] iput+0x103/0x1f0
|
||||
[<ffffffff81196d84>] do_unlinkat+0x154/0x1c0
|
||||
[<ffffffff8118cc3a>] ? sys_newfstatat+0x2a/0x40
|
||||
[<ffffffff81197b0b>] sys_unlinkat+0x1b/0x50
|
||||
[<ffffffff816135e9>] system_call_fastpath+0x16/0x1b
|
||||
Code: 8b 4d 20 0f b7 41 02 48 8d 04 40 48 8d 04 81 49 89 45 18 0f b7 49 02 48 83 c1 01 49 89 4d 00 e9 ae f8 ff ff 0f 1f 00 49 8b 45 28 <48> 8b 40 28 49 89 45 20 e9 85 f8 ff ff 0f 1f 80 00 00 00
|
||||
|
||||
RIP [<ffffffff81233164>] ext4_ext_remove_space+0xa34/0xdf0
|
||||
|
||||
This could be reproduced as follows:
|
||||
|
||||
The problem in commit 968dee7722 was that caused the variable 'i' to
|
||||
be left uninitialized if the truncate required more space than was
|
||||
available in the journal. This resulted in the function
|
||||
ext4_ext_truncate_extend_restart() returning -EAGAIN, which caused
|
||||
ext4_ext_remove_space() to restart the truncate operation after
|
||||
starting a new jbd2 handle.
|
||||
|
||||
Reported-by: Maciej Żenczykowski <maze@google.com>
|
||||
Reported-by: Marti Raudsepp <marti@juffo.org>
|
||||
Tested-by: Fengguang Wu <fengguang.wu@intel.com>
|
||||
Signed-off-by: "Theodore Ts'o" <tytso@mit.edu>
|
||||
Cc: stable@vger.kernel.org
|
||||
---
|
||||
fs/ext4/extents.c | 1 +
|
||||
1 file changed, 1 insertion(+)
|
||||
|
||||
diff --git a/fs/ext4/extents.c b/fs/ext4/extents.c
|
||||
index 2b8b3c9..9169e11 100644
|
||||
--- a/fs/ext4/extents.c
|
||||
+++ b/fs/ext4/extents.c
|
||||
@@ -2594,6 +2594,7 @@ cont:
|
||||
}
|
||||
path[0].p_depth = depth;
|
||||
path[0].p_hdr = ext_inode_hdr(inode);
|
||||
+ i = 0;
|
||||
|
||||
if (ext4_ext_check(inode, path[0].p_hdr, depth)) {
|
||||
err = -EIO;
|
|
@ -1,349 +0,0 @@
|
|||
From: Lukas Czerner <lczerner@redhat.com>
|
||||
Date: Mon, 19 Mar 2012 23:03:19 -0400
|
||||
Subject: [PATCH 1/3] ext4: rewrite punch hole to use ext4_ext_remove_space()
|
||||
|
||||
commit 5f95d21fb6f2aaa52830e5b7fb405f6c71d3ab85 upstream.
|
||||
|
||||
This commit rewrites ext4 punch hole implementation to use
|
||||
ext4_ext_remove_space() instead of its home gown way of doing this via
|
||||
ext4_ext_map_blocks(). There are several reasons for changing this.
|
||||
|
||||
Firstly it is quite non obvious that punching hole needs to
|
||||
ext4_ext_map_blocks() to punch a hole, especially given that this
|
||||
function should map blocks, not unmap it. It also required a lot of new
|
||||
code in ext4_ext_map_blocks().
|
||||
|
||||
Secondly the design of it is not very effective. The reason is that we
|
||||
are trying to punch out blocks in ext4_ext_punch_hole() in opposite
|
||||
direction than in ext4_ext_rm_leaf() which causes the ext4_ext_rm_leaf()
|
||||
to iterate through the whole tree from the end to the start to find the
|
||||
requested extent for every extent we are going to punch out.
|
||||
|
||||
And finally the current implementation does not use the existing code,
|
||||
but bring a lot of new code, which is IMO unnecessary since there
|
||||
already is some infrastructure we can use. Specifically
|
||||
ext4_ext_remove_space().
|
||||
|
||||
This commit changes ext4_ext_remove_space() to accept 'end' parameter so
|
||||
we can not only truncate to the end of file, but also remove the space
|
||||
in the middle of the file (punch a hole). Moreover, because the last
|
||||
block to punch out, might be in the middle of the extent, we have to
|
||||
split the extent at 'end + 1' so ext4_ext_rm_leaf() can easily either
|
||||
remove the whole fist part of split extent, or change its size.
|
||||
|
||||
ext4_ext_remove_space() is then used to actually remove the space
|
||||
(extents) from within the hole, instead of ext4_ext_map_blocks().
|
||||
|
||||
Note that this also fix the issue with punch hole, where we would forget
|
||||
to remove empty index blocks from the extent tree, resulting in double
|
||||
free block error and file system corruption. This is simply because we
|
||||
now use different code path, where this problem does not exist.
|
||||
|
||||
This has been tested with fsx running for several days and xfstests,
|
||||
plus xfstest #251 with '-o discard' run on the loop image (which
|
||||
converts discard requestes into punch hole to the backing file). All of
|
||||
it on 1K and 4K file system block size.
|
||||
|
||||
Signed-off-by: Lukas Czerner <lczerner@redhat.com>
|
||||
Signed-off-by: "Theodore Ts'o" <tytso@mit.edu>
|
||||
[bwh: Backported to 3.2.y: move EXT4_EXT_DATA_VALID{1,2} along with the
|
||||
other extent splitting flags]
|
||||
---
|
||||
fs/ext4/extents.c | 170 ++++++++++++++++++++++++++++--------------------------
|
||||
1 file changed, 88 insertions(+), 82 deletions(-)
|
||||
|
||||
--- a/fs/ext4/extents.c
|
||||
+++ b/fs/ext4/extents.c
|
||||
@@ -45,6 +45,17 @@
|
||||
|
||||
#include <trace/events/ext4.h>
|
||||
|
||||
+/*
|
||||
+ * used by extent splitting.
|
||||
+ */
|
||||
+#define EXT4_EXT_MAY_ZEROOUT 0x1 /* safe to zeroout if split fails \
|
||||
+ due to ENOSPC */
|
||||
+#define EXT4_EXT_MARK_UNINIT1 0x2 /* mark first half uninitialized */
|
||||
+#define EXT4_EXT_MARK_UNINIT2 0x4 /* mark second half uninitialized */
|
||||
+
|
||||
+#define EXT4_EXT_DATA_VALID1 0x8 /* first half contains valid data */
|
||||
+#define EXT4_EXT_DATA_VALID2 0x10 /* second half contains valid data */
|
||||
+
|
||||
static int ext4_split_extent(handle_t *handle,
|
||||
struct inode *inode,
|
||||
struct ext4_ext_path *path,
|
||||
@@ -52,6 +63,13 @@ static int ext4_split_extent(handle_t *h
|
||||
int split_flag,
|
||||
int flags);
|
||||
|
||||
+static int ext4_split_extent_at(handle_t *handle,
|
||||
+ struct inode *inode,
|
||||
+ struct ext4_ext_path *path,
|
||||
+ ext4_lblk_t split,
|
||||
+ int split_flag,
|
||||
+ int flags);
|
||||
+
|
||||
static int ext4_ext_truncate_extend_restart(handle_t *handle,
|
||||
struct inode *inode,
|
||||
int needed)
|
||||
@@ -2321,7 +2339,7 @@ ext4_ext_rm_leaf(handle_t *handle, struc
|
||||
struct ext4_extent *ex;
|
||||
|
||||
/* the header must be checked already in ext4_ext_remove_space() */
|
||||
- ext_debug("truncate since %u in leaf\n", start);
|
||||
+ ext_debug("truncate since %u in leaf to %u\n", start, end);
|
||||
if (!path[depth].p_hdr)
|
||||
path[depth].p_hdr = ext_block_hdr(path[depth].p_bh);
|
||||
eh = path[depth].p_hdr;
|
||||
@@ -2356,7 +2374,7 @@ ext4_ext_rm_leaf(handle_t *handle, struc
|
||||
ext_debug(" border %u:%u\n", a, b);
|
||||
|
||||
/* If this extent is beyond the end of the hole, skip it */
|
||||
- if (end <= ex_ee_block) {
|
||||
+ if (end < ex_ee_block) {
|
||||
ex--;
|
||||
ex_ee_block = le32_to_cpu(ex->ee_block);
|
||||
ex_ee_len = ext4_ext_get_actual_len(ex);
|
||||
@@ -2495,7 +2513,8 @@ ext4_ext_more_to_rm(struct ext4_ext_path
|
||||
return 1;
|
||||
}
|
||||
|
||||
-static int ext4_ext_remove_space(struct inode *inode, ext4_lblk_t start)
|
||||
+static int ext4_ext_remove_space(struct inode *inode, ext4_lblk_t start,
|
||||
+ ext4_lblk_t end)
|
||||
{
|
||||
struct super_block *sb = inode->i_sb;
|
||||
int depth = ext_depth(inode);
|
||||
@@ -2504,7 +2523,7 @@ static int ext4_ext_remove_space(struct
|
||||
handle_t *handle;
|
||||
int i, err;
|
||||
|
||||
- ext_debug("truncate since %u\n", start);
|
||||
+ ext_debug("truncate since %u to %u\n", start, end);
|
||||
|
||||
/* probably first extent we're gonna free will be last in block */
|
||||
handle = ext4_journal_start(inode, depth + 1);
|
||||
@@ -2517,6 +2536,61 @@ again:
|
||||
trace_ext4_ext_remove_space(inode, start, depth);
|
||||
|
||||
/*
|
||||
+ * Check if we are removing extents inside the extent tree. If that
|
||||
+ * is the case, we are going to punch a hole inside the extent tree
|
||||
+ * so we have to check whether we need to split the extent covering
|
||||
+ * the last block to remove so we can easily remove the part of it
|
||||
+ * in ext4_ext_rm_leaf().
|
||||
+ */
|
||||
+ if (end < EXT_MAX_BLOCKS - 1) {
|
||||
+ struct ext4_extent *ex;
|
||||
+ ext4_lblk_t ee_block;
|
||||
+
|
||||
+ /* find extent for this block */
|
||||
+ path = ext4_ext_find_extent(inode, end, NULL);
|
||||
+ if (IS_ERR(path)) {
|
||||
+ ext4_journal_stop(handle);
|
||||
+ return PTR_ERR(path);
|
||||
+ }
|
||||
+ depth = ext_depth(inode);
|
||||
+ ex = path[depth].p_ext;
|
||||
+ if (!ex)
|
||||
+ goto cont;
|
||||
+
|
||||
+ ee_block = le32_to_cpu(ex->ee_block);
|
||||
+
|
||||
+ /*
|
||||
+ * See if the last block is inside the extent, if so split
|
||||
+ * the extent at 'end' block so we can easily remove the
|
||||
+ * tail of the first part of the split extent in
|
||||
+ * ext4_ext_rm_leaf().
|
||||
+ */
|
||||
+ if (end >= ee_block &&
|
||||
+ end < ee_block + ext4_ext_get_actual_len(ex) - 1) {
|
||||
+ int split_flag = 0;
|
||||
+
|
||||
+ if (ext4_ext_is_uninitialized(ex))
|
||||
+ split_flag = EXT4_EXT_MARK_UNINIT1 |
|
||||
+ EXT4_EXT_MARK_UNINIT2;
|
||||
+
|
||||
+ /*
|
||||
+ * Split the extent in two so that 'end' is the last
|
||||
+ * block in the first new extent
|
||||
+ */
|
||||
+ err = ext4_split_extent_at(handle, inode, path,
|
||||
+ end + 1, split_flag,
|
||||
+ EXT4_GET_BLOCKS_PRE_IO |
|
||||
+ EXT4_GET_BLOCKS_PUNCH_OUT_EXT);
|
||||
+
|
||||
+ if (err < 0)
|
||||
+ goto out;
|
||||
+ }
|
||||
+ ext4_ext_drop_refs(path);
|
||||
+ kfree(path);
|
||||
+ }
|
||||
+cont:
|
||||
+
|
||||
+ /*
|
||||
* We start scanning from right side, freeing all the blocks
|
||||
* after i_size and walking into the tree depth-wise.
|
||||
*/
|
||||
@@ -2528,6 +2602,7 @@ again:
|
||||
}
|
||||
path[0].p_depth = depth;
|
||||
path[0].p_hdr = ext_inode_hdr(inode);
|
||||
+
|
||||
if (ext4_ext_check(inode, path[0].p_hdr, depth)) {
|
||||
err = -EIO;
|
||||
goto out;
|
||||
@@ -2539,7 +2614,7 @@ again:
|
||||
/* this is leaf block */
|
||||
err = ext4_ext_rm_leaf(handle, inode, path,
|
||||
&partial_cluster, start,
|
||||
- EXT_MAX_BLOCKS - 1);
|
||||
+ end);
|
||||
/* root level has p_bh == NULL, brelse() eats this */
|
||||
brelse(path[i].p_bh);
|
||||
path[i].p_bh = NULL;
|
||||
@@ -2722,17 +2797,6 @@ static int ext4_ext_zeroout(struct inode
|
||||
}
|
||||
|
||||
/*
|
||||
- * used by extent splitting.
|
||||
- */
|
||||
-#define EXT4_EXT_MAY_ZEROOUT 0x1 /* safe to zeroout if split fails \
|
||||
- due to ENOSPC */
|
||||
-#define EXT4_EXT_MARK_UNINIT1 0x2 /* mark first half uninitialized */
|
||||
-#define EXT4_EXT_MARK_UNINIT2 0x4 /* mark second half uninitialized */
|
||||
-
|
||||
-#define EXT4_EXT_DATA_VALID1 0x8 /* first half contains valid data */
|
||||
-#define EXT4_EXT_DATA_VALID2 0x10 /* second half contains valid data */
|
||||
-
|
||||
-/*
|
||||
* ext4_split_extent_at() splits an extent at given block.
|
||||
*
|
||||
* @handle: the journal handle
|
||||
@@ -4274,7 +4338,7 @@ void ext4_ext_truncate(struct inode *ino
|
||||
|
||||
last_block = (inode->i_size + sb->s_blocksize - 1)
|
||||
>> EXT4_BLOCK_SIZE_BITS(sb);
|
||||
- err = ext4_ext_remove_space(inode, last_block);
|
||||
+ err = ext4_ext_remove_space(inode, last_block, EXT_MAX_BLOCKS - 1);
|
||||
|
||||
/* In a multi-transaction truncate, we only make the final
|
||||
* transaction synchronous.
|
||||
@@ -4751,14 +4815,12 @@ int ext4_ext_punch_hole(struct file *fil
|
||||
{
|
||||
struct inode *inode = file->f_path.dentry->d_inode;
|
||||
struct super_block *sb = inode->i_sb;
|
||||
- struct ext4_ext_cache cache_ex;
|
||||
- ext4_lblk_t first_block, last_block, num_blocks, iblock, max_blocks;
|
||||
+ ext4_lblk_t first_block, stop_block;
|
||||
struct address_space *mapping = inode->i_mapping;
|
||||
- struct ext4_map_blocks map;
|
||||
handle_t *handle;
|
||||
loff_t first_page, last_page, page_len;
|
||||
loff_t first_page_offset, last_page_offset;
|
||||
- int ret, credits, blocks_released, err = 0;
|
||||
+ int credits, err = 0;
|
||||
|
||||
/* No need to punch hole beyond i_size */
|
||||
if (offset >= inode->i_size)
|
||||
@@ -4774,10 +4836,6 @@ int ext4_ext_punch_hole(struct file *fil
|
||||
offset;
|
||||
}
|
||||
|
||||
- first_block = (offset + sb->s_blocksize - 1) >>
|
||||
- EXT4_BLOCK_SIZE_BITS(sb);
|
||||
- last_block = (offset + length) >> EXT4_BLOCK_SIZE_BITS(sb);
|
||||
-
|
||||
first_page = (offset + PAGE_CACHE_SIZE - 1) >> PAGE_CACHE_SHIFT;
|
||||
last_page = (offset + length) >> PAGE_CACHE_SHIFT;
|
||||
|
||||
@@ -4856,7 +4914,6 @@ int ext4_ext_punch_hole(struct file *fil
|
||||
}
|
||||
}
|
||||
|
||||
-
|
||||
/*
|
||||
* If i_size is contained in the last page, we need to
|
||||
* unmap and zero the partial page after i_size
|
||||
@@ -4876,73 +4933,22 @@ int ext4_ext_punch_hole(struct file *fil
|
||||
}
|
||||
}
|
||||
|
||||
+ first_block = (offset + sb->s_blocksize - 1) >>
|
||||
+ EXT4_BLOCK_SIZE_BITS(sb);
|
||||
+ stop_block = (offset + length) >> EXT4_BLOCK_SIZE_BITS(sb);
|
||||
+
|
||||
/* If there are no blocks to remove, return now */
|
||||
- if (first_block >= last_block)
|
||||
+ if (first_block >= stop_block)
|
||||
goto out;
|
||||
|
||||
down_write(&EXT4_I(inode)->i_data_sem);
|
||||
ext4_ext_invalidate_cache(inode);
|
||||
ext4_discard_preallocations(inode);
|
||||
|
||||
- /*
|
||||
- * Loop over all the blocks and identify blocks
|
||||
- * that need to be punched out
|
||||
- */
|
||||
- iblock = first_block;
|
||||
- blocks_released = 0;
|
||||
- while (iblock < last_block) {
|
||||
- max_blocks = last_block - iblock;
|
||||
- num_blocks = 1;
|
||||
- memset(&map, 0, sizeof(map));
|
||||
- map.m_lblk = iblock;
|
||||
- map.m_len = max_blocks;
|
||||
- ret = ext4_ext_map_blocks(handle, inode, &map,
|
||||
- EXT4_GET_BLOCKS_PUNCH_OUT_EXT);
|
||||
-
|
||||
- if (ret > 0) {
|
||||
- blocks_released += ret;
|
||||
- num_blocks = ret;
|
||||
- } else if (ret == 0) {
|
||||
- /*
|
||||
- * If map blocks could not find the block,
|
||||
- * then it is in a hole. If the hole was
|
||||
- * not already cached, then map blocks should
|
||||
- * put it in the cache. So we can get the hole
|
||||
- * out of the cache
|
||||
- */
|
||||
- memset(&cache_ex, 0, sizeof(cache_ex));
|
||||
- if ((ext4_ext_check_cache(inode, iblock, &cache_ex)) &&
|
||||
- !cache_ex.ec_start) {
|
||||
-
|
||||
- /* The hole is cached */
|
||||
- num_blocks = cache_ex.ec_block +
|
||||
- cache_ex.ec_len - iblock;
|
||||
-
|
||||
- } else {
|
||||
- /* The block could not be identified */
|
||||
- err = -EIO;
|
||||
- break;
|
||||
- }
|
||||
- } else {
|
||||
- /* Map blocks error */
|
||||
- err = ret;
|
||||
- break;
|
||||
- }
|
||||
+ err = ext4_ext_remove_space(inode, first_block, stop_block - 1);
|
||||
|
||||
- if (num_blocks == 0) {
|
||||
- /* This condition should never happen */
|
||||
- ext_debug("Block lookup failed");
|
||||
- err = -EIO;
|
||||
- break;
|
||||
- }
|
||||
-
|
||||
- iblock += num_blocks;
|
||||
- }
|
||||
-
|
||||
- if (blocks_released > 0) {
|
||||
- ext4_ext_invalidate_cache(inode);
|
||||
- ext4_discard_preallocations(inode);
|
||||
- }
|
||||
+ ext4_ext_invalidate_cache(inode);
|
||||
+ ext4_discard_preallocations(inode);
|
||||
|
||||
if (IS_SYNC(inode))
|
||||
ext4_handle_sync(handle);
|
|
@ -1,31 +0,0 @@
|
|||
From: Justin Lecher <jlec@gentoo.org>
|
||||
Date: Mon, 30 Jul 2012 14:42:53 -0700
|
||||
Subject: fs: cachefiles: add support for large files in filesystem caching
|
||||
|
||||
commit 98c350cda2c14a343d34ea01a3d9c24fea5ec66d upstream.
|
||||
|
||||
Support the caching of large files.
|
||||
|
||||
Addresses https://bugzilla.kernel.org/show_bug.cgi?id=31182
|
||||
|
||||
Signed-off-by: Justin Lecher <jlec@gentoo.org>
|
||||
Signed-off-by: Suresh Jayaraman <sjayaraman@suse.com>
|
||||
Tested-by: Suresh Jayaraman <sjayaraman@suse.com>
|
||||
Acked-by: David Howells <dhowells@redhat.com>
|
||||
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
|
||||
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
|
||||
[bwh: Backported to 3.2:
|
||||
- Adjust context
|
||||
- dentry_open() takes dentry and vfsmount pointers, not a path pointer]
|
||||
---
|
||||
--- a/fs/cachefiles/rdwr.c
|
||||
+++ b/fs/cachefiles/rdwr.c
|
||||
@@ -918,7 +918,7 @@ int cachefiles_write_page(struct fscache_storage *op, struct page *page)
|
||||
* own time */
|
||||
dget(object->backer);
|
||||
mntget(cache->mnt);
|
||||
- file = dentry_open(object->backer, cache->mnt, O_RDWR,
|
||||
+ file = dentry_open(object->backer, cache->mnt, O_RDWR | O_LARGEFILE,
|
||||
cache->cache_cred);
|
||||
if (IS_ERR(file)) {
|
||||
ret = PTR_ERR(file);
|
|
@ -1,69 +0,0 @@
|
|||
From: Oleg Nesterov <oleg@redhat.com>
|
||||
Date: Fri, 23 Mar 2012 15:02:49 -0700
|
||||
Subject: [4/5] kmod: introduce call_modprobe() helper
|
||||
|
||||
commit 3e63a93b987685f02421e18b2aa452d20553a88b upstream.
|
||||
|
||||
No functional changes. Move the call_usermodehelper code from
|
||||
__request_module() into the new simple helper, call_modprobe().
|
||||
|
||||
Signed-off-by: Oleg Nesterov <oleg@redhat.com>
|
||||
Cc: Tetsuo Handa <penguin-kernel@I-love.SAKURA.ne.jp>
|
||||
Cc: Rusty Russell <rusty@rustcorp.com.au>
|
||||
Cc: Tejun Heo <tj@kernel.org>
|
||||
Cc: David Rientjes <rientjes@google.com>
|
||||
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
|
||||
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
|
||||
---
|
||||
kernel/kmod.c | 24 ++++++++++++++++--------
|
||||
1 file changed, 16 insertions(+), 8 deletions(-)
|
||||
|
||||
diff --git a/kernel/kmod.c b/kernel/kmod.c
|
||||
index 685b246..56a29e8 100644
|
||||
--- a/kernel/kmod.c
|
||||
+++ b/kernel/kmod.c
|
||||
@@ -60,6 +60,21 @@ static DECLARE_RWSEM(umhelper_sem);
|
||||
*/
|
||||
char modprobe_path[KMOD_PATH_LEN] = "/sbin/modprobe";
|
||||
|
||||
+static int call_modprobe(char *module_name, int wait)
|
||||
+{
|
||||
+ static char *envp[] = {
|
||||
+ "HOME=/",
|
||||
+ "TERM=linux",
|
||||
+ "PATH=/sbin:/usr/sbin:/bin:/usr/bin",
|
||||
+ NULL
|
||||
+ };
|
||||
+
|
||||
+ char *argv[] = { modprobe_path, "-q", "--", module_name, NULL };
|
||||
+
|
||||
+ return call_usermodehelper_fns(modprobe_path, argv, envp,
|
||||
+ wait, NULL, NULL, NULL);
|
||||
+}
|
||||
+
|
||||
/**
|
||||
* __request_module - try to load a kernel module
|
||||
* @wait: wait (or not) for the operation to complete
|
||||
@@ -81,11 +96,6 @@ int __request_module(bool wait, const char *fmt, ...)
|
||||
char module_name[MODULE_NAME_LEN];
|
||||
unsigned int max_modprobes;
|
||||
int ret;
|
||||
- char *argv[] = { modprobe_path, "-q", "--", module_name, NULL };
|
||||
- static char *envp[] = { "HOME=/",
|
||||
- "TERM=linux",
|
||||
- "PATH=/sbin:/usr/sbin:/bin:/usr/bin",
|
||||
- NULL };
|
||||
static atomic_t kmod_concurrent = ATOMIC_INIT(0);
|
||||
#define MAX_KMOD_CONCURRENT 50 /* Completely arbitrary value - KAO */
|
||||
static int kmod_loop_msg;
|
||||
@@ -128,9 +138,7 @@ int __request_module(bool wait, const char *fmt, ...)
|
||||
|
||||
trace_module_request(module_name, wait, _RET_IP_);
|
||||
|
||||
- ret = call_usermodehelper_fns(modprobe_path, argv, envp,
|
||||
- wait ? UMH_WAIT_PROC : UMH_WAIT_EXEC,
|
||||
- NULL, NULL, NULL);
|
||||
+ ret = call_modprobe(module_name, wait ? UMH_WAIT_PROC : UMH_WAIT_EXEC);
|
||||
|
||||
atomic_dec(&kmod_concurrent);
|
||||
return ret;
|
|
@ -1,78 +0,0 @@
|
|||
From: Oleg Nesterov <oleg@redhat.com>
|
||||
Date: Fri, 23 Mar 2012 15:02:50 -0700
|
||||
Subject: [5/5] kmod: make __request_module() killable
|
||||
|
||||
commit 1cc684ab75123efe7ff446eb821d44375ba8fa30 upstream.
|
||||
|
||||
As Tetsuo Handa pointed out, request_module() can stress the system
|
||||
while the oom-killed caller sleeps in TASK_UNINTERRUPTIBLE.
|
||||
|
||||
The task T uses "almost all" memory, then it does something which
|
||||
triggers request_module(). Say, it can simply call sys_socket(). This
|
||||
in turn needs more memory and leads to OOM. oom-killer correctly
|
||||
chooses T and kills it, but this can't help because it sleeps in
|
||||
TASK_UNINTERRUPTIBLE and after that oom-killer becomes "disabled" by the
|
||||
TIF_MEMDIE task T.
|
||||
|
||||
Make __request_module() killable. The only necessary change is that
|
||||
call_modprobe() should kmalloc argv and module_name, they can't live in
|
||||
the stack if we use UMH_KILLABLE. This memory is freed via
|
||||
call_usermodehelper_freeinfo()->cleanup.
|
||||
|
||||
Reported-by: Tetsuo Handa <penguin-kernel@I-love.SAKURA.ne.jp>
|
||||
Signed-off-by: Oleg Nesterov <oleg@redhat.com>
|
||||
Cc: Rusty Russell <rusty@rustcorp.com.au>
|
||||
Cc: Tejun Heo <tj@kernel.org>
|
||||
Cc: David Rientjes <rientjes@google.com>
|
||||
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
|
||||
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
|
||||
---
|
||||
kernel/kmod.c | 26 ++++++++++++++++++++++++--
|
||||
1 file changed, 24 insertions(+), 2 deletions(-)
|
||||
|
||||
diff --git a/kernel/kmod.c b/kernel/kmod.c
|
||||
index 56a29e8..957a7aa 100644
|
||||
--- a/kernel/kmod.c
|
||||
+++ b/kernel/kmod.c
|
||||
@@ -60,6 +60,12 @@ static DECLARE_RWSEM(umhelper_sem);
|
||||
*/
|
||||
char modprobe_path[KMOD_PATH_LEN] = "/sbin/modprobe";
|
||||
|
||||
+static void free_modprobe_argv(struct subprocess_info *info)
|
||||
+{
|
||||
+ kfree(info->argv[3]); /* check call_modprobe() */
|
||||
+ kfree(info->argv);
|
||||
+}
|
||||
+
|
||||
static int call_modprobe(char *module_name, int wait)
|
||||
{
|
||||
static char *envp[] = {
|
||||
@@ -69,10 +75,26 @@ static int call_modprobe(char *module_name, int wait)
|
||||
NULL
|
||||
};
|
||||
|
||||
- char *argv[] = { modprobe_path, "-q", "--", module_name, NULL };
|
||||
+ char **argv = kmalloc(sizeof(char *[5]), GFP_KERNEL);
|
||||
+ if (!argv)
|
||||
+ goto out;
|
||||
+
|
||||
+ module_name = kstrdup(module_name, GFP_KERNEL);
|
||||
+ if (!module_name)
|
||||
+ goto free_argv;
|
||||
+
|
||||
+ argv[0] = modprobe_path;
|
||||
+ argv[1] = "-q";
|
||||
+ argv[2] = "--";
|
||||
+ argv[3] = module_name; /* check free_modprobe_argv() */
|
||||
+ argv[4] = NULL;
|
||||
|
||||
return call_usermodehelper_fns(modprobe_path, argv, envp,
|
||||
- wait, NULL, NULL, NULL);
|
||||
+ wait | UMH_KILLABLE, NULL, free_modprobe_argv, NULL);
|
||||
+free_argv:
|
||||
+ kfree(argv);
|
||||
+out:
|
||||
+ return -ENOMEM;
|
||||
}
|
||||
|
||||
/**
|
|
@ -1,80 +0,0 @@
|
|||
From: Linus Torvalds <torvalds@linux-foundation.org>
|
||||
Date: Mon, 18 Feb 2013 09:58:02 -0800
|
||||
Subject: mm: fix pageblock bitmap allocation
|
||||
|
||||
commit 7c45512df987c5619db041b5c9b80d281e26d3db upstream.
|
||||
|
||||
Commit c060f943d092 ("mm: use aligned zone start for pfn_to_bitidx
|
||||
calculation") fixed out calculation of the index into the pageblock
|
||||
bitmap when a !SPARSEMEM zome was not aligned to pageblock_nr_pages.
|
||||
|
||||
However, the _allocation_ of that bitmap had never taken this alignment
|
||||
requirement into accout, so depending on the exact size and alignment of
|
||||
the zone, the use of that index could then access past the allocation,
|
||||
resulting in some very subtle memory corruption.
|
||||
|
||||
This was reported (and bisected) by Ingo Molnar: one of his random
|
||||
config builds would hang with certain very specific kernel command line
|
||||
options.
|
||||
|
||||
In the meantime, commit c060f943d092 has been marked for stable, so this
|
||||
fix needs to be back-ported to the stable kernels that backported the
|
||||
commit to use the right alignment.
|
||||
|
||||
Bisected-and-tested-by: Ingo Molnar <mingo@kernel.org>
|
||||
Acked-by: Mel Gorman <mgorman@suse.de>
|
||||
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
|
||||
---
|
||||
mm/page_alloc.c | 15 +++++++++------
|
||||
1 file changed, 9 insertions(+), 6 deletions(-)
|
||||
|
||||
diff --git a/mm/page_alloc.c b/mm/page_alloc.c
|
||||
index 9673d96..6a83cd3 100644
|
||||
--- a/mm/page_alloc.c
|
||||
+++ b/mm/page_alloc.c
|
||||
@@ -4420,10 +4420,11 @@ static void __meminit calculate_node_totalpages(struct pglist_data *pgdat,
|
||||
* round what is now in bits to nearest long in bits, then return it in
|
||||
* bytes.
|
||||
*/
|
||||
-static unsigned long __init usemap_size(unsigned long zonesize)
|
||||
+static unsigned long __init usemap_size(unsigned long zone_start_pfn, unsigned long zonesize)
|
||||
{
|
||||
unsigned long usemapsize;
|
||||
|
||||
+ zonesize += zone_start_pfn & (pageblock_nr_pages-1);
|
||||
usemapsize = roundup(zonesize, pageblock_nr_pages);
|
||||
usemapsize = usemapsize >> pageblock_order;
|
||||
usemapsize *= NR_PAGEBLOCK_BITS;
|
||||
@@ -4433,17 +4434,19 @@ static unsigned long __init usemap_size(unsigned long zonesize)
|
||||
}
|
||||
|
||||
static void __init setup_usemap(struct pglist_data *pgdat,
|
||||
- struct zone *zone, unsigned long zonesize)
|
||||
+ struct zone *zone,
|
||||
+ unsigned long zone_start_pfn,
|
||||
+ unsigned long zonesize)
|
||||
{
|
||||
- unsigned long usemapsize = usemap_size(zonesize);
|
||||
+ unsigned long usemapsize = usemap_size(zone_start_pfn, zonesize);
|
||||
zone->pageblock_flags = NULL;
|
||||
if (usemapsize)
|
||||
zone->pageblock_flags = alloc_bootmem_node_nopanic(pgdat,
|
||||
usemapsize);
|
||||
}
|
||||
#else
|
||||
-static inline void setup_usemap(struct pglist_data *pgdat,
|
||||
- struct zone *zone, unsigned long zonesize) {}
|
||||
+static inline void setup_usemap(struct pglist_data *pgdat, struct zone *zone,
|
||||
+ unsigned long zone_start_pfn, unsigned long zonesize) {}
|
||||
#endif /* CONFIG_SPARSEMEM */
|
||||
|
||||
#ifdef CONFIG_HUGETLB_PAGE_SIZE_VARIABLE
|
||||
@@ -4594,7 +4597,7 @@ static void __paginginit free_area_init_core(struct pglist_data *pgdat,
|
||||
continue;
|
||||
|
||||
set_pageblock_order();
|
||||
- setup_usemap(pgdat, zone, size);
|
||||
+ setup_usemap(pgdat, zone, zone_start_pfn, size);
|
||||
ret = init_currently_empty_zone(zone, zone_start_pfn,
|
||||
size, MEMMAP_EARLY);
|
||||
BUG_ON(ret);
|
|
@ -1,33 +0,0 @@
|
|||
From: Samuel Thibault <samuel.thibault@ens-lyon.org>
|
||||
Date: Sun, 26 Aug 2012 23:35:17 +0200
|
||||
Subject: speakup: lower default software speech rate
|
||||
|
||||
commit cfd757010691eae4e17acc246f74e7622c3a2f05 upstream.
|
||||
|
||||
Speech synthesis beginners need a low speech rate, and trained people
|
||||
want a high speech rate. A medium speech rate is thus actually not a
|
||||
good default for neither. Since trained people will typically know how
|
||||
to change the rate, better default for a low speech rate, which
|
||||
beginners can grasp and learn how to increase it afterwards
|
||||
|
||||
This was agreed with users on the speakup mailing list.
|
||||
|
||||
Signed-off-by: Samuel Thibault <samuel.thibault@ens-lyon.org>
|
||||
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
||||
---
|
||||
drivers/staging/speakup/speakup_soft.c | 2 +-
|
||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
|
||||
diff --git a/drivers/staging/speakup/speakup_soft.c b/drivers/staging/speakup/speakup_soft.c
|
||||
index 42cdafe..2a67610 100644
|
||||
--- a/drivers/staging/speakup/speakup_soft.c
|
||||
+++ b/drivers/staging/speakup/speakup_soft.c
|
||||
@@ -46,7 +46,7 @@ static int misc_registered;
|
||||
static struct var_t vars[] = {
|
||||
{ CAPS_START, .u.s = {"\x01+3p" } },
|
||||
{ CAPS_STOP, .u.s = {"\x01-3p" } },
|
||||
- { RATE, .u.n = {"\x01%ds", 5, 0, 9, 0, 0, NULL } },
|
||||
+ { RATE, .u.n = {"\x01%ds", 2, 0, 9, 0, 0, NULL } },
|
||||
{ PITCH, .u.n = {"\x01%dp", 5, 0, 9, 0, 0, NULL } },
|
||||
{ VOL, .u.n = {"\x01%dv", 5, 0, 9, 0, 0, NULL } },
|
||||
{ TONE, .u.n = {"\x01%dx", 1, 0, 2, 0, 0, NULL } },
|
|
@ -1,98 +0,0 @@
|
|||
From: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
|
||||
Date: Thu, 19 Jul 2012 12:39:14 +0200
|
||||
Subject: usb: Add USB_QUIRK_RESET_RESUME for all Logitech UVC webcams
|
||||
|
||||
commit e387ef5c47ddeaeaa3cbdc54424cdb7a28dae2c0 upstream.
|
||||
|
||||
Most Logitech UVC webcams (both early models that don't advertise UVC
|
||||
compatibility and newer UVC-advertised devices) require the RESET_RESUME
|
||||
quirk. Instead of listing each and every model, match the devices based
|
||||
on the UVC interface information.
|
||||
|
||||
Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
|
||||
Acked-by: Alan Stern <stern@rowland.harvard.edu>
|
||||
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
||||
[bwh: Adjust context to apply after 3.2.38]
|
||||
---
|
||||
drivers/usb/core/quirks.c | 58 +++++++++++++--------------------------------
|
||||
1 file changed, 16 insertions(+), 42 deletions(-)
|
||||
|
||||
--- a/drivers/usb/core/quirks.c
|
||||
+++ b/drivers/usb/core/quirks.c
|
||||
@@ -46,53 +46,23 @@ static const struct usb_device_id usb_qu
|
||||
/* Microsoft LifeCam-VX700 v2.0 */
|
||||
{ USB_DEVICE(0x045e, 0x0770), .driver_info = USB_QUIRK_RESET_RESUME },
|
||||
|
||||
- /* Logitech Webcam C200 */
|
||||
- { USB_DEVICE(0x046d, 0x0802), .driver_info = USB_QUIRK_RESET_RESUME },
|
||||
+ /* Logitech Quickcam Fusion */
|
||||
+ { USB_DEVICE(0x046d, 0x08c1), .driver_info = USB_QUIRK_RESET_RESUME },
|
||||
|
||||
- /* Logitech Webcam C250 */
|
||||
- { USB_DEVICE(0x046d, 0x0804), .driver_info = USB_QUIRK_RESET_RESUME },
|
||||
+ /* Logitech Quickcam Orbit MP */
|
||||
+ { USB_DEVICE(0x046d, 0x08c2), .driver_info = USB_QUIRK_RESET_RESUME },
|
||||
|
||||
- /* Logitech Webcam C300 */
|
||||
- { USB_DEVICE(0x046d, 0x0805), .driver_info = USB_QUIRK_RESET_RESUME },
|
||||
+ /* Logitech Quickcam Pro for Notebook */
|
||||
+ { USB_DEVICE(0x046d, 0x08c3), .driver_info = USB_QUIRK_RESET_RESUME },
|
||||
|
||||
- /* Logitech Webcam B/C500 */
|
||||
- { USB_DEVICE(0x046d, 0x0807), .driver_info = USB_QUIRK_RESET_RESUME },
|
||||
+ /* Logitech Quickcam Pro 5000 */
|
||||
+ { USB_DEVICE(0x046d, 0x08c5), .driver_info = USB_QUIRK_RESET_RESUME },
|
||||
|
||||
- /* Logitech Webcam C600 */
|
||||
- { USB_DEVICE(0x046d, 0x0808), .driver_info = USB_QUIRK_RESET_RESUME },
|
||||
+ /* Logitech Quickcam OEM Dell Notebook */
|
||||
+ { USB_DEVICE(0x046d, 0x08c6), .driver_info = USB_QUIRK_RESET_RESUME },
|
||||
|
||||
- /* Logitech Webcam Pro 9000 */
|
||||
- { USB_DEVICE(0x046d, 0x0809), .driver_info = USB_QUIRK_RESET_RESUME },
|
||||
-
|
||||
- /* Logitech Webcam C905 */
|
||||
- { USB_DEVICE(0x046d, 0x080a), .driver_info = USB_QUIRK_RESET_RESUME },
|
||||
-
|
||||
- /* Logitech Webcam C210 */
|
||||
- { USB_DEVICE(0x046d, 0x0819), .driver_info = USB_QUIRK_RESET_RESUME },
|
||||
-
|
||||
- /* Logitech Webcam C260 */
|
||||
- { USB_DEVICE(0x046d, 0x081a), .driver_info = USB_QUIRK_RESET_RESUME },
|
||||
-
|
||||
- /* Logitech Webcam C310 */
|
||||
- { USB_DEVICE(0x046d, 0x081b), .driver_info = USB_QUIRK_RESET_RESUME },
|
||||
-
|
||||
- /* Logitech Webcam C910 */
|
||||
- { USB_DEVICE(0x046d, 0x0821), .driver_info = USB_QUIRK_RESET_RESUME },
|
||||
-
|
||||
- /* Logitech Webcam C160 */
|
||||
- { USB_DEVICE(0x046d, 0x0824), .driver_info = USB_QUIRK_RESET_RESUME },
|
||||
-
|
||||
- /* Logitech Webcam C270 */
|
||||
- { USB_DEVICE(0x046d, 0x0825), .driver_info = USB_QUIRK_RESET_RESUME },
|
||||
-
|
||||
- /* Logitech Quickcam Pro 9000 */
|
||||
- { USB_DEVICE(0x046d, 0x0990), .driver_info = USB_QUIRK_RESET_RESUME },
|
||||
-
|
||||
- /* Logitech Quickcam E3500 */
|
||||
- { USB_DEVICE(0x046d, 0x09a4), .driver_info = USB_QUIRK_RESET_RESUME },
|
||||
-
|
||||
- /* Logitech Quickcam Vision Pro */
|
||||
- { USB_DEVICE(0x046d, 0x09a6), .driver_info = USB_QUIRK_RESET_RESUME },
|
||||
+ /* Logitech Quickcam OEM Cisco VT Camera II */
|
||||
+ { USB_DEVICE(0x046d, 0x08c7), .driver_info = USB_QUIRK_RESET_RESUME },
|
||||
|
||||
/* Logitech Harmony 700-series */
|
||||
{ USB_DEVICE(0x046d, 0xc122), .driver_info = USB_QUIRK_DELAY_INIT },
|
||||
@@ -169,6 +139,10 @@ static const struct usb_device_id usb_qu
|
||||
};
|
||||
|
||||
static const struct usb_device_id usb_interface_quirk_list[] = {
|
||||
+ /* Logitech UVC Cameras */
|
||||
+ { USB_VENDOR_AND_INTERFACE_INFO(0x046d, USB_CLASS_VIDEO, 1, 0),
|
||||
+ .driver_info = USB_QUIRK_RESET_RESUME },
|
||||
+
|
||||
{ } /* terminating entry must be last */
|
||||
};
|
||||
|
|
@ -1,250 +0,0 @@
|
|||
From: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
|
||||
Date: Thu, 19 Jul 2012 12:39:13 +0200
|
||||
Subject: usb: Add quirk detection based on interface information
|
||||
|
||||
commit 80da2e0df5af700518611b7d1cc4fc9945bcaf95 upstream.
|
||||
|
||||
When a whole class of devices (possibly from a specific vendor, or
|
||||
across multiple vendors) require a quirk, explictly listing all devices
|
||||
in the class make the quirks table unnecessarily large. Fix this by
|
||||
allowing matching devices based on interface information.
|
||||
|
||||
Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
|
||||
Acked-by: Alan Stern <stern@rowland.harvard.edu>
|
||||
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
||||
---
|
||||
drivers/usb/core/driver.c | 38 ++++++++++--------
|
||||
drivers/usb/core/hub.c | 10 +++--
|
||||
drivers/usb/core/quirks.c | 93 +++++++++++++++++++++++++++++++++++----------
|
||||
drivers/usb/core/usb.h | 4 ++
|
||||
4 files changed, 106 insertions(+), 39 deletions(-)
|
||||
|
||||
--- a/drivers/usb/core/driver.c
|
||||
+++ b/drivers/usb/core/driver.c
|
||||
@@ -541,22 +541,10 @@ int usb_match_device(struct usb_device *
|
||||
}
|
||||
|
||||
/* returns 0 if no match, 1 if match */
|
||||
-int usb_match_one_id(struct usb_interface *interface,
|
||||
- const struct usb_device_id *id)
|
||||
+int usb_match_one_id_intf(struct usb_device *dev,
|
||||
+ struct usb_host_interface *intf,
|
||||
+ const struct usb_device_id *id)
|
||||
{
|
||||
- struct usb_host_interface *intf;
|
||||
- struct usb_device *dev;
|
||||
-
|
||||
- /* proc_connectinfo in devio.c may call us with id == NULL. */
|
||||
- if (id == NULL)
|
||||
- return 0;
|
||||
-
|
||||
- intf = interface->cur_altsetting;
|
||||
- dev = interface_to_usbdev(interface);
|
||||
-
|
||||
- if (!usb_match_device(dev, id))
|
||||
- return 0;
|
||||
-
|
||||
/* The interface class, subclass, and protocol should never be
|
||||
* checked for a match if the device class is Vendor Specific,
|
||||
* unless the match record specifies the Vendor ID. */
|
||||
@@ -581,6 +569,26 @@ int usb_match_one_id(struct usb_interfac
|
||||
|
||||
return 1;
|
||||
}
|
||||
+
|
||||
+/* returns 0 if no match, 1 if match */
|
||||
+int usb_match_one_id(struct usb_interface *interface,
|
||||
+ const struct usb_device_id *id)
|
||||
+{
|
||||
+ struct usb_host_interface *intf;
|
||||
+ struct usb_device *dev;
|
||||
+
|
||||
+ /* proc_connectinfo in devio.c may call us with id == NULL. */
|
||||
+ if (id == NULL)
|
||||
+ return 0;
|
||||
+
|
||||
+ intf = interface->cur_altsetting;
|
||||
+ dev = interface_to_usbdev(interface);
|
||||
+
|
||||
+ if (!usb_match_device(dev, id))
|
||||
+ return 0;
|
||||
+
|
||||
+ return usb_match_one_id_intf(dev, intf, id);
|
||||
+}
|
||||
EXPORT_SYMBOL_GPL(usb_match_one_id);
|
||||
|
||||
/**
|
||||
--- a/drivers/usb/core/hub.c
|
||||
+++ b/drivers/usb/core/hub.c
|
||||
@@ -1821,7 +1821,7 @@ static int usb_enumerate_device(struct u
|
||||
if (err < 0) {
|
||||
dev_err(&udev->dev, "can't read configurations, error %d\n",
|
||||
err);
|
||||
- goto fail;
|
||||
+ return err;
|
||||
}
|
||||
}
|
||||
if (udev->wusb == 1 && udev->authorized == 0) {
|
||||
@@ -1837,8 +1837,12 @@ static int usb_enumerate_device(struct u
|
||||
udev->serial = usb_cache_string(udev, udev->descriptor.iSerialNumber);
|
||||
}
|
||||
err = usb_enumerate_device_otg(udev);
|
||||
-fail:
|
||||
- return err;
|
||||
+ if (err < 0)
|
||||
+ return err;
|
||||
+
|
||||
+ usb_detect_interface_quirks(udev);
|
||||
+
|
||||
+ return 0;
|
||||
}
|
||||
|
||||
|
||||
--- a/drivers/usb/core/quirks.c
|
||||
+++ b/drivers/usb/core/quirks.c
|
||||
@@ -15,17 +15,22 @@
|
||||
#include <linux/usb/quirks.h>
|
||||
#include "usb.h"
|
||||
|
||||
-/* List of quirky USB devices. Please keep this list ordered by:
|
||||
+/* Lists of quirky USB devices, split in device quirks and interface quirks.
|
||||
+ * Device quirks are applied at the very beginning of the enumeration process,
|
||||
+ * right after reading the device descriptor. They can thus only match on device
|
||||
+ * information.
|
||||
+ *
|
||||
+ * Interface quirks are applied after reading all the configuration descriptors.
|
||||
+ * They can match on both device and interface information.
|
||||
+ *
|
||||
+ * Note that the DELAY_INIT and HONOR_BNUMINTERFACES quirks do not make sense as
|
||||
+ * interface quirks, as they only influence the enumeration process which is run
|
||||
+ * before processing the interface quirks.
|
||||
+ *
|
||||
+ * Please keep the lists ordered by:
|
||||
* 1) Vendor ID
|
||||
* 2) Product ID
|
||||
* 3) Class ID
|
||||
- *
|
||||
- * as we want specific devices to be overridden first, and only after that, any
|
||||
- * class specific quirks.
|
||||
- *
|
||||
- * Right now the logic aborts if it finds a valid device in the table, we might
|
||||
- * want to change that in the future if it turns out that a whole class of
|
||||
- * devices is broken...
|
||||
*/
|
||||
static const struct usb_device_id usb_quirk_list[] = {
|
||||
/* CBM - Flash disk */
|
||||
@@ -156,16 +161,53 @@ static const struct usb_device_id usb_qu
|
||||
{ } /* terminating entry must be last */
|
||||
};
|
||||
|
||||
-static const struct usb_device_id *find_id(struct usb_device *udev)
|
||||
+static const struct usb_device_id usb_interface_quirk_list[] = {
|
||||
+ { } /* terminating entry must be last */
|
||||
+};
|
||||
+
|
||||
+static bool usb_match_any_interface(struct usb_device *udev,
|
||||
+ const struct usb_device_id *id)
|
||||
+{
|
||||
+ unsigned int i;
|
||||
+
|
||||
+ for (i = 0; i < udev->descriptor.bNumConfigurations; ++i) {
|
||||
+ struct usb_host_config *cfg = &udev->config[i];
|
||||
+ unsigned int j;
|
||||
+
|
||||
+ for (j = 0; j < cfg->desc.bNumInterfaces; ++j) {
|
||||
+ struct usb_interface_cache *cache;
|
||||
+ struct usb_host_interface *intf;
|
||||
+
|
||||
+ cache = cfg->intf_cache[j];
|
||||
+ if (cache->num_altsetting == 0)
|
||||
+ continue;
|
||||
+
|
||||
+ intf = &cache->altsetting[0];
|
||||
+ if (usb_match_one_id_intf(udev, intf, id))
|
||||
+ return true;
|
||||
+ }
|
||||
+ }
|
||||
+
|
||||
+ return false;
|
||||
+}
|
||||
+
|
||||
+static u32 __usb_detect_quirks(struct usb_device *udev,
|
||||
+ const struct usb_device_id *id)
|
||||
{
|
||||
- const struct usb_device_id *id = usb_quirk_list;
|
||||
+ u32 quirks = 0;
|
||||
|
||||
- for (; id->idVendor || id->bDeviceClass || id->bInterfaceClass ||
|
||||
- id->driver_info; id++) {
|
||||
- if (usb_match_device(udev, id))
|
||||
- return id;
|
||||
+ for (; id->match_flags; id++) {
|
||||
+ if (!usb_match_device(udev, id))
|
||||
+ continue;
|
||||
+
|
||||
+ if ((id->match_flags & USB_DEVICE_ID_MATCH_INT_INFO) &&
|
||||
+ !usb_match_any_interface(udev, id))
|
||||
+ continue;
|
||||
+
|
||||
+ quirks |= (u32)(id->driver_info);
|
||||
}
|
||||
- return NULL;
|
||||
+
|
||||
+ return quirks;
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -173,14 +215,10 @@ static const struct usb_device_id *find_
|
||||
*/
|
||||
void usb_detect_quirks(struct usb_device *udev)
|
||||
{
|
||||
- const struct usb_device_id *id = usb_quirk_list;
|
||||
-
|
||||
- id = find_id(udev);
|
||||
- if (id)
|
||||
- udev->quirks = (u32)(id->driver_info);
|
||||
+ udev->quirks = __usb_detect_quirks(udev, usb_quirk_list);
|
||||
if (udev->quirks)
|
||||
dev_dbg(&udev->dev, "USB quirks for this device: %x\n",
|
||||
- udev->quirks);
|
||||
+ udev->quirks);
|
||||
|
||||
/* For the present, all devices default to USB-PERSIST enabled */
|
||||
#if 0 /* was: #ifdef CONFIG_PM */
|
||||
@@ -197,3 +235,16 @@ void usb_detect_quirks(struct usb_device
|
||||
udev->persist_enabled = 1;
|
||||
#endif /* CONFIG_PM */
|
||||
}
|
||||
+
|
||||
+void usb_detect_interface_quirks(struct usb_device *udev)
|
||||
+{
|
||||
+ u32 quirks;
|
||||
+
|
||||
+ quirks = __usb_detect_quirks(udev, usb_interface_quirk_list);
|
||||
+ if (quirks == 0)
|
||||
+ return;
|
||||
+
|
||||
+ dev_dbg(&udev->dev, "USB interface quirks for this device: %x\n",
|
||||
+ quirks);
|
||||
+ udev->quirks |= quirks;
|
||||
+}
|
||||
--- a/drivers/usb/core/usb.h
|
||||
+++ b/drivers/usb/core/usb.h
|
||||
@@ -24,6 +24,7 @@ extern void usb_disable_device(struct us
|
||||
extern int usb_deauthorize_device(struct usb_device *);
|
||||
extern int usb_authorize_device(struct usb_device *);
|
||||
extern void usb_detect_quirks(struct usb_device *udev);
|
||||
+extern void usb_detect_interface_quirks(struct usb_device *udev);
|
||||
extern int usb_remove_device(struct usb_device *udev);
|
||||
|
||||
extern int usb_get_device_descriptor(struct usb_device *dev,
|
||||
@@ -35,6 +36,9 @@ extern int usb_set_configuration(struct
|
||||
extern int usb_choose_configuration(struct usb_device *udev);
|
||||
|
||||
extern void usb_kick_khubd(struct usb_device *dev);
|
||||
+extern int usb_match_one_id_intf(struct usb_device *dev,
|
||||
+ struct usb_host_interface *intf,
|
||||
+ const struct usb_device_id *id);
|
||||
extern int usb_match_device(struct usb_device *dev,
|
||||
const struct usb_device_id *id);
|
||||
extern void usb_forced_unbind_intf(struct usb_interface *intf);
|
|
@ -1,34 +0,0 @@
|
|||
From: Oleg Nesterov <oleg@redhat.com>
|
||||
Date: Fri, 23 Mar 2012 15:02:49 -0700
|
||||
Subject: [3/5] usermodehelper: ____call_usermodehelper() doesn't need
|
||||
do_exit()
|
||||
|
||||
commit 5b9bd473e3b8a8c6c4ae99be475e6e9b27568555 upstream.
|
||||
|
||||
Minor cleanup. ____call_usermodehelper() can simply return, no need to
|
||||
call do_exit() explicitely.
|
||||
|
||||
Signed-off-by: Oleg Nesterov <oleg@redhat.com>
|
||||
Cc: Tetsuo Handa <penguin-kernel@I-love.SAKURA.ne.jp>
|
||||
Cc: Rusty Russell <rusty@rustcorp.com.au>
|
||||
Cc: Tejun Heo <tj@kernel.org>
|
||||
Cc: David Rientjes <rientjes@google.com>
|
||||
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
|
||||
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
|
||||
---
|
||||
kernel/kmod.c | 2 +-
|
||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
|
||||
diff --git a/kernel/kmod.c b/kernel/kmod.c
|
||||
index 8341de9..685b246 100644
|
||||
--- a/kernel/kmod.c
|
||||
+++ b/kernel/kmod.c
|
||||
@@ -188,7 +188,7 @@ static int ____call_usermodehelper(void *data)
|
||||
/* Exec failed? */
|
||||
fail:
|
||||
sub_info->retval = retval;
|
||||
- do_exit(0);
|
||||
+ return 0;
|
||||
}
|
||||
|
||||
void call_usermodehelper_freeinfo(struct subprocess_info *info)
|
|
@ -1,105 +0,0 @@
|
|||
From: Oleg Nesterov <oleg@redhat.com>
|
||||
Date: Fri, 23 Mar 2012 15:02:47 -0700
|
||||
Subject: [2/5] usermodehelper: implement UMH_KILLABLE
|
||||
|
||||
commit d0bd587a80960d7ba7e0c8396e154028c9045c54 upstream.
|
||||
|
||||
Implement UMH_KILLABLE, should be used along with UMH_WAIT_EXEC/PROC.
|
||||
The caller must ensure that subprocess_info->path/etc can not go away
|
||||
until call_usermodehelper_freeinfo().
|
||||
|
||||
call_usermodehelper_exec(UMH_KILLABLE) does
|
||||
wait_for_completion_killable. If it fails, it uses
|
||||
xchg(&sub_info->complete, NULL) to serialize with umh_complete() which
|
||||
does the same xhcg() to access sub_info->complete.
|
||||
|
||||
If call_usermodehelper_exec wins, it can safely return. umh_complete()
|
||||
should get NULL and call call_usermodehelper_freeinfo().
|
||||
|
||||
Otherwise we know that umh_complete() was already called, in this case
|
||||
call_usermodehelper_exec() falls back to wait_for_completion() which
|
||||
should succeed "very soon".
|
||||
|
||||
Note: UMH_NO_WAIT == -1 but it obviously should not be used with
|
||||
UMH_KILLABLE. We delay the neccessary cleanup to simplify the back
|
||||
porting.
|
||||
|
||||
Signed-off-by: Oleg Nesterov <oleg@redhat.com>
|
||||
Cc: Tetsuo Handa <penguin-kernel@I-love.SAKURA.ne.jp>
|
||||
Cc: Rusty Russell <rusty@rustcorp.com.au>
|
||||
Cc: Tejun Heo <tj@kernel.org>
|
||||
Cc: David Rientjes <rientjes@google.com>
|
||||
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
|
||||
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
|
||||
---
|
||||
include/linux/kmod.h | 2 ++
|
||||
kernel/kmod.c | 27 +++++++++++++++++++++++++--
|
||||
2 files changed, 27 insertions(+), 2 deletions(-)
|
||||
|
||||
diff --git a/include/linux/kmod.h b/include/linux/kmod.h
|
||||
index 722f477..1b598585 100644
|
||||
--- a/include/linux/kmod.h
|
||||
+++ b/include/linux/kmod.h
|
||||
@@ -54,6 +54,8 @@ enum umh_wait {
|
||||
UMH_WAIT_PROC = 1, /* wait for the process to complete */
|
||||
};
|
||||
|
||||
+#define UMH_KILLABLE 4 /* wait for EXEC/PROC killable */
|
||||
+
|
||||
struct subprocess_info {
|
||||
struct work_struct work;
|
||||
struct completion *complete;
|
||||
diff --git a/kernel/kmod.c b/kernel/kmod.c
|
||||
index 8ea2594..f92f917 100644
|
||||
--- a/kernel/kmod.c
|
||||
+++ b/kernel/kmod.c
|
||||
@@ -201,7 +201,15 @@ EXPORT_SYMBOL(call_usermodehelper_freeinfo);
|
||||
|
||||
static void umh_complete(struct subprocess_info *sub_info)
|
||||
{
|
||||
- complete(sub_info->complete);
|
||||
+ struct completion *comp = xchg(&sub_info->complete, NULL);
|
||||
+ /*
|
||||
+ * See call_usermodehelper_exec(). If xchg() returns NULL
|
||||
+ * we own sub_info, the UMH_KILLABLE caller has gone away.
|
||||
+ */
|
||||
+ if (comp)
|
||||
+ complete(comp);
|
||||
+ else
|
||||
+ call_usermodehelper_freeinfo(sub_info);
|
||||
}
|
||||
|
||||
/* Keventd can't block, but this (a child) can. */
|
||||
@@ -252,6 +260,9 @@ static void __call_usermodehelper(struct work_struct *work)
|
||||
enum umh_wait wait = sub_info->wait;
|
||||
pid_t pid;
|
||||
|
||||
+ if (wait != UMH_NO_WAIT)
|
||||
+ wait &= ~UMH_KILLABLE;
|
||||
+
|
||||
/* CLONE_VFORK: wait until the usermode helper has execve'd
|
||||
* successfully We need the data structures to stay around
|
||||
* until that is done. */
|
||||
@@ -461,9 +472,21 @@ int call_usermodehelper_exec(struct subprocess_info *sub_info,
|
||||
queue_work(khelper_wq, &sub_info->work);
|
||||
if (wait == UMH_NO_WAIT) /* task has freed sub_info */
|
||||
goto unlock;
|
||||
+
|
||||
+ if (wait & UMH_KILLABLE) {
|
||||
+ retval = wait_for_completion_killable(&done);
|
||||
+ if (!retval)
|
||||
+ goto wait_done;
|
||||
+
|
||||
+ /* umh_complete() will see NULL and free sub_info */
|
||||
+ if (xchg(&sub_info->complete, NULL))
|
||||
+ goto unlock;
|
||||
+ /* fallthrough, umh_complete() was already called */
|
||||
+ }
|
||||
+
|
||||
wait_for_completion(&done);
|
||||
+wait_done:
|
||||
retval = sub_info->retval;
|
||||
-
|
||||
out:
|
||||
call_usermodehelper_freeinfo(sub_info);
|
||||
unlock:
|
|
@ -1,54 +0,0 @@
|
|||
From: Oleg Nesterov <oleg@redhat.com>
|
||||
Date: Fri, 23 Mar 2012 15:02:47 -0700
|
||||
Subject: [1/5] usermodehelper: introduce umh_complete(sub_info)
|
||||
|
||||
commit b3449922502f5a161ee2b5022a33aec8472fbf18 upstream.
|
||||
|
||||
Preparation. Add the new trivial helper, umh_complete(). Currently it
|
||||
simply does complete(sub_info->complete).
|
||||
|
||||
Signed-off-by: Oleg Nesterov <oleg@redhat.com>
|
||||
Cc: Tetsuo Handa <penguin-kernel@I-love.SAKURA.ne.jp>
|
||||
Cc: Rusty Russell <rusty@rustcorp.com.au>
|
||||
Cc: Tejun Heo <tj@kernel.org>
|
||||
Cc: David Rientjes <rientjes@google.com>
|
||||
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
|
||||
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
|
||||
---
|
||||
kernel/kmod.c | 9 +++++++--
|
||||
1 file changed, 7 insertions(+), 2 deletions(-)
|
||||
|
||||
diff --git a/kernel/kmod.c b/kernel/kmod.c
|
||||
index a0a8854..8ea2594 100644
|
||||
--- a/kernel/kmod.c
|
||||
+++ b/kernel/kmod.c
|
||||
@@ -199,6 +199,11 @@ void call_usermodehelper_freeinfo(struct subprocess_info *info)
|
||||
}
|
||||
EXPORT_SYMBOL(call_usermodehelper_freeinfo);
|
||||
|
||||
+static void umh_complete(struct subprocess_info *sub_info)
|
||||
+{
|
||||
+ complete(sub_info->complete);
|
||||
+}
|
||||
+
|
||||
/* Keventd can't block, but this (a child) can. */
|
||||
static int wait_for_helper(void *data)
|
||||
{
|
||||
@@ -235,7 +240,7 @@ static int wait_for_helper(void *data)
|
||||
sub_info->retval = ret;
|
||||
}
|
||||
|
||||
- complete(sub_info->complete);
|
||||
+ umh_complete(sub_info);
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -269,7 +274,7 @@ static void __call_usermodehelper(struct work_struct *work)
|
||||
case UMH_WAIT_EXEC:
|
||||
if (pid < 0)
|
||||
sub_info->retval = pid;
|
||||
- complete(sub_info->complete);
|
||||
+ umh_complete(sub_info);
|
||||
}
|
||||
}
|
||||
|
|
@ -1,31 +0,0 @@
|
|||
From: "Michael S. Tsirkin" <mst@redhat.com>
|
||||
Date: Mon, 26 Nov 2012 05:57:27 +0000
|
||||
Subject: vhost: fix length for cross region descriptor
|
||||
|
||||
commit bd97120fc3d1a11f3124c7c9ba1d91f51829eb85 upstream.
|
||||
|
||||
If a single descriptor crosses a region, the
|
||||
second chunk length should be decremented
|
||||
by size translated so far, instead it includes
|
||||
the full descriptor length.
|
||||
|
||||
Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
|
||||
Acked-by: Jason Wang <jasowang@redhat.com>
|
||||
Signed-off-by: David S. Miller <davem@davemloft.net>
|
||||
---
|
||||
drivers/vhost/vhost.c | 2 +-
|
||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
|
||||
diff --git a/drivers/vhost/vhost.c b/drivers/vhost/vhost.c
|
||||
index 99ac2cb..dedaf81 100644
|
||||
--- a/drivers/vhost/vhost.c
|
||||
+++ b/drivers/vhost/vhost.c
|
||||
@@ -1076,7 +1076,7 @@ static int translate_desc(struct vhost_dev *dev, u64 addr, u32 len,
|
||||
}
|
||||
_iov = iov + ret;
|
||||
size = reg->memory_size - addr + reg->guest_phys_addr;
|
||||
- _iov->iov_len = min((u64)len, size);
|
||||
+ _iov->iov_len = min((u64)len - s, size);
|
||||
_iov->iov_base = (void __user *)(unsigned long)
|
||||
(reg->userspace_addr + addr - reg->guest_phys_addr);
|
||||
s += size;
|
|
@ -1,65 +0,0 @@
|
|||
From: Ben Hutchings <ben@decadent.org.uk>
|
||||
Date: Fri, 9 Nov 2012 02:43:00 +0000
|
||||
Subject: asus-laptop: Do not call HWRS on init
|
||||
|
||||
commit cb7da022450cdaaebd33078b6b32fb7dd2aaf6db upstream.
|
||||
|
||||
Since commit 8871e99f89b7 ('asus-laptop: HRWS/HWRS typo'), module
|
||||
initialisation is very slow on the Asus UL30A. The HWRS method takes
|
||||
about 12 seconds to run, and subsequent initialisation also seems to
|
||||
be delayed. Since we don't really need the result, don't bother
|
||||
calling it on init. Those who are curious can still get the result
|
||||
through the 'infos' device attribute.
|
||||
|
||||
Update the comment about HWRS in show_infos().
|
||||
|
||||
Reported-by: ryan <draziw+deb@gmail.com>
|
||||
References: http://bugs.debian.org/692436
|
||||
Signed-off-by: Ben Hutchings <ben@decadent.org.uk>
|
||||
---
|
||||
drivers/platform/x86/asus-laptop.c | 17 ++++-------------
|
||||
1 file changed, 4 insertions(+), 13 deletions(-)
|
||||
|
||||
diff --git a/drivers/platform/x86/asus-laptop.c b/drivers/platform/x86/asus-laptop.c
|
||||
index 4b568df..a961156 100644
|
||||
--- a/drivers/platform/x86/asus-laptop.c
|
||||
+++ b/drivers/platform/x86/asus-laptop.c
|
||||
@@ -860,8 +860,10 @@ static ssize_t show_infos(struct device *dev,
|
||||
/*
|
||||
* The HWRS method return informations about the hardware.
|
||||
* 0x80 bit is for WLAN, 0x100 for Bluetooth.
|
||||
+ * 0x40 for WWAN, 0x10 for WIMAX.
|
||||
* The significance of others is yet to be found.
|
||||
- * If we don't find the method, we assume the device are present.
|
||||
+ * We don't currently use this for device detection, and it
|
||||
+ * takes several seconds to run on some systems.
|
||||
*/
|
||||
rv = acpi_evaluate_integer(asus->handle, "HWRS", NULL, &temp);
|
||||
if (!ACPI_FAILURE(rv))
|
||||
@@ -1682,7 +1684,7 @@ static int asus_laptop_get_info(struct asus_laptop *asus)
|
||||
{
|
||||
struct acpi_buffer buffer = { ACPI_ALLOCATE_BUFFER, NULL };
|
||||
union acpi_object *model = NULL;
|
||||
- unsigned long long bsts_result, hwrs_result;
|
||||
+ unsigned long long bsts_result;
|
||||
char *string = NULL;
|
||||
acpi_status status;
|
||||
|
||||
@@ -1744,17 +1746,6 @@ static int asus_laptop_get_info(struct asus_laptop *asus)
|
||||
if (*string)
|
||||
pr_notice(" %s model detected\n", string);
|
||||
|
||||
- /*
|
||||
- * The HWRS method return informations about the hardware.
|
||||
- * 0x80 bit is for WLAN, 0x100 for Bluetooth,
|
||||
- * 0x40 for WWAN, 0x10 for WIMAX.
|
||||
- * The significance of others is yet to be found.
|
||||
- */
|
||||
- status =
|
||||
- acpi_evaluate_integer(asus->handle, "HWRS", NULL, &hwrs_result);
|
||||
- if (!ACPI_FAILURE(status))
|
||||
- pr_notice(" HWRS returned %x", (int)hwrs_result);
|
||||
-
|
||||
if (!acpi_check_handle(asus->handle, METHOD_WL_STATUS, NULL))
|
||||
asus->have_rsts = true;
|
||||
|
|
@ -1,65 +0,0 @@
|
|||
From: Satoru Takeuchi <takeuchi_satoru@jp.fujitsu.com>
|
||||
Date: Thu, 14 Feb 2013 09:12:52 +0900
|
||||
Subject: efi: Clear EFI_RUNTIME_SERVICES rather than EFI_BOOT by "noefi" boot
|
||||
parameter
|
||||
|
||||
commit 1de63d60cd5b0d33a812efa455d5933bf1564a51 upstream.
|
||||
|
||||
There was a serious problem in samsung-laptop that its platform driver is
|
||||
designed to run under BIOS and running under EFI can cause the machine to
|
||||
become bricked or can cause Machine Check Exceptions.
|
||||
|
||||
Discussion about this problem:
|
||||
https://bugs.launchpad.net/ubuntu-cdimage/+bug/1040557
|
||||
https://bugzilla.kernel.org/show_bug.cgi?id=47121
|
||||
|
||||
The patches to fix this problem:
|
||||
efi: Make 'efi_enabled' a function to query EFI facilities
|
||||
83e68189745ad931c2afd45d8ee3303929233e7f
|
||||
|
||||
samsung-laptop: Disable on EFI hardware
|
||||
e0094244e41c4d0c7ad69920681972fc45d8ce34
|
||||
|
||||
Unfortunately this problem comes back again if users specify "noefi" option.
|
||||
This parameter clears EFI_BOOT and that driver continues to run even if running
|
||||
under EFI. Refer to the document, this parameter should clear
|
||||
EFI_RUNTIME_SERVICES instead.
|
||||
|
||||
Documentation/kernel-parameters.txt:
|
||||
===============================================================================
|
||||
...
|
||||
noefi [X86] Disable EFI runtime services support.
|
||||
...
|
||||
===============================================================================
|
||||
|
||||
Documentation/x86/x86_64/uefi.txt:
|
||||
===============================================================================
|
||||
...
|
||||
- If some or all EFI runtime services don't work, you can try following
|
||||
kernel command line parameters to turn off some or all EFI runtime
|
||||
services.
|
||||
noefi turn off all EFI runtime services
|
||||
...
|
||||
===============================================================================
|
||||
|
||||
Signed-off-by: Satoru Takeuchi <takeuchi_satoru@jp.fujitsu.com>
|
||||
Link: http://lkml.kernel.org/r/511C2C04.2070108@jp.fujitsu.com
|
||||
Cc: Matt Fleming <matt.fleming@intel.com>
|
||||
Signed-off-by: H. Peter Anvin <hpa@linux.intel.com>
|
||||
---
|
||||
arch/x86/platform/efi/efi.c | 2 +-
|
||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
|
||||
diff --git a/arch/x86/platform/efi/efi.c b/arch/x86/platform/efi/efi.c
|
||||
index 77cf009..928bf83 100644
|
||||
--- a/arch/x86/platform/efi/efi.c
|
||||
+++ b/arch/x86/platform/efi/efi.c
|
||||
@@ -87,7 +87,7 @@ EXPORT_SYMBOL(efi_enabled);
|
||||
|
||||
static int __init setup_noefi(char *arg)
|
||||
{
|
||||
- clear_bit(EFI_BOOT, &x86_efi_facility);
|
||||
+ clear_bit(EFI_RUNTIME_SERVICES, &x86_efi_facility);
|
||||
return 0;
|
||||
}
|
||||
early_param("noefi", setup_noefi);
|
|
@ -1,105 +0,0 @@
|
|||
From: Matt Fleming <matt.fleming@intel.com>
|
||||
Date: Wed, 20 Feb 2013 20:36:12 +0000
|
||||
Subject: x86, efi: Make "noefi" really disable EFI runtime serivces
|
||||
|
||||
commit fb834c7acc5e140cf4f9e86da93a66de8c0514da upstream.
|
||||
|
||||
commit 1de63d60cd5b ("efi: Clear EFI_RUNTIME_SERVICES rather than
|
||||
EFI_BOOT by "noefi" boot parameter") attempted to make "noefi" true to
|
||||
its documentation and disable EFI runtime services to prevent the
|
||||
bricking bug described in commit e0094244e41c ("samsung-laptop:
|
||||
Disable on EFI hardware"). However, it's not possible to clear
|
||||
EFI_RUNTIME_SERVICES from an early param function because
|
||||
EFI_RUNTIME_SERVICES is set in efi_init() *after* parse_early_param().
|
||||
|
||||
This resulted in "noefi" effectively becoming a no-op and no longer
|
||||
providing users with a way to disable EFI, which is bad for those
|
||||
users that have buggy machines.
|
||||
|
||||
Reported-by: Walt Nelson Jr <walt0924@gmail.com>
|
||||
Cc: Satoru Takeuchi <takeuchi_satoru@jp.fujitsu.com>
|
||||
Signed-off-by: Matt Fleming <matt.fleming@intel.com>
|
||||
Link: http://lkml.kernel.org/r/1361392572-25657-1-git-send-email-matt@console-pimps.org
|
||||
Signed-off-by: H. Peter Anvin <hpa@linux.intel.com>
|
||||
[bwh: Backported to 3.2: efi_runtime_init() is not a separate function,
|
||||
so put a whole set of statements in an if (!disable_runtime) block]
|
||||
---
|
||||
--- a/arch/x86/platform/efi/efi.c
|
||||
+++ b/arch/x86/platform/efi/efi.c
|
||||
@@ -83,9 +83,10 @@ int efi_enabled(int facility)
|
||||
}
|
||||
EXPORT_SYMBOL(efi_enabled);
|
||||
|
||||
+static bool disable_runtime = false;
|
||||
static int __init setup_noefi(char *arg)
|
||||
{
|
||||
- clear_bit(EFI_RUNTIME_SERVICES, &x86_efi_facility);
|
||||
+ disable_runtime = true;
|
||||
return 0;
|
||||
}
|
||||
early_param("noefi", setup_noefi);
|
||||
@@ -549,35 +550,37 @@ void __init efi_init(void)
|
||||
|
||||
set_bit(EFI_CONFIG_TABLES, &x86_efi_facility);
|
||||
|
||||
- /*
|
||||
- * Check out the runtime services table. We need to map
|
||||
- * the runtime services table so that we can grab the physical
|
||||
- * address of several of the EFI runtime functions, needed to
|
||||
- * set the firmware into virtual mode.
|
||||
- */
|
||||
- runtime = early_ioremap((unsigned long)efi.systab->runtime,
|
||||
- sizeof(efi_runtime_services_t));
|
||||
- if (runtime != NULL) {
|
||||
- /*
|
||||
- * We will only need *early* access to the following
|
||||
- * two EFI runtime services before set_virtual_address_map
|
||||
- * is invoked.
|
||||
- */
|
||||
- efi_phys.get_time = (efi_get_time_t *)runtime->get_time;
|
||||
- efi_phys.set_virtual_address_map =
|
||||
- (efi_set_virtual_address_map_t *)
|
||||
- runtime->set_virtual_address_map;
|
||||
+ if (!disable_runtime) {
|
||||
/*
|
||||
- * Make efi_get_time can be called before entering
|
||||
- * virtual mode.
|
||||
+ * Check out the runtime services table. We need to map
|
||||
+ * the runtime services table so that we can grab the physical
|
||||
+ * address of several of the EFI runtime functions, needed to
|
||||
+ * set the firmware into virtual mode.
|
||||
*/
|
||||
- efi.get_time = phys_efi_get_time;
|
||||
-
|
||||
- set_bit(EFI_RUNTIME_SERVICES, &x86_efi_facility);
|
||||
- } else
|
||||
- printk(KERN_ERR "Could not map the EFI runtime service "
|
||||
- "table!\n");
|
||||
- early_iounmap(runtime, sizeof(efi_runtime_services_t));
|
||||
+ runtime = early_ioremap((unsigned long)efi.systab->runtime,
|
||||
+ sizeof(efi_runtime_services_t));
|
||||
+ if (runtime != NULL) {
|
||||
+ /*
|
||||
+ * We will only need *early* access to the following
|
||||
+ * two EFI runtime services before set_virtual_address_map
|
||||
+ * is invoked.
|
||||
+ */
|
||||
+ efi_phys.get_time = (efi_get_time_t *)runtime->get_time;
|
||||
+ efi_phys.set_virtual_address_map =
|
||||
+ (efi_set_virtual_address_map_t *)
|
||||
+ runtime->set_virtual_address_map;
|
||||
+ /*
|
||||
+ * Make efi_get_time can be called before entering
|
||||
+ * virtual mode.
|
||||
+ */
|
||||
+ efi.get_time = phys_efi_get_time;
|
||||
+
|
||||
+ set_bit(EFI_RUNTIME_SERVICES, &x86_efi_facility);
|
||||
+ } else
|
||||
+ printk(KERN_ERR "Could not map the EFI runtime service "
|
||||
+ "table!\n");
|
||||
+ early_iounmap(runtime, sizeof(efi_runtime_services_t));
|
||||
+ }
|
||||
|
||||
/* Map the EFI memory map */
|
||||
memmap.map = early_ioremap((unsigned long)memmap.phys_map,
|
|
@ -0,0 +1,27 @@
|
|||
From: Ben Hutchings <ben@decadent.org.uk>
|
||||
Subject: pps: avoid ABI change in 3.2.40
|
||||
Date: Wed, 06 Mar 2013 14:15:34 +0000
|
||||
|
||||
Move the new member pps_device::lookup_cookie to the end of the
|
||||
structure and hide it from genksyms. This structure is always
|
||||
allocated by pps_register_source().
|
||||
|
||||
---
|
||||
--- a/include/linux/pps_kernel.h
|
||||
+++ b/include/linux/pps_kernel.h
|
||||
@@ -69,11 +69,14 @@ struct pps_device {
|
||||
wait_queue_head_t queue; /* PPS event queue */
|
||||
|
||||
unsigned int id; /* PPS source unique ID */
|
||||
- void const *lookup_cookie; /* pps_lookup_dev only */
|
||||
struct cdev cdev;
|
||||
struct device *dev;
|
||||
struct fasync_struct *async_queue; /* fasync method */
|
||||
spinlock_t lock;
|
||||
+
|
||||
+#ifndef __GENKSYMS__
|
||||
+ void const *lookup_cookie; /* pps_lookup_dev only */
|
||||
+#endif
|
||||
};
|
||||
|
||||
/*
|
|
@ -2237,20 +2237,10 @@ index 40c187c..6116e3b 100644
|
|||
atomic_inc(&dev->counts[_DRM_STAT_IOCTLS]);
|
||||
++file_priv->ioctl_count;
|
||||
diff --git a/drivers/gpu/drm/drm_edid.c b/drivers/gpu/drm/drm_edid.c
|
||||
index bb95d59..9d9835a 100644
|
||||
index 9080eb7..9d9835a 100644
|
||||
--- a/drivers/gpu/drm/drm_edid.c
|
||||
+++ b/drivers/gpu/drm/drm_edid.c
|
||||
@@ -87,9 +87,6 @@ static struct edid_quirk {
|
||||
int product_id;
|
||||
u32 quirks;
|
||||
} edid_quirk_list[] = {
|
||||
- /* ASUS VW222S */
|
||||
- { "ACI", 0x22a2, EDID_QUIRK_FORCE_REDUCED_BLANKING },
|
||||
-
|
||||
/* Acer AL1706 */
|
||||
{ "ACR", 44358, EDID_QUIRK_PREFER_LARGE_60 },
|
||||
/* Acer F51 */
|
||||
@@ -157,8 +154,7 @@ EXPORT_SYMBOL(drm_edid_header_is_valid);
|
||||
@@ -154,8 +154,7 @@ EXPORT_SYMBOL(drm_edid_header_is_valid);
|
||||
* Sanity check the EDID block (base or extension). Return 0 if the block
|
||||
* doesn't check out, or 1 if it's valid.
|
||||
*/
|
||||
|
@ -2260,7 +2250,7 @@ index bb95d59..9d9835a 100644
|
|||
{
|
||||
int i;
|
||||
u8 csum = 0;
|
||||
@@ -211,6 +207,7 @@ bad:
|
||||
@@ -208,6 +207,7 @@ bad:
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
@ -2268,7 +2258,7 @@ index bb95d59..9d9835a 100644
|
|||
|
||||
/**
|
||||
* drm_edid_is_valid - sanity check EDID data
|
||||
@@ -234,7 +231,6 @@ bool drm_edid_is_valid(struct edid *edid)
|
||||
@@ -231,7 +231,6 @@ bool drm_edid_is_valid(struct edid *edid)
|
||||
}
|
||||
EXPORT_SYMBOL(drm_edid_is_valid);
|
||||
|
||||
|
@ -2276,7 +2266,7 @@ index bb95d59..9d9835a 100644
|
|||
#define DDC_SEGMENT_ADDR 0x30
|
||||
/**
|
||||
* Get EDID information via I2C.
|
||||
@@ -521,25 +517,10 @@ static void
|
||||
@@ -518,25 +517,10 @@ static void
|
||||
cea_for_each_detailed_block(u8 *ext, detailed_cb *cb, void *closure)
|
||||
{
|
||||
int i, n = 0;
|
||||
|
@ -2304,7 +2294,7 @@ index bb95d59..9d9835a 100644
|
|||
for (i = 0; i < n; i++)
|
||||
cb((struct detailed_timing *)(det_base + 18 * i), closure);
|
||||
}
|
||||
@@ -773,7 +754,7 @@ drm_mode_std(struct drm_connector *connector, struct edid *edid,
|
||||
@@ -770,7 +754,7 @@ drm_mode_std(struct drm_connector *connector, struct edid *edid,
|
||||
*/
|
||||
mode = drm_gtf_mode(dev, hsize, vsize, vrefresh_rate, 0, 0);
|
||||
if (drm_mode_hsync(mode) > drm_gtf2_hbreak(edid)) {
|
||||
|
@ -2313,7 +2303,7 @@ index bb95d59..9d9835a 100644
|
|||
mode = drm_gtf_mode_complex(dev, hsize, vsize,
|
||||
vrefresh_rate, 0, 0,
|
||||
drm_gtf2_m(edid),
|
||||
@@ -1341,6 +1322,7 @@ add_detailed_modes(struct drm_connector *connector, struct edid *edid,
|
||||
@@ -1338,6 +1322,7 @@ add_detailed_modes(struct drm_connector *connector, struct edid *edid,
|
||||
|
||||
#define HDMI_IDENTIFIER 0x000C03
|
||||
#define AUDIO_BLOCK 0x01
|
||||
|
@ -2321,7 +2311,7 @@ index bb95d59..9d9835a 100644
|
|||
#define VENDOR_BLOCK 0x03
|
||||
#define SPEAKER_BLOCK 0x04
|
||||
#define EDID_BASIC_AUDIO (1 << 6)
|
||||
@@ -1371,6 +1353,47 @@ u8 *drm_find_cea_extension(struct edid *edid)
|
||||
@@ -1368,6 +1353,47 @@ u8 *drm_find_cea_extension(struct edid *edid)
|
||||
}
|
||||
EXPORT_SYMBOL(drm_find_cea_extension);
|
||||
|
||||
|
@ -2369,7 +2359,7 @@ index bb95d59..9d9835a 100644
|
|||
static void
|
||||
parse_hdmi_vsdb(struct drm_connector *connector, uint8_t *db)
|
||||
{
|
||||
@@ -1454,26 +1477,29 @@ void drm_edid_to_eld(struct drm_connector *connector, struct edid *edid)
|
||||
@@ -1451,26 +1477,29 @@ void drm_edid_to_eld(struct drm_connector *connector, struct edid *edid)
|
||||
eld[18] = edid->prod_code[0];
|
||||
eld[19] = edid->prod_code[1];
|
||||
|
||||
|
@ -2418,10 +2408,13 @@ index bb95d59..9d9835a 100644
|
|||
eld[5] |= sad_count << 4;
|
||||
eld[2] = (20 + mnl + sad_count * 3 + 3) / 4;
|
||||
|
||||
@@ -1744,6 +1770,7 @@ int drm_add_edid_modes(struct drm_connector *connector, struct edid *edid)
|
||||
@@ -1740,8 +1769,8 @@ int drm_add_edid_modes(struct drm_connector *connector, struct edid *edid)
|
||||
num_modes += add_cvt_modes(connector, edid);
|
||||
num_modes += add_standard_modes(connector, edid);
|
||||
num_modes += add_established_modes(connector, edid);
|
||||
num_modes += add_inferred_modes(connector, edid);
|
||||
- if (edid->features & DRM_EDID_FEATURE_DEFAULT_GTF)
|
||||
- num_modes += add_inferred_modes(connector, edid);
|
||||
+ num_modes += add_inferred_modes(connector, edid);
|
||||
+ num_modes += add_cea_modes(connector, edid);
|
||||
|
||||
if (quirks & (EDID_QUIRK_PREFER_LARGE_60 | EDID_QUIRK_PREFER_LARGE_75))
|
||||
|
@ -4317,7 +4310,7 @@ index 0f9ef9b..5a7bd51 100644
|
|||
|
||||
|
||||
diff --git a/drivers/gpu/drm/drm_usb.c b/drivers/gpu/drm/drm_usb.c
|
||||
index 445003f..37c9a52 100644
|
||||
index 471f453..37c9a52 100644
|
||||
--- a/drivers/gpu/drm/drm_usb.c
|
||||
+++ b/drivers/gpu/drm/drm_usb.c
|
||||
@@ -1,8 +1,7 @@
|
||||
|
@ -4330,6 +4323,15 @@ index 445003f..37c9a52 100644
|
|||
int drm_get_usb_dev(struct usb_interface *interface,
|
||||
const struct usb_device_id *id,
|
||||
struct drm_driver *driver)
|
||||
@@ -19,7 +18,7 @@ int drm_get_usb_dev(struct usb_interface *interface,
|
||||
|
||||
usbdev = interface_to_usbdev(interface);
|
||||
dev->usbdev = usbdev;
|
||||
- dev->dev = &interface->dev;
|
||||
+ dev->dev = &usbdev->dev;
|
||||
|
||||
mutex_lock(&drm_global_mutex);
|
||||
|
||||
@@ -115,4 +114,7 @@ void drm_usb_exit(struct drm_driver *driver,
|
||||
usb_deregister(udriver);
|
||||
}
|
||||
|
@ -42875,7 +42877,7 @@ index 0ae6a7c..ce7fc77 100644
|
|||
dvo_ch7xxx.o \
|
||||
dvo_ch7017.o \
|
||||
diff --git a/drivers/gpu/drm/i915/i915_debugfs.c b/drivers/gpu/drm/i915/i915_debugfs.c
|
||||
index 10fe480..e6162a1 100644
|
||||
index 5620192..e6162a1 100644
|
||||
--- a/drivers/gpu/drm/i915/i915_debugfs.c
|
||||
+++ b/drivers/gpu/drm/i915/i915_debugfs.c
|
||||
@@ -30,7 +30,6 @@
|
||||
|
@ -43063,7 +43065,7 @@ index 10fe480..e6162a1 100644
|
|||
|
||||
seq_printf(m, "Time: %ld s %ld us\n", error->time.tv_sec,
|
||||
error->time.tv_usec);
|
||||
- seq_printf(m, "Kernel: " UTS_RELEASE);
|
||||
- seq_printf(m, "Kernel: " UTS_RELEASE "\n");
|
||||
seq_printf(m, "PCI ID: 0x%04x\n", dev->pci_device);
|
||||
seq_printf(m, "EIR: 0x%08x\n", error->eir);
|
||||
seq_printf(m, "PGTBL_ER: 0x%08x\n", error->pgtbl_er);
|
||||
|
@ -47730,7 +47732,7 @@ index fee0ad0..342ffb7 100644
|
|||
|
||||
drm_encoder_helper_add(&crt->base.base, &intel_crt_helper_funcs);
|
||||
diff --git a/drivers/gpu/drm/i915/intel_display.c b/drivers/gpu/drm/i915/intel_display.c
|
||||
index 7817429..3c9b9c5 100644
|
||||
index 2303c2b..3c9b9c5 100644
|
||||
--- a/drivers/gpu/drm/i915/intel_display.c
|
||||
+++ b/drivers/gpu/drm/i915/intel_display.c
|
||||
@@ -75,7 +75,7 @@ struct intel_limit {
|
||||
|
@ -47768,6 +47770,17 @@ index 7817429..3c9b9c5 100644
|
|||
|
||||
static inline u32 /* units of 100MHz */
|
||||
intel_fdi_link_freq(struct drm_device *dev)
|
||||
@@ -138,8 +142,8 @@ static const intel_limit_t intel_limits_i9xx_sdvo = {
|
||||
.vco = { .min = 1400000, .max = 2800000 },
|
||||
.n = { .min = 1, .max = 6 },
|
||||
.m = { .min = 70, .max = 120 },
|
||||
- .m1 = { .min = 8, .max = 18 },
|
||||
- .m2 = { .min = 3, .max = 7 },
|
||||
+ .m1 = { .min = 10, .max = 22 },
|
||||
+ .m2 = { .min = 5, .max = 9 },
|
||||
.p = { .min = 5, .max = 80 },
|
||||
.p1 = { .min = 1, .max = 8 },
|
||||
.p2 = { .dot_limit = 200000,
|
||||
@@ -534,7 +538,8 @@ static bool intel_PLL_is_valid(struct drm_device *dev,
|
||||
|
||||
static bool
|
||||
|
@ -48066,7 +48079,29 @@ index 7817429..3c9b9c5 100644
|
|||
|
||||
intel_fdi_normal_train(crtc);
|
||||
|
||||
@@ -3331,10 +3392,12 @@ static void intel_crtc_disable(struct drm_crtc *crtc)
|
||||
@@ -3242,7 +3303,6 @@ static void i9xx_crtc_disable(struct drm_crtc *crtc)
|
||||
struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
|
||||
int pipe = intel_crtc->pipe;
|
||||
int plane = intel_crtc->plane;
|
||||
- u32 pctl;
|
||||
|
||||
if (!intel_crtc->active)
|
||||
return;
|
||||
@@ -3258,13 +3318,6 @@ static void i9xx_crtc_disable(struct drm_crtc *crtc)
|
||||
|
||||
intel_disable_plane(dev_priv, plane, pipe);
|
||||
intel_disable_pipe(dev_priv, pipe);
|
||||
-
|
||||
- /* Disable pannel fitter if it is on this pipe. */
|
||||
- pctl = I915_READ(PFIT_CONTROL);
|
||||
- if ((pctl & PFIT_ENABLE) &&
|
||||
- ((pctl & PFIT_PIPE_MASK) >> PFIT_PIPE_SHIFT) == pipe)
|
||||
- I915_WRITE(PFIT_CONTROL, 0);
|
||||
-
|
||||
intel_disable_pll(dev_priv, pipe);
|
||||
|
||||
intel_crtc->active = false;
|
||||
@@ -3339,10 +3392,12 @@ static void intel_crtc_disable(struct drm_crtc *crtc)
|
||||
struct drm_device *dev = crtc->dev;
|
||||
|
||||
crtc_funcs->dpms(crtc, DRM_MODE_DPMS_OFF);
|
||||
|
@ -48080,7 +48115,7 @@ index 7817429..3c9b9c5 100644
|
|||
mutex_unlock(&dev->struct_mutex);
|
||||
}
|
||||
}
|
||||
@@ -3408,10 +3471,10 @@ static bool intel_crtc_mode_fixup(struct drm_crtc *crtc,
|
||||
@@ -3416,10 +3471,10 @@ static bool intel_crtc_mode_fixup(struct drm_crtc *crtc,
|
||||
return false;
|
||||
}
|
||||
|
||||
|
@ -48095,7 +48130,7 @@ index 7817429..3c9b9c5 100644
|
|||
drm_mode_set_crtcinfo(adjusted_mode, 0);
|
||||
|
||||
return true;
|
||||
@@ -4527,10 +4590,11 @@ static void ironlake_update_wm(struct drm_device *dev)
|
||||
@@ -4535,10 +4590,11 @@ static void ironlake_update_wm(struct drm_device *dev)
|
||||
*/
|
||||
}
|
||||
|
||||
|
@ -48108,7 +48143,7 @@ index 7817429..3c9b9c5 100644
|
|||
int fbc_wm, plane_wm, cursor_wm;
|
||||
unsigned int enabled;
|
||||
|
||||
@@ -4539,8 +4603,10 @@ static void sandybridge_update_wm(struct drm_device *dev)
|
||||
@@ -4547,8 +4603,10 @@ static void sandybridge_update_wm(struct drm_device *dev)
|
||||
&sandybridge_display_wm_info, latency,
|
||||
&sandybridge_cursor_wm_info, latency,
|
||||
&plane_wm, &cursor_wm)) {
|
||||
|
@ -48121,7 +48156,7 @@ index 7817429..3c9b9c5 100644
|
|||
DRM_DEBUG_KMS("FIFO watermarks For pipe A -"
|
||||
" plane %d, " "cursor: %d\n",
|
||||
plane_wm, cursor_wm);
|
||||
@@ -4551,8 +4617,10 @@ static void sandybridge_update_wm(struct drm_device *dev)
|
||||
@@ -4559,8 +4617,10 @@ static void sandybridge_update_wm(struct drm_device *dev)
|
||||
&sandybridge_display_wm_info, latency,
|
||||
&sandybridge_cursor_wm_info, latency,
|
||||
&plane_wm, &cursor_wm)) {
|
||||
|
@ -48134,7 +48169,7 @@ index 7817429..3c9b9c5 100644
|
|||
DRM_DEBUG_KMS("FIFO watermarks For pipe B -"
|
||||
" plane %d, cursor: %d\n",
|
||||
plane_wm, cursor_wm);
|
||||
@@ -4565,8 +4633,10 @@ static void sandybridge_update_wm(struct drm_device *dev)
|
||||
@@ -4573,8 +4633,10 @@ static void sandybridge_update_wm(struct drm_device *dev)
|
||||
&sandybridge_display_wm_info, latency,
|
||||
&sandybridge_cursor_wm_info, latency,
|
||||
&plane_wm, &cursor_wm)) {
|
||||
|
@ -48147,7 +48182,7 @@ index 7817429..3c9b9c5 100644
|
|||
DRM_DEBUG_KMS("FIFO watermarks For pipe C -"
|
||||
" plane %d, cursor: %d\n",
|
||||
plane_wm, cursor_wm);
|
||||
@@ -4587,7 +4657,8 @@ static void sandybridge_update_wm(struct drm_device *dev)
|
||||
@@ -4595,7 +4657,8 @@ static void sandybridge_update_wm(struct drm_device *dev)
|
||||
I915_WRITE(WM2_LP_ILK, 0);
|
||||
I915_WRITE(WM1_LP_ILK, 0);
|
||||
|
||||
|
@ -48157,7 +48192,7 @@ index 7817429..3c9b9c5 100644
|
|||
return;
|
||||
enabled = ffs(enabled) - 1;
|
||||
|
||||
@@ -4637,6 +4708,161 @@ static void sandybridge_update_wm(struct drm_device *dev)
|
||||
@@ -4645,6 +4708,161 @@ static void sandybridge_update_wm(struct drm_device *dev)
|
||||
cursor_wm);
|
||||
}
|
||||
|
||||
|
@ -48319,7 +48354,7 @@ index 7817429..3c9b9c5 100644
|
|||
/**
|
||||
* intel_update_watermarks - update FIFO watermark values based on current modes
|
||||
*
|
||||
@@ -4677,6 +4903,16 @@ static void intel_update_watermarks(struct drm_device *dev)
|
||||
@@ -4685,6 +4903,16 @@ static void intel_update_watermarks(struct drm_device *dev)
|
||||
dev_priv->display.update_wm(dev);
|
||||
}
|
||||
|
||||
|
@ -48336,7 +48371,7 @@ index 7817429..3c9b9c5 100644
|
|||
static inline bool intel_panel_use_ssc(struct drm_i915_private *dev_priv)
|
||||
{
|
||||
if (i915_panel_use_ssc >= 0)
|
||||
@@ -4824,6 +5060,82 @@ static bool intel_choose_pipe_bpp_dither(struct drm_crtc *crtc,
|
||||
@@ -4832,6 +5060,82 @@ static bool intel_choose_pipe_bpp_dither(struct drm_crtc *crtc,
|
||||
return display_bpc != bpc;
|
||||
}
|
||||
|
||||
|
@ -48419,7 +48454,7 @@ index 7817429..3c9b9c5 100644
|
|||
static int i9xx_crtc_mode_set(struct drm_crtc *crtc,
|
||||
struct drm_display_mode *mode,
|
||||
struct drm_display_mode *adjusted_mode,
|
||||
@@ -4837,7 +5149,7 @@ static int i9xx_crtc_mode_set(struct drm_crtc *crtc,
|
||||
@@ -4845,7 +5149,7 @@ static int i9xx_crtc_mode_set(struct drm_crtc *crtc,
|
||||
int plane = intel_crtc->plane;
|
||||
int refclk, num_connectors = 0;
|
||||
intel_clock_t clock, reduced_clock;
|
||||
|
@ -48428,7 +48463,7 @@ index 7817429..3c9b9c5 100644
|
|||
bool ok, has_reduced_clock = false, is_sdvo = false, is_dvo = false;
|
||||
bool is_crt = false, is_lvds = false, is_tv = false, is_dp = false;
|
||||
struct drm_mode_config *mode_config = &dev->mode_config;
|
||||
@@ -4878,15 +5190,7 @@ static int i9xx_crtc_mode_set(struct drm_crtc *crtc,
|
||||
@@ -4886,15 +5190,7 @@ static int i9xx_crtc_mode_set(struct drm_crtc *crtc,
|
||||
num_connectors++;
|
||||
}
|
||||
|
||||
|
@ -48445,7 +48480,7 @@ index 7817429..3c9b9c5 100644
|
|||
|
||||
/*
|
||||
* Returns a set of divisors for the desired target clock with the given
|
||||
@@ -4894,7 +5198,8 @@ static int i9xx_crtc_mode_set(struct drm_crtc *crtc,
|
||||
@@ -4902,7 +5198,8 @@ static int i9xx_crtc_mode_set(struct drm_crtc *crtc,
|
||||
* reflck * (5 * (m1 + 2) + (m2 + 2)) / (n + 2) / p1 / p2.
|
||||
*/
|
||||
limit = intel_limit(crtc, refclk);
|
||||
|
@ -48455,7 +48490,7 @@ index 7817429..3c9b9c5 100644
|
|||
if (!ok) {
|
||||
DRM_ERROR("Couldn't find PLL settings for mode!\n");
|
||||
return -EINVAL;
|
||||
@@ -4904,53 +5209,24 @@ static int i9xx_crtc_mode_set(struct drm_crtc *crtc,
|
||||
@@ -4912,53 +5209,24 @@ static int i9xx_crtc_mode_set(struct drm_crtc *crtc,
|
||||
intel_crtc_update_cursor(crtc, true);
|
||||
|
||||
if (is_lvds && dev_priv->lvds_downclock_avail) {
|
||||
|
@ -48521,7 +48556,7 @@ index 7817429..3c9b9c5 100644
|
|||
|
||||
dpll = DPLL_VGA_MODE_DIS;
|
||||
|
||||
@@ -5024,8 +5300,6 @@ static int i9xx_crtc_mode_set(struct drm_crtc *crtc,
|
||||
@@ -5032,8 +5300,6 @@ static int i9xx_crtc_mode_set(struct drm_crtc *crtc,
|
||||
/* Set up the display plane register */
|
||||
dspcntr = DISPPLANE_GAMMA_ENABLE;
|
||||
|
||||
|
@ -48530,7 +48565,7 @@ index 7817429..3c9b9c5 100644
|
|||
if (pipe == 0)
|
||||
dspcntr &= ~DISPPLANE_SEL_PIPE_MASK;
|
||||
else
|
||||
@@ -5060,7 +5334,6 @@ static int i9xx_crtc_mode_set(struct drm_crtc *crtc,
|
||||
@@ -5068,7 +5334,6 @@ static int i9xx_crtc_mode_set(struct drm_crtc *crtc,
|
||||
DRM_DEBUG_KMS("Mode for pipe %c:\n", pipe == 0 ? 'A' : 'B');
|
||||
drm_mode_debug_printmodeline(mode);
|
||||
|
||||
|
@ -48538,7 +48573,7 @@ index 7817429..3c9b9c5 100644
|
|||
I915_WRITE(DPLL(pipe), dpll & ~DPLL_VCO_ENABLE);
|
||||
|
||||
POSTING_READ(DPLL(pipe));
|
||||
@@ -5147,33 +5420,32 @@ static int i9xx_crtc_mode_set(struct drm_crtc *crtc,
|
||||
@@ -5155,33 +5420,32 @@ static int i9xx_crtc_mode_set(struct drm_crtc *crtc,
|
||||
I915_WRITE(DPLL(pipe), dpll);
|
||||
}
|
||||
|
||||
|
@ -48587,7 +48622,7 @@ index 7817429..3c9b9c5 100644
|
|||
|
||||
I915_WRITE(HTOTAL(pipe),
|
||||
(adjusted_mode->crtc_hdisplay - 1) |
|
||||
@@ -5290,7 +5562,8 @@ void ironlake_init_pch_refclk(struct drm_device *dev)
|
||||
@@ -5298,7 +5562,8 @@ void ironlake_init_pch_refclk(struct drm_device *dev)
|
||||
if (intel_panel_use_ssc(dev_priv) && can_ssc) {
|
||||
DRM_DEBUG_KMS("Using SSC on panel\n");
|
||||
temp |= DREF_SSC1_ENABLE;
|
||||
|
@ -48597,7 +48632,7 @@ index 7817429..3c9b9c5 100644
|
|||
|
||||
/* Get SSC going before enabling the outputs */
|
||||
I915_WRITE(PCH_DREF_CONTROL, temp);
|
||||
@@ -5439,7 +5712,8 @@ static int ironlake_crtc_mode_set(struct drm_crtc *crtc,
|
||||
@@ -5447,7 +5712,8 @@ static int ironlake_crtc_mode_set(struct drm_crtc *crtc,
|
||||
* reflck * (5 * (m1 + 2) + (m2 + 2)) / (n + 2) / p1 / p2.
|
||||
*/
|
||||
limit = intel_limit(crtc, refclk);
|
||||
|
@ -48607,7 +48642,7 @@ index 7817429..3c9b9c5 100644
|
|||
if (!ok) {
|
||||
DRM_ERROR("Couldn't find PLL settings for mode!\n");
|
||||
return -EINVAL;
|
||||
@@ -5449,21 +5723,17 @@ static int ironlake_crtc_mode_set(struct drm_crtc *crtc,
|
||||
@@ -5457,21 +5723,17 @@ static int ironlake_crtc_mode_set(struct drm_crtc *crtc,
|
||||
intel_crtc_update_cursor(crtc, true);
|
||||
|
||||
if (is_lvds && dev_priv->lvds_downclock_avail) {
|
||||
|
@ -48636,7 +48671,7 @@ index 7817429..3c9b9c5 100644
|
|||
}
|
||||
/* SDVO TV has fixed PLL values depend on its clock range,
|
||||
this mirrors vbios setting. */
|
||||
@@ -5758,17 +6028,19 @@ static int ironlake_crtc_mode_set(struct drm_crtc *crtc,
|
||||
@@ -5766,17 +6028,19 @@ static int ironlake_crtc_mode_set(struct drm_crtc *crtc,
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -48663,7 +48698,7 @@ index 7817429..3c9b9c5 100644
|
|||
|
||||
I915_WRITE(HTOTAL(pipe),
|
||||
(adjusted_mode->crtc_hdisplay - 1) |
|
||||
@@ -5811,12 +6083,6 @@ static int ironlake_crtc_mode_set(struct drm_crtc *crtc,
|
||||
@@ -5819,12 +6083,6 @@ static int ironlake_crtc_mode_set(struct drm_crtc *crtc,
|
||||
|
||||
intel_wait_for_vblank(dev, pipe);
|
||||
|
||||
|
@ -48676,7 +48711,7 @@ index 7817429..3c9b9c5 100644
|
|||
I915_WRITE(DSPCNTR(plane), dspcntr);
|
||||
POSTING_READ(DSPCNTR(plane));
|
||||
|
||||
@@ -5843,14 +6109,45 @@ static int intel_crtc_mode_set(struct drm_crtc *crtc,
|
||||
@@ -5851,14 +6109,45 @@ static int intel_crtc_mode_set(struct drm_crtc *crtc,
|
||||
|
||||
ret = dev_priv->display.crtc_mode_set(crtc, mode, adjusted_mode,
|
||||
x, y, old_fb);
|
||||
|
@ -48724,7 +48759,7 @@ index 7817429..3c9b9c5 100644
|
|||
static void g4x_write_eld(struct drm_connector *connector,
|
||||
struct drm_crtc *crtc)
|
||||
{
|
||||
@@ -5867,6 +6164,12 @@ static void g4x_write_eld(struct drm_connector *connector,
|
||||
@@ -5875,6 +6164,12 @@ static void g4x_write_eld(struct drm_connector *connector,
|
||||
else
|
||||
eldv = G4X_ELDV_DEVCTG;
|
||||
|
||||
|
@ -48737,7 +48772,7 @@ index 7817429..3c9b9c5 100644
|
|||
i = I915_READ(G4X_AUD_CNTL_ST);
|
||||
i &= ~(eldv | G4X_ELD_ADDR);
|
||||
len = (i >> 9) & 0x1f; /* ELD buffer size */
|
||||
@@ -5894,22 +6197,26 @@ static void ironlake_write_eld(struct drm_connector *connector,
|
||||
@@ -5902,22 +6197,26 @@ static void ironlake_write_eld(struct drm_connector *connector,
|
||||
uint32_t i;
|
||||
int len;
|
||||
int hdmiw_hdmiedid;
|
||||
|
@ -48770,7 +48805,7 @@ index 7817429..3c9b9c5 100644
|
|||
|
||||
DRM_DEBUG_DRIVER("ELD on pipe %c\n", pipe_name(i));
|
||||
|
||||
@@ -5918,14 +6225,27 @@ static void ironlake_write_eld(struct drm_connector *connector,
|
||||
@@ -5926,14 +6225,27 @@ static void ironlake_write_eld(struct drm_connector *connector,
|
||||
if (!i) {
|
||||
DRM_DEBUG_DRIVER("Audio directed to unknown port\n");
|
||||
/* operate blindly on all ports */
|
||||
|
@ -48802,7 +48837,7 @@ index 7817429..3c9b9c5 100644
|
|||
i = I915_READ(aud_cntrl_st2);
|
||||
i &= ~eldv;
|
||||
I915_WRITE(aud_cntrl_st2, i);
|
||||
@@ -5933,13 +6253,8 @@ static void ironlake_write_eld(struct drm_connector *connector,
|
||||
@@ -5941,13 +6253,8 @@ static void ironlake_write_eld(struct drm_connector *connector,
|
||||
if (!eld[0])
|
||||
return;
|
||||
|
||||
|
@ -48817,7 +48852,7 @@ index 7817429..3c9b9c5 100644
|
|||
I915_WRITE(aud_cntl_st, i);
|
||||
|
||||
len = min_t(uint8_t, eld[2], 21); /* 84 bytes of hw ELD buffer */
|
||||
@@ -6319,7 +6634,7 @@ static struct drm_display_mode load_detect_mode = {
|
||||
@@ -6327,7 +6634,7 @@ static struct drm_display_mode load_detect_mode = {
|
||||
|
||||
static struct drm_framebuffer *
|
||||
intel_framebuffer_create(struct drm_device *dev,
|
||||
|
@ -48826,7 +48861,7 @@ index 7817429..3c9b9c5 100644
|
|||
struct drm_i915_gem_object *obj)
|
||||
{
|
||||
struct intel_framebuffer *intel_fb;
|
||||
@@ -6361,7 +6676,7 @@ intel_framebuffer_create_for_mode(struct drm_device *dev,
|
||||
@@ -6369,7 +6676,7 @@ intel_framebuffer_create_for_mode(struct drm_device *dev,
|
||||
int depth, int bpp)
|
||||
{
|
||||
struct drm_i915_gem_object *obj;
|
||||
|
@ -48835,7 +48870,7 @@ index 7817429..3c9b9c5 100644
|
|||
|
||||
obj = i915_gem_alloc_object(dev,
|
||||
intel_framebuffer_size_for_mode(mode, bpp));
|
||||
@@ -6370,9 +6685,9 @@ intel_framebuffer_create_for_mode(struct drm_device *dev,
|
||||
@@ -6378,9 +6685,9 @@ intel_framebuffer_create_for_mode(struct drm_device *dev,
|
||||
|
||||
mode_cmd.width = mode->hdisplay;
|
||||
mode_cmd.height = mode->vdisplay;
|
||||
|
@ -48848,7 +48883,7 @@ index 7817429..3c9b9c5 100644
|
|||
|
||||
return intel_framebuffer_create(dev, &mode_cmd, obj);
|
||||
}
|
||||
@@ -6393,11 +6708,11 @@ mode_fits_in_fbdev(struct drm_device *dev,
|
||||
@@ -6401,11 +6708,11 @@ mode_fits_in_fbdev(struct drm_device *dev,
|
||||
return NULL;
|
||||
|
||||
fb = &dev_priv->fbdev->ifb.base;
|
||||
|
@ -48863,7 +48898,7 @@ index 7817429..3c9b9c5 100644
|
|||
return NULL;
|
||||
|
||||
return fb;
|
||||
@@ -6729,9 +7044,7 @@ static void intel_increase_pllclock(struct drm_crtc *crtc)
|
||||
@@ -6737,9 +7044,7 @@ static void intel_increase_pllclock(struct drm_crtc *crtc)
|
||||
if (!HAS_PIPE_CXSR(dev) && (dpll & DISPLAY_RATE_SELECT_FPA1)) {
|
||||
DRM_DEBUG_DRIVER("upclocking LVDS\n");
|
||||
|
||||
|
@ -48874,7 +48909,7 @@ index 7817429..3c9b9c5 100644
|
|||
|
||||
dpll &= ~DISPLAY_RATE_SELECT_FPA1;
|
||||
I915_WRITE(dpll_reg, dpll);
|
||||
@@ -6740,9 +7053,6 @@ static void intel_increase_pllclock(struct drm_crtc *crtc)
|
||||
@@ -6748,9 +7053,6 @@ static void intel_increase_pllclock(struct drm_crtc *crtc)
|
||||
dpll = I915_READ(dpll_reg);
|
||||
if (dpll & DISPLAY_RATE_SELECT_FPA1)
|
||||
DRM_DEBUG_DRIVER("failed to upclock LVDS!\n");
|
||||
|
@ -48884,7 +48919,7 @@ index 7817429..3c9b9c5 100644
|
|||
}
|
||||
|
||||
/* Schedule downclock */
|
||||
@@ -6755,9 +7065,6 @@ static void intel_decrease_pllclock(struct drm_crtc *crtc)
|
||||
@@ -6763,9 +7065,6 @@ static void intel_decrease_pllclock(struct drm_crtc *crtc)
|
||||
struct drm_device *dev = crtc->dev;
|
||||
drm_i915_private_t *dev_priv = dev->dev_private;
|
||||
struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
|
||||
|
@ -48894,7 +48929,7 @@ index 7817429..3c9b9c5 100644
|
|||
|
||||
if (HAS_PCH_SPLIT(dev))
|
||||
return;
|
||||
@@ -6770,23 +7077,22 @@ static void intel_decrease_pllclock(struct drm_crtc *crtc)
|
||||
@@ -6778,23 +7077,22 @@ static void intel_decrease_pllclock(struct drm_crtc *crtc)
|
||||
* the manual case.
|
||||
*/
|
||||
if (!HAS_PIPE_CXSR(dev) && intel_crtc->lowfreq_avail) {
|
||||
|
@ -48924,7 +48959,7 @@ index 7817429..3c9b9c5 100644
|
|||
}
|
||||
|
||||
/**
|
||||
@@ -6899,7 +7205,7 @@ static void intel_unpin_work_fn(struct work_struct *__work)
|
||||
@@ -6907,7 +7205,7 @@ static void intel_unpin_work_fn(struct work_struct *__work)
|
||||
container_of(__work, struct intel_unpin_work, work);
|
||||
|
||||
mutex_lock(&work->dev->struct_mutex);
|
||||
|
@ -48933,7 +48968,7 @@ index 7817429..3c9b9c5 100644
|
|||
drm_gem_object_unreference(&work->pending_flip_obj->base);
|
||||
drm_gem_object_unreference(&work->old_fb_obj->base);
|
||||
|
||||
@@ -6927,18 +7233,11 @@ static void do_intel_finish_page_flip(struct drm_device *dev,
|
||||
@@ -6935,18 +7233,11 @@ static void do_intel_finish_page_flip(struct drm_device *dev,
|
||||
|
||||
spin_lock_irqsave(&dev->event_lock, flags);
|
||||
work = intel_crtc->unpin_work;
|
||||
|
@ -48953,7 +48988,7 @@ index 7817429..3c9b9c5 100644
|
|||
intel_crtc->unpin_work = NULL;
|
||||
|
||||
if (work->event) {
|
||||
@@ -7010,25 +7309,16 @@ void intel_prepare_page_flip(struct drm_device *dev, int plane)
|
||||
@@ -7018,25 +7309,16 @@ void intel_prepare_page_flip(struct drm_device *dev, int plane)
|
||||
to_intel_crtc(dev_priv->plane_to_crtc_mapping[plane]);
|
||||
unsigned long flags;
|
||||
|
||||
|
@ -48985,7 +49020,7 @@ index 7817429..3c9b9c5 100644
|
|||
static int intel_gen2_queue_flip(struct drm_device *dev,
|
||||
struct drm_crtc *crtc,
|
||||
struct drm_framebuffer *fb,
|
||||
@@ -7045,7 +7335,7 @@ static int intel_gen2_queue_flip(struct drm_device *dev,
|
||||
@@ -7053,7 +7335,7 @@ static int intel_gen2_queue_flip(struct drm_device *dev,
|
||||
goto err;
|
||||
|
||||
/* Offset into the new buffer for cases of shared fbs between CRTCs */
|
||||
|
@ -48994,7 +49029,7 @@ index 7817429..3c9b9c5 100644
|
|||
|
||||
ret = BEGIN_LP_RING(6);
|
||||
if (ret)
|
||||
@@ -7062,16 +7352,14 @@ static int intel_gen2_queue_flip(struct drm_device *dev,
|
||||
@@ -7070,16 +7352,14 @@ static int intel_gen2_queue_flip(struct drm_device *dev,
|
||||
OUT_RING(MI_NOOP);
|
||||
OUT_RING(MI_DISPLAY_FLIP |
|
||||
MI_DISPLAY_FLIP_PLANE(intel_crtc->plane));
|
||||
|
@ -49014,7 +49049,7 @@ index 7817429..3c9b9c5 100644
|
|||
err:
|
||||
return ret;
|
||||
}
|
||||
@@ -7092,7 +7380,7 @@ static int intel_gen3_queue_flip(struct drm_device *dev,
|
||||
@@ -7100,7 +7380,7 @@ static int intel_gen3_queue_flip(struct drm_device *dev,
|
||||
goto err;
|
||||
|
||||
/* Offset into the new buffer for cases of shared fbs between CRTCs */
|
||||
|
@ -49023,7 +49058,7 @@ index 7817429..3c9b9c5 100644
|
|||
|
||||
ret = BEGIN_LP_RING(6);
|
||||
if (ret)
|
||||
@@ -7106,16 +7394,15 @@ static int intel_gen3_queue_flip(struct drm_device *dev,
|
||||
@@ -7114,16 +7394,15 @@ static int intel_gen3_queue_flip(struct drm_device *dev,
|
||||
OUT_RING(MI_NOOP);
|
||||
OUT_RING(MI_DISPLAY_FLIP_I915 |
|
||||
MI_DISPLAY_FLIP_PLANE(intel_crtc->plane));
|
||||
|
@ -49042,7 +49077,7 @@ index 7817429..3c9b9c5 100644
|
|||
err:
|
||||
return ret;
|
||||
}
|
||||
@@ -7144,7 +7431,7 @@ static int intel_gen4_queue_flip(struct drm_device *dev,
|
||||
@@ -7152,7 +7431,7 @@ static int intel_gen4_queue_flip(struct drm_device *dev,
|
||||
*/
|
||||
OUT_RING(MI_DISPLAY_FLIP |
|
||||
MI_DISPLAY_FLIP_PLANE(intel_crtc->plane));
|
||||
|
@ -49051,7 +49086,7 @@ index 7817429..3c9b9c5 100644
|
|||
OUT_RING(obj->gtt_offset | obj->tiling_mode);
|
||||
|
||||
/* XXX Enabling the panel-fitter across page-flip is so far
|
||||
@@ -7154,13 +7441,11 @@ static int intel_gen4_queue_flip(struct drm_device *dev,
|
||||
@@ -7162,13 +7441,11 @@ static int intel_gen4_queue_flip(struct drm_device *dev,
|
||||
pf = 0;
|
||||
pipesrc = I915_READ(PIPESRC(intel_crtc->pipe)) & 0x0fff0fff;
|
||||
OUT_RING(pf | pipesrc);
|
||||
|
@ -49066,7 +49101,7 @@ index 7817429..3c9b9c5 100644
|
|||
err:
|
||||
return ret;
|
||||
}
|
||||
@@ -7185,19 +7470,23 @@ static int intel_gen6_queue_flip(struct drm_device *dev,
|
||||
@@ -7193,19 +7470,23 @@ static int intel_gen6_queue_flip(struct drm_device *dev,
|
||||
|
||||
OUT_RING(MI_DISPLAY_FLIP |
|
||||
MI_DISPLAY_FLIP_PLANE(intel_crtc->plane));
|
||||
|
@ -49095,7 +49130,7 @@ index 7817429..3c9b9c5 100644
|
|||
err:
|
||||
return ret;
|
||||
}
|
||||
@@ -7244,16 +7533,14 @@ static int intel_gen7_queue_flip(struct drm_device *dev,
|
||||
@@ -7252,16 +7533,14 @@ static int intel_gen7_queue_flip(struct drm_device *dev,
|
||||
goto err_unpin;
|
||||
|
||||
intel_ring_emit(ring, MI_DISPLAY_FLIP_I915 | plane_bit);
|
||||
|
@ -49114,7 +49149,7 @@ index 7817429..3c9b9c5 100644
|
|||
err:
|
||||
return ret;
|
||||
}
|
||||
@@ -7551,10 +7838,9 @@ static void intel_setup_outputs(struct drm_device *dev)
|
||||
@@ -7559,10 +7838,9 @@ static void intel_setup_outputs(struct drm_device *dev)
|
||||
struct drm_i915_private *dev_priv = dev->dev_private;
|
||||
struct intel_encoder *encoder;
|
||||
bool dpd_is_edp = false;
|
||||
|
@ -49127,7 +49162,7 @@ index 7817429..3c9b9c5 100644
|
|||
if (!has_lvds && !HAS_PCH_SPLIT(dev)) {
|
||||
/* disable the panel fitter on everything but LVDS */
|
||||
I915_WRITE(PFIT_CONTROL, 0);
|
||||
@@ -7683,7 +7969,7 @@ static const struct drm_framebuffer_funcs intel_fb_funcs = {
|
||||
@@ -7691,7 +7969,7 @@ static const struct drm_framebuffer_funcs intel_fb_funcs = {
|
||||
|
||||
int intel_framebuffer_init(struct drm_device *dev,
|
||||
struct intel_framebuffer *intel_fb,
|
||||
|
@ -49136,7 +49171,7 @@ index 7817429..3c9b9c5 100644
|
|||
struct drm_i915_gem_object *obj)
|
||||
{
|
||||
int ret;
|
||||
@@ -7691,21 +7977,27 @@ int intel_framebuffer_init(struct drm_device *dev,
|
||||
@@ -7699,21 +7977,27 @@ int intel_framebuffer_init(struct drm_device *dev,
|
||||
if (obj->tiling_mode == I915_TILING_Y)
|
||||
return -EINVAL;
|
||||
|
||||
|
@ -49174,7 +49209,7 @@ index 7817429..3c9b9c5 100644
|
|||
return -EINVAL;
|
||||
}
|
||||
|
||||
@@ -7723,11 +8015,12 @@ int intel_framebuffer_init(struct drm_device *dev,
|
||||
@@ -7731,11 +8015,12 @@ int intel_framebuffer_init(struct drm_device *dev,
|
||||
static struct drm_framebuffer *
|
||||
intel_user_framebuffer_create(struct drm_device *dev,
|
||||
struct drm_file *filp,
|
||||
|
@ -49189,7 +49224,7 @@ index 7817429..3c9b9c5 100644
|
|||
if (&obj->base == NULL)
|
||||
return ERR_PTR(-ENOENT);
|
||||
|
||||
@@ -7996,7 +8289,7 @@ void intel_init_emon(struct drm_device *dev)
|
||||
@@ -8004,7 +8289,7 @@ void intel_init_emon(struct drm_device *dev)
|
||||
dev_priv->corr = (lcfuse & LCFUSE_HIV_MASK);
|
||||
}
|
||||
|
||||
|
@ -49198,7 +49233,7 @@ index 7817429..3c9b9c5 100644
|
|||
{
|
||||
/*
|
||||
* Respect the kernel parameter if it is set
|
||||
@@ -8014,11 +8307,11 @@ static bool intel_enable_rc6(struct drm_device *dev)
|
||||
@@ -8022,11 +8307,11 @@ static bool intel_enable_rc6(struct drm_device *dev)
|
||||
* Disable rc6 on Sandybridge
|
||||
*/
|
||||
if (INTEL_INFO(dev)->gen == 6) {
|
||||
|
@ -49214,7 +49249,7 @@ index 7817429..3c9b9c5 100644
|
|||
}
|
||||
|
||||
void gen6_enable_rps(struct drm_i915_private *dev_priv)
|
||||
@@ -8026,7 +8319,9 @@ void gen6_enable_rps(struct drm_i915_private *dev_priv)
|
||||
@@ -8034,7 +8319,9 @@ void gen6_enable_rps(struct drm_i915_private *dev_priv)
|
||||
u32 rp_state_cap = I915_READ(GEN6_RP_STATE_CAP);
|
||||
u32 gt_perf_status = I915_READ(GEN6_GT_PERF_STATUS);
|
||||
u32 pcu_mbox, rc6_mask = 0;
|
||||
|
@ -49224,7 +49259,7 @@ index 7817429..3c9b9c5 100644
|
|||
int i;
|
||||
|
||||
/* Here begins a magic sequence of register writes to enable
|
||||
@@ -8037,6 +8332,13 @@ void gen6_enable_rps(struct drm_i915_private *dev_priv)
|
||||
@@ -8045,6 +8332,13 @@ void gen6_enable_rps(struct drm_i915_private *dev_priv)
|
||||
*/
|
||||
I915_WRITE(GEN6_RC_STATE, 0);
|
||||
mutex_lock(&dev_priv->dev->struct_mutex);
|
||||
|
@ -49238,7 +49273,7 @@ index 7817429..3c9b9c5 100644
|
|||
gen6_gt_force_wake_get(dev_priv);
|
||||
|
||||
/* disable the counters and set deterministic thresholds */
|
||||
@@ -8057,9 +8359,20 @@ void gen6_enable_rps(struct drm_i915_private *dev_priv)
|
||||
@@ -8065,9 +8359,20 @@ void gen6_enable_rps(struct drm_i915_private *dev_priv)
|
||||
I915_WRITE(GEN6_RC6p_THRESHOLD, 100000);
|
||||
I915_WRITE(GEN6_RC6pp_THRESHOLD, 64000); /* unused */
|
||||
|
||||
|
@ -49262,7 +49297,7 @@ index 7817429..3c9b9c5 100644
|
|||
|
||||
I915_WRITE(GEN6_RC_CONTROL,
|
||||
rc6_mask |
|
||||
@@ -8287,6 +8600,10 @@ static void gen6_init_clock_gating(struct drm_device *dev)
|
||||
@@ -8295,6 +8600,10 @@ static void gen6_init_clock_gating(struct drm_device *dev)
|
||||
I915_WRITE(WM2_LP_ILK, 0);
|
||||
I915_WRITE(WM1_LP_ILK, 0);
|
||||
|
||||
|
@ -49273,7 +49308,7 @@ index 7817429..3c9b9c5 100644
|
|||
/* According to the BSpec vol1g, bit 12 (RCPBUNIT) clock
|
||||
* gating disable must be set. Failure to set it results in
|
||||
* flickering pixels due to Z write ordering failures after
|
||||
@@ -8365,6 +8682,10 @@ static void ivybridge_init_clock_gating(struct drm_device *dev)
|
||||
@@ -8373,6 +8682,10 @@ static void ivybridge_init_clock_gating(struct drm_device *dev)
|
||||
|
||||
I915_WRITE(ILK_DSPCLK_GATE, IVB_VRHUNIT_CLK_GATE);
|
||||
|
||||
|
@ -49284,7 +49319,7 @@ index 7817429..3c9b9c5 100644
|
|||
/* Apply the WaDisableRHWOOptimizationForRenderHang workaround. */
|
||||
I915_WRITE(GEN7_COMMON_SLICE_CHICKEN1,
|
||||
GEN7_CSC1_RHWO_OPT_DISABLE_IN_RCC);
|
||||
@@ -8675,9 +8996,15 @@ static void intel_init_display(struct drm_device *dev)
|
||||
@@ -8683,9 +8996,15 @@ static void intel_init_display(struct drm_device *dev)
|
||||
if (IS_IVYBRIDGE(dev)) {
|
||||
u32 ecobus;
|
||||
|
||||
|
@ -49301,7 +49336,7 @@ index 7817429..3c9b9c5 100644
|
|||
__gen6_gt_force_wake_mt_put(dev_priv);
|
||||
mutex_unlock(&dev->struct_mutex);
|
||||
|
||||
@@ -8709,6 +9036,7 @@ static void intel_init_display(struct drm_device *dev)
|
||||
@@ -8717,6 +9036,7 @@ static void intel_init_display(struct drm_device *dev)
|
||||
} else if (IS_GEN6(dev)) {
|
||||
if (SNB_READ_WM0_LATENCY()) {
|
||||
dev_priv->display.update_wm = sandybridge_update_wm;
|
||||
|
@ -49309,7 +49344,7 @@ index 7817429..3c9b9c5 100644
|
|||
} else {
|
||||
DRM_DEBUG_KMS("Failed to read display plane latency. "
|
||||
"Disable CxSR\n");
|
||||
@@ -8722,6 +9050,7 @@ static void intel_init_display(struct drm_device *dev)
|
||||
@@ -8730,6 +9050,7 @@ static void intel_init_display(struct drm_device *dev)
|
||||
dev_priv->display.fdi_link_train = ivb_manual_fdi_link_train;
|
||||
if (SNB_READ_WM0_LATENCY()) {
|
||||
dev_priv->display.update_wm = sandybridge_update_wm;
|
||||
|
@ -49317,7 +49352,7 @@ index 7817429..3c9b9c5 100644
|
|||
} else {
|
||||
DRM_DEBUG_KMS("Failed to read display plane latency. "
|
||||
"Disable CxSR\n");
|
||||
@@ -8834,8 +9163,6 @@ struct intel_quirk {
|
||||
@@ -8842,8 +9163,6 @@ struct intel_quirk {
|
||||
};
|
||||
|
||||
struct intel_quirk intel_quirks[] = {
|
||||
|
@ -49326,7 +49361,7 @@ index 7817429..3c9b9c5 100644
|
|||
/* HP Mini needs pipe A force quirk (LP: #322104) */
|
||||
{ 0x27ae, 0x103c, 0x361a, quirk_pipea_force },
|
||||
|
||||
@@ -8902,33 +9229,19 @@ static void i915_disable_vga(struct drm_device *dev)
|
||||
@@ -8910,33 +9229,19 @@ static void i915_disable_vga(struct drm_device *dev)
|
||||
POSTING_READ(vga_reg);
|
||||
}
|
||||
|
||||
|
@ -49364,7 +49399,7 @@ index 7817429..3c9b9c5 100644
|
|||
dev->mode_config.funcs = (void *)&intel_mode_funcs;
|
||||
|
||||
intel_init_quirks(dev);
|
||||
@@ -8952,6 +9265,9 @@ void intel_modeset_init(struct drm_device *dev)
|
||||
@@ -8960,6 +9265,9 @@ void intel_modeset_init(struct drm_device *dev)
|
||||
|
||||
for (i = 0; i < dev_priv->num_pipe; i++) {
|
||||
intel_crtc_init(dev, i);
|
||||
|
@ -72957,7 +72992,7 @@ index 7b4eeb7..19a0114 100644
|
|||
#include <linux/kernel.h>
|
||||
|
||||
diff --git a/drivers/gpu/drm/radeon/evergreen.c b/drivers/gpu/drm/radeon/evergreen.c
|
||||
index 0977849..c62132c 100644
|
||||
index 60d13fe..c62132c 100644
|
||||
--- a/drivers/gpu/drm/radeon/evergreen.c
|
||||
+++ b/drivers/gpu/drm/radeon/evergreen.c
|
||||
@@ -50,6 +50,39 @@ static const u32 crtc_offsets[6] =
|
||||
|
@ -73048,16 +73083,7 @@ index 0977849..c62132c 100644
|
|||
|
||||
blackout = RREG32(MC_SHARED_BLACKOUT_CNTL);
|
||||
if ((blackout & BLACKOUT_MODE_MASK) != 1) {
|
||||
@@ -1137,6 +1183,8 @@ void evergreen_mc_stop(struct radeon_device *rdev, struct evergreen_mc_save *sav
|
||||
blackout &= ~BLACKOUT_MODE_MASK;
|
||||
WREG32(MC_SHARED_BLACKOUT_CNTL, blackout | 1);
|
||||
}
|
||||
+ /* wait for the MC to settle */
|
||||
+ udelay(100);
|
||||
}
|
||||
|
||||
void evergreen_mc_resume(struct radeon_device *rdev, struct evergreen_mc_save *save)
|
||||
@@ -1166,10 +1214,20 @@ void evergreen_mc_resume(struct radeon_device *rdev, struct evergreen_mc_save *s
|
||||
@@ -1168,10 +1214,20 @@ void evergreen_mc_resume(struct radeon_device *rdev, struct evergreen_mc_save *s
|
||||
WREG32(BIF_FB_EN, FB_READ_EN | FB_WRITE_EN);
|
||||
|
||||
for (i = 0; i < rdev->num_crtc; i++) {
|
||||
|
@ -73082,7 +73108,7 @@ index 0977849..c62132c 100644
|
|||
/* wait for the next frame */
|
||||
frame_count = radeon_get_vblank_counter(rdev, i);
|
||||
for (j = 0; j < rdev->usec_timeout; j++) {
|
||||
@@ -1229,7 +1287,10 @@ void evergreen_mc_program(struct radeon_device *rdev)
|
||||
@@ -1231,7 +1287,10 @@ void evergreen_mc_program(struct radeon_device *rdev)
|
||||
rdev->mc.vram_end >> 12);
|
||||
}
|
||||
WREG32(MC_VM_SYSTEM_APERTURE_DEFAULT_ADDR, rdev->vram_scratch.gpu_addr >> 12);
|
||||
|
@ -73094,7 +73120,7 @@ index 0977849..c62132c 100644
|
|||
tmp = RREG32(MC_FUS_VM_FB_OFFSET) & 0x000FFFFF;
|
||||
tmp |= ((rdev->mc.vram_end >> 20) & 0xF) << 24;
|
||||
tmp |= ((rdev->mc.vram_start >> 20) & 0xF) << 20;
|
||||
@@ -1264,18 +1325,20 @@ void evergreen_mc_program(struct radeon_device *rdev)
|
||||
@@ -1266,18 +1325,20 @@ void evergreen_mc_program(struct radeon_device *rdev)
|
||||
*/
|
||||
void evergreen_ring_ib_execute(struct radeon_device *rdev, struct radeon_ib *ib)
|
||||
{
|
||||
|
@ -73121,7 +73147,7 @@ index 0977849..c62132c 100644
|
|||
}
|
||||
|
||||
|
||||
@@ -1313,71 +1376,73 @@ static int evergreen_cp_load_microcode(struct radeon_device *rdev)
|
||||
@@ -1315,71 +1376,73 @@ static int evergreen_cp_load_microcode(struct radeon_device *rdev)
|
||||
|
||||
static int evergreen_cp_start(struct radeon_device *rdev)
|
||||
{
|
||||
|
@ -73226,7 +73252,7 @@ index 0977849..c62132c 100644
|
|||
u32 tmp;
|
||||
u32 rb_bufsz;
|
||||
int r;
|
||||
@@ -1395,13 +1460,14 @@ int evergreen_cp_resume(struct radeon_device *rdev)
|
||||
@@ -1397,13 +1460,14 @@ int evergreen_cp_resume(struct radeon_device *rdev)
|
||||
RREG32(GRBM_SOFT_RESET);
|
||||
|
||||
/* Set ring buffer size */
|
||||
|
@ -73243,7 +73269,7 @@ index 0977849..c62132c 100644
|
|||
|
||||
/* Set the write pointer delay */
|
||||
WREG32(CP_RB_WPTR_DELAY, 0);
|
||||
@@ -1409,8 +1475,8 @@ int evergreen_cp_resume(struct radeon_device *rdev)
|
||||
@@ -1411,8 +1475,8 @@ int evergreen_cp_resume(struct radeon_device *rdev)
|
||||
/* Initialize the ring buffer's read and write pointers */
|
||||
WREG32(CP_RB_CNTL, tmp | RB_RPTR_WR_ENA);
|
||||
WREG32(CP_RB_RPTR_WR, 0);
|
||||
|
@ -73254,7 +73280,7 @@ index 0977849..c62132c 100644
|
|||
|
||||
/* set the wb address wether it's enabled or not */
|
||||
WREG32(CP_RB_RPTR_ADDR,
|
||||
@@ -1428,16 +1494,16 @@ int evergreen_cp_resume(struct radeon_device *rdev)
|
||||
@@ -1430,16 +1494,16 @@ int evergreen_cp_resume(struct radeon_device *rdev)
|
||||
mdelay(1);
|
||||
WREG32(CP_RB_CNTL, tmp);
|
||||
|
||||
|
@ -73276,7 +73302,7 @@ index 0977849..c62132c 100644
|
|||
return r;
|
||||
}
|
||||
return 0;
|
||||
@@ -1730,7 +1796,7 @@ static void evergreen_gpu_init(struct radeon_device *rdev)
|
||||
@@ -1732,7 +1796,7 @@ static void evergreen_gpu_init(struct radeon_device *rdev)
|
||||
case CHIP_SUMO:
|
||||
rdev->config.evergreen.num_ses = 1;
|
||||
rdev->config.evergreen.max_pipes = 4;
|
||||
|
@ -73285,7 +73311,7 @@ index 0977849..c62132c 100644
|
|||
if (rdev->pdev->device == 0x9648)
|
||||
rdev->config.evergreen.max_simds = 3;
|
||||
else if ((rdev->pdev->device == 0x9647) ||
|
||||
@@ -1819,7 +1885,7 @@ static void evergreen_gpu_init(struct radeon_device *rdev)
|
||||
@@ -1821,7 +1885,7 @@ static void evergreen_gpu_init(struct radeon_device *rdev)
|
||||
break;
|
||||
case CHIP_CAICOS:
|
||||
rdev->config.evergreen.num_ses = 1;
|
||||
|
@ -73294,7 +73320,7 @@ index 0977849..c62132c 100644
|
|||
rdev->config.evergreen.max_tile_pipes = 2;
|
||||
rdev->config.evergreen.max_simds = 2;
|
||||
rdev->config.evergreen.max_backends = 1 * rdev->config.evergreen.num_ses;
|
||||
@@ -1868,7 +1934,9 @@ static void evergreen_gpu_init(struct radeon_device *rdev)
|
||||
@@ -1870,7 +1934,9 @@ static void evergreen_gpu_init(struct radeon_device *rdev)
|
||||
|
||||
|
||||
mc_shared_chmap = RREG32(MC_SHARED_CHMAP);
|
||||
|
@ -73305,7 +73331,7 @@ index 0977849..c62132c 100644
|
|||
mc_arb_ramcfg = RREG32(FUS_MC_ARB_RAMCFG);
|
||||
else
|
||||
mc_arb_ramcfg = RREG32(MC_ARB_RAMCFG);
|
||||
@@ -2272,7 +2340,9 @@ int evergreen_mc_init(struct radeon_device *rdev)
|
||||
@@ -2274,7 +2340,9 @@ int evergreen_mc_init(struct radeon_device *rdev)
|
||||
|
||||
/* Get VRAM informations */
|
||||
rdev->mc.vram_is_ddr = true;
|
||||
|
@ -73316,7 +73342,7 @@ index 0977849..c62132c 100644
|
|||
tmp = RREG32(FUS_MC_ARB_RAMCFG);
|
||||
else
|
||||
tmp = RREG32(MC_ARB_RAMCFG);
|
||||
@@ -2304,12 +2374,14 @@ int evergreen_mc_init(struct radeon_device *rdev)
|
||||
@@ -2306,12 +2374,14 @@ int evergreen_mc_init(struct radeon_device *rdev)
|
||||
rdev->mc.aper_base = pci_resource_start(rdev->pdev, 0);
|
||||
rdev->mc.aper_size = pci_resource_len(rdev->pdev, 0);
|
||||
/* Setup GPU memory space */
|
||||
|
@ -73333,7 +73359,7 @@ index 0977849..c62132c 100644
|
|||
rdev->mc.mc_vram_size = RREG32(CONFIG_MEMSIZE) * 1024 * 1024;
|
||||
rdev->mc.real_vram_size = RREG32(CONFIG_MEMSIZE) * 1024 * 1024;
|
||||
}
|
||||
@@ -2320,7 +2392,7 @@ int evergreen_mc_init(struct radeon_device *rdev)
|
||||
@@ -2322,7 +2392,7 @@ int evergreen_mc_init(struct radeon_device *rdev)
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -73342,7 +73368,7 @@ index 0977849..c62132c 100644
|
|||
{
|
||||
u32 srbm_status;
|
||||
u32 grbm_status;
|
||||
@@ -2333,19 +2405,19 @@ bool evergreen_gpu_is_lockup(struct radeon_device *rdev)
|
||||
@@ -2335,19 +2405,19 @@ bool evergreen_gpu_is_lockup(struct radeon_device *rdev)
|
||||
grbm_status_se0 = RREG32(GRBM_STATUS_SE0);
|
||||
grbm_status_se1 = RREG32(GRBM_STATUS_SE1);
|
||||
if (!(grbm_status & GUI_ACTIVE)) {
|
||||
|
@ -73369,7 +73395,7 @@ index 0977849..c62132c 100644
|
|||
}
|
||||
|
||||
static int evergreen_gpu_soft_reset(struct radeon_device *rdev)
|
||||
@@ -2437,7 +2509,13 @@ void evergreen_disable_interrupt_state(struct radeon_device *rdev)
|
||||
@@ -2439,7 +2509,13 @@ void evergreen_disable_interrupt_state(struct radeon_device *rdev)
|
||||
{
|
||||
u32 tmp;
|
||||
|
||||
|
@ -73384,7 +73410,7 @@ index 0977849..c62132c 100644
|
|||
WREG32(GRBM_INT_CNTL, 0);
|
||||
WREG32(INT_MASK + EVERGREEN_CRTC0_REGISTER_OFFSET, 0);
|
||||
WREG32(INT_MASK + EVERGREEN_CRTC1_REGISTER_OFFSET, 0);
|
||||
@@ -2461,7 +2539,9 @@ void evergreen_disable_interrupt_state(struct radeon_device *rdev)
|
||||
@@ -2463,7 +2539,9 @@ void evergreen_disable_interrupt_state(struct radeon_device *rdev)
|
||||
WREG32(GRPH_INT_CONTROL + EVERGREEN_CRTC5_REGISTER_OFFSET, 0);
|
||||
}
|
||||
|
||||
|
@ -73395,7 +73421,7 @@ index 0977849..c62132c 100644
|
|||
WREG32(DACB_AUTODETECT_INT_CONTROL, 0);
|
||||
|
||||
tmp = RREG32(DC_HPD1_INT_CONTROL) & DC_HPDx_INT_POLARITY;
|
||||
@@ -2482,6 +2562,7 @@ void evergreen_disable_interrupt_state(struct radeon_device *rdev)
|
||||
@@ -2484,6 +2562,7 @@ void evergreen_disable_interrupt_state(struct radeon_device *rdev)
|
||||
int evergreen_irq_set(struct radeon_device *rdev)
|
||||
{
|
||||
u32 cp_int_cntl = CNTX_BUSY_INT_ENABLE | CNTX_EMPTY_INT_ENABLE;
|
||||
|
@ -73403,7 +73429,7 @@ index 0977849..c62132c 100644
|
|||
u32 crtc1 = 0, crtc2 = 0, crtc3 = 0, crtc4 = 0, crtc5 = 0, crtc6 = 0;
|
||||
u32 hpd1, hpd2, hpd3, hpd4, hpd5, hpd6;
|
||||
u32 grbm_int_cntl = 0;
|
||||
@@ -2506,11 +2587,28 @@ int evergreen_irq_set(struct radeon_device *rdev)
|
||||
@@ -2508,11 +2587,28 @@ int evergreen_irq_set(struct radeon_device *rdev)
|
||||
hpd5 = RREG32(DC_HPD5_INT_CONTROL) & ~DC_HPDx_INT_EN;
|
||||
hpd6 = RREG32(DC_HPD6_INT_CONTROL) & ~DC_HPDx_INT_EN;
|
||||
|
||||
|
@ -73436,7 +73462,7 @@ index 0977849..c62132c 100644
|
|||
if (rdev->irq.crtc_vblank_int[0] ||
|
||||
rdev->irq.pflip[0]) {
|
||||
DRM_DEBUG("evergreen_irq_set: vblank 0\n");
|
||||
@@ -2570,7 +2668,12 @@ int evergreen_irq_set(struct radeon_device *rdev)
|
||||
@@ -2572,7 +2668,12 @@ int evergreen_irq_set(struct radeon_device *rdev)
|
||||
grbm_int_cntl |= GUI_IDLE_INT_ENABLE;
|
||||
}
|
||||
|
||||
|
@ -73450,7 +73476,7 @@ index 0977849..c62132c 100644
|
|||
WREG32(GRBM_INT_CNTL, grbm_int_cntl);
|
||||
|
||||
WREG32(INT_MASK + EVERGREEN_CRTC0_REGISTER_OFFSET, crtc1);
|
||||
@@ -2985,11 +3088,24 @@ restart_ih:
|
||||
@@ -2987,11 +3088,24 @@ restart_ih:
|
||||
case 177: /* CP_INT in IB1 */
|
||||
case 178: /* CP_INT in IB2 */
|
||||
DRM_DEBUG("IH: CP int: 0x%08x\n", src_data);
|
||||
|
@ -73477,7 +73503,7 @@ index 0977849..c62132c 100644
|
|||
break;
|
||||
case 233: /* GUI IDLE */
|
||||
DRM_DEBUG("IH: GUI idle\n");
|
||||
@@ -3019,6 +3135,7 @@ restart_ih:
|
||||
@@ -3021,6 +3135,7 @@ restart_ih:
|
||||
|
||||
static int evergreen_startup(struct radeon_device *rdev)
|
||||
{
|
||||
|
@ -73485,7 +73511,7 @@ index 0977849..c62132c 100644
|
|||
int r;
|
||||
|
||||
/* enable pcie gen2 link */
|
||||
@@ -3064,7 +3181,7 @@ static int evergreen_startup(struct radeon_device *rdev)
|
||||
@@ -3066,7 +3181,7 @@ static int evergreen_startup(struct radeon_device *rdev)
|
||||
r = evergreen_blit_init(rdev);
|
||||
if (r) {
|
||||
r600_blit_fini(rdev);
|
||||
|
@ -73494,7 +73520,7 @@ index 0977849..c62132c 100644
|
|||
dev_warn(rdev->dev, "failed blitter (%d) falling back to memcpy\n", r);
|
||||
}
|
||||
|
||||
@@ -3073,6 +3190,12 @@ static int evergreen_startup(struct radeon_device *rdev)
|
||||
@@ -3075,6 +3190,12 @@ static int evergreen_startup(struct radeon_device *rdev)
|
||||
if (r)
|
||||
return r;
|
||||
|
||||
|
@ -73507,7 +73533,7 @@ index 0977849..c62132c 100644
|
|||
/* Enable IRQ */
|
||||
r = r600_irq_init(rdev);
|
||||
if (r) {
|
||||
@@ -3082,7 +3205,9 @@ static int evergreen_startup(struct radeon_device *rdev)
|
||||
@@ -3084,7 +3205,9 @@ static int evergreen_startup(struct radeon_device *rdev)
|
||||
}
|
||||
evergreen_irq_set(rdev);
|
||||
|
||||
|
@ -73518,7 +73544,7 @@ index 0977849..c62132c 100644
|
|||
if (r)
|
||||
return r;
|
||||
r = evergreen_cp_load_microcode(rdev);
|
||||
@@ -3092,6 +3217,23 @@ static int evergreen_startup(struct radeon_device *rdev)
|
||||
@@ -3094,6 +3217,23 @@ static int evergreen_startup(struct radeon_device *rdev)
|
||||
if (r)
|
||||
return r;
|
||||
|
||||
|
@ -73542,7 +73568,7 @@ index 0977849..c62132c 100644
|
|||
return 0;
|
||||
}
|
||||
|
||||
@@ -3111,15 +3253,11 @@ int evergreen_resume(struct radeon_device *rdev)
|
||||
@@ -3113,15 +3253,11 @@ int evergreen_resume(struct radeon_device *rdev)
|
||||
/* post card */
|
||||
atom_asic_init(rdev->mode_info.atom_context);
|
||||
|
||||
|
@ -73560,7 +73586,7 @@ index 0977849..c62132c 100644
|
|||
return r;
|
||||
}
|
||||
|
||||
@@ -3129,13 +3267,17 @@ int evergreen_resume(struct radeon_device *rdev)
|
||||
@@ -3131,13 +3267,17 @@ int evergreen_resume(struct radeon_device *rdev)
|
||||
|
||||
int evergreen_suspend(struct radeon_device *rdev)
|
||||
{
|
||||
|
@ -73580,7 +73606,7 @@ index 0977849..c62132c 100644
|
|||
|
||||
return 0;
|
||||
}
|
||||
@@ -3210,8 +3352,8 @@ int evergreen_init(struct radeon_device *rdev)
|
||||
@@ -3212,8 +3352,8 @@ int evergreen_init(struct radeon_device *rdev)
|
||||
if (r)
|
||||
return r;
|
||||
|
||||
|
@ -73591,7 +73617,7 @@ index 0977849..c62132c 100644
|
|||
|
||||
rdev->ih.ring_obj = NULL;
|
||||
r600_ih_ring_init(rdev, 64 * 1024);
|
||||
@@ -3220,29 +3362,24 @@ int evergreen_init(struct radeon_device *rdev)
|
||||
@@ -3222,29 +3362,24 @@ int evergreen_init(struct radeon_device *rdev)
|
||||
if (r)
|
||||
return r;
|
||||
|
||||
|
@ -73628,7 +73654,7 @@ index 0977849..c62132c 100644
|
|||
|
||||
/* Don't start up if the MC ucode is missing on BTC parts.
|
||||
* The default clocks and voltages before the MC ucode
|
||||
@@ -3260,15 +3397,17 @@ int evergreen_init(struct radeon_device *rdev)
|
||||
@@ -3262,15 +3397,17 @@ int evergreen_init(struct radeon_device *rdev)
|
||||
|
||||
void evergreen_fini(struct radeon_device *rdev)
|
||||
{
|
||||
|
@ -76068,7 +76094,7 @@ index cd4590a..2cbd369 100644
|
|||
+ return ret;
|
||||
+}
|
||||
diff --git a/drivers/gpu/drm/radeon/evergreen_reg.h b/drivers/gpu/drm/radeon/evergreen_reg.h
|
||||
index e022776..34a0e85 100644
|
||||
index e022776b..34a0e85 100644
|
||||
--- a/drivers/gpu/drm/radeon/evergreen_reg.h
|
||||
+++ b/drivers/gpu/drm/radeon/evergreen_reg.h
|
||||
@@ -35,6 +35,14 @@
|
||||
|
|
|
@ -395,17 +395,13 @@ features/all/bql/skge-add-byte-queue-limit-support.patch
|
|||
|
||||
bugfix/all/PCI-PM-Runtime-make-PCI-traces-quieter.patch
|
||||
features/all/USB-add-USB_VENDOR_AND_INTERFACE_INFO-macro.patch
|
||||
bugfix/all/usb-Add-quirk-detection-based-on-interface-informati.patch
|
||||
bugfix/all/usb-Add-USB_QUIRK_RESET_RESUME-for-all-Logitech-UVC-.patch
|
||||
bugfix/alpha/alpha-use-large-data-model.diff
|
||||
features/arm/ahci-Add-JMicron-362-device-IDs.patch
|
||||
bugfix/all/speakup-lower-default-software-speech-rate.patch
|
||||
debian/perf-hide-abi-change-in-3.2.30.patch
|
||||
debian/iwlwifi-do-not-request-unreleased-firmware.patch
|
||||
debian/hid-avoid-ABI-change-in-3.2.31.patch
|
||||
debian/xfrm-avoid-ABI-change-in-3.2.31.patch
|
||||
debian/fs-writeback-avoid-ABI-change-in-3.2.32.patch
|
||||
bugfix/x86/asus-laptop-Do-not-call-HWRS-on-init.patch
|
||||
|
||||
features/all/xen/microcode.patch
|
||||
debian/ALSA-avoid-ABI-change-in-3.2.34.patch
|
||||
|
@ -420,12 +416,6 @@ features/all/xen/microcode-typo.patch
|
|||
bugfix/all/firmware_class-log-every-success-and-failure.patch
|
||||
bugfix/all/firmware-remove-redundant-log-messages-from-drivers.patch
|
||||
|
||||
bugfix/all/usermodehelper-introduce-umh_complete.patch
|
||||
bugfix/all/usermodehelper-implement-UMH_KILLABLE.patch
|
||||
bugfix/all/usermodehelper-____call_usermodehelper-doesnt-need-do_exit.patch
|
||||
bugfix/all/kmod-introduce-call_modprobe-helper.patch
|
||||
bugfix/all/kmod-make-__request_module-killable.patch
|
||||
bugfix/all/exec-use-ELOOP-for-max-recursion-depth.patch
|
||||
bugfix/all/megaraid_sas-fix-memory-leak-if-SGL-has-zero-length-entries.patch
|
||||
debian/audit-increase-AUDIT_NAMES.patch
|
||||
features/all/asix-Adds-support-for-Lenovo-10-100-USB-dongle.patch
|
||||
|
@ -449,10 +439,6 @@ features/all/iguanair/0009-media-rc-do-not-wake-up-rc-thread-unless-there-is-so.
|
|||
features/all/iguanair/0010-media-iguanair-do-not-modify-transmit-buffer.patch
|
||||
features/all/iguanair/0011-media-iguanair-cannot-send-data-from-the-stack.patch
|
||||
features/all/rt2800-add-chipset-revision-RT5390R-support.patch
|
||||
bugfix/all/fs-cachefiles-add-support-for-large-files-in-filesys.patch
|
||||
bugfix/all/ext4-rewrite-punch-hole-to-use-ext4_ext_remove_space.patch
|
||||
bugfix/all/ext4-fix-hole-punch-failure-when-depth-is-greater-th.patch
|
||||
bugfix/all/ext4-fix-kernel-BUG-on-large-scale-rm-rf-commands.patch
|
||||
bugfix/all/md-protect-against-crash-upon-fsync-on-ro-array.patch
|
||||
debian/net-avoid-ABI-break-in-3.2.37.patch
|
||||
|
||||
|
@ -625,10 +611,6 @@ features/all/line6/0104-staging-line6-drop-dump-requests-from-variax-startup.pat
|
|||
features/all/line6/0105-staging-line6-drop-dump-requests-from-pod-startup.patch
|
||||
features/all/line6/0106-staging-line6-drop-unused-dumprequest-code.patch
|
||||
bugfix/all/mm-Try-harder-to-allocate-vmemmap-blocks.patch
|
||||
bugfix/x86/efi-Clear-EFI_RUNTIME_SERVICES-rather-than-EFI_BOOT-.patch
|
||||
bugfix/x86/x86-efi-Make-noefi-really-disable-EFI-runtime-serivc.patch
|
||||
bugfix/all/mm-fix-pageblock-bitmap-allocation.patch
|
||||
bugfix/all/USB-usb-storage-unusual_devs-update-for-Super-TOP-SA.patch
|
||||
debian/x86-efi-avoid-abi-change-in-3.2.38.patch
|
||||
bugfix/all/vhost-fix-length-for-cross-region-descriptor.patch
|
||||
features/x86/efi-stub/0019-x86-efi-Fix-processor-specific-memcpy-build-error.patch
|
||||
debian/pps-avoid-abi-change-in-3.2.40.patch
|
||||
|
|
Loading…
Reference in New Issue