Skip to content

Commit

Permalink
Merge remote-tracking branch 'remotes/stefanha/tags/block-pull-reques…
Browse files Browse the repository at this point in the history
…t' into staging

Pull request

# gpg: Signature made Fri 13 Dec 2019 14:32:11 GMT
# gpg:                using RSA key 8695A8BFD3F97CDAAC35775A9CA4ABB381AB73C8
# gpg: Good signature from "Stefan Hajnoczi <stefanha@redhat.com>" [full]
# gpg:                 aka "Stefan Hajnoczi <stefanha@gmail.com>" [full]
# Primary key fingerprint: 8695 A8BF D3F9 7CDA AC35  775A 9CA4 ABB3 81AB 73C8

* remotes/stefanha/tags/block-pull-request:
  iothread: document -object iothread on man page
  virtio-blk: advertise F_WCE (F_FLUSH) if F_CONFIG_WCE is advertised

Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
  • Loading branch information
pm215 committed Dec 13, 2019
2 parents 4148d14 + 86d2a49 commit 084a398
Show file tree
Hide file tree
Showing 10 changed files with 57 additions and 2 deletions.
1 change: 1 addition & 0 deletions hw/arm/virt.c
Expand Up @@ -2149,6 +2149,7 @@ type_init(machvirt_machine_init);

static void virt_machine_4_2_options(MachineClass *mc)
{
compat_props_add(mc->compat_props, hw_compat_4_2, hw_compat_4_2_len);
}
DEFINE_VIRT_MACHINE_AS_LATEST(4, 2)

Expand Down
6 changes: 5 additions & 1 deletion hw/block/virtio-blk.c
Expand Up @@ -991,7 +991,9 @@ static uint64_t virtio_blk_get_features(VirtIODevice *vdev, uint64_t features,
virtio_add_feature(&features, VIRTIO_BLK_F_SCSI);
}

if (blk_enable_write_cache(s->blk)) {
if (blk_enable_write_cache(s->blk) ||
(s->conf.x_enable_wce_if_config_wce &&
virtio_has_feature(features, VIRTIO_BLK_F_CONFIG_WCE))) {
virtio_add_feature(&features, VIRTIO_BLK_F_WCE);
}
if (blk_is_read_only(s->blk)) {
Expand Down Expand Up @@ -1270,6 +1272,8 @@ static Property virtio_blk_properties[] = {
conf.max_discard_sectors, BDRV_REQUEST_MAX_SECTORS),
DEFINE_PROP_UINT32("max-write-zeroes-sectors", VirtIOBlock,
conf.max_write_zeroes_sectors, BDRV_REQUEST_MAX_SECTORS),
DEFINE_PROP_BOOL("x-enable-wce-if-config-wce", VirtIOBlock,
conf.x_enable_wce_if_config_wce, true),
DEFINE_PROP_END_OF_LIST(),
};

Expand Down
5 changes: 5 additions & 0 deletions hw/core/machine.c
Expand Up @@ -27,6 +27,11 @@
#include "hw/pci/pci.h"
#include "hw/mem/nvdimm.h"

GlobalProperty hw_compat_4_2[] = {
{ "virtio-blk-device", "x-enable-wce-if-config-wce", "off" },
};
const size_t hw_compat_4_2_len = G_N_ELEMENTS(hw_compat_4_2);

GlobalProperty hw_compat_4_1[] = {
{ "virtio-pci", "x-pcie-flr-init", "off" },
};
Expand Down
1 change: 1 addition & 0 deletions hw/i386/pc_piix.c
Expand Up @@ -431,6 +431,7 @@ static void pc_i440fx_4_2_machine_options(MachineClass *m)
m->alias = "pc";
m->is_default = 1;
pcmc->default_cpu_version = 1;
compat_props_add(m->compat_props, hw_compat_4_2, hw_compat_4_2_len);
}

DEFINE_I440FX_MACHINE(v4_2, "pc-i440fx-4.2", NULL,
Expand Down
1 change: 1 addition & 0 deletions hw/i386/pc_q35.c
Expand Up @@ -354,6 +354,7 @@ static void pc_q35_4_2_machine_options(MachineClass *m)
pc_q35_machine_options(m);
m->alias = "q35";
pcmc->default_cpu_version = 1;
compat_props_add(m->compat_props, hw_compat_4_2, hw_compat_4_2_len);
}

DEFINE_Q35_MACHINE(v4_2, "pc-q35-4.2", NULL,
Expand Down
2 changes: 1 addition & 1 deletion hw/ppc/spapr.c
Expand Up @@ -4496,7 +4496,7 @@ static const TypeInfo spapr_machine_info = {
*/
static void spapr_machine_4_2_class_options(MachineClass *mc)
{
/* Defaults for the latest behaviour inherited from the base class */
compat_props_add(mc->compat_props, hw_compat_4_2, hw_compat_4_2_len);
}

DEFINE_SPAPR_MACHINE(4_2, "4.2", true);
Expand Down
1 change: 1 addition & 0 deletions hw/s390x/s390-virtio-ccw.c
Expand Up @@ -645,6 +645,7 @@ static void ccw_machine_4_2_instance_options(MachineState *machine)

static void ccw_machine_4_2_class_options(MachineClass *mc)
{
compat_props_add(mc->compat_props, hw_compat_4_2, hw_compat_4_2_len);
}
DEFINE_CCW_MACHINE(4_2, "4.2", true);

Expand Down
3 changes: 3 additions & 0 deletions include/hw/boards.h
Expand Up @@ -329,6 +329,9 @@ struct MachineState {
} \
type_init(machine_initfn##_register_types)

extern GlobalProperty hw_compat_4_2[];
extern const size_t hw_compat_4_2_len;

extern GlobalProperty hw_compat_4_1[];
extern const size_t hw_compat_4_1_len;

Expand Down
1 change: 1 addition & 0 deletions include/hw/virtio/virtio-blk.h
Expand Up @@ -40,6 +40,7 @@ struct VirtIOBlkConf
uint16_t queue_size;
uint32_t max_discard_sectors;
uint32_t max_write_zeroes_sectors;
bool x_enable_wce_if_config_wce;
};

struct VirtIOBlockDataPlane;
Expand Down
38 changes: 38 additions & 0 deletions qemu-options.hx
Expand Up @@ -4916,6 +4916,44 @@ access
CN=laptop.example.com,O=Example Home,L=London,ST=London,C=GB
@end example

@item -object iothread,id=@var{id},poll-max-ns=@var{poll-max-ns},poll-grow=@var{poll-grow},poll-shrink=@var{poll-shrink}

Creates a dedicated event loop thread that devices can be assigned to. This is
known as an IOThread. By default device emulation happens in vCPU threads or
the main event loop thread. This can become a scalability bottleneck.
IOThreads allow device emulation and I/O to run on other host CPUs.

The @option{id} parameter is a unique ID that will be used to reference this
IOThread from @option{-device ...,iothread=@var{id}}. Multiple devices can be
assigned to an IOThread. Note that not all devices support an
@option{iothread} parameter.

The @code{query-iothreads} QMP command lists IOThreads and reports their thread
IDs so that the user can configure host CPU pinning/affinity.

IOThreads use an adaptive polling algorithm to reduce event loop latency.
Instead of entering a blocking system call to monitor file descriptors and then
pay the cost of being woken up when an event occurs, the polling algorithm
spins waiting for events for a short time. The algorithm's default parameters
are suitable for many cases but can be adjusted based on knowledge of the
workload and/or host device latency.

The @option{poll-max-ns} parameter is the maximum number of nanoseconds to busy
wait for events. Polling can be disabled by setting this value to 0.

The @option{poll-grow} parameter is the multiplier used to increase the polling
time when the algorithm detects it is missing events due to not polling long
enough.

The @option{poll-shrink} parameter is the divisor used to decrease the polling
time when the algorithm detects it is spending too long polling without
encountering events.

The polling parameters can be modified at run-time using the @code{qom-set} command (where @code{iothread1} is the IOThread's @code{id}):

@example
(qemu) qom-set /objects/iothread1 poll-max-ns 100000
@end example

@end table

Expand Down

0 comments on commit 084a398

Please sign in to comment.