From: Greg Kroah-Hartman Date: Tue, 26 Mar 2019 01:41:24 +0000 (+0900) Subject: 4.14-stable patches X-Git-Tag: v4.9.166~9 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=bfb49ad241c2c082ad6fdfecff290cccdb9536b5;p=thirdparty%2Fkernel%2Fstable-queue.git 4.14-stable patches added patches: lib-int_sqrt-optimize-small-argument.patch usb-core-only-clean-up-what-we-allocated.patch --- diff --git a/queue-4.14/lib-int_sqrt-optimize-small-argument.patch b/queue-4.14/lib-int_sqrt-optimize-small-argument.patch new file mode 100644 index 00000000000..4cc29a69283 --- /dev/null +++ b/queue-4.14/lib-int_sqrt-optimize-small-argument.patch @@ -0,0 +1,94 @@ +From 3f3295709edea6268ff1609855f498035286af73 Mon Sep 17 00:00:00 2001 +From: Peter Zijlstra +Date: Fri, 17 Nov 2017 15:28:04 -0800 +Subject: lib/int_sqrt: optimize small argument + +From: Peter Zijlstra + +commit 3f3295709edea6268ff1609855f498035286af73 upstream. + +The current int_sqrt() computation is sub-optimal for the case of small +@x. Which is the interesting case when we're going to do cumulative +distribution functions on idle times, which we assume to be a random +variable, where the target residency of the deepest idle state gives an +upper bound on the variable (5e6ns on recent Intel chips). + +In the case of small @x, the compute loop: + + while (m != 0) { + b = y + m; + y >>= 1; + + if (x >= b) { + x -= b; + y += m; + } + m >>= 2; + } + +can be reduced to: + + while (m > x) + m >>= 2; + +Because y==0, b==m and until x>=m y will remain 0. + +And while this is computationally equivalent, it runs much faster +because there's less code, in particular less branches. + + cycles: branches: branch-misses: + +OLD: + +hot: 45.109444 +- 0.044117 44.333392 +- 0.002254 0.018723 +- 0.000593 +cold: 187.737379 +- 0.156678 44.333407 +- 0.002254 6.272844 +- 0.004305 + +PRE: + +hot: 67.937492 +- 0.064124 66.999535 +- 0.000488 0.066720 +- 0.001113 +cold: 232.004379 +- 0.332811 66.999527 +- 0.000488 6.914634 +- 0.006568 + +POST: + +hot: 43.633557 +- 0.034373 45.333132 +- 0.002277 0.023529 +- 0.000681 +cold: 207.438411 +- 0.125840 45.333132 +- 0.002277 6.976486 +- 0.004219 + +Averages computed over all values <128k using a LFSR to generate order. +Cold numbers have a LFSR based branch trace buffer 'confuser' ran between +each int_sqrt() invocation. + +Link: http://lkml.kernel.org/r/20171020164644.876503355@infradead.org +Fixes: 30493cc9dddb ("lib/int_sqrt.c: optimize square root algorithm") +Signed-off-by: Peter Zijlstra (Intel) +Suggested-by: Anshul Garg +Acked-by: Linus Torvalds +Cc: Davidlohr Bueso +Cc: Thomas Gleixner +Cc: Ingo Molnar +Cc: Will Deacon +Cc: Joe Perches +Cc: David Miller +Cc: Matthew Wilcox +Cc: Kees Cook +Cc: Michael Davidson +Signed-off-by: Andrew Morton +Signed-off-by: Linus Torvalds +Signed-off-by: Arnd Bergmann +Signed-off-by: Greg Kroah-Hartman + +--- + lib/int_sqrt.c | 3 +++ + 1 file changed, 3 insertions(+) + +--- a/lib/int_sqrt.c ++++ b/lib/int_sqrt.c +@@ -23,6 +23,9 @@ unsigned long int_sqrt(unsigned long x) + return x; + + m = 1UL << (BITS_PER_LONG - 2); ++ while (m > x) ++ m >>= 2; ++ + while (m != 0) { + b = y + m; + y >>= 1; diff --git a/queue-4.14/series b/queue-4.14/series index aa59aabe850..9680f25d1fd 100644 --- a/queue-4.14/series +++ b/queue-4.14/series @@ -28,3 +28,5 @@ locking-lockdep-add-debug_locks-check-in-__lock_downgrade.patch mm-mempolicy-fix-uninit-memory-access.patch alsa-hda-record-the-current-power-state-before-suspend-resume-calls.patch alsa-hda-enforces-runtime_resume-after-s3-and-s4-for-each-codec.patch +lib-int_sqrt-optimize-small-argument.patch +usb-core-only-clean-up-what-we-allocated.patch diff --git a/queue-4.14/usb-core-only-clean-up-what-we-allocated.patch b/queue-4.14/usb-core-only-clean-up-what-we-allocated.patch new file mode 100644 index 00000000000..e56c5b46d99 --- /dev/null +++ b/queue-4.14/usb-core-only-clean-up-what-we-allocated.patch @@ -0,0 +1,48 @@ +From 32fd87b3bbf5f7a045546401dfe2894dbbf4d8c3 Mon Sep 17 00:00:00 2001 +From: Andrey Konovalov +Date: Mon, 11 Dec 2017 22:48:41 +0100 +Subject: USB: core: only clean up what we allocated + +From: Andrey Konovalov + +commit 32fd87b3bbf5f7a045546401dfe2894dbbf4d8c3 upstream. + +When cleaning up the configurations, make sure we only free the number +of configurations and interfaces that we could have allocated. + +Reported-by: Andrey Konovalov +Cc: stable +Signed-off-by: Arnd Bergmann +Signed-off-by: Greg Kroah-Hartman + +--- + drivers/usb/core/config.c | 9 ++++++--- + 1 file changed, 6 insertions(+), 3 deletions(-) + +--- a/drivers/usb/core/config.c ++++ b/drivers/usb/core/config.c +@@ -768,18 +768,21 @@ void usb_destroy_configuration(struct us + return; + + if (dev->rawdescriptors) { +- for (i = 0; i < dev->descriptor.bNumConfigurations; i++) ++ for (i = 0; i < dev->descriptor.bNumConfigurations && ++ i < USB_MAXCONFIG; i++) + kfree(dev->rawdescriptors[i]); + + kfree(dev->rawdescriptors); + dev->rawdescriptors = NULL; + } + +- for (c = 0; c < dev->descriptor.bNumConfigurations; c++) { ++ for (c = 0; c < dev->descriptor.bNumConfigurations && ++ c < USB_MAXCONFIG; c++) { + struct usb_host_config *cf = &dev->config[c]; + + kfree(cf->string); +- for (i = 0; i < cf->desc.bNumInterfaces; i++) { ++ for (i = 0; i < cf->desc.bNumInterfaces && ++ i < USB_MAXINTERFACES; i++) { + if (cf->intf_cache[i]) + kref_put(&cf->intf_cache[i]->ref, + usb_release_interface_cache);