X-Git-Url: https://git.pld-linux.org/?a=blobdiff_plain;f=kernel-small_fixes.patch;h=b97c7aafdb86c3ebfb2d414fc39ae3dc41fbbff6;hb=679d237fdefebb21903f94f8dfb1dc357f852489;hp=59f4a4bb8cf5ec1c1b184699fc662e3264852e1f;hpb=fc3fc2cf178dbaef089a75182333d8c707a6a32f;p=packages%2Fkernel.git diff --git a/kernel-small_fixes.patch b/kernel-small_fixes.patch index 59f4a4bb..b97c7aaf 100644 --- a/kernel-small_fixes.patch +++ b/kernel-small_fixes.patch @@ -1,186 +1,40 @@ ---- linux-2.6.33/scripts/mod/modpost.c~ 2010-02-24 19:52:17.000000000 +0100 -+++ linux-2.6.33/scripts/mod/modpost.c 2010-03-07 14:26:47.242168558 +0100 -@@ -15,7 +15,8 @@ - #include - #include - #include "modpost.h" --#include "../../include/generated/autoconf.h" -+// PLD architectures don't use CONFIG_SYMBOL_PREFIX -+//#include "../../include/generated/autoconf.h" - #include "../../include/linux/license.h" - - /* Some toolchains use a `_' prefix for all user symbols. */ - ---- linux-3.0/scripts/kconfig/lxdialog/check-lxdialog.sh~ 2011-07-22 04:17:23.000000000 +0200 -+++ linux-3.0/scripts/kconfig/lxdialog/check-lxdialog.sh 2011-08-25 21:26:04.799150642 +0200 -@@ -9,6 +9,12 @@ - $cc -print-file-name=lib${lib}.${ext} | grep -q / - if [ $? -eq 0 ]; then - echo "-l${lib}" -+ for libt in tinfow tinfo ; do -+ $cc -print-file-name=lib${libt}.${ext} | grep -q / -+ if [ $? -eq 0 ]; then -+ echo "-l${libt}" -+ fi -+ done - exit - fi - done +From: Shaohua Li -diff --git a/drivers/net/ethernet/realtek/r8169.c b/drivers/net/ethernet/realtek/r8169.c -index 7a0c800..ec5ebbb 100644 ---- a/drivers/net/ethernet/realtek/r8169.c -+++ b/drivers/net/ethernet/realtek/r8169.c -@@ -6927,6 +6927,14 @@ rtl_init_one(struct pci_dev *pdev, const - for (i = 0; i < ETH_ALEN; i++) - dev->dev_addr[i] = RTL_R8(MAC0 + i); - -+ if (!is_valid_ether_addr(dev->dev_addr)) { -+ /* Report it and use a random ethernet address instead */ -+ netdev_err(dev, "Invalid MAC address: %pM\n", dev->dev_addr); -+ random_ether_addr(dev->dev_addr); -+ netdev_info(dev, "Using random MAC address: %pM\n", -+ dev->dev_addr); -+ } -+ - SET_ETHTOOL_OPS(dev, &rtl8169_ethtool_ops); - dev->watchdog_timeo = RTL8169_TX_TIMEOUT; - -commit 110dc24ad2ae4e9b94b08632fe1eb2fcdff83045 -Author: Dave Chinner -Date: Tue May 20 08:18:09 2014 +1000 +Basically this is a copy of commit 001e4a8775f6(ext4: implement cgroup +writeback support). Tested with a fio test, verified writeback is +throttled against cgroup io.max write bandwidth, also verified moving +the fio test to another cgroup and the writeback is throttled against +new cgroup setting. - xfs: log vector rounding leaks log space - - The addition of direct formatting of log items into the CIL - linear buffer added alignment restrictions that the start of each - vector needed to be 64 bit aligned. Hence padding was added in - xlog_finish_iovec() to round up the vector length to ensure the next - vector started with the correct alignment. - - This adds a small number of bytes to the size of - the linear buffer that is otherwise unused. The issue is that we - then use the linear buffer size to determine the log space used by - the log item, and this includes the unused space. Hence when we - account for space used by the log item, it's more than is actually - written into the iclogs, and hence we slowly leak this space. - - This results on log hangs when reserving space, with threads getting - stuck with these stack traces: - - Call Trace: - [] schedule+0x29/0x70 - [] xlog_grant_head_wait+0xa2/0x1a0 - [] xlog_grant_head_check+0xbd/0x140 - [] xfs_log_reserve+0x103/0x220 - [] xfs_trans_reserve+0x2f5/0x310 - ..... - - The 4 bytes is significant. Brain Foster did all the hard work in - tracking down a reproducable leak to inode chunk allocation (it went - away with the ikeep mount option). His rough numbers were that - creating 50,000 inodes leaked 11 log blocks. This turns out to be - roughly 800 inode chunks or 1600 inode cluster buffers. That - works out at roughly 4 bytes per cluster buffer logged, and at that - I started looking for a 4 byte leak in the buffer logging code. - - What I found was that a struct xfs_buf_log_format structure for an - inode cluster buffer is 28 bytes in length. This gets rounded up to - 32 bytes, but the vector length remains 28 bytes. Hence the CIL - ticket reservation is decremented by 32 bytes (via lv->lv_buf_len) - for that vector rather than 28 bytes which are written into the log. - - The fix for this problem is to separately track the bytes used by - the log vectors in the item and use that instead of the buffer - length when accounting for the log space that will be used by the - formatted log item. - - Again, thanks to Brian Foster for doing all the hard work and long - hours to isolate this leak and make finding the bug relatively - simple. - - Signed-off-by: Dave Chinner - Reviewed-by: Christoph Hellwig - Reviewed-by: Brian Foster - Signed-off-by: Dave Chinner +Cc: Tejun Heo +Signed-off-by: Shaohua Li +--- + fs/xfs/xfs_aops.c | 2 ++ + fs/xfs/xfs_super.c | 1 + + 2 files changed, 3 insertions(+) -diff --git a/fs/xfs/xfs_log.h b/fs/xfs/xfs_log.h -index 2c40044..84e0deb 100644 ---- a/fs/xfs/xfs_log.h -+++ b/fs/xfs/xfs_log.h -@@ -24,7 +24,8 @@ struct xfs_log_vec { - struct xfs_log_iovec *lv_iovecp; /* iovec array */ - struct xfs_log_item *lv_item; /* owner */ - char *lv_buf; /* formatted buffer */ -- int lv_buf_len; /* size of formatted buffer */ -+ int lv_bytes; /* accounted space in buffer */ -+ int lv_buf_len; /* aligned size of buffer */ - int lv_size; /* size of allocated lv */ - }; - -@@ -52,15 +53,21 @@ xlog_prepare_iovec(struct xfs_log_vec *lv, struct xfs_log_iovec **vecp, - return vec->i_addr; - } - -+/* -+ * We need to make sure the next buffer is naturally aligned for the biggest -+ * basic data type we put into it. We already accounted for this padding when -+ * sizing the buffer. -+ * -+ * However, this padding does not get written into the log, and hence we have to -+ * track the space used by the log vectors separately to prevent log space hangs -+ * due to inaccurate accounting (i.e. a leak) of the used log space through the -+ * CIL context ticket. -+ */ - static inline void - xlog_finish_iovec(struct xfs_log_vec *lv, struct xfs_log_iovec *vec, int len) - { -- /* -- * We need to make sure the next buffer is naturally aligned for the -- * biggest basic data type we put into it. We already accounted for -- * this when sizing the buffer. -- */ - lv->lv_buf_len += round_up(len, sizeof(uint64_t)); -+ lv->lv_bytes += len; - vec->i_len = len; - } - -diff --git a/fs/xfs/xfs_log_cil.c b/fs/xfs/xfs_log_cil.c -index 7e54553..de835da 100644 ---- a/fs/xfs/xfs_log_cil.c -+++ b/fs/xfs/xfs_log_cil.c -@@ -97,7 +97,7 @@ xfs_cil_prepare_item( - { - /* Account for the new LV being passed in */ - if (lv->lv_buf_len != XFS_LOG_VEC_ORDERED) { -- *diff_len += lv->lv_buf_len; -+ *diff_len += lv->lv_bytes; - *diff_iovecs += lv->lv_niovecs; +--- linux-4.19/fs/xfs/xfs_aops.c.org 2018-11-21 10:31:12.348955352 +0100 ++++ linux-4.19/fs/xfs/xfs_aops.c 2018-11-21 10:34:35.241764742 +0100 +@@ -613,8 +613,10 @@ xfs_add_to_ioend( + list_add(&wpc->ioend->io_list, iolist); + wpc->ioend = xfs_alloc_ioend(inode, wpc->io_type, offset, + bdev, sector); ++ wbc_init_bio(wbc, wpc->ioend->io_bio); } -@@ -111,7 +111,7 @@ xfs_cil_prepare_item( - else if (old_lv != lv) { - ASSERT(lv->lv_buf_len != XFS_LOG_VEC_ORDERED); - -- *diff_len -= old_lv->lv_buf_len; -+ *diff_len -= old_lv->lv_bytes; - *diff_iovecs -= old_lv->lv_niovecs; - kmem_free(old_lv); - } -@@ -239,7 +239,7 @@ xlog_cil_insert_format_items( - * that the space reservation accounting is correct. - */ - *diff_iovecs -= lv->lv_niovecs; -- *diff_len -= lv->lv_buf_len; -+ *diff_len -= lv->lv_bytes; - } else { - /* allocate new data chunk */ - lv = kmem_zalloc(buf_size, KM_SLEEP|KM_NOFS); -@@ -259,6 +259,7 @@ xlog_cil_insert_format_items( - - /* The allocated data region lies beyond the iovec region */ - lv->lv_buf_len = 0; -+ lv->lv_bytes = 0; - lv->lv_buf = (char *)lv + buf_size - nbytes; - ASSERT(IS_ALIGNED((unsigned long)lv->lv_buf, sizeof(uint64_t))); - ++ wbc_account_io(wbc, page, len); + if (!__bio_try_merge_page(wpc->ioend->io_bio, page, len, poff)) { + if (iop) + atomic_inc(&iop->write_count); +diff --git a/fs/xfs/xfs_super.c b/fs/xfs/xfs_super.c +index 584cf2d..aea3bc2 100644 +--- a/fs/xfs/xfs_super.c ++++ b/fs/xfs/xfs_super.c +@@ -1634,6 +1634,7 @@ xfs_fs_fill_super( + sb->s_max_links = XFS_MAXLINK; + sb->s_time_gran = 1; + set_posix_acl_flag(sb); ++ sb->s_iflags |= SB_I_CGROUPWB; + + /* version 5 superblocks support inode version counters. */ + if (XFS_SB_VERSION_NUM(&mp->m_sb) == XFS_SB_VERSION_5)