]> git.ipfire.org Git - thirdparty/kernel/stable-queue.git/commitdiff
5.5-stable patches
authorGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Mon, 3 Feb 2020 10:38:07 +0000 (10:38 +0000)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Mon, 3 Feb 2020 10:38:07 +0000 (10:38 +0000)
added patches:
arm64-kbuild-remove-compressed-images-on-make-arch-arm64-dist-clean.patch
gfs2-another-gfs2_find_jhead-fix.patch
lib-test_bitmap-correct-test-data-offsets-for-32-bit.patch
perf-c2c-fix-return-type-for-histogram-sorting-comparision-functions.patch
pm-devfreq-add-new-name-attribute-for-sysfs.patch
tools-lib-fix-builds-when-glibc-contains-strlcpy.patch

queue-5.5/arm64-kbuild-remove-compressed-images-on-make-arch-arm64-dist-clean.patch [new file with mode: 0644]
queue-5.5/gfs2-another-gfs2_find_jhead-fix.patch [new file with mode: 0644]
queue-5.5/lib-test_bitmap-correct-test-data-offsets-for-32-bit.patch [new file with mode: 0644]
queue-5.5/perf-c2c-fix-return-type-for-histogram-sorting-comparision-functions.patch [new file with mode: 0644]
queue-5.5/pm-devfreq-add-new-name-attribute-for-sysfs.patch [new file with mode: 0644]
queue-5.5/series
queue-5.5/tools-lib-fix-builds-when-glibc-contains-strlcpy.patch [new file with mode: 0644]

diff --git a/queue-5.5/arm64-kbuild-remove-compressed-images-on-make-arch-arm64-dist-clean.patch b/queue-5.5/arm64-kbuild-remove-compressed-images-on-make-arch-arm64-dist-clean.patch
new file mode 100644 (file)
index 0000000..a6febc0
--- /dev/null
@@ -0,0 +1,40 @@
+From d7bbd6c1b01cb5dd13c245d4586a83145c1d5f52 Mon Sep 17 00:00:00 2001
+From: Dirk Behme <dirk.behme@de.bosch.com>
+Date: Tue, 21 Jan 2020 16:54:39 +0100
+Subject: arm64: kbuild: remove compressed images on 'make ARCH=arm64 (dist)clean'
+
+From: Dirk Behme <dirk.behme@de.bosch.com>
+
+commit d7bbd6c1b01cb5dd13c245d4586a83145c1d5f52 upstream.
+
+Since v4.3-rc1 commit 0723c05fb75e44 ("arm64: enable more compressed
+Image formats"), it is possible to build Image.{bz2,lz4,lzma,lzo}
+AArch64 images. However, the commit missed adding support for removing
+those images on 'make ARCH=arm64 (dist)clean'.
+
+Fix this by adding them to the target list.
+Make sure to match the order of the recipes in the makefile.
+
+Cc: stable@vger.kernel.org # v4.3+
+Fixes: 0723c05fb75e44 ("arm64: enable more compressed Image formats")
+Signed-off-by: Dirk Behme <dirk.behme@de.bosch.com>
+Signed-off-by: Eugeniu Rosca <erosca@de.adit-jv.com>
+Reviewed-by: Masahiro Yamada <yamada.masahiro@socionext.com>
+Signed-off-by: Will Deacon <will@kernel.org>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+
+---
+ arch/arm64/boot/Makefile |    2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+--- a/arch/arm64/boot/Makefile
++++ b/arch/arm64/boot/Makefile
+@@ -16,7 +16,7 @@
+ OBJCOPYFLAGS_Image :=-O binary -R .note -R .note.gnu.build-id -R .comment -S
+-targets := Image Image.gz
++targets := Image Image.bz2 Image.gz Image.lz4 Image.lzma Image.lzo
+ $(obj)/Image: vmlinux FORCE
+       $(call if_changed,objcopy)
diff --git a/queue-5.5/gfs2-another-gfs2_find_jhead-fix.patch b/queue-5.5/gfs2-another-gfs2_find_jhead-fix.patch
new file mode 100644 (file)
index 0000000..24ad87b
--- /dev/null
@@ -0,0 +1,152 @@
+From eed0f953b90e86e765197a1dad06bb48aedc27fe Mon Sep 17 00:00:00 2001
+From: Andreas Gruenbacher <agruenba@redhat.com>
+Date: Sun, 8 Dec 2019 13:12:49 +0000
+Subject: gfs2: Another gfs2_find_jhead fix
+
+From: Andreas Gruenbacher <agruenba@redhat.com>
+
+commit eed0f953b90e86e765197a1dad06bb48aedc27fe upstream.
+
+On filesystems with a block size smaller than the page size,
+gfs2_find_jhead can split a page across two bios (for example, when
+blocks are not allocated consecutively).  When that happens, the first
+bio that completes will unlock the page in its bi_end_io handler even
+though the page hasn't been read completely yet.  Fix that by using a
+chained bio for the rest of the page.
+
+While at it, clean up the sector calculation logic in
+gfs2_log_alloc_bio.  In gfs2_find_jhead, simplify the disk block and
+offset calculation logic and fix a variable name.
+
+Fixes: f4686c26ecc3 ("gfs2: read journal in large chunks")
+Cc: stable@vger.kernel.org # v5.2+
+Signed-off-by: Andreas Gruenbacher <agruenba@redhat.com>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+
+---
+ fs/gfs2/lops.c |   68 ++++++++++++++++++++++++++++++++++++---------------------
+ 1 file changed, 44 insertions(+), 24 deletions(-)
+
+--- a/fs/gfs2/lops.c
++++ b/fs/gfs2/lops.c
+@@ -259,7 +259,7 @@ static struct bio *gfs2_log_alloc_bio(st
+       struct super_block *sb = sdp->sd_vfs;
+       struct bio *bio = bio_alloc(GFP_NOIO, BIO_MAX_PAGES);
+-      bio->bi_iter.bi_sector = blkno * (sb->s_blocksize >> 9);
++      bio->bi_iter.bi_sector = blkno << (sb->s_blocksize_bits - 9);
+       bio_set_dev(bio, sb->s_bdev);
+       bio->bi_end_io = end_io;
+       bio->bi_private = sdp;
+@@ -472,6 +472,20 @@ static void gfs2_jhead_process_page(stru
+       put_page(page); /* Once more for find_or_create_page */
+ }
++static struct bio *gfs2_chain_bio(struct bio *prev, unsigned int nr_iovecs)
++{
++      struct bio *new;
++
++      new = bio_alloc(GFP_NOIO, nr_iovecs);
++      bio_copy_dev(new, prev);
++      new->bi_iter.bi_sector = bio_end_sector(prev);
++      new->bi_opf = prev->bi_opf;
++      new->bi_write_hint = prev->bi_write_hint;
++      bio_chain(new, prev);
++      submit_bio(prev);
++      return new;
++}
++
+ /**
+  * gfs2_find_jhead - find the head of a log
+  * @jd: The journal descriptor
+@@ -488,15 +502,15 @@ int gfs2_find_jhead(struct gfs2_jdesc *j
+       struct gfs2_sbd *sdp = GFS2_SB(jd->jd_inode);
+       struct address_space *mapping = jd->jd_inode->i_mapping;
+       unsigned int block = 0, blocks_submitted = 0, blocks_read = 0;
+-      unsigned int bsize = sdp->sd_sb.sb_bsize;
++      unsigned int bsize = sdp->sd_sb.sb_bsize, off;
+       unsigned int bsize_shift = sdp->sd_sb.sb_bsize_shift;
+       unsigned int shift = PAGE_SHIFT - bsize_shift;
+-      unsigned int readhead_blocks = BIO_MAX_PAGES << shift;
++      unsigned int readahead_blocks = BIO_MAX_PAGES << shift;
+       struct gfs2_journal_extent *je;
+       int sz, ret = 0;
+       struct bio *bio = NULL;
+       struct page *page = NULL;
+-      bool done = false;
++      bool bio_chained = false, done = false;
+       errseq_t since;
+       memset(head, 0, sizeof(*head));
+@@ -505,9 +519,9 @@ int gfs2_find_jhead(struct gfs2_jdesc *j
+       since = filemap_sample_wb_err(mapping);
+       list_for_each_entry(je, &jd->extent_list, list) {
+-              for (; block < je->lblock + je->blocks; block++) {
+-                      u64 dblock;
++              u64 dblock = je->dblock;
++              for (; block < je->lblock + je->blocks; block++, dblock++) {
+                       if (!page) {
+                               page = find_or_create_page(mapping,
+                                               block >> shift, GFP_NOFS);
+@@ -516,35 +530,41 @@ int gfs2_find_jhead(struct gfs2_jdesc *j
+                                       done = true;
+                                       goto out;
+                               }
++                              off = 0;
+                       }
+-                      if (bio) {
+-                              unsigned int off;
+-
+-                              off = (block << bsize_shift) & ~PAGE_MASK;
++                      if (!bio || (bio_chained && !off)) {
++                              /* start new bio */
++                      } else {
+                               sz = bio_add_page(bio, page, bsize, off);
+-                              if (sz == bsize) { /* block added */
+-                                      if (off + bsize == PAGE_SIZE) {
+-                                              page = NULL;
+-                                              goto page_added;
+-                                      }
+-                                      continue;
++                              if (sz == bsize)
++                                      goto block_added;
++                              if (off) {
++                                      unsigned int blocks =
++                                              (PAGE_SIZE - off) >> bsize_shift;
++
++                                      bio = gfs2_chain_bio(bio, blocks);
++                                      bio_chained = true;
++                                      goto add_block_to_new_bio;
+                               }
++                      }
++
++                      if (bio) {
+                               blocks_submitted = block + 1;
+                               submit_bio(bio);
+-                              bio = NULL;
+                       }
+-                      dblock = je->dblock + (block - je->lblock);
+                       bio = gfs2_log_alloc_bio(sdp, dblock, gfs2_end_log_read);
+                       bio->bi_opf = REQ_OP_READ;
+-                      sz = bio_add_page(bio, page, bsize, 0);
+-                      gfs2_assert_warn(sdp, sz == bsize);
+-                      if (bsize == PAGE_SIZE)
++                      bio_chained = false;
++add_block_to_new_bio:
++                      sz = bio_add_page(bio, page, bsize, off);
++                      BUG_ON(sz != bsize);
++block_added:
++                      off += bsize;
++                      if (off == PAGE_SIZE)
+                               page = NULL;
+-
+-page_added:
+-                      if (blocks_submitted < blocks_read + readhead_blocks) {
++                      if (blocks_submitted < blocks_read + readahead_blocks) {
+                               /* Keep at least one bio in flight */
+                               continue;
+                       }
diff --git a/queue-5.5/lib-test_bitmap-correct-test-data-offsets-for-32-bit.patch b/queue-5.5/lib-test_bitmap-correct-test-data-offsets-for-32-bit.patch
new file mode 100644 (file)
index 0000000..e6aef89
--- /dev/null
@@ -0,0 +1,59 @@
+From 69334ca530da80c1563ac6a3bd32afa40884ccd3 Mon Sep 17 00:00:00 2001
+From: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
+Date: Thu, 30 Jan 2020 22:11:01 -0800
+Subject: lib/test_bitmap: correct test data offsets for 32-bit
+
+From: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
+
+commit 69334ca530da80c1563ac6a3bd32afa40884ccd3 upstream.
+
+On 32-bit platform the size of long is only 32 bits which makes wrong
+offset in the array of 64 bit size.
+
+Calculate offset based on BITS_PER_LONG.
+
+Link: http://lkml.kernel.org/r/20200109103601.45929-1-andriy.shevchenko@linux.intel.com
+Fixes: 30544ed5de43 ("lib/bitmap: introduce bitmap_replace() helper")
+Signed-off-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
+Reported-by: Guenter Roeck <linux@roeck-us.net>
+Cc: Rasmus Villemoes <linux@rasmusvillemoes.dk>
+Cc: Yury Norov <yury.norov@gmail.com>
+Cc: <stable@vger.kernel.org>
+Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
+Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+
+---
+ lib/test_bitmap.c |    9 +++++----
+ 1 file changed, 5 insertions(+), 4 deletions(-)
+
+--- a/lib/test_bitmap.c
++++ b/lib/test_bitmap.c
+@@ -275,22 +275,23 @@ static void __init test_copy(void)
+ static void __init test_replace(void)
+ {
+       unsigned int nbits = 64;
++      unsigned int nlongs = DIV_ROUND_UP(nbits, BITS_PER_LONG);
+       DECLARE_BITMAP(bmap, 1024);
+       bitmap_zero(bmap, 1024);
+-      bitmap_replace(bmap, &exp2[0], &exp2[1], exp2_to_exp3_mask, nbits);
++      bitmap_replace(bmap, &exp2[0 * nlongs], &exp2[1 * nlongs], exp2_to_exp3_mask, nbits);
+       expect_eq_bitmap(bmap, exp3_0_1, nbits);
+       bitmap_zero(bmap, 1024);
+-      bitmap_replace(bmap, &exp2[1], &exp2[0], exp2_to_exp3_mask, nbits);
++      bitmap_replace(bmap, &exp2[1 * nlongs], &exp2[0 * nlongs], exp2_to_exp3_mask, nbits);
+       expect_eq_bitmap(bmap, exp3_1_0, nbits);
+       bitmap_fill(bmap, 1024);
+-      bitmap_replace(bmap, &exp2[0], &exp2[1], exp2_to_exp3_mask, nbits);
++      bitmap_replace(bmap, &exp2[0 * nlongs], &exp2[1 * nlongs], exp2_to_exp3_mask, nbits);
+       expect_eq_bitmap(bmap, exp3_0_1, nbits);
+       bitmap_fill(bmap, 1024);
+-      bitmap_replace(bmap, &exp2[1], &exp2[0], exp2_to_exp3_mask, nbits);
++      bitmap_replace(bmap, &exp2[1 * nlongs], &exp2[0 * nlongs], exp2_to_exp3_mask, nbits);
+       expect_eq_bitmap(bmap, exp3_1_0, nbits);
+ }
diff --git a/queue-5.5/perf-c2c-fix-return-type-for-histogram-sorting-comparision-functions.patch b/queue-5.5/perf-c2c-fix-return-type-for-histogram-sorting-comparision-functions.patch
new file mode 100644 (file)
index 0000000..8988956
--- /dev/null
@@ -0,0 +1,86 @@
+From c1c8013ec34d7163431d18367808ea40b2e305f8 Mon Sep 17 00:00:00 2001
+From: Andres Freund <andres@anarazel.de>
+Date: Wed, 8 Jan 2020 20:30:30 -0800
+Subject: perf c2c: Fix return type for histogram sorting comparision functions
+
+From: Andres Freund <andres@anarazel.de>
+
+commit c1c8013ec34d7163431d18367808ea40b2e305f8 upstream.
+
+Commit 722ddfde366f ("perf tools: Fix time sorting") changed - correctly
+so - hist_entry__sort to return int64. Unfortunately several of the
+builtin-c2c.c comparison routines only happened to work due the cast
+caused by the wrong return type.
+
+This causes meaningless ordering of both the cacheline list, and the
+cacheline details page. E.g a simple:
+
+  perf c2c record -a sleep 3
+  perf c2c report
+
+will result in cacheline table like
+  =================================================
+             Shared Data Cache Line Table
+  =================================================
+  #
+  #        ------- Cacheline ----------    Total     Tot  - LLC Load Hitm -  - Store Reference -  - Load Dram -     LLC  Total  - Core Load Hit -  - LLC Load Hit -
+  # Index         Address  Node  PA cnt  records    Hitm  Total  Lcl    Rmt  Total  L1Hit  L1Miss     Lcl   Rmt  Ld Miss  Loads    FB    L1   L2     Llc      Rmt
+  # .....  ..............  ....  ......  .......  ......  .....  .....  ...  ....   .....  ......  ......  ....  ......   .....  .....  ..... ...  ....     .......
+
+        0  0x7f0d27ffba00   N/A       0       52   0.12%     13      6    7    12      12       0       0     7      14      40      4     16    0    0           0
+        1  0x7f0d27ff61c0   N/A       0     6353  14.04%   1475    801  674   779     779       0       0   718    1392    5574   1299   1967    0  115           0
+        2  0x7f0d26d3ec80   N/A       0       71   0.15%     16      4   12    13      13       0       0    12      24      58      1     20    0    9           0
+        3  0x7f0d26d3ec00   N/A       0       98   0.22%     23     17    6    19      19       0       0     6      12      79      0     40    0   10           0
+
+i.e. with the list not being ordered by Total Hitm.
+
+Fixes: 722ddfde366f ("perf tools: Fix time sorting")
+Signed-off-by: Andres Freund <andres@anarazel.de>
+Tested-by: Michael Petlan <mpetlan@redhat.com>
+Acked-by: Jiri Olsa <jolsa@redhat.com>
+Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com>
+Cc: Andi Kleen <ak@linux.intel.com>
+Cc: Namhyung Kim <namhyung@kernel.org>
+Cc: Peter Zijlstra <peterz@infradead.org>
+Cc: stable@vger.kernel.org # v3.16+
+Link: http://lore.kernel.org/lkml/20200109043030.233746-1-andres@anarazel.de
+Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+
+---
+ tools/perf/builtin-c2c.c |   10 ++++++----
+ 1 file changed, 6 insertions(+), 4 deletions(-)
+
+--- a/tools/perf/builtin-c2c.c
++++ b/tools/perf/builtin-c2c.c
+@@ -595,8 +595,8 @@ tot_hitm_cmp(struct perf_hpp_fmt *fmt __
+ {
+       struct c2c_hist_entry *c2c_left;
+       struct c2c_hist_entry *c2c_right;
+-      unsigned int tot_hitm_left;
+-      unsigned int tot_hitm_right;
++      uint64_t tot_hitm_left;
++      uint64_t tot_hitm_right;
+       c2c_left  = container_of(left, struct c2c_hist_entry, he);
+       c2c_right = container_of(right, struct c2c_hist_entry, he);
+@@ -629,7 +629,8 @@ __f ## _cmp(struct perf_hpp_fmt *fmt __m
+                                                                       \
+       c2c_left  = container_of(left, struct c2c_hist_entry, he);      \
+       c2c_right = container_of(right, struct c2c_hist_entry, he);     \
+-      return c2c_left->stats.__f - c2c_right->stats.__f;              \
++      return (uint64_t) c2c_left->stats.__f -                         \
++             (uint64_t) c2c_right->stats.__f;                         \
+ }
+ #define STAT_FN(__f)          \
+@@ -682,7 +683,8 @@ ld_llcmiss_cmp(struct perf_hpp_fmt *fmt
+       c2c_left  = container_of(left, struct c2c_hist_entry, he);
+       c2c_right = container_of(right, struct c2c_hist_entry, he);
+-      return llc_miss(&c2c_left->stats) - llc_miss(&c2c_right->stats);
++      return (uint64_t) llc_miss(&c2c_left->stats) -
++             (uint64_t) llc_miss(&c2c_right->stats);
+ }
+ static uint64_t total_records(struct c2c_stats *stats)
diff --git a/queue-5.5/pm-devfreq-add-new-name-attribute-for-sysfs.patch b/queue-5.5/pm-devfreq-add-new-name-attribute-for-sysfs.patch
new file mode 100644 (file)
index 0000000..500da2b
--- /dev/null
@@ -0,0 +1,66 @@
+From 2fee1a7cc6b1ce6634bb0f025be2c94a58dfa34d Mon Sep 17 00:00:00 2001
+From: Chanwoo Choi <cw00.choi@samsung.com>
+Date: Tue, 5 Nov 2019 18:18:03 +0900
+Subject: PM / devfreq: Add new name attribute for sysfs
+
+From: Chanwoo Choi <cw00.choi@samsung.com>
+
+commit 2fee1a7cc6b1ce6634bb0f025be2c94a58dfa34d upstream.
+
+The commit 4585fbcb5331 ("PM / devfreq: Modify the device name as devfreq(X) for
+sysfs") changed the node name to devfreq(x). After this commit, it is not
+possible to get the device name through /sys/class/devfreq/devfreq(X)/*.
+
+Add new name attribute in order to get device name.
+
+Cc: stable@vger.kernel.org
+Fixes: 4585fbcb5331 ("PM / devfreq: Modify the device name as devfreq(X) for sysfs")
+Signed-off-by: Chanwoo Choi <cw00.choi@samsung.com>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+
+---
+ Documentation/ABI/testing/sysfs-class-devfreq |    7 +++++++
+ drivers/devfreq/devfreq.c                     |    9 +++++++++
+ 2 files changed, 16 insertions(+)
+
+--- a/Documentation/ABI/testing/sysfs-class-devfreq
++++ b/Documentation/ABI/testing/sysfs-class-devfreq
+@@ -7,6 +7,13 @@ Description:
+               The name of devfreq object denoted as ... is same as the
+               name of device using devfreq.
++What:         /sys/class/devfreq/.../name
++Date:         November 2019
++Contact:      Chanwoo Choi <cw00.choi@samsung.com>
++Description:
++              The /sys/class/devfreq/.../name shows the name of device
++              of the corresponding devfreq object.
++
+ What:         /sys/class/devfreq/.../governor
+ Date:         September 2011
+ Contact:      MyungJoo Ham <myungjoo.ham@samsung.com>
+--- a/drivers/devfreq/devfreq.c
++++ b/drivers/devfreq/devfreq.c
+@@ -1259,6 +1259,14 @@ err_out:
+ }
+ EXPORT_SYMBOL(devfreq_remove_governor);
++static ssize_t name_show(struct device *dev,
++                      struct device_attribute *attr, char *buf)
++{
++      struct devfreq *devfreq = to_devfreq(dev);
++      return sprintf(buf, "%s\n", dev_name(devfreq->dev.parent));
++}
++static DEVICE_ATTR_RO(name);
++
+ static ssize_t governor_show(struct device *dev,
+                            struct device_attribute *attr, char *buf)
+ {
+@@ -1592,6 +1600,7 @@ static ssize_t trans_stat_show(struct de
+ static DEVICE_ATTR_RO(trans_stat);
+ static struct attribute *devfreq_attrs[] = {
++      &dev_attr_name.attr,
+       &dev_attr_governor.attr,
+       &dev_attr_available_governors.attr,
+       &dev_attr_cur_freq.attr,
index 93b14f53b46f0b0d12e7e04cca6b63481cef7dfe..10850cfc4f4f12661b9394ecac53aadf39bbabde 100644 (file)
@@ -4,3 +4,9 @@ x86-resctrl-fix-a-deadlock-due-to-inaccurate-referen.patch
 x86-resctrl-fix-use-after-free-when-deleting-resourc.patch
 x86-resctrl-fix-use-after-free-due-to-inaccurate-ref.patch
 kvm-ppc-book3s-pr-fix-werror-return-type-build-failu.patch
+gfs2-another-gfs2_find_jhead-fix.patch
+lib-test_bitmap-correct-test-data-offsets-for-32-bit.patch
+perf-c2c-fix-return-type-for-histogram-sorting-comparision-functions.patch
+pm-devfreq-add-new-name-attribute-for-sysfs.patch
+tools-lib-fix-builds-when-glibc-contains-strlcpy.patch
+arm64-kbuild-remove-compressed-images-on-make-arch-arm64-dist-clean.patch
diff --git a/queue-5.5/tools-lib-fix-builds-when-glibc-contains-strlcpy.patch b/queue-5.5/tools-lib-fix-builds-when-glibc-contains-strlcpy.patch
new file mode 100644 (file)
index 0000000..fcbbe85
--- /dev/null
@@ -0,0 +1,103 @@
+From 6c4798d3f08b81c2c52936b10e0fa872590c96ae Mon Sep 17 00:00:00 2001
+From: Vitaly Chikunov <vt@altlinux.org>
+Date: Tue, 24 Dec 2019 20:20:29 +0300
+Subject: tools lib: Fix builds when glibc contains strlcpy()
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+From: Vitaly Chikunov <vt@altlinux.org>
+
+commit 6c4798d3f08b81c2c52936b10e0fa872590c96ae upstream.
+
+Disable a couple of compilation warnings (which are treated as errors)
+on strlcpy() definition and declaration, allowing users to compile perf
+and kernel (objtool) when:
+
+1. glibc have strlcpy() (such as in ALT Linux since 2004) objtool and
+   perf build fails with this (in gcc):
+
+  In file included from exec-cmd.c:3:
+  tools/include/linux/string.h:20:15: error: redundant redeclaration of ‘strlcpy’ [-Werror=redundant-decls]
+     20 | extern size_t strlcpy(char *dest, const char *src, size_t size);
+
+2. clang ignores `-Wredundant-decls', but produces another warning when
+   building perf:
+
+    CC       util/string.o
+  ../lib/string.c:99:8: error: attribute declaration must precede definition [-Werror,-Wignored-attributes]
+  size_t __weak strlcpy(char *dest, const char *src, size_t size)
+  ../../tools/include/linux/compiler.h:66:34: note: expanded from macro '__weak'
+  # define __weak                 __attribute__((weak))
+  /usr/include/bits/string_fortified.h:151:8: note: previous definition is here
+  __NTH (strlcpy (char *__restrict __dest, const char *__restrict __src,
+
+Committer notes:
+
+The
+
+ #pragma GCC diagnostic
+
+directive was introduced in gcc 4.6, so check for that as well.
+
+Fixes: ce99091 ("perf tools: Move strlcpy() from perf to tools/lib/string.c")
+Fixes: 0215d59 ("tools lib: Reinstate strlcpy() header guard with __UCLIBC__")
+Resolves: https://bugzilla.kernel.org/show_bug.cgi?id=118481
+Signed-off-by: Vitaly Chikunov <vt@altlinux.org>
+Reviewed-by: Dmitry Levin <ldv@altlinux.org>
+Cc: Dmitry Levin <ldv@altlinux.org>
+Cc: Josh Poimboeuf <jpoimboe@redhat.com>
+Cc: kbuild test robot <lkp@intel.com>
+Cc: Peter Zijlstra <peterz@infradead.org>
+Cc: stable@vger.kernel.org
+Cc: Vineet Gupta <vineet.gupta1@synopsys.com>
+Link: http://lore.kernel.org/lkml/20191224172029.19690-1-vt@altlinux.org
+Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+
+---
+ tools/include/linux/string.h |    8 ++++++++
+ tools/lib/string.c           |    7 +++++++
+ 2 files changed, 15 insertions(+)
+
+--- a/tools/include/linux/string.h
++++ b/tools/include/linux/string.h
+@@ -17,7 +17,15 @@ int strtobool(const char *s, bool *res);
+  * However uClibc headers also define __GLIBC__ hence the hack below
+  */
+ #if defined(__GLIBC__) && !defined(__UCLIBC__)
++// pragma diagnostic was introduced in gcc 4.6
++#if __GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 6)
++#pragma GCC diagnostic push
++#pragma GCC diagnostic ignored "-Wredundant-decls"
++#endif
+ extern size_t strlcpy(char *dest, const char *src, size_t size);
++#if __GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 6)
++#pragma GCC diagnostic pop
++#endif
+ #endif
+ char *str_error_r(int errnum, char *buf, size_t buflen);
+--- a/tools/lib/string.c
++++ b/tools/lib/string.c
+@@ -96,6 +96,10 @@ int strtobool(const char *s, bool *res)
+  * If libc has strlcpy() then that version will override this
+  * implementation:
+  */
++#ifdef __clang__
++#pragma clang diagnostic push
++#pragma clang diagnostic ignored "-Wignored-attributes"
++#endif
+ size_t __weak strlcpy(char *dest, const char *src, size_t size)
+ {
+       size_t ret = strlen(src);
+@@ -107,6 +111,9 @@ size_t __weak strlcpy(char *dest, const
+       }
+       return ret;
+ }
++#ifdef __clang__
++#pragma clang diagnostic pop
++#endif
+ /**
+  * skip_spaces - Removes leading whitespace from @str.