From: Greg Kroah-Hartman Date: Mon, 3 Feb 2020 10:38:07 +0000 (+0000) Subject: 5.5-stable patches X-Git-Tag: v5.5.2~29 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=15904a3310cd25e0601ca653cb225473810af057;p=thirdparty%2Fkernel%2Fstable-queue.git 5.5-stable patches 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 --- 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 index 00000000000..a6febc0a443 --- /dev/null +++ b/queue-5.5/arm64-kbuild-remove-compressed-images-on-make-arch-arm64-dist-clean.patch @@ -0,0 +1,40 @@ +From d7bbd6c1b01cb5dd13c245d4586a83145c1d5f52 Mon Sep 17 00:00:00 2001 +From: Dirk Behme +Date: Tue, 21 Jan 2020 16:54:39 +0100 +Subject: arm64: kbuild: remove compressed images on 'make ARCH=arm64 (dist)clean' + +From: Dirk Behme + +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 +Signed-off-by: Eugeniu Rosca +Reviewed-by: Masahiro Yamada +Signed-off-by: Will Deacon +Signed-off-by: Greg Kroah-Hartman + +--- + 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 index 00000000000..24ad87b494f --- /dev/null +++ b/queue-5.5/gfs2-another-gfs2_find_jhead-fix.patch @@ -0,0 +1,152 @@ +From eed0f953b90e86e765197a1dad06bb48aedc27fe Mon Sep 17 00:00:00 2001 +From: Andreas Gruenbacher +Date: Sun, 8 Dec 2019 13:12:49 +0000 +Subject: gfs2: Another gfs2_find_jhead fix + +From: Andreas Gruenbacher + +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 +Signed-off-by: Greg Kroah-Hartman + +--- + 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 index 00000000000..e6aef8901fe --- /dev/null +++ b/queue-5.5/lib-test_bitmap-correct-test-data-offsets-for-32-bit.patch @@ -0,0 +1,59 @@ +From 69334ca530da80c1563ac6a3bd32afa40884ccd3 Mon Sep 17 00:00:00 2001 +From: Andy Shevchenko +Date: Thu, 30 Jan 2020 22:11:01 -0800 +Subject: lib/test_bitmap: correct test data offsets for 32-bit + +From: Andy Shevchenko + +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 +Reported-by: Guenter Roeck +Cc: Rasmus Villemoes +Cc: Yury Norov +Cc: +Signed-off-by: Andrew Morton +Signed-off-by: Linus Torvalds +Signed-off-by: Greg Kroah-Hartman + +--- + 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 index 00000000000..8988956149d --- /dev/null +++ b/queue-5.5/perf-c2c-fix-return-type-for-histogram-sorting-comparision-functions.patch @@ -0,0 +1,86 @@ +From c1c8013ec34d7163431d18367808ea40b2e305f8 Mon Sep 17 00:00:00 2001 +From: Andres Freund +Date: Wed, 8 Jan 2020 20:30:30 -0800 +Subject: perf c2c: Fix return type for histogram sorting comparision functions + +From: Andres Freund + +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 +Tested-by: Michael Petlan +Acked-by: Jiri Olsa +Cc: Alexander Shishkin +Cc: Andi Kleen +Cc: Namhyung Kim +Cc: Peter Zijlstra +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 +Signed-off-by: Greg Kroah-Hartman + +--- + 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 index 00000000000..500da2b3b0e --- /dev/null +++ b/queue-5.5/pm-devfreq-add-new-name-attribute-for-sysfs.patch @@ -0,0 +1,66 @@ +From 2fee1a7cc6b1ce6634bb0f025be2c94a58dfa34d Mon Sep 17 00:00:00 2001 +From: Chanwoo Choi +Date: Tue, 5 Nov 2019 18:18:03 +0900 +Subject: PM / devfreq: Add new name attribute for sysfs + +From: Chanwoo Choi + +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 +Signed-off-by: Greg Kroah-Hartman + +--- + 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 ++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 +--- 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, diff --git a/queue-5.5/series b/queue-5.5/series index 93b14f53b46..10850cfc4f4 100644 --- a/queue-5.5/series +++ b/queue-5.5/series @@ -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 index 00000000000..fcbbe8559e8 --- /dev/null +++ b/queue-5.5/tools-lib-fix-builds-when-glibc-contains-strlcpy.patch @@ -0,0 +1,103 @@ +From 6c4798d3f08b81c2c52936b10e0fa872590c96ae Mon Sep 17 00:00:00 2001 +From: Vitaly Chikunov +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 + +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 +Reviewed-by: Dmitry Levin +Cc: Dmitry Levin +Cc: Josh Poimboeuf +Cc: kbuild test robot +Cc: Peter Zijlstra +Cc: stable@vger.kernel.org +Cc: Vineet Gupta +Link: http://lore.kernel.org/lkml/20191224172029.19690-1-vt@altlinux.org +Signed-off-by: Arnaldo Carvalho de Melo +Signed-off-by: Greg Kroah-Hartman + +--- + 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.