From: Greg Kroah-Hartman Date: Tue, 25 Mar 2014 21:03:52 +0000 (-0700) Subject: 3.13-stable patches X-Git-Tag: v3.4.85~14 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=c829c9c762eb31771aa881fa89b146b87f1b2f3f;p=thirdparty%2Fkernel%2Fstable-queue.git 3.13-stable patches added patches: deb-pkg-fix-building-for-mips-big-endian-or-arm-oabi.patch deb-pkg-fix-cross-building-linux-headers-package.patch fix-uses-of-dma_max_pfn-when-converting-to-a-limiting-address.patch mips-fix-build-error-seen-in-some-configurations.patch p54-clamp-properly-instead-of-just-truncating.patch perf-tools-fix-aaaaargh64-memory-barriers.patch printk-fix-syslog-overflowing-user-buffer.patch regulator-core-replace-direct-ops-disable-usage.patch sunrpc-fix-a-pipe_version-reference-leak.patch x86-bpf_jit-support-negative-offsets.patch --- diff --git a/queue-3.13/deb-pkg-fix-building-for-mips-big-endian-or-arm-oabi.patch b/queue-3.13/deb-pkg-fix-building-for-mips-big-endian-or-arm-oabi.patch new file mode 100644 index 00000000000..32805f92185 --- /dev/null +++ b/queue-3.13/deb-pkg-fix-building-for-mips-big-endian-or-arm-oabi.patch @@ -0,0 +1,45 @@ +From c5e318f67eebbad491615a752c51dbfde7dc3d78 Mon Sep 17 00:00:00 2001 +From: Ben Hutchings +Date: Thu, 5 Dec 2013 14:39:11 +0000 +Subject: deb-pkg: Fix building for MIPS big-endian or ARM OABI + +From: Ben Hutchings + +commit c5e318f67eebbad491615a752c51dbfde7dc3d78 upstream. + +These commands will mysteriously fail: + +$ make ARCH=arm versatile_defconfig +[...] +$ make ARCH=arm deb-pkg +[...] +make[1]: *** [deb-pkg] Error 1 +make: *** [deb-pkg] Error 2 + +The Debian architecture selection for these kernel architectures does +'grep FOO=y $KCONFIG_CONFIG && echo bar', and after 'set -e' this +aborts the script if grep does not find the given config symbol. + +Fixes: 10f26fa64200 ('build, deb-pkg: select userland architecture based on UTS_MACHINE') +Signed-off-by: Ben Hutchings +Signed-off-by: Michal Marek +Signed-off-by: Greg Kroah-Hartman + +--- + scripts/package/builddeb | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +--- a/scripts/package/builddeb ++++ b/scripts/package/builddeb +@@ -41,9 +41,9 @@ create_package() { + parisc*) + debarch=hppa ;; + mips*) +- debarch=mips$(grep -q CPU_LITTLE_ENDIAN=y $KCONFIG_CONFIG && echo el) ;; ++ debarch=mips$(grep -q CPU_LITTLE_ENDIAN=y $KCONFIG_CONFIG && echo el || true) ;; + arm*) +- debarch=arm$(grep -q CONFIG_AEABI=y $KCONFIG_CONFIG && echo el) ;; ++ debarch=arm$(grep -q CONFIG_AEABI=y $KCONFIG_CONFIG && echo el || true) ;; + *) + echo "" >&2 + echo "** ** ** WARNING ** ** **" >&2 diff --git a/queue-3.13/deb-pkg-fix-cross-building-linux-headers-package.patch b/queue-3.13/deb-pkg-fix-cross-building-linux-headers-package.patch new file mode 100644 index 00000000000..b8f384ff6dc --- /dev/null +++ b/queue-3.13/deb-pkg-fix-cross-building-linux-headers-package.patch @@ -0,0 +1,58 @@ +From f8ce239dfc7ba9add41d9ecdc5e7810738f839fa Mon Sep 17 00:00:00 2001 +From: Ben Hutchings +Date: Thu, 5 Dec 2013 14:37:35 +0000 +Subject: deb-pkg: Fix cross-building linux-headers package + +From: Ben Hutchings + +commit f8ce239dfc7ba9add41d9ecdc5e7810738f839fa upstream. + +builddeb generates a control file that says the linux-headers package +can only be built for the build system primary architecture. This +breaks cross-building configurations. We should use $debarch for this +instead. + +Since $debarch is not yet set when generating the control file, set +Architecture: any and use control file variables to fill in the +description. + +Fixes: cd8d60a20a45 ('kbuild: create linux-headers package in deb-pkg') +Reported-and-tested-by: "Niew, Sh." +Signed-off-by: Ben Hutchings +Signed-off-by: Michal Marek +Signed-off-by: Greg Kroah-Hartman + +--- + scripts/package/builddeb | 9 ++++----- + 1 file changed, 4 insertions(+), 5 deletions(-) + +--- a/scripts/package/builddeb ++++ b/scripts/package/builddeb +@@ -62,7 +62,7 @@ create_package() { + fi + + # Create the package +- dpkg-gencontrol -isp $forcearch -p$pname -P"$pdir" ++ dpkg-gencontrol -isp $forcearch -Vkernel:debarch="${debarch:-$(dpkg --print-architecture)}" -p$pname -P"$pdir" + dpkg --build "$pdir" .. + } + +@@ -288,15 +288,14 @@ mkdir -p "$destdir" + (cd $objtree; cp $KCONFIG_CONFIG $destdir/.config) # copy .config manually to be where it's expected to be + ln -sf "/usr/src/linux-headers-$version" "$kernel_headers_dir/lib/modules/$version/build" + rm -f "$objtree/debian/hdrsrcfiles" "$objtree/debian/hdrobjfiles" +-arch=$(dpkg --print-architecture) + + cat <> debian/control + + Package: $kernel_headers_packagename + Provides: linux-headers, linux-headers-2.6 +-Architecture: $arch +-Description: Linux kernel headers for $KERNELRELEASE on $arch +- This package provides kernel header files for $KERNELRELEASE on $arch ++Architecture: any ++Description: Linux kernel headers for $KERNELRELEASE on \${kernel:debarch} ++ This package provides kernel header files for $KERNELRELEASE on \${kernel:debarch} + . + This is useful for people who need to build external modules + EOF diff --git a/queue-3.13/fix-uses-of-dma_max_pfn-when-converting-to-a-limiting-address.patch b/queue-3.13/fix-uses-of-dma_max_pfn-when-converting-to-a-limiting-address.patch new file mode 100644 index 00000000000..a08963be52f --- /dev/null +++ b/queue-3.13/fix-uses-of-dma_max_pfn-when-converting-to-a-limiting-address.patch @@ -0,0 +1,46 @@ +From e83b366487b5582274374f8226e489cb214ae5a6 Mon Sep 17 00:00:00 2001 +From: Russell King +Date: Tue, 11 Feb 2014 17:11:04 +0000 +Subject: Fix uses of dma_max_pfn() when converting to a limiting address + +From: Russell King + +commit e83b366487b5582274374f8226e489cb214ae5a6 upstream. + +We must use a 64-bit for this, otherwise overflowed bits get lost, and +that can result in a lower than intended value set. + +Fixes: 8e0cb8a1f6ac ("ARM: 7797/1: mmc: Use dma_max_pfn(dev) helper for bounce_limit calculations") +Fixes: 7d35496dd982 ("ARM: 7796/1: scsi: Use dma_max_pfn(dev) helper for bounce_limit calculations") +Tested-Acked-by: Santosh Shilimkar +Reviewed-by: Ulf Hansson +Signed-off-by: Russell King +Signed-off-by: Greg Kroah-Hartman + +--- + drivers/mmc/card/queue.c | 2 +- + drivers/scsi/scsi_lib.c | 2 +- + 2 files changed, 2 insertions(+), 2 deletions(-) + +--- a/drivers/mmc/card/queue.c ++++ b/drivers/mmc/card/queue.c +@@ -197,7 +197,7 @@ int mmc_init_queue(struct mmc_queue *mq, + struct mmc_queue_req *mqrq_prev = &mq->mqrq[1]; + + if (mmc_dev(host)->dma_mask && *mmc_dev(host)->dma_mask) +- limit = dma_max_pfn(mmc_dev(host)) << PAGE_SHIFT; ++ limit = (u64)dma_max_pfn(mmc_dev(host)) << PAGE_SHIFT; + + mq->card = card; + mq->queue = blk_init_queue(mmc_request_fn, lock); +--- a/drivers/scsi/scsi_lib.c ++++ b/drivers/scsi/scsi_lib.c +@@ -1684,7 +1684,7 @@ u64 scsi_calculate_bounce_limit(struct S + + host_dev = scsi_get_device(shost); + if (host_dev && host_dev->dma_mask) +- bounce_limit = dma_max_pfn(host_dev) << PAGE_SHIFT; ++ bounce_limit = (u64)dma_max_pfn(host_dev) << PAGE_SHIFT; + + return bounce_limit; + } diff --git a/queue-3.13/mips-fix-build-error-seen-in-some-configurations.patch b/queue-3.13/mips-fix-build-error-seen-in-some-configurations.patch new file mode 100644 index 00000000000..4f9fdf34378 --- /dev/null +++ b/queue-3.13/mips-fix-build-error-seen-in-some-configurations.patch @@ -0,0 +1,38 @@ +From 63238f2cc5518e1c45a3418fc0ac0f560dafe7ef Mon Sep 17 00:00:00 2001 +From: Guenter Roeck +Date: Mon, 25 Nov 2013 15:21:00 -0800 +Subject: MIPS: Fix build error seen in some configurations + +From: Guenter Roeck + +commit 63238f2cc5518e1c45a3418fc0ac0f560dafe7ef upstream. + +The following build error is seen if CONFIG_32BIT is undefined, +CONFIG_64BIT is defined, and CONFIG_MIPS32_O32 is undefined. + +asm/syscall.h: In function 'mips_get_syscall_arg': +arch/mips/include/asm/syscall.h:32:16: error: unused variable 'usp' [-Werror=unused-variable] +cc1: all warnings being treated as errors + +Fixes: c0ff3c53d4f9 ('MIPS: Enable HAVE_ARCH_TRACEHOOK') +Signed-off-by: Guenter Roeck +Acked-by: David Daney +Signed-off-by: John Crispin +Patchwork: http://patchwork.linux-mips.org/patch/6160/ +Signed-off-by: Greg Kroah-Hartman + +--- + arch/mips/include/asm/syscall.h | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +--- a/arch/mips/include/asm/syscall.h ++++ b/arch/mips/include/asm/syscall.h +@@ -29,7 +29,7 @@ static inline long syscall_get_nr(struct + static inline unsigned long mips_get_syscall_arg(unsigned long *arg, + struct task_struct *task, struct pt_regs *regs, unsigned int n) + { +- unsigned long usp = regs->regs[29]; ++ unsigned long usp __maybe_unused = regs->regs[29]; + + switch (n) { + case 0: case 1: case 2: case 3: diff --git a/queue-3.13/p54-clamp-properly-instead-of-just-truncating.patch b/queue-3.13/p54-clamp-properly-instead-of-just-truncating.patch new file mode 100644 index 00000000000..673b66416a4 --- /dev/null +++ b/queue-3.13/p54-clamp-properly-instead-of-just-truncating.patch @@ -0,0 +1,32 @@ +From 608cfbe4abaf76e9d732efd7ed1cfa3998163d91 Mon Sep 17 00:00:00 2001 +From: Dan Carpenter +Date: Mon, 13 Jan 2014 22:05:23 +0300 +Subject: p54: clamp properly instead of just truncating + +From: Dan Carpenter + +commit 608cfbe4abaf76e9d732efd7ed1cfa3998163d91 upstream. + +The call to clamp_t() first truncates the variable signed 8 bit and as a +result, the actual clamp is a no-op. + +Fixes: 0d78156eef1d ('p54: improve site survey') +Signed-off-by: Dan Carpenter +Signed-off-by: John W. Linville +Signed-off-by: Greg Kroah-Hartman + +--- + drivers/net/wireless/p54/txrx.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +--- a/drivers/net/wireless/p54/txrx.c ++++ b/drivers/net/wireless/p54/txrx.c +@@ -587,7 +587,7 @@ static void p54_rx_stats(struct p54_comm + chan = priv->curchan; + if (chan) { + struct survey_info *survey = &priv->survey[chan->hw_value]; +- survey->noise = clamp_t(s8, priv->noise, -128, 127); ++ survey->noise = clamp(priv->noise, -128, 127); + survey->channel_time = priv->survey_raw.active; + survey->channel_time_tx = priv->survey_raw.tx; + survey->channel_time_busy = priv->survey_raw.tx + diff --git a/queue-3.13/perf-tools-fix-aaaaargh64-memory-barriers.patch b/queue-3.13/perf-tools-fix-aaaaargh64-memory-barriers.patch new file mode 100644 index 00000000000..d9155fa7958 --- /dev/null +++ b/queue-3.13/perf-tools-fix-aaaaargh64-memory-barriers.patch @@ -0,0 +1,38 @@ +From f428ebd184c82a7914b2aa7e9f868918aaf7ea78 Mon Sep 17 00:00:00 2001 +From: Peter Zijlstra +Date: Fri, 24 Jan 2014 16:40:02 +0100 +Subject: perf tools: Fix AAAAARGH64 memory barriers + +From: Peter Zijlstra + +commit f428ebd184c82a7914b2aa7e9f868918aaf7ea78 upstream. + +Someone got the load and store barriers mixed up for AAAAARGH64. Turn +them the right side up. + +Reported-by: Will Deacon +Signed-off-by: Peter Zijlstra +Fixes: a94d342b9cb0 ("tools/perf: Add required memory barriers") +Cc: Ingo Molnar +Cc: Will Deacon +Link: http://lkml.kernel.org/r/20140124154002.GF31570@twins.programming.kicks-ass.net +Signed-off-by: Arnaldo Carvalho de Melo +Signed-off-by: Greg Kroah-Hartman + +--- + tools/perf/perf.h | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +--- a/tools/perf/perf.h ++++ b/tools/perf/perf.h +@@ -100,8 +100,8 @@ + + #ifdef __aarch64__ + #define mb() asm volatile("dmb ish" ::: "memory") +-#define wmb() asm volatile("dmb ishld" ::: "memory") +-#define rmb() asm volatile("dmb ishst" ::: "memory") ++#define wmb() asm volatile("dmb ishst" ::: "memory") ++#define rmb() asm volatile("dmb ishld" ::: "memory") + #define cpu_relax() asm volatile("yield" ::: "memory") + #endif + diff --git a/queue-3.13/printk-fix-syslog-overflowing-user-buffer.patch b/queue-3.13/printk-fix-syslog-overflowing-user-buffer.patch new file mode 100644 index 00000000000..e58bbe5629f --- /dev/null +++ b/queue-3.13/printk-fix-syslog-overflowing-user-buffer.patch @@ -0,0 +1,62 @@ +From e4178d809fdaee32a56833fff1f5056c99e90a1a Mon Sep 17 00:00:00 2001 +From: Linus Torvalds +Date: Mon, 17 Feb 2014 12:24:45 -0800 +Subject: printk: fix syslog() overflowing user buffer + +From: Linus Torvalds + +commit e4178d809fdaee32a56833fff1f5056c99e90a1a upstream. + +This is not a buffer overflow in the traditional sense: we don't +overflow any *kernel* buffers, but we do mis-count the amount of data we +copy back to user space for the SYSLOG_ACTION_READ_ALL case. + +In particular, if the user buffer is too small to hold everything, and +*if* there is a continuation line at just the right place, we can end up +giving the user more data than he asked for. + +The reason is that we first count up the number of bytes all the log +records contains, then we walk the records again until we've skipped the +records at the beginning that won't fit, and then we walk the rest of +the records and copy them to the user space buffer. + +And in between that "skip the initial records that won't fit" and the +"copy the records that *will* fit to user space", we reset the 'prev' +variable that contained the record information for the last record not +copied. That meant that when we started copying to user space, we now +had a different character count than what we had originally calculated +in the first record walk-through. + +The fix is to simply not clear the 'prev' flags value (in both cases +where we had the same logic: syslog_print_all and kmsg_dump_get_buffer: +the latter is used for pstore-like dumping) + +Reported-and-tested-by: Debabrata Banerjee +Acked-by: Kay Sievers +Cc: Jeff Mahoney +Signed-off-by: Linus Torvalds +Cc: Josh Hunt +Signed-off-by: Greg Kroah-Hartman + +--- + kernel/printk/printk.c | 2 -- + 1 file changed, 2 deletions(-) + +--- a/kernel/printk/printk.c ++++ b/kernel/printk/printk.c +@@ -1080,7 +1080,6 @@ static int syslog_print_all(char __user + next_seq = log_next_seq; + + len = 0; +- prev = 0; + while (len >= 0 && seq < next_seq) { + struct printk_log *msg = log_from_idx(idx); + int textlen; +@@ -2789,7 +2788,6 @@ bool kmsg_dump_get_buffer(struct kmsg_du + next_idx = idx; + + l = 0; +- prev = 0; + while (seq < dumper->next_seq) { + struct printk_log *msg = log_from_idx(idx); + diff --git a/queue-3.13/regulator-core-replace-direct-ops-disable-usage.patch b/queue-3.13/regulator-core-replace-direct-ops-disable-usage.patch new file mode 100644 index 00000000000..0ce41db39a0 --- /dev/null +++ b/queue-3.13/regulator-core-replace-direct-ops-disable-usage.patch @@ -0,0 +1,115 @@ +From 66fda75f47dc583f1c187556e9a2c082dd64f8c6 Mon Sep 17 00:00:00 2001 +From: Markus Pargmann +Date: Thu, 20 Feb 2014 17:36:04 +0100 +Subject: regulator: core: Replace direct ops->disable usage + +From: Markus Pargmann + +commit 66fda75f47dc583f1c187556e9a2c082dd64f8c6 upstream. + +There are many places where ops->disable is called directly. Instead we +should use _regulator_do_disable() which also handles gpio regulators. + +To be able to use the wrapper function from _regulator_force_disable(), +I moved the _notifier_call_chain() call from _regulator_do_disable() to +_regulator_disable(). This way, _regulator_force_disable() can use +different flags for _notifier_call_chain() without calling it twice. + +Signed-off-by: Markus Pargmann +Signed-off-by: Mark Brown +Signed-off-by: Greg Kroah-Hartman + +--- + drivers/regulator/core.c | 34 +++++++++++++--------------------- + 1 file changed, 13 insertions(+), 21 deletions(-) + +--- a/drivers/regulator/core.c ++++ b/drivers/regulator/core.c +@@ -1908,8 +1908,6 @@ static int _regulator_do_disable(struct + + trace_regulator_disable_complete(rdev_get_name(rdev)); + +- _notifier_call_chain(rdev, REGULATOR_EVENT_DISABLE, +- NULL); + return 0; + } + +@@ -1933,6 +1931,8 @@ static int _regulator_disable(struct reg + rdev_err(rdev, "failed to disable\n"); + return ret; + } ++ _notifier_call_chain(rdev, REGULATOR_EVENT_DISABLE, ++ NULL); + } + + rdev->use_count = 0; +@@ -1985,20 +1985,16 @@ static int _regulator_force_disable(stru + { + int ret = 0; + +- /* force disable */ +- if (rdev->desc->ops->disable) { +- /* ah well, who wants to live forever... */ +- ret = rdev->desc->ops->disable(rdev); +- if (ret < 0) { +- rdev_err(rdev, "failed to force disable\n"); +- return ret; +- } +- /* notify other consumers that power has been forced off */ +- _notifier_call_chain(rdev, REGULATOR_EVENT_FORCE_DISABLE | +- REGULATOR_EVENT_DISABLE, NULL); ++ ret = _regulator_do_disable(rdev); ++ if (ret < 0) { ++ rdev_err(rdev, "failed to force disable\n"); ++ return ret; + } + +- return ret; ++ _notifier_call_chain(rdev, REGULATOR_EVENT_FORCE_DISABLE | ++ REGULATOR_EVENT_DISABLE, NULL); ++ ++ return 0; + } + + /** +@@ -3631,8 +3627,6 @@ int regulator_suspend_finish(void) + + mutex_lock(®ulator_list_mutex); + list_for_each_entry(rdev, ®ulator_list, list) { +- struct regulator_ops *ops = rdev->desc->ops; +- + mutex_lock(&rdev->mutex); + if (rdev->use_count > 0 || rdev->constraints->always_on) { + error = _regulator_do_enable(rdev); +@@ -3641,12 +3635,10 @@ int regulator_suspend_finish(void) + } else { + if (!have_full_constraints()) + goto unlock; +- if (!ops->disable) +- goto unlock; + if (!_regulator_is_enabled(rdev)) + goto unlock; + +- error = ops->disable(rdev); ++ error = _regulator_do_disable(rdev); + if (error) + ret = error; + } +@@ -3820,7 +3812,7 @@ static int __init regulator_init_complet + ops = rdev->desc->ops; + c = rdev->constraints; + +- if (!ops->disable || (c && c->always_on)) ++ if (c && c->always_on) + continue; + + mutex_lock(&rdev->mutex); +@@ -3841,7 +3833,7 @@ static int __init regulator_init_complet + /* We log since this may kill the system if it + * goes wrong. */ + rdev_info(rdev, "disabling\n"); +- ret = ops->disable(rdev); ++ ret = _regulator_do_disable(rdev); + if (ret != 0) { + rdev_err(rdev, "couldn't disable: %d\n", ret); + } diff --git a/queue-3.13/series b/queue-3.13/series index b909c71c0c1..d35615aed39 100644 --- a/queue-3.13/series +++ b/queue-3.13/series @@ -18,3 +18,13 @@ asoc-max98090-make-revision_id-readable.patch stop_machine-fix-2-race-between-stop_two_cpus-and-stop_cpus.patch sfc-use-the-correct-maximum-tx-dma-ring-size-for-sfc9100.patch arm-7941-2-fix-incorrect-fdt-initrd-parameter-override.patch +sunrpc-fix-a-pipe_version-reference-leak.patch +x86-bpf_jit-support-negative-offsets.patch +printk-fix-syslog-overflowing-user-buffer.patch +fix-uses-of-dma_max_pfn-when-converting-to-a-limiting-address.patch +perf-tools-fix-aaaaargh64-memory-barriers.patch +deb-pkg-fix-building-for-mips-big-endian-or-arm-oabi.patch +deb-pkg-fix-cross-building-linux-headers-package.patch +mips-fix-build-error-seen-in-some-configurations.patch +p54-clamp-properly-instead-of-just-truncating.patch +regulator-core-replace-direct-ops-disable-usage.patch diff --git a/queue-3.13/sunrpc-fix-a-pipe_version-reference-leak.patch b/queue-3.13/sunrpc-fix-a-pipe_version-reference-leak.patch new file mode 100644 index 00000000000..c3ea2ee94c1 --- /dev/null +++ b/queue-3.13/sunrpc-fix-a-pipe_version-reference-leak.patch @@ -0,0 +1,37 @@ +From e9776d0f4adee8877145672f6416b06b57f2dc27 Mon Sep 17 00:00:00 2001 +From: Trond Myklebust +Date: Sun, 16 Feb 2014 13:28:01 -0500 +Subject: SUNRPC: Fix a pipe_version reference leak + +From: Trond Myklebust + +commit e9776d0f4adee8877145672f6416b06b57f2dc27 upstream. + +In gss_alloc_msg(), if the call to gss_encode_v1_msg() fails, we +want to release the reference to the pipe_version that was obtained +earlier in the function. + +Fixes: 9d3a2260f0f4b (SUNRPC: Fix buffer overflow checking in...) +Signed-off-by: Trond Myklebust +Signed-off-by: Greg Kroah-Hartman + +--- + net/sunrpc/auth_gss/auth_gss.c | 4 +++- + 1 file changed, 3 insertions(+), 1 deletion(-) + +--- a/net/sunrpc/auth_gss/auth_gss.c ++++ b/net/sunrpc/auth_gss/auth_gss.c +@@ -500,10 +500,12 @@ gss_alloc_msg(struct gss_auth *gss_auth, + default: + err = gss_encode_v1_msg(gss_msg, service_name, gss_auth->target_name); + if (err) +- goto err_free_msg; ++ goto err_put_pipe_version; + }; + kref_get(&gss_auth->kref); + return gss_msg; ++err_put_pipe_version: ++ put_pipe_version(gss_auth->net); + err_free_msg: + kfree(gss_msg); + err: diff --git a/queue-3.13/x86-bpf_jit-support-negative-offsets.patch b/queue-3.13/x86-bpf_jit-support-negative-offsets.patch new file mode 100644 index 00000000000..83c97add32f --- /dev/null +++ b/queue-3.13/x86-bpf_jit-support-negative-offsets.patch @@ -0,0 +1,40 @@ +From fdfaf64e75397567257e1051931f9a3377360665 Mon Sep 17 00:00:00 2001 +From: Alexei Starovoitov +Date: Mon, 10 Mar 2014 15:56:51 -0700 +Subject: x86: bpf_jit: support negative offsets + +From: Alexei Starovoitov + +commit fdfaf64e75397567257e1051931f9a3377360665 upstream. + +Commit a998d4342337 claimed to introduce negative offset support to x86 jit, +but it couldn't be working, since at the time of the execution +of LD+ABS or LD+IND instructions via call into +bpf_internal_load_pointer_neg_helper() the %edx (3rd argument of this func) +had junk value instead of access size in bytes (1 or 2 or 4). + +Store size into %edx instead of %ecx (what original commit intended to do) + +Fixes: a998d4342337 ("bpf jit: Let the x86 jit handle negative offsets") +Signed-off-by: Alexei Starovoitov +Cc: Jan Seiffert +Cc: Eric Dumazet +Acked-by: Eric Dumazet +Signed-off-by: David S. Miller +Signed-off-by: Greg Kroah-Hartman + +--- + arch/x86/net/bpf_jit.S | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +--- a/arch/x86/net/bpf_jit.S ++++ b/arch/x86/net/bpf_jit.S +@@ -140,7 +140,7 @@ bpf_slow_path_byte_msh: + push %r9; \ + push SKBDATA; \ + /* rsi already has offset */ \ +- mov $SIZE,%ecx; /* size */ \ ++ mov $SIZE,%edx; /* size */ \ + call bpf_internal_load_pointer_neg_helper; \ + test %rax,%rax; \ + pop SKBDATA; \