merge monitor oob fixup
Signed-off-by: Wolfgang Bumiller <w.bumiller@proxmox.com>
This commit is contained in:
		
							parent
							
								
									21833e1b41
								
							
						
					
					
						commit
						3b1986f02f
					
				
							
								
								
									
										69
									
								
								debian/patches/extra/0005-monitor-qmp-resume-monitor-when-clearing-its-queue.patch
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										69
									
								
								debian/patches/extra/0005-monitor-qmp-resume-monitor-when-clearing-its-queue.patch
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @ -0,0 +1,69 @@ | |||||||
|  | From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 | ||||||
|  | From: Wolfgang Bumiller <w.bumiller@proxmox.com> | ||||||
|  | Date: Wed, 2 Oct 2019 09:41:34 +0200 | ||||||
|  | Subject: [PATCH] monitor/qmp: resume monitor when clearing its queue | ||||||
|  | 
 | ||||||
|  | When a monitor's queue is filled up in handle_qmp_command() | ||||||
|  | it gets suspended. It's the dispatcher bh's job currently to | ||||||
|  | resume the monitor, which it does after processing an even | ||||||
|  | from the queue. However, it is possible for a | ||||||
|  | CHR_EVENT_CLOSED event to be processed before before the bh | ||||||
|  | is scheduled, which will clear the queue without resuming | ||||||
|  | the monitor, thereby preventing the dispatcher from reaching | ||||||
|  | the resume() call. | ||||||
|  | Fix this by resuming the monitor when clearing a queue which | ||||||
|  | was filled up. | ||||||
|  | 
 | ||||||
|  | Signed-off-by: Wolfgang Bumiller <w.bumiller@proxmox.com> | ||||||
|  | ---
 | ||||||
|  |  monitor.c | 21 ++++++++++++++++----- | ||||||
|  |  1 file changed, 16 insertions(+), 5 deletions(-) | ||||||
|  | 
 | ||||||
|  | diff --git a/monitor.c b/monitor.c
 | ||||||
|  | index 4807bbe811..daadbcdede 100644
 | ||||||
|  | --- a/monitor.c
 | ||||||
|  | +++ b/monitor.c
 | ||||||
|  | @@ -356,12 +356,28 @@ static void qmp_request_free(QMPRequest *req)
 | ||||||
|  |      g_free(req); | ||||||
|  |  } | ||||||
|  |   | ||||||
|  | +static bool qmp_oob_enabled(Monitor *mon)
 | ||||||
|  | +{
 | ||||||
|  | +    return mon->qmp.capab[QMP_CAPABILITY_OOB];
 | ||||||
|  | +}
 | ||||||
|  | +
 | ||||||
|  |  /* Caller must hold mon->qmp.qmp_queue_lock */ | ||||||
|  |  static void monitor_qmp_cleanup_req_queue_locked(Monitor *mon) | ||||||
|  |  { | ||||||
|  | +    bool need_resume =
 | ||||||
|  | +        (!qmp_oob_enabled(mon) && mon->qmp.qmp_requests->length > 0)
 | ||||||
|  | +        || mon->qmp.qmp_requests->length == QMP_REQ_QUEUE_LEN_MAX;
 | ||||||
|  |      while (!g_queue_is_empty(mon->qmp.qmp_requests)) { | ||||||
|  |          qmp_request_free(g_queue_pop_head(mon->qmp.qmp_requests)); | ||||||
|  |      } | ||||||
|  | +    if (need_resume) {
 | ||||||
|  | +        /*
 | ||||||
|  | +         * Pairs with the monitor_suspend() in handle_qmp_command() in case the
 | ||||||
|  | +         * queue gets cleared from a CH_EVENT_CLOSED event before the dispatch
 | ||||||
|  | +         * bh got scheduled.
 | ||||||
|  | +         */
 | ||||||
|  | +        monitor_resume(mon);
 | ||||||
|  | +    }
 | ||||||
|  |  } | ||||||
|  |   | ||||||
|  |  static void monitor_qmp_cleanup_queues(Monitor *mon) | ||||||
|  | @@ -1157,11 +1173,6 @@ static void monitor_init_qmp_commands(void)
 | ||||||
|  |                           qmp_marshal_qmp_capabilities, QCO_ALLOW_PRECONFIG); | ||||||
|  |  } | ||||||
|  |   | ||||||
|  | -static bool qmp_oob_enabled(Monitor *mon)
 | ||||||
|  | -{
 | ||||||
|  | -    return mon->qmp.capab[QMP_CAPABILITY_OOB];
 | ||||||
|  | -}
 | ||||||
|  | -
 | ||||||
|  |  static void monitor_qmp_caps_reset(Monitor *mon) | ||||||
|  |  { | ||||||
|  |      memset(mon->qmp.capab_offered, 0, sizeof(mon->qmp.capab_offered)); | ||||||
|  | -- 
 | ||||||
|  | 2.20.1 | ||||||
|  | 
 | ||||||
| @ -1,38 +0,0 @@ | |||||||
| From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 |  | ||||||
| From: Wolfgang Bumiller <w.bumiller@proxmox.com> |  | ||||||
| Date: Tue, 25 Jun 2019 11:17:58 +0200 |  | ||||||
| Subject: [PATCH] PVE: monitor: disable oob capability |  | ||||||
| 
 |  | ||||||
| A bisect revealed that commit 8258292e18c3 |  | ||||||
| ("monitor: Remove "x-oob", offer capability "oob" unconditionally") |  | ||||||
| causes unexpected hangs when restoring live snapshots from some |  | ||||||
| types of block devices (particularly RBD). |  | ||||||
| We need to figure out what's happnening there. For now, since we |  | ||||||
| had this disabled before and probably don't need it now either, |  | ||||||
| disable oob, so we can get a functioning qemu out... |  | ||||||
| 
 |  | ||||||
| Signed-off-by: Wolfgang Bumiller <w.bumiller@proxmox.com> |  | ||||||
| Signed-off-by: Thomas Lamprecht <t.lamprecht@proxmox.com> |  | ||||||
| ---
 |  | ||||||
|  monitor.c | 5 +---- |  | ||||||
|  1 file changed, 1 insertion(+), 4 deletions(-) |  | ||||||
| 
 |  | ||||||
| diff --git a/monitor.c b/monitor.c
 |  | ||||||
| index 4807bbe811..f8d2338667 100644
 |  | ||||||
| --- a/monitor.c
 |  | ||||||
| +++ b/monitor.c
 |  | ||||||
| @@ -4605,10 +4605,7 @@ void monitor_init(Chardev *chr, int flags)
 |  | ||||||
|      bool use_readline = flags & MONITOR_USE_READLINE; |  | ||||||
|   |  | ||||||
|      /* Note: we run QMP monitor in I/O thread when @chr supports that */ |  | ||||||
| -    monitor_data_init(mon, false,
 |  | ||||||
| -                      (flags & MONITOR_USE_CONTROL)
 |  | ||||||
| -                      && qemu_chr_has_feature(chr,
 |  | ||||||
| -                                              QEMU_CHAR_FEATURE_GCONTEXT));
 |  | ||||||
| +    monitor_data_init(mon, false, false);
 |  | ||||||
|   |  | ||||||
|      qemu_chr_fe_init(&mon->chr, chr, &error_abort); |  | ||||||
|      mon->flags = flags; |  | ||||||
| -- 
 |  | ||||||
| 2.20.1 |  | ||||||
| 
 |  | ||||||
							
								
								
									
										2
									
								
								debian/patches/series
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								debian/patches/series
									
									
									
									
										vendored
									
									
								
							| @ -2,6 +2,7 @@ extra/0001-target-i386-add-MDS-NO-feature.patch | |||||||
| extra/0002-target-i386-define-md-clear-bit.patch | extra/0002-target-i386-define-md-clear-bit.patch | ||||||
| extra/0003-virtio-balloon-fix-QEMU-4.0-config-size-migration-in.patch | extra/0003-virtio-balloon-fix-QEMU-4.0-config-size-migration-in.patch | ||||||
| extra/0004-Fix-heap-overflow-in-ip_reass-on-big-packet-input.patch | extra/0004-Fix-heap-overflow-in-ip_reass-on-big-packet-input.patch | ||||||
|  | extra/0005-monitor-qmp-resume-monitor-when-clearing-its-queue.patch | ||||||
| pve/0001-PVE-Config-block-file-change-locking-default-to-off.patch | pve/0001-PVE-Config-block-file-change-locking-default-to-off.patch | ||||||
| pve/0002-PVE-Config-Adjust-network-script-path-to-etc-kvm.patch | pve/0002-PVE-Config-Adjust-network-script-path-to-etc-kvm.patch | ||||||
| pve/0003-PVE-Config-set-the-CPU-model-to-kvm64-32-instead-of-.patch | pve/0003-PVE-Config-set-the-CPU-model-to-kvm64-32-instead-of-.patch | ||||||
| @ -32,4 +33,3 @@ pve/0027-PVE-Up-Config-file-posix-make-locking-optiono-on-cre.patch | |||||||
| pve/0028-docs-recommend-use-of-md-clear-feature-on-all-Intel-.patch | pve/0028-docs-recommend-use-of-md-clear-feature-on-all-Intel-.patch | ||||||
| pve/0029-PVE-savevm-async-kick-AIO-wait-on-block-state-write.patch | pve/0029-PVE-savevm-async-kick-AIO-wait-on-block-state-write.patch | ||||||
| pve/0030-PVE-move-snapshot-cleanup-into-bottom-half.patch | pve/0030-PVE-move-snapshot-cleanup-into-bottom-half.patch | ||||||
| pve/0031-PVE-monitor-disable-oob-capability.patch |  | ||||||
|  | |||||||
		Loading…
	
		Reference in New Issue
	
	Block a user
	 Wolfgang Bumiller
						Wolfgang Bumiller