rebase patches on top of Ubuntu-4.15.0-14.15
and drop those applied upstream Signed-off-by: Fabian Grünbichler <f.gruenbichler@proxmox.com>
This commit is contained in:
parent
29704dd4fa
commit
a214614ea9
@ -54,7 +54,7 @@ Signed-off-by: Fabian Grünbichler <f.gruenbichler@proxmox.com>
|
|||||||
2 files changed, 110 insertions(+)
|
2 files changed, 110 insertions(+)
|
||||||
|
|
||||||
diff --git a/Documentation/admin-guide/kernel-parameters.txt b/Documentation/admin-guide/kernel-parameters.txt
|
diff --git a/Documentation/admin-guide/kernel-parameters.txt b/Documentation/admin-guide/kernel-parameters.txt
|
||||||
index 27ca3fbc47aa..5e3caff3fb49 100644
|
index 2db36b52a4ff..9b7f4e3e6e30 100644
|
||||||
--- a/Documentation/admin-guide/kernel-parameters.txt
|
--- a/Documentation/admin-guide/kernel-parameters.txt
|
||||||
+++ b/Documentation/admin-guide/kernel-parameters.txt
|
+++ b/Documentation/admin-guide/kernel-parameters.txt
|
||||||
@@ -2968,6 +2968,15 @@
|
@@ -2968,6 +2968,15 @@
|
||||||
@ -74,7 +74,7 @@ index 27ca3fbc47aa..5e3caff3fb49 100644
|
|||||||
Safety option to keep boot IRQs enabled. This
|
Safety option to keep boot IRQs enabled. This
|
||||||
should never be necessary.
|
should never be necessary.
|
||||||
diff --git a/drivers/pci/quirks.c b/drivers/pci/quirks.c
|
diff --git a/drivers/pci/quirks.c b/drivers/pci/quirks.c
|
||||||
index 242040c87ce2..3926d5bf4d06 100644
|
index 451fd28f1855..a928bd86e102 100644
|
||||||
--- a/drivers/pci/quirks.c
|
--- a/drivers/pci/quirks.c
|
||||||
+++ b/drivers/pci/quirks.c
|
+++ b/drivers/pci/quirks.c
|
||||||
@@ -3702,6 +3702,106 @@ static int __init pci_apply_final_quirks(void)
|
@@ -3702,6 +3702,106 @@ static int __init pci_apply_final_quirks(void)
|
||||||
@ -184,7 +184,7 @@ index 242040c87ce2..3926d5bf4d06 100644
|
|||||||
/*
|
/*
|
||||||
* Following are device-specific reset methods which can be used to
|
* Following are device-specific reset methods which can be used to
|
||||||
* reset a single function if other methods (e.g. FLR, PM D0->D3) are
|
* reset a single function if other methods (e.g. FLR, PM D0->D3) are
|
||||||
@@ -4534,6 +4634,7 @@ static const struct pci_dev_acs_enabled {
|
@@ -4536,6 +4636,7 @@ static const struct pci_dev_acs_enabled {
|
||||||
{ PCI_VENDOR_ID_CAVIUM, PCI_ANY_ID, pci_quirk_cavium_acs },
|
{ PCI_VENDOR_ID_CAVIUM, PCI_ANY_ID, pci_quirk_cavium_acs },
|
||||||
/* APM X-Gene */
|
/* APM X-Gene */
|
||||||
{ PCI_VENDOR_ID_AMCC, 0xE004, pci_quirk_xgene_acs },
|
{ PCI_VENDOR_ID_AMCC, 0xE004, pci_quirk_xgene_acs },
|
||||||
|
@ -1,103 +0,0 @@
|
|||||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
|
||||||
From: "Kirill A. Shutemov" <kirill.shutemov@linux.intel.com>
|
|
||||||
Date: Fri, 23 Mar 2018 09:19:21 +0100
|
|
||||||
Subject: [PATCH] mm/shmem: do not wait for lock_page() in
|
|
||||||
shmem_unused_huge_shrink()
|
|
||||||
MIME-Version: 1.0
|
|
||||||
Content-Type: text/plain; charset=UTF-8
|
|
||||||
Content-Transfer-Encoding: 8bit
|
|
||||||
|
|
||||||
shmem_unused_huge_shrink() gets called from reclaim path. Waiting for
|
|
||||||
page lock may lead to deadlock there.
|
|
||||||
|
|
||||||
There was a bug report that may be attributed to this:
|
|
||||||
|
|
||||||
http://lkml.kernel.org/r/alpine.LRH.2.11.1801242349220.30642@mail.ewheeler.net
|
|
||||||
|
|
||||||
Replace lock_page() with trylock_page() and skip the page if we failed to
|
|
||||||
lock it. We will get to the page on the next scan.
|
|
||||||
|
|
||||||
We can test for the PageTransHuge() outside the page lock as we only need
|
|
||||||
protection against splitting the page under us. Holding pin oni the page
|
|
||||||
is enough for this.
|
|
||||||
|
|
||||||
Link: http://lkml.kernel.org/r/20180316210830.43738-1-kirill.shutemov@linux.intel.com
|
|
||||||
Fixes: 779750d20b93 ("shmem: split huge pages beyond i_size under memory pressure")
|
|
||||||
Signed-off-by: Kirill A. Shutemov <kirill.shutemov@linux.intel.com>
|
|
||||||
Reported-by: Eric Wheeler <linux-mm@lists.ewheeler.net>
|
|
||||||
Acked-by: Michal Hocko <mhocko@suse.com>
|
|
||||||
Reviewed-by: Andrew Morton <akpm@linux-foundation.org>
|
|
||||||
Cc: Tetsuo Handa <penguin-kernel@I-love.SAKURA.ne.jp>
|
|
||||||
Cc: Hugh Dickins <hughd@google.com>
|
|
||||||
Cc: <stable@vger.kernel.org> [4.8+]
|
|
||||||
Signed-off-by: Andrew Morton <>
|
|
||||||
(cherry-picked from https://git.kernel.org/pub/scm/linux/kernel/git/mhocko/mm.git/commit/?h=since-4.15&id=73eccc61c701ee7b4223aea2079542a712feeea7)
|
|
||||||
Signed-off-by: Fabian Grünbichler <f.gruenbichler@proxmox.com>
|
|
||||||
---
|
|
||||||
mm/shmem.c | 31 ++++++++++++++++++++-----------
|
|
||||||
1 file changed, 20 insertions(+), 11 deletions(-)
|
|
||||||
|
|
||||||
diff --git a/mm/shmem.c b/mm/shmem.c
|
|
||||||
index f6695c111086..800482fe6ed6 100644
|
|
||||||
--- a/mm/shmem.c
|
|
||||||
+++ b/mm/shmem.c
|
|
||||||
@@ -497,36 +497,45 @@ static unsigned long shmem_unused_huge_shrink(struct shmem_sb_info *sbinfo,
|
|
||||||
info = list_entry(pos, struct shmem_inode_info, shrinklist);
|
|
||||||
inode = &info->vfs_inode;
|
|
||||||
|
|
||||||
- if (nr_to_split && split >= nr_to_split) {
|
|
||||||
- iput(inode);
|
|
||||||
- continue;
|
|
||||||
- }
|
|
||||||
+ if (nr_to_split && split >= nr_to_split)
|
|
||||||
+ goto leave;
|
|
||||||
|
|
||||||
- page = find_lock_page(inode->i_mapping,
|
|
||||||
+ page = find_get_page(inode->i_mapping,
|
|
||||||
(inode->i_size & HPAGE_PMD_MASK) >> PAGE_SHIFT);
|
|
||||||
if (!page)
|
|
||||||
goto drop;
|
|
||||||
|
|
||||||
+ /* No huge page at the end of the file: nothing to split */
|
|
||||||
if (!PageTransHuge(page)) {
|
|
||||||
- unlock_page(page);
|
|
||||||
put_page(page);
|
|
||||||
goto drop;
|
|
||||||
}
|
|
||||||
|
|
||||||
+ /*
|
|
||||||
+ * Leave the inode on the list if we failed to lock
|
|
||||||
+ * the page at this time.
|
|
||||||
+ *
|
|
||||||
+ * Waiting for the lock may lead to deadlock in the
|
|
||||||
+ * reclaim path.
|
|
||||||
+ */
|
|
||||||
+ if (!trylock_page(page)) {
|
|
||||||
+ put_page(page);
|
|
||||||
+ goto leave;
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
ret = split_huge_page(page);
|
|
||||||
unlock_page(page);
|
|
||||||
put_page(page);
|
|
||||||
|
|
||||||
- if (ret) {
|
|
||||||
- /* split failed: leave it on the list */
|
|
||||||
- iput(inode);
|
|
||||||
- continue;
|
|
||||||
- }
|
|
||||||
+ /* If split failed leave the inode on the list */
|
|
||||||
+ if (ret)
|
|
||||||
+ goto leave;
|
|
||||||
|
|
||||||
split++;
|
|
||||||
drop:
|
|
||||||
list_del_init(&info->shrinklist);
|
|
||||||
removed++;
|
|
||||||
+leave:
|
|
||||||
iput(inode);
|
|
||||||
}
|
|
||||||
|
|
||||||
--
|
|
||||||
2.14.2
|
|
||||||
|
|
@ -1,46 +0,0 @@
|
|||||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
|
||||||
From: "Kirill A. Shutemov" <kirill.shutemov@linux.intel.com>
|
|
||||||
Date: Thu, 15 Mar 2018 18:07:47 +0300
|
|
||||||
Subject: [PATCH] mm/thp: Do not wait for lock_page() in deferred_split_scan()
|
|
||||||
MIME-Version: 1.0
|
|
||||||
Content-Type: text/plain; charset=UTF-8
|
|
||||||
Content-Transfer-Encoding: 8bit
|
|
||||||
|
|
||||||
deferred_split_scan() gets called from reclaim path. Waiting for page
|
|
||||||
lock may lead to deadlock there.
|
|
||||||
|
|
||||||
Replace lock_page() with trylock_page() and skip the page if we failed
|
|
||||||
to lock it. We will get to the page on the next scan.
|
|
||||||
|
|
||||||
Fixes: 9a982250f773 ("thp: introduce deferred_split_huge_page()")
|
|
||||||
|
|
||||||
Signed-off-by: Kirill A. Shutemov <kirill.shutemov@linux.intel.com>
|
|
||||||
Acked-by: Michal Hocko <mhocko@suse.com>
|
|
||||||
(cherry-picked from https://patchwork.kernel.org/patch/10284703/)
|
|
||||||
Signed-off-by: Fabian Grünbichler <f.gruenbichler@proxmox.com>
|
|
||||||
---
|
|
||||||
mm/huge_memory.c | 4 +++-
|
|
||||||
1 file changed, 3 insertions(+), 1 deletion(-)
|
|
||||||
|
|
||||||
diff --git a/mm/huge_memory.c b/mm/huge_memory.c
|
|
||||||
index 0e7ded98d114..4ed6c89e95c3 100644
|
|
||||||
--- a/mm/huge_memory.c
|
|
||||||
+++ b/mm/huge_memory.c
|
|
||||||
@@ -2791,11 +2791,13 @@ static unsigned long deferred_split_scan(struct shrinker *shrink,
|
|
||||||
|
|
||||||
list_for_each_safe(pos, next, &list) {
|
|
||||||
page = list_entry((void *)pos, struct page, mapping);
|
|
||||||
- lock_page(page);
|
|
||||||
+ if (!trylock_page(page))
|
|
||||||
+ goto next;
|
|
||||||
/* split_huge_page() removes page from list on success */
|
|
||||||
if (!split_huge_page(page))
|
|
||||||
split++;
|
|
||||||
unlock_page(page);
|
|
||||||
+next:
|
|
||||||
put_page(page);
|
|
||||||
}
|
|
||||||
|
|
||||||
--
|
|
||||||
2.14.2
|
|
||||||
|
|
Loading…
Reference in New Issue
Block a user