Date: Tue, 19 Jan 2021 05:08:05 GMT From: Bryan Venteicher <bryanv@FreeBSD.org> To: src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-main@FreeBSD.org Subject: git: f7f9c266e439 - main - virtio_balloon: Add modern (V1) support Message-ID: <202101190508.10J585HU085639@gitrepo.freebsd.org>
next in thread | raw e-mail | index | archive | help
The branch main has been updated by bryanv: URL: https://cgit.FreeBSD.org/src/commit/?id=f7f9c266e439ee494b5f1bca8158ee99d7f56819 commit f7f9c266e439ee494b5f1bca8158ee99d7f56819 Author: Bryan Venteicher <bryanv@FreeBSD.org> AuthorDate: 2021-01-19 04:55:23 +0000 Commit: Bryan Venteicher <bryanv@FreeBSD.org> CommitDate: 2021-01-19 04:55:23 +0000 virtio_balloon: Add modern (V1) support Reviewed by: grehan (mentor) Differential Revision: https://reviews.freebsd.org/D27900 --- sys/dev/virtio/balloon/virtio_balloon.c | 29 ++++++++++++++++++++++------- sys/dev/virtio/balloon/virtio_balloon.h | 28 +++++++++++++++++++++++++++- 2 files changed, 49 insertions(+), 8 deletions(-) diff --git a/sys/dev/virtio/balloon/virtio_balloon.c b/sys/dev/virtio/balloon/virtio_balloon.c index 2292ca384ba9..0973528887c5 100644 --- a/sys/dev/virtio/balloon/virtio_balloon.c +++ b/sys/dev/virtio/balloon/virtio_balloon.c @@ -80,6 +80,8 @@ struct vtballoon_softc { static struct virtio_feature_desc vtballoon_feature_desc[] = { { VIRTIO_BALLOON_F_MUST_TELL_HOST, "MustTellHost" }, { VIRTIO_BALLOON_F_STATS_VQ, "StatsVq" }, + { VIRTIO_BALLOON_F_DEFLATE_ON_OOM, "DeflateOnOOM" }, + { 0, NULL } }; @@ -110,8 +112,11 @@ static int vtballoon_sleep(struct vtballoon_softc *); static void vtballoon_thread(void *); static void vtballoon_add_sysctl(struct vtballoon_softc *); +#define vtballoon_modern(_sc) \ + (((_sc)->vtballoon_features & VIRTIO_F_VERSION_1) != 0) + /* Features desired/implemented by this driver. */ -#define VTBALLOON_FEATURES 0 +#define VTBALLOON_FEATURES VIRTIO_BALLOON_F_MUST_TELL_HOST /* Timeout between retries when the balloon needs inflating. */ #define VTBALLOON_LOWMEM_TIMEOUT hz @@ -278,8 +283,10 @@ vtballoon_negotiate_features(struct vtballoon_softc *sc) uint64_t features; dev = sc->vtballoon_dev; - features = virtio_negotiate_features(dev, VTBALLOON_FEATURES); - sc->vtballoon_features = features; + features = VTBALLOON_FEATURES; + + sc->vtballoon_features = virtio_negotiate_features(dev, features); + virtio_finalize_features(dev); } static int @@ -440,7 +447,8 @@ vtballoon_alloc_page(struct vtballoon_softc *sc) { vm_page_t m; - m = vm_page_alloc(NULL, 0, VM_ALLOC_NORMAL | VM_ALLOC_NOOBJ); + m = vm_page_alloc(NULL, 0, + VM_ALLOC_NORMAL | VM_ALLOC_NOOBJ | VM_ALLOC_NODUMP); if (m != NULL) sc->vtballoon_current_npages++; @@ -463,16 +471,23 @@ vtballoon_desired_size(struct vtballoon_softc *sc) desired = virtio_read_dev_config_4(sc->vtballoon_dev, offsetof(struct virtio_balloon_config, num_pages)); - return (le32toh(desired)); + if (vtballoon_modern(sc)) + return (desired); + else + return (le32toh(desired)); } static void vtballoon_update_size(struct vtballoon_softc *sc) { + uint32_t npages; + + npages = sc->vtballoon_current_npages; + if (!vtballoon_modern(sc)) + npages = htole32(npages); virtio_write_dev_config_4(sc->vtballoon_dev, - offsetof(struct virtio_balloon_config, actual), - htole32(sc->vtballoon_current_npages)); + offsetof(struct virtio_balloon_config, actual), npages); } static int diff --git a/sys/dev/virtio/balloon/virtio_balloon.h b/sys/dev/virtio/balloon/virtio_balloon.h index b871dfb01c56..07802d84ce52 100644 --- a/sys/dev/virtio/balloon/virtio_balloon.h +++ b/sys/dev/virtio/balloon/virtio_balloon.h @@ -36,6 +36,7 @@ /* Feature bits. */ #define VIRTIO_BALLOON_F_MUST_TELL_HOST 0x1 /* Tell before reclaiming pages */ #define VIRTIO_BALLOON_F_STATS_VQ 0x2 /* Memory stats virtqueue */ +#define VIRTIO_BALLOON_F_DEFLATE_ON_OOM 0x4 /* Deflate balloon on OOM */ /* Size of a PFN in the balloon interface. */ #define VIRTIO_BALLOON_PFN_SHIFT 12 @@ -54,8 +55,33 @@ struct virtio_balloon_config { #define VIRTIO_BALLOON_S_MINFLT 3 /* Number of minor faults */ #define VIRTIO_BALLOON_S_MEMFREE 4 /* Total amount of free memory */ #define VIRTIO_BALLOON_S_MEMTOT 5 /* Total amount of memory */ -#define VIRTIO_BALLOON_S_NR 6 +#define VIRTIO_BALLOON_S_AVAIL 6 /* Available memory as in /proc */ +#define VIRTIO_BALLOON_S_CACHES 7 /* Disk caches */ +#define VIRTIO_BALLOON_S_NR 8 +/* + * Memory statistics structure. + * Driver fills an array of these structures and passes to device. + * + * NOTE: fields are laid out in a way that would make compiler add padding + * between and after fields, so we have to use compiler-specific attributes to + * pack it, to disable this padding. This also often causes compiler to + * generate suboptimal code. + * + * We maintain this statistics structure format for backwards compatibility, + * but don't follow this example. + * + * If implementing a similar structure, do something like the below instead: + * struct virtio_balloon_stat { + * __virtio16 tag; + * __u8 reserved[6]; + * __virtio64 val; + * }; + * + * In other words, add explicit reserved fields to align field and + * structure boundaries at field size, avoiding compiler padding + * without the packed attribute. + */ struct virtio_balloon_stat { uint16_t tag; uint64_t val;
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?202101190508.10J585HU085639>