From: David Hildenbrand <david@redhat.com>
To: Marshall Midden <marshallmidden@gmail.com>, linux-mm@kvack.org
Cc: "mark.d.rustad@intel.com" <mark.d.rustad@intel.com>
Subject: Re: kdump twirling - does not finish - commit 326e1b8f83a4318b09033ef754f40c785aed5e68
Date: Thu, 5 Mar 2020 11:18:50 +0100 [thread overview]
Message-ID: <03d36fe7-7607-dbbb-a507-b40d9baa5603@redhat.com> (raw)
In-Reply-To: <CAD2CkAW=1X+sLcvJQ-23MCs78jiRPO8=GyQtce8ApLNhzrxhZg@mail.gmail.com>
On 04.03.20 18:03, Marshall Midden wrote:
> I know a translator is required - trying... Mark - is this better than
> typical?
>
> Problem: kdump is not finishing, hangs twirling ... iKVM
> Found: Power failure. Qlogic/Cavium/Marvell driver crash, but no kernel
> dump. v5.3.8+local.
> Reproduce: Boot, "echo c > /proc/sysrq-trigger"
> Last known working release: v5.2.x (any of them).
> First release failure: v5.3-rc1
> Tried many versions up to v5.6-rc4 (2020-03-01).
>
> Repository: https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
> System: Supermicro X10 dual socket x86_64, 64g/256g/512g (different
> systems/MB/CPUs).
> UserLand: RedHat7.5
> Tried (did not fix) kexec-tools fetched Feb 25th, 2020 from:
> git://git.kernel.org/pub/scm/utils/kernel/kexec/kexec-tools.git
> <http://git.kernel.org/pub/scm/utils/kernel/kexec/kexec-tools.git>
> .config: No modules, except those listed below (only 10 "=m").
> No modules in initramfs, /etc/dracut.conf.d/xxxx:
> omit_drivers+="qla2xxx nfs_layout_flexfiles"
> omit_drivers+=" tcm_loop tcm_fc target_core_mod iscsi_target_mod
> target_core_file"
> omit_drivers+=" target_core_iblock target_core_mod target_core_pscsi"
>
> Commit where problem appeared (git bisect):
> commit 326e1b8f83a4318b09033ef754f40c785aed5e68
> Author: Dan Williams <dan.j.williams@intel.com
> <mailto:dan.j.williams@intel.com>>
> Date: Thu Jul 18 15:58:00 2019 -0700
> ------------------------------------------------------------------------------
> -rw------- 1 root root 2174976 Feb 28 13:33 vmcore-incomplete
> -rw-r--r-- 1 root root 87611 Feb 28 13:33 vmcore-dmesg.txt
> verses
> -rw------- 1 root root 1186929986 Mar 3 18:57 vmcore
> -rw-r--r-- 1 root root 181709 Mar 3 18:57 vmcore-dmesg.txt
> ------------------------------------------------------------------------------
> What am I breaking -- if I comment out the usage of early_section(ms)
> in file mm/sparse.c -- although kdump's seems to work fine, etc.
> // bool section_is_early = early_section(ms);
> ...
> // if (!section_is_early) {
> kfree(ms->usage);
> ms->usage = NULL;
> // }
> ------------------------------------------------------------------------------
> Humor:
> commit 5f9e832c137075045d15cd6899ab0505cfb2ca4b (tag: v5.3-rc1)
> Author: Linus Torvalds <torvalds@linux-foundation.org
> <mailto:torvalds@linux-foundation.org>>
> Date: Sun Jul 21 14:05:38 2019 -0700
> Linus 5.3-rc1
> ^
> Horror:
> No one else has run into this since the end of July?
> ------------------------------------------------------------------------------
> Full git show below:
>
> commit 326e1b8f83a4318b09033ef754f40c785aed5e68
> Author: Dan Williams <dan.j.williams@intel.com
> <mailto:dan.j.williams@intel.com>>
> Date: Thu Jul 18 15:58:00 2019 -0700
>
> mm/sparsemem: introduce a SECTION_IS_EARLY flag
>
> In preparation for sub-section hotplug, track whether a given section
> was created during early memory initialization, or later via memory
> hotplug. This distinction is needed to maintain the coarse expectation
> that pfn_valid() returns true for any pfn within a given section even if
> that section has pages that are reserved from the page allocator.
>
> For example one of the of goals of subsection hotplug is to support
> cases where the system physical memory layout collides System RAM and
> PMEM within a section. Several pfn_valid() users expect to just check
> if a section is valid, but they are not careful to check if the given
> pfn is within a "System RAM" boundary and instead expect pgdat
> information to further validate the pfn.
>
> Rather than unwind those paths to make their pfn_valid() queries more
> precise a follow on patch uses the SECTION_IS_EARLY flag to maintain the
> traditional expectation that pfn_valid() returns true for all early
> sections.
>
> Link:
> https://lore.kernel.org/lkml/1560366952-10660-1-git-send-email-cai@lca.pw/
> Link:
> http://lkml.kernel.org/r/156092350358.979959.5817209875548072819.stgit@dwillia2-desk3.amr.corp.intel.com
> Signed-off-by: Dan Williams <dan.j.williams@intel.com
> <mailto:dan.j.williams@intel.com>>
> Reported-by: Qian Cai <cai@lca.pw <mailto:cai@lca.pw>>
> Tested-by: Aneesh Kumar K.V <aneesh.kumar@linux.ibm.com
> <mailto:aneesh.kumar@linux.ibm.com>> [ppc64]
> Reviewed-by: Oscar Salvador <osalvador@suse.de
> <mailto:osalvador@suse.de>>
> Cc: Michal Hocko <mhocko@suse.com <mailto:mhocko@suse.com>>
> Cc: Logan Gunthorpe <logang@deltatee.com <mailto:logang@deltatee.com>>
> Cc: David Hildenbrand <david@redhat.com <mailto:david@redhat.com>>
> Cc: Pavel Tatashin <pasha.tatashin@soleen.com
> <mailto:pasha.tatashin@soleen.com>>
> Cc: Jane Chu <jane.chu@oracle.com <mailto:jane.chu@oracle.com>>
> Cc: Jeff Moyer <jmoyer@redhat.com <mailto:jmoyer@redhat.com>>
> Cc: Jérôme Glisse <jglisse@redhat.com <mailto:jglisse@redhat.com>>
> Cc: Jonathan Corbet <corbet@lwn.net <mailto:corbet@lwn.net>>
> Cc: Mike Rapoport <rppt@linux.ibm.com <mailto:rppt@linux.ibm.com>>
> Cc: Toshi Kani <toshi.kani@hpe.com <mailto:toshi.kani@hpe.com>>
> Cc: Vlastimil Babka <vbabka@suse.cz <mailto:vbabka@suse.cz>>
> Cc: Wei Yang <richardw.yang@linux.intel.com
> <mailto:richardw.yang@linux.intel.com>>
> Cc: Jason Gunthorpe <jgg@mellanox.com <mailto:jgg@mellanox.com>>
> Cc: Christoph Hellwig <hch@lst.de <mailto:hch@lst.de>>
> Signed-off-by: Andrew Morton <akpm@linux-foundation.org
> <mailto:akpm@linux-foundation.org>>
> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org
> <mailto:torvalds@linux-foundation.org>>
>
> diff --git a/include/linux/mmzone.h b/include/linux/mmzone.h
> index 2520336bdfd1..4be40634238b 100644
> --- a/include/linux/mmzone.h
> +++ b/include/linux/mmzone.h
> @@ -1260,7 +1260,8 @@ extern size_t mem_section_usage_size(void);
> #define SECTION_MARKED_PRESENT (1UL<<0)
> #define SECTION_HAS_MEM_MAP (1UL<<1)
> #define SECTION_IS_ONLINE (1UL<<2)
> -#define SECTION_MAP_LAST_BIT (1UL<<3)
> +#define SECTION_IS_EARLY (1UL<<3)
> +#define SECTION_MAP_LAST_BIT (1UL<<4)
> #define SECTION_MAP_MASK (~(SECTION_MAP_LAST_BIT-1))
> #define SECTION_NID_SHIFT 3
>
> @@ -1286,6 +1287,11 @@ static inline int valid_section(struct
> mem_section *section)
> return (section && (section->section_mem_map &
> SECTION_HAS_MEM_MAP));
> }
>
> +static inline int early_section(struct mem_section *section)
> +{
> + return (section && (section->section_mem_map & SECTION_IS_EARLY));
> +}
> +
> static inline int valid_section_nr(unsigned long nr)
> {
> return valid_section(__nr_to_section(nr));
> diff --git a/mm/sparse.c b/mm/sparse.c
> index 41bef8e1f65c..6d23a526279a 100644
> --- a/mm/sparse.c
> +++ b/mm/sparse.c
> @@ -288,11 +288,11 @@ struct page *sparse_decode_mem_map(unsigned long
> coded_mem_map, unsigned long pn
>
> static void __meminit sparse_init_one_section(struct mem_section *ms,
> unsigned long pnum, struct page *mem_map,
> - struct mem_section_usage *usage)
> + struct mem_section_usage *usage, unsigned long flags)
> {
> ms->section_mem_map &= ~SECTION_MAP_MASK;
> - ms->section_mem_map |= sparse_encode_mem_map(mem_map, pnum) |
> - SECTION_HAS_MEM_MAP;
> + ms->section_mem_map |= sparse_encode_mem_map(mem_map, pnum)
> + | SECTION_HAS_MEM_MAP | flags;
> ms->usage = usage;
> }
>
> @@ -497,7 +497,8 @@ static void __init sparse_init_nid(int nid, unsigned
> long pnum_begin,
> goto failed;
> }
> check_usemap_section_nr(nid, usage);
> - sparse_init_one_section(__nr_to_section(pnum), pnum,
> map, usage);
> + sparse_init_one_section(__nr_to_section(pnum), pnum,
> map, usage,
> + SECTION_IS_EARLY);
> usage = (void *) usage + mem_section_usage_size();
> }
> sparse_buffer_fini();
> @@ -732,7 +733,7 @@ int __meminit sparse_add_one_section(int nid,
> unsigned long start_pfn,
>
> set_section_nid(section_nr, nid);
> section_mark_present(ms);
> - sparse_init_one_section(ms, section_nr, memmap, usage);
> + sparse_init_one_section(ms, section_nr, memmap, usage, 0);
>
> out:
> if (ret < 0) {
> @@ -772,19 +773,16 @@ static inline void clear_hwpoisoned_pages(struct
> page *memmap, int nr_pages)
> }
> #endif
>
> -static void free_section_usage(struct page *memmap,
> +static void free_section_usage(struct mem_section *ms, struct page *memmap,
> struct mem_section_usage *usage, struct vmem_altmap *altmap)
> {
> - struct page *usage_page;
> -
> if (!usage)
> return;
>
> - usage_page = virt_to_page(usage);
> /*
> * Check to see if allocation came from hot-plug-add
> */
> - if (PageSlab(usage_page) || PageCompound(usage_page)) {
> + if (!early_section(ms)) {
> kfree(usage);
> if (memmap)
> __kfree_section_memmap(memmap, altmap);
> @@ -816,6 +814,6 @@ void sparse_remove_one_section(struct mem_section
> *ms, unsigned long map_offset,
>
> clear_hwpoisoned_pages(memmap + map_offset,
> PAGES_PER_SECTION - map_offset);
> - free_section_usage(memmap, usage, altmap);
> + free_section_usage(ms, memmap, usage, altmap);
> }
> #endif /* CONFIG_MEMORY_HOTPLUG */
>
I am most probably missing some context here. But we do have
commit 8068df3b60373c390198f660574ea14c8098de57
Author: David Hildenbrand <david@redhat.com>
Date: Mon Jan 13 16:29:07 2020 -0800
mm/memory_hotplug: don't free usage map when removing a re-added
early section
Does that fix your issue?
--
Thanks,
David / dhildenb
next prev parent reply other threads:[~2020-03-05 10:19 UTC|newest]
Thread overview: 3+ messages / expand[flat|nested] mbox.gz Atom feed top
2020-03-04 17:03 kdump twirling - does not finish - commit 326e1b8f83a4318b09033ef754f40c785aed5e68 Marshall Midden
2020-03-05 10:18 ` David Hildenbrand [this message]
2020-03-05 21:15 ` Marshall Midden
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=03d36fe7-7607-dbbb-a507-b40d9baa5603@redhat.com \
--to=david@redhat.com \
--cc=linux-mm@kvack.org \
--cc=mark.d.rustad@intel.com \
--cc=marshallmidden@gmail.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).