All of lore.kernel.org
 help / color / mirror / Atom feed
From: Dave Young <dyoung@redhat.com>
To: David Hildenbrand <david@redhat.com>
Cc: Baoquan He <bhe@redhat.com>,
	boris.ostrovsky@oracle.com, bp@alien8.de,
	Andrew Morton <akpm@linux-foundation.org>,
	hpa@zytor.com, jasowang@redhat.com, jgross@suse.com,
	linux-mm@kvack.org, mhocko@suse.com, mingo@redhat.com,
	mm-commits@vger.kernel.org, mst@redhat.com, osalvador@suse.de,
	rafael.j.wysocki@intel.com, rppt@kernel.org,
	sstabellini@kernel.org, tglx@linutronix.de,
	torvalds@linux-foundation.org, vgoyal@redhat.com
Subject: Re: [patch 08/87] proc/vmcore: convert oldmem_pfn_is_ram callback to more generic vmcore callbacks
Date: Wed, 10 Nov 2021 19:28:37 +0800	[thread overview]
Message-ID: <YYus5ftQiJtYivRZ@dhcp-128-65.nay.redhat.com> (raw)
In-Reply-To: <1cbc6332-8a45-3af1-c648-99437819bb5a@redhat.com>

On 11/10/21 at 12:21pm, David Hildenbrand wrote:
> On 10.11.21 12:11, Dave Young wrote:
> > Hi David,
> > On 11/10/21 at 09:10am, David Hildenbrand wrote:
> >> On 10.11.21 08:22, Baoquan He wrote:
> >>> On 11/08/21 at 06:31pm, Andrew Morton wrote:
> >>>> From: David Hildenbrand <david@redhat.com>
> >>>> Subject: proc/vmcore: convert oldmem_pfn_is_ram callback to more generic vmcore callbacks
> >>>>
> >>>> Let's support multiple registered callbacks, making sure that registering
> >>>> vmcore callbacks cannot fail.  Make the callback return a bool instead of
> >>>> an int, handling how to deal with errors internally.  Drop unused
> >>>> HAVE_OLDMEM_PFN_IS_RAM.
> >>>>
> >>>> We soon want to make use of this infrastructure from other drivers:
> >>>> virtio-mem, registering one callback for each virtio-mem device, to
> >>>> prevent reading unplugged virtio-mem memory.
> >>>>
> >>>> Handle it via a generic vmcore_cb structure, prepared for future
> >>>> extensions: for example, once we support virtio-mem on s390x where the
> >>>> vmcore is completely constructed in the second kernel, we want to detect
> >>>> and add plugged virtio-mem memory ranges to the vmcore in order for them
> >>>> to get dumped properly.
> >>>>
> >>>> Handle corner cases that are unexpected and shouldn't happen in sane
> >>>> setups: registering a callback after the vmcore has already been opened
> >>>> (warn only) and unregistering a callback after the vmcore has already been
> >>>> opened (warn and essentially read only zeroes from that point on).
> >>>                                ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
> >>>
> >>> I am fine with the whole patch except of one concern. As above sentence
> >>> underscored states, if a callback is unregistered when vmcore has been
> >>> opened, it will read out zeros from that point on. And it's done by
> >>> judging global variable 'vmcore_cb_unstable' in pfn_is_ram(). This will
> >>> cause vmcore dumping in makedumpfile only being able to read out zero
> >>> page since then, and may cost long extra time to finish.
> >>>
> >>> Please see remap_oldmem_pfn_checked(). In makedumpfile, we default to
> >>> mmap 4M memory region at one time, then copy out. With this patch, and if
> >>> vmcore_cb_unstable is true, kernel will mmap page by page. The extra
> >>> time could be huge, e.g on machine with TBs memory, and we only get a
> >>> useless vmcore because of loss of core data with high probability.
> >>
> >> Thanks Baoquan for the quick review!
> >>
> >> This code is really just to handle the unlikely case of a driver getting
> >> unbound from a device that has a callback registered (e.g., a
> >> virtio-mem-pci device). Something like this will never happen in
> >> practice in a *sane* environment.
> >>
> >> The only known way I know is if userspace manually unbinds the driver
> >> from a virtio-mem-pci device -- which is possible but especially in a
> >> kdump environment something without any sane use case. In that case, we'll
> >>
> >> pr_warn_once("Unexpected vmcore callback unregistration\n");
> >>
> >> to let user space know that something weird/unsupported is going on.
> >>
> >> Long story short: if user space does something nasty, I don't see a
> >> problem in some action taking a little longer.
> >>
> >>
> >>>
> >>> I am thinking if we can simply panic in the case, since the left dumping
> >>> are all zeroed, very likely the vmcore is unavailable any more.
> >>
> >> IMHO panic() is a little bit too much. Instead of returning zeroes, we
> >> could fail the read/mmap operation -- I considered that as an option
> >> when I crafted/tested this patch, however, this approach here turned out
> >> to be the easiest way to handle something that's really not
> >> supported/advised and won't really happen in a sane environment.
> > 
> > I would still say that the most important task for kdump is to save the
> > vmcore successfully.  Even the above issue is not a common case it could
> > cause the vmcore to be useless.  It is understandable if the zeroed part
> > is only the virtio-mem part, but if all the remaining vmcore is zeroed
> > that it is bad and not acceptable for kdump. 
> 
> Again, in a sane environment this will never happen.
> 
> Why are we discussing on how to optimize a scenario where user space
> does something that's clearly unsupported and will not happen in real life?
> 
> My take is to warn and fail as simple as possible, without hacking
> around the issue (like blocking driver unloading while user space has
> /proc/vmcore opened.
> 
> "remaining vmcore is zeroed that it is bad and not acceptable for kdump."
> 
> Which scenario are you concerned about? User space plays stupid games
> (unbining a driver from a virtio-mem device in a *kdump kernel* after
> opening /proc/vmcore) and wins stupid prices (a warning and a vmcore
> filled (partially) with zeroes). Why isn't a warning sufficient for
> something like that?

Hi David,

Suppose we have the use case below:

A user plays with the game (Probably in hypervisor part, but the user is
not aware that the guest panicked and in a kdump kernel), then we get a
zeroed vmcore.   But the panic can not be easily reproduced any more,
then the warning is not useful.

But if you think user is playing the game in kdump kernel, eg. in guest
os while kdump is saving vmcore then it is nearly not possible to happen
I agree with you it is a very trival problem.

Probably we have some misunderstanding, but it would be good to make it
clear :)
> 
> I appreciate all the feedback (even if it comes in late :) ), but I'm
> missing why we are trying to optimize something here.
> 
> I'm happy to send a patch that does whatever we decide to do, but I
> really don't see the need for a change. Most probably I'm missing
> something important?
> 
> (the patch landed mainline in the meantime)
> 
> -- 
> Thanks,
> 
> David / dhildenb
> 
Thanks
Dave


  reply	other threads:[~2021-11-10 11:29 UTC|newest]

Thread overview: 98+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2021-11-09  2:30 incoming Andrew Morton
2021-11-09  2:31 ` [patch 01/87] vfs: keep inodes with page cache off the inode shrinker LRU Andrew Morton
2021-11-09  2:31 ` [patch 02/87] mm,hugetlb: remove mlock ulimit for SHM_HUGETLB Andrew Morton
2021-11-09  2:31 ` [patch 03/87] procfs: do not list TID 0 in /proc/<pid>/task Andrew Morton
2021-11-09  2:31 ` [patch 04/87] x86/xen: update xen_oldmem_pfn_is_ram() documentation Andrew Morton
2021-11-09  2:31 ` [patch 05/87] x86/xen: simplify xen_oldmem_pfn_is_ram() Andrew Morton
2021-11-09  2:31 ` [patch 06/87] x86/xen: print a warning when HVMOP_get_mem_type fails Andrew Morton
2021-11-09  2:31 ` [patch 07/87] proc/vmcore: let pfn_is_ram() return a bool Andrew Morton
2021-11-09  2:31 ` [patch 08/87] proc/vmcore: convert oldmem_pfn_is_ram callback to more generic vmcore callbacks Andrew Morton
2021-11-09  3:59   ` Dave Young
2021-11-09  6:40     ` David Hildenbrand
2021-11-09 10:30       ` Dave Young
2021-11-10  7:22   ` Baoquan He
2021-11-10  8:10     ` David Hildenbrand
2021-11-10 11:11       ` Dave Young
2021-11-10 11:21         ` David Hildenbrand
2021-11-10 11:28           ` Dave Young [this message]
2021-11-10 12:05             ` David Hildenbrand
2021-11-10 13:11               ` Dave Young
2021-11-09  2:31 ` [patch 09/87] virtio-mem: factor out hotplug specifics from virtio_mem_init() into virtio_mem_init_hotplug() Andrew Morton
2021-11-09  2:31 ` [patch 10/87] virtio-mem: factor out hotplug specifics from virtio_mem_probe() " Andrew Morton
2021-11-09  2:31 ` [patch 11/87] virtio-mem: factor out hotplug specifics from virtio_mem_remove() into virtio_mem_deinit_hotplug() Andrew Morton
2021-11-09  2:32 ` [patch 12/87] virtio-mem: kdump mode to sanitize /proc/vmcore access Andrew Morton
2021-11-09  2:32 ` [patch 13/87] proc: allow pid_revalidate() during LOOKUP_RCU Andrew Morton
2021-11-09  2:32 ` [patch 14/87] kernel.h: drop unneeded <linux/kernel.h> inclusion from other headers Andrew Morton
2021-11-09  2:32 ` [patch 15/87] kernel.h: split out container_of() and typeof_member() macros Andrew Morton
2021-11-09  2:32 ` [patch 16/87] include/kunit/test.h: replace kernel.h with the necessary inclusions Andrew Morton
2021-11-09  2:32 ` [patch 17/87] include/linux/list.h: " Andrew Morton
2021-11-09  2:32 ` [patch 18/87] include/linux/llist.h: " Andrew Morton
2021-11-09  2:32 ` [patch 19/87] include/linux/plist.h: " Andrew Morton
2021-11-09  2:32 ` [patch 20/87] include/media/media-entity.h: " Andrew Morton
2021-11-09  2:32 ` [patch 21/87] include/linux/delay.h: " Andrew Morton
2021-11-09  2:32 ` [patch 22/87] include/linux/sbitmap.h: " Andrew Morton
2021-11-09  2:32 ` [patch 23/87] include/linux/radix-tree.h: " Andrew Morton
2021-11-09  2:32 ` [patch 24/87] include/linux/generic-radix-tree.h: " Andrew Morton
2021-11-09  2:32 ` [patch 25/87] kernel.h: split out instruction pointer accessors Andrew Morton
2021-11-09  2:32 ` [patch 26/87] linux/container_of.h: switch to static_assert Andrew Morton
2021-11-09  2:32 ` [patch 27/87] mailmap: update email address for Colin King Andrew Morton
2021-11-09  2:32 ` [patch 28/87] MAINTAINERS: add "exec & binfmt" section with myself and Eric Andrew Morton
2021-11-09  2:32 ` [patch 29/87] MAINTAINERS: rectify entry for ARM/TOSHIBA VISCONTI ARCHITECTURE Andrew Morton
2021-11-09  2:32 ` [patch 30/87] MAINTAINERS: rectify entry for HIKEY960 ONBOARD USB GPIO HUB DRIVER Andrew Morton
2021-11-09  2:33 ` [patch 31/87] MAINTAINERS: rectify entry for INTEL KEEM BAY DRM DRIVER Andrew Morton
2021-11-09  2:33 ` [patch 32/87] MAINTAINERS: rectify entry for ALLWINNER HARDWARE SPINLOCK SUPPORT Andrew Morton
2021-11-09  2:33 ` [patch 33/87] lib, stackdepot: check stackdepot handle before accessing slabs Andrew Morton
2021-11-09  2:33 ` [patch 34/87] lib, stackdepot: add helper to print stack entries Andrew Morton
2021-11-09  2:33 ` [patch 35/87] lib, stackdepot: add helper to print stack entries into buffer Andrew Morton
2021-11-09  2:33 ` [patch 36/87] include/linux/string_helpers.h: add linux/string.h for strlen() Andrew Morton
2021-11-09  2:33 ` [patch 37/87] lib: uninline simple_strntoull() as well Andrew Morton
2021-11-09  2:33 ` [patch 38/87] mm/scatterlist: replace the !preemptible warning in sg_miter_stop() Andrew Morton
2021-11-09  2:33 ` [patch 39/87] const_structs.checkpatch: add a few sound ops structs Andrew Morton
2021-11-09  2:33 ` [patch 40/87] checkpatch: improve EXPORT_SYMBOL test for EXPORT_SYMBOL_NS uses Andrew Morton
2021-11-09  2:33 ` [patch 41/87] checkpatch: get default codespell dictionary path from package location Andrew Morton
2021-11-09  2:33 ` [patch 42/87] binfmt_elf: reintroduce using MAP_FIXED_NOREPLACE Andrew Morton
2021-11-09  2:33 ` [patch 43/87] ELF: simplify STACK_ALLOC macro Andrew Morton
2021-11-09  2:33 ` [patch 44/87] kallsyms: remove arch specific text and data check Andrew Morton
2021-11-09  2:33 ` [patch 45/87] kallsyms: fix address-checks for kernel related range Andrew Morton
2021-11-09  2:33 ` [patch 46/87] sections: move and rename core_kernel_data() to is_kernel_core_data() Andrew Morton
2021-11-09  2:33 ` [patch 47/87] sections: move is_kernel_inittext() into sections.h Andrew Morton
2021-11-09  2:33 ` [patch 48/87] x86: mm: rename __is_kernel_text() to is_x86_32_kernel_text() Andrew Morton
2021-11-09  2:34 ` [patch 49/87] sections: provide internal __is_kernel() and __is_kernel_text() helper Andrew Morton
2021-11-09  2:34 ` [patch 50/87] mm: kasan: use is_kernel() helper Andrew Morton
2021-11-09  2:34 ` [patch 51/87] extable: use is_kernel_text() helper Andrew Morton
2021-11-09  2:34 ` [patch 52/87] powerpc/mm: use core_kernel_text() helper Andrew Morton
2021-11-09  2:34 ` [patch 53/87] microblaze: use is_kernel_text() helper Andrew Morton
2021-11-09  2:34 ` [patch 54/87] alpha: " Andrew Morton
2021-11-09  2:34 ` [patch 55/87] ramfs: fix mount source show for ramfs Andrew Morton
2021-11-09  2:34 ` [patch 56/87] init: make unknown command line param message clearer Andrew Morton
2021-11-09  2:34 ` [patch 57/87] coda: avoid NULL pointer dereference from a bad inode Andrew Morton
2021-11-09  2:34 ` [patch 58/87] coda: check for async upcall request using local state Andrew Morton
2021-11-09  2:34 ` [patch 59/87] coda: remove err which no one care Andrew Morton
2021-11-09  2:34 ` [patch 60/87] coda: avoid flagging NULL inodes Andrew Morton
2021-11-09  2:34 ` [patch 61/87] coda: avoid hidden code duplication in rename Andrew Morton
2021-11-09  2:34 ` [patch 62/87] coda: avoid doing bad things on inode type changes during revalidation Andrew Morton
2021-11-09  2:34 ` [patch 63/87] coda: convert from atomic_t to refcount_t on coda_vm_ops->refcnt Andrew Morton
2021-11-09  2:34 ` [patch 64/87] coda: use vmemdup_user to replace the open code Andrew Morton
2021-11-09  2:34 ` [patch 65/87] coda: bump module version to 7.2 Andrew Morton
2021-11-09  2:34 ` [patch 66/87] nilfs2: replace snprintf in show functions with sysfs_emit Andrew Morton
2021-11-09  2:35 ` [patch 67/87] nilfs2: remove filenames from file comments Andrew Morton
2021-11-09  2:35 ` [patch 68/87] hfs/hfsplus: use WARN_ON for sanity check Andrew Morton
2021-11-09  2:35 ` [patch 69/87] crash_dump: fix boolreturn.cocci warning Andrew Morton
2021-11-09  2:35 ` [patch 70/87] crash_dump: remove duplicate include in crash_dump.h Andrew Morton
2021-11-09  2:35 ` [patch 71/87] signal: remove duplicate include in signal.h Andrew Morton
2021-11-09  2:35 ` [patch 72/87] seq_file: move seq_escape() to a header Andrew Morton
2021-11-09  2:35 ` [patch 73/87] seq_file: fix passing wrong private data Andrew Morton
2021-11-09  2:35 ` [patch 74/87] kernel/fork.c: unshare(): use swap() to make code cleaner Andrew Morton
2021-11-09  2:35 ` [patch 75/87] sysv: use BUILD_BUG_ON instead of runtime check Andrew Morton
2021-11-09  2:35 ` [patch 76/87] Documentation/kcov: include types.h in the example Andrew Morton
2021-11-09  2:35 ` [patch 77/87] Documentation/kcov: define `ip' " Andrew Morton
2021-11-09  2:35 ` [patch 78/87] kcov: allocate per-CPU memory on the relevant node Andrew Morton
2021-11-09  2:35 ` [patch 79/87] kcov: avoid enable+disable interrupts if !in_task() Andrew Morton
2021-11-09  2:35 ` [patch 80/87] kcov: replace local_irq_save() with a local_lock_t Andrew Morton
2021-11-09  2:35 ` [patch 81/87] scripts/gdb: handle split debug for vmlinux Andrew Morton
2021-11-09  2:35 ` [patch 82/87] kernel/resource: clean up and optimize iomem_is_exclusive() Andrew Morton
2021-11-09  2:35 ` [patch 83/87] kernel/resource: disallow access to exclusive system RAM regions Andrew Morton
2021-11-09  2:35 ` [patch 84/87] virtio-mem: disallow mapping virtio-mem memory via /dev/mem Andrew Morton
2021-11-09  2:35 ` [patch 85/87] selftests/kselftest/runner/run_one(): allow running non-executable files Andrew Morton
2021-11-09  2:35 ` [patch 86/87] ipc: check checkpoint_restore_ns_capable() to modify C/R proc files Andrew Morton
2021-11-09  2:36 ` [patch 87/87] ipc/ipc_sysctl.c: remove fallback for !CONFIG_PROC_SYSCTL 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=YYus5ftQiJtYivRZ@dhcp-128-65.nay.redhat.com \
    --to=dyoung@redhat.com \
    --cc=akpm@linux-foundation.org \
    --cc=bhe@redhat.com \
    --cc=boris.ostrovsky@oracle.com \
    --cc=bp@alien8.de \
    --cc=david@redhat.com \
    --cc=hpa@zytor.com \
    --cc=jasowang@redhat.com \
    --cc=jgross@suse.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-mm@kvack.org \
    --cc=mhocko@suse.com \
    --cc=mingo@redhat.com \
    --cc=mm-commits@vger.kernel.org \
    --cc=mst@redhat.com \
    --cc=osalvador@suse.de \
    --cc=rafael.j.wysocki@intel.com \
    --cc=rppt@kernel.org \
    --cc=sstabellini@kernel.org \
    --cc=tglx@linutronix.de \
    --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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.