From: Andrew Morton <akpm@linux-foundation.org>
To: akpm@linux-foundation.org, bhe@redhat.com, david@redhat.com,
dyoung@redhat.com, linux-mm@kvack.org,
mm-commits@vger.kernel.org, prudo@redhat.com,
torvalds@linux-foundation.org, vgoyal@redhat.com
Subject: [patch 05/55] proc/vmcore: don't fake reading zeroes on surprise vmcore_cb unregistration
Date: Wed, 19 Jan 2022 18:07:57 -0800 [thread overview]
Message-ID: <20220120020757.dOiHTk8NT%akpm@linux-foundation.org> (raw)
In-Reply-To: <20220119180714.9e187ce100e4510de3cd9f7d@linux-foundation.org>
From: David Hildenbrand <david@redhat.com>
Subject: proc/vmcore: don't fake reading zeroes on surprise vmcore_cb unregistration
In commit cc5f2704c934 ("proc/vmcore: convert oldmem_pfn_is_ram callback
to more generic vmcore callbacks"), we added detection of surprise
vmcore_cb unregistration after the vmcore was already opened. Once
detected, we warn the user and simulate reading zeroes from that point on
when accessing the vmcore.
The basic reason was that unexpected unregistration, for example, by
manually unbinding a driver from a device after opening the vmcore, is not
supported and could result in reading oldmem the vmcore_cb would have
actually prohibited while registered. However, something like that can
similarly be trigger by a user that's really looking for trouble simply by
unbinding the relevant driver before opening the vmcore -- or by
disallowing loading the driver in the first place. So it's actually of
limited help.
Currently, unregistration can only be triggered via virtio-mem when
manually unbinding the driver from the device inside the VM; there is no
way to trigger it from the hypervisor, as hypervisors don't allow for
unplugging virtio-mem devices -- ripping out system RAM from a VM without
coordination with the guest is usually not a good idea.
The important part is that unbinding the driver and unregistering the
vmcore_cb while concurrently reading the vmcore won't crash the system,
and that is handled by the rwsem.
To make the mechanism more future proof, let's remove the "read zero"
part, but leave the warning in place. For example, we could have a future
driver (like virtio-balloon) that will contact the hypervisor to figure
out if we already populated a page for a given PFN. Hotunplugging such a
device and consequently unregistering the vmcore_cb could be triggered
from the hypervisor without harming the system even while kdump is
running. In that case, we don't want to silently end up with a vmcore
that contains wrong data, because the user inside the VM might be unaware
of the hypervisor action and might easily miss the warning in the log.
Link: https://lkml.kernel.org/r/20211111192243.22002-1-david@redhat.com
Signed-off-by: David Hildenbrand <david@redhat.com>
Acked-by: Baoquan He <bhe@redhat.com>
Cc: Dave Young <dyoung@redhat.com>
Cc: Vivek Goyal <vgoyal@redhat.com>
Cc: Philipp Rudo <prudo@redhat.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
---
fs/proc/vmcore.c | 10 ++--------
1 file changed, 2 insertions(+), 8 deletions(-)
--- a/fs/proc/vmcore.c~proc-vmcore-dont-fake-reading-zeroes-on-surprise-vmcore_cb-unregistration
+++ a/fs/proc/vmcore.c
@@ -65,8 +65,6 @@ static size_t vmcoredd_orig_sz;
static DECLARE_RWSEM(vmcore_cb_rwsem);
/* List of registered vmcore callbacks. */
static LIST_HEAD(vmcore_cb_list);
-/* Whether we had a surprise unregistration of a callback. */
-static bool vmcore_cb_unstable;
/* Whether the vmcore has been opened once. */
static bool vmcore_opened;
@@ -94,10 +92,8 @@ void unregister_vmcore_cb(struct vmcore_
* very unusual (e.g., forced driver removal), but we cannot stop
* unregistering.
*/
- if (vmcore_opened) {
+ if (vmcore_opened)
pr_warn_once("Unexpected vmcore callback unregistration\n");
- vmcore_cb_unstable = true;
- }
up_write(&vmcore_cb_rwsem);
}
EXPORT_SYMBOL_GPL(unregister_vmcore_cb);
@@ -108,8 +104,6 @@ static bool pfn_is_ram(unsigned long pfn
bool ret = true;
lockdep_assert_held_read(&vmcore_cb_rwsem);
- if (unlikely(vmcore_cb_unstable))
- return false;
list_for_each_entry(cb, &vmcore_cb_list, next) {
if (unlikely(!cb->pfn_is_ram))
@@ -581,7 +575,7 @@ static int vmcore_remap_oldmem_pfn(struc
* looping over all pages without a reason.
*/
down_read(&vmcore_cb_rwsem);
- if (!list_empty(&vmcore_cb_list) || vmcore_cb_unstable)
+ if (!list_empty(&vmcore_cb_list))
ret = remap_oldmem_pfn_checked(vma, from, pfn, size, prot);
else
ret = remap_oldmem_pfn_range(vma, from, pfn, size, prot);
_
next prev parent reply other threads:[~2022-01-20 2:08 UTC|newest]
Thread overview: 56+ messages / expand[flat|nested] mbox.gz Atom feed top
2022-01-20 2:07 incoming Andrew Morton
2022-01-20 2:07 ` [patch 01/55] mm: percpu: generalize percpu related config Andrew Morton
2022-01-20 2:07 ` [patch 02/55] mm: percpu: add pcpu_fc_cpu_to_node_fn_t typedef Andrew Morton
2022-01-20 2:07 ` [patch 03/55] mm: percpu: add generic pcpu_fc_alloc/free funciton Andrew Morton
2022-01-20 2:07 ` [patch 04/55] mm: percpu: add generic pcpu_populate_pte() function Andrew Morton
2022-01-20 2:07 ` Andrew Morton [this message]
2022-01-20 2:08 ` [patch 06/55] proc: make the proc_create[_data]() stubs static inlines Andrew Morton
2022-01-20 2:08 ` [patch 07/55] proc: convert the return type of proc_fd_access_allowed() to be boolean Andrew Morton
2022-01-20 2:08 ` [patch 08/55] sysctl: fix duplicate path separator in printed entries Andrew Morton
2022-01-20 2:08 ` [patch 09/55] sysctl: remove redundant ret assignment Andrew Morton
2022-01-20 2:08 ` [patch 10/55] include/linux/unaligned: replace kernel.h with the necessary inclusions Andrew Morton
2022-01-20 2:08 ` [patch 11/55] kernel.h: include a note to discourage people from including it in headers Andrew Morton
2022-01-20 2:08 ` [patch 12/55] fs/exec: replace strlcpy with strscpy_pad in __set_task_comm Andrew Morton
2022-01-20 2:08 ` [patch 13/55] fs/exec: replace strncpy with strscpy_pad in __get_task_comm Andrew Morton
2022-01-20 2:08 ` [patch 14/55] drivers/infiniband: replace open-coded string copy with get_task_comm Andrew Morton
2022-01-20 2:08 ` [patch 15/55] fs/binfmt_elf: " Andrew Morton
2022-01-20 2:08 ` [patch 16/55] samples/bpf/test_overhead_kprobe_kern: replace bpf_probe_read_kernel with bpf_probe_read_kernel_str to get task comm Andrew Morton
2022-01-20 2:08 ` [patch 17/55] tools/bpf/bpftool/skeleton: " Andrew Morton
2022-01-20 2:08 ` [patch 18/55] tools/testing/selftests/bpf: replace open-coded 16 with TASK_COMM_LEN Andrew Morton
2022-01-20 2:08 ` [patch 19/55] kthread: dynamically allocate memory to store kthread's full name Andrew Morton
2022-01-20 2:08 ` [patch 20/55] kernel/sys.c: only take tasklist_lock for get/setpriority(PRIO_PGRP) Andrew Morton
2022-01-20 2:08 ` [patch 21/55] get_maintainer: don't remind about no git repo when --nogit is used Andrew Morton
2022-01-20 2:08 ` [patch 22/55] kstrtox: uninline everything Andrew Morton
2022-01-20 2:08 ` [patch 23/55] list: introduce list_is_head() helper and re-use it in list.h Andrew Morton
2022-01-20 2:08 ` [patch 24/55] lib/list_debug.c: print more list debugging context in __list_del_entry_valid() Andrew Morton
2022-01-20 2:09 ` [patch 25/55] hash.h: remove unused define directive Andrew Morton
2022-01-20 2:09 ` [patch 26/55] test_hash.c: split test_int_hash into arch-specific functions Andrew Morton
2022-01-20 2:09 ` [patch 27/55] test_hash.c: split test_hash_init Andrew Morton
2022-01-20 2:09 ` [patch 28/55] lib/Kconfig.debug: properly split hash test kernel entries Andrew Morton
2022-01-20 2:09 ` [patch 29/55] test_hash.c: refactor into kunit Andrew Morton
2022-01-20 2:09 ` [patch 30/55] kunit: replace kernel.h with the necessary inclusions Andrew Morton
2022-01-20 2:09 ` [patch 31/55] uuid: discourage people from using UAPI header in new code Andrew Morton
2022-01-20 2:09 ` [patch 32/55] uuid: remove licence boilerplate text from the header Andrew Morton
2022-01-20 2:09 ` [patch 33/55] lib/test_meminit: destroy cache in kmem_cache_alloc_bulk() test Andrew Morton
2022-01-20 2:09 ` [patch 34/55] checkpatch: relax regexp for COMMIT_LOG_LONG_LINE Andrew Morton
2022-01-20 2:09 ` [patch 35/55] checkpatch: improve Kconfig help test Andrew Morton
2022-01-20 2:09 ` [patch 36/55] const_structs.checkpatch: add frequently used ops structs Andrew Morton
2022-01-20 2:09 ` [patch 37/55] fs/binfmt_elf: use PT_LOAD p_align values for static PIE Andrew Morton
2022-01-20 2:09 ` [patch 38/55] nilfs2: remove redundant pointer sbufs Andrew Morton
2022-01-20 2:09 ` [patch 39/55] hfsplus: use struct_group_attr() for memcpy() region Andrew Morton
2022-01-20 2:09 ` [patch 40/55] FAT: use io_schedule_timeout() instead of congestion_wait() Andrew Morton
2022-01-20 2:09 ` [patch 41/55] fs/adfs: remove unneeded variable make code cleaner Andrew Morton
2022-01-20 2:09 ` [patch 42/55] panic: use error_report_end tracepoint on warnings Andrew Morton
2022-01-20 2:09 ` [patch 43/55] panic: remove oops_id Andrew Morton
2022-01-20 2:10 ` [patch 44/55] delayacct: support swapin delay accounting for swapping without blkio Andrew Morton
2022-01-20 2:10 ` [patch 45/55] delayacct: fix incomplete disable operation when switch enable to disable Andrew Morton
2022-01-20 2:10 ` [patch 46/55] delayacct: cleanup flags in struct task_delay_info and functions use it Andrew Morton
2022-01-20 2:10 ` [patch 47/55] Documentation/accounting/delay-accounting.rst: add thrashing page cache and direct compact Andrew Morton
2022-01-20 2:10 ` [patch 48/55] delayacct: track delays from memory compact Andrew Morton
2022-01-20 2:10 ` [patch 49/55] configs: introduce debug.config for CI-like setup Andrew Morton
2022-01-20 2:10 ` [patch 50/55] arch/Kconfig: split PAGE_SIZE_LESS_THAN_256KB from PAGE_SIZE_LESS_THAN_64KB Andrew Morton
2022-01-20 2:10 ` [patch 51/55] btrfs: use generic Kconfig option for 256kB page size limit Andrew Morton
2022-01-20 2:10 ` [patch 52/55] lib/Kconfig.debug: make TEST_KMOD depend on PAGE_SIZE_LESS_THAN_256KB Andrew Morton
2022-01-20 2:10 ` [patch 53/55] kcov: fix generic Kconfig dependencies if ARCH_WANTS_NO_INSTR Andrew Morton
2022-01-20 2:10 ` [patch 54/55] ubsan: remove CONFIG_UBSAN_OBJECT_SIZE Andrew Morton
2022-01-20 2:10 ` [patch 55/55] lib: remove redundant assignment to variable ret Andrew Morton
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=20220120020757.dOiHTk8NT%akpm@linux-foundation.org \
--to=akpm@linux-foundation.org \
--cc=bhe@redhat.com \
--cc=david@redhat.com \
--cc=dyoung@redhat.com \
--cc=linux-mm@kvack.org \
--cc=mm-commits@vger.kernel.org \
--cc=prudo@redhat.com \
--cc=torvalds@linux-foundation.org \
--cc=vgoyal@redhat.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