Go to file
David Woodhouse b0ba80e8a6 hvc/xen: fix console unplug
commit a30badfd7c upstream.

On unplug of a Xen console, xencons_disconnect_backend() unconditionally
calls free_irq() via unbind_from_irqhandler(), causing a warning of
freeing an already-free IRQ:

(qemu) device_del con1
[   32.050919] ------------[ cut here ]------------
[   32.050942] Trying to free already-free IRQ 33
[   32.050990] WARNING: CPU: 0 PID: 51 at kernel/irq/manage.c:1895 __free_irq+0x1d4/0x330

It should be using evtchn_put() to tear down the event channel binding,
and let the Linux IRQ side of it be handled by notifier_del_irq() through
the HVC code.

On which topic... xencons_disconnect_backend() should call hvc_remove()
*first*, rather than tearing down the event channel and grant mapping
while they are in use. And then the IRQ is guaranteed to be freed by
the time it's torn down by evtchn_put().

Since evtchn_put() also closes the actual event channel, avoid calling
xenbus_free_evtchn() except in the failure path where the IRQ was not
successfully set up.

However, calling hvc_remove() at the start of xencons_disconnect_backend()
still isn't early enough. An unplug request is indicated by the backend
setting its state to XenbusStateClosing, which triggers a notification
to xencons_backend_changed(), which... does nothing except set its own
frontend state directly to XenbusStateClosed without *actually* tearing
down the HVC device or, you know, making sure it isn't actively in use.

So the backend sees the guest frontend set its state to XenbusStateClosed
and stops servicing the interrupt... and the guest spins for ever in the
domU_write_console() function waiting for the ring to drain.

Fix that one by calling hvc_remove() from xencons_backend_changed() before
signalling to the backend that it's OK to proceed with the removal.

Tested with 'dd if=/dev/zero of=/dev/hvc1' while telling Qemu to remove
the console device.

Signed-off-by: David Woodhouse <dwmw@amazon.co.uk>
Cc: stable@vger.kernel.org
Link: https://lore.kernel.org/r/20231020161529.355083-4-dwmw2@infradead.org
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
2023-11-28 17:15:00 +00:00
arch KVM: x86: Fix lapic timer interrupt lost after loading a snapshot. 2023-11-28 17:15:00 +00:00
block blk-mq: make sure active queue usage is held for bio_integrity_prep() 2023-11-28 17:14:55 +00:00
certs KEYS: Add missing function documentation 2023-04-24 16:15:52 +03:00
crypto crypto: pcrypt - Fix hungtask for PADATA_RESET 2023-11-28 17:14:46 +00:00
Documentation net/mlx5e: Add recovery flow for tx devlink health reporter for unhealthy PTP SQ 2023-11-28 17:14:57 +00:00
drivers hvc/xen: fix console unplug 2023-11-28 17:15:00 +00:00
fs proc: sysctl: prevent aliased sysctls from getting passed to init 2023-11-28 17:15:00 +00:00
include proc: sysctl: prevent aliased sysctls from getting passed to init 2023-11-28 17:15:00 +00:00
init proc: sysctl: prevent aliased sysctls from getting passed to init 2023-11-28 17:15:00 +00:00
io_uring io_uring/fdinfo: remove need for sqpoll lock for thread/pid retrieval 2023-11-28 17:14:56 +00:00
ipc Merge branch 'work.namespace' of git://git.kernel.org/pub/scm/linux/kernel/git/viro/vfs 2023-02-24 19:20:07 -08:00
kernel audit: don't WARN_ON_ONCE(!current->mm) in audit_exe_compare() 2023-11-28 17:15:00 +00:00
lib lib/generic-radix-tree.c: Don't overflow in peek() 2023-11-28 17:14:40 +00:00
LICENSES LICENSES: Add the copyleft-next-0.3.1 license 2022-11-08 15:44:01 +01:00
mm vfs: fix readahead(2) on block devices 2023-11-20 11:56:43 +01:00
net net: sched: do not offload flows with a helper in act_ct 2023-11-28 17:14:57 +00:00
rust rust: types: make Opaque be !Unpin 2023-11-08 14:09:04 +01:00
samples samples/bpf: syscall_tp_user: Fix array out-of-bound access 2023-11-28 17:14:52 +00:00
scripts randstruct: Fix gcc-plugin performance mode to stay in group 2023-11-28 17:14:58 +00:00
security apparmor: fix invalid reference on profile->disconnected 2023-11-20 11:57:12 +01:00
sound ALSA: hda/realtek: Add quirk for ASUS UX7602ZM 2023-11-28 17:14:52 +00:00
tools perf intel-pt: Fix async branch flags 2023-11-28 17:14:58 +00:00
usr initramfs: Encode dependency on KBUILD_BUILD_TIMESTAMP 2023-06-06 17:54:49 +09:00
virt kvm/vfio: ensure kvg instance stays around in kvm_vfio_group_add() 2023-09-13 09:53:29 +02:00
.clang-format iommu: Add for_each_group_device() 2023-05-23 08:15:51 +02:00
.cocciconfig
.get_maintainer.ignore get_maintainer: add Alan to .get_maintainer.ignore 2022-08-20 15:17:44 -07:00
.gitattributes .gitattributes: set diff driver for Rust source code files 2023-05-31 17:48:25 +02:00
.gitignore Revert ".gitignore: ignore *.cover and *.mbx" 2023-07-04 15:05:12 -07:00
.mailmap mailmap: add entries for Simon Horman 2023-08-16 09:53:10 +01:00
.rustfmt.toml rust: add .rustfmt.toml 2022-09-28 09:02:20 +02:00
COPYING COPYING: state that all contributions really are covered by this file 2020-02-10 13:32:20 -08:00
CREDITS - Address -Wmissing-prototype warnings 2023-06-26 16:43:54 -07:00
Kbuild Kbuild updates for v6.1 2022-10-10 12:00:45 -07:00
Kconfig kbuild: ensure full rebuild when the compiler is updated 2020-05-12 13:28:33 +09:00
MAINTAINERS sound fixes for 6.5 2023-08-25 08:48:14 -07:00
Makefile Linux 6.5.12 2023-11-20 11:57:26 +01:00
README Drop all 00-INDEX files from Documentation/ 2018-09-09 15:08:58 -06:00

Linux kernel
============

There are several guides for kernel developers and users. These guides can
be rendered in a number of formats, like HTML and PDF. Please read
Documentation/admin-guide/README.rst first.

In order to build the documentation, use ``make htmldocs`` or
``make pdfdocs``.  The formatted documentation can also be read online at:

    https://www.kernel.org/doc/html/latest/

There are various text files in the Documentation/ subdirectory,
several of them using the Restructured Text markup notation.

Please read the Documentation/process/changes.rst file, as it contains the
requirements for building and running the kernel, and information about
the problems which may result by upgrading your kernel.