[Spice-devel] [PATCH spice-server] Make reds_stat utility work with both 32 and 64 bit architectures.
Pavel Grunt
pgrunt at redhat.com
Thu Oct 27 14:15:14 UTC 2016
On Wed, 2016-10-26 at 16:06 +0100, Frediano Ziglio wrote:
> Due to alignment problems the structure of statistics file is
> different between 32 and 64 bit. This as on 32 bit uint64_t is
> aligned to 4 bytes instead of 8 so sizeof(SpiceStat) can be either
> 20 (32 bit) or 24 (64 bit).
> This cause reds_stat utility to be bit dependent.
> Detect the correct SpiceStat size and use that information.
>
> Signed-off-by: Frediano Ziglio <fziglio at redhat.com>
Acked-by: Pavel Grunt <pgrunt at redhat.com>
> ---
> tools/reds_stat.c | 20 +++++++++++++++++---
> 1 file changed, 17 insertions(+), 3 deletions(-)
>
> diff --git a/tools/reds_stat.c b/tools/reds_stat.c
> index 3e966d4..69260bf 100644
> --- a/tools/reds_stat.c
> +++ b/tools/reds_stat.c
> @@ -25,18 +25,22 @@
> #include <string.h>
> #include <unistd.h>
> #include <inttypes.h>
> +#include <sys/stat.h>
> #include <spice/stats.h>
> +#include <common/verify.h>
>
> #define TAB_LEN 4
> #define VALUE_TABS 7
> #define INVALID_STAT_REF (~(uint32_t)0)
>
> -static SpiceStat *reds_stat = (SpiceStat *)MAP_FAILED;
> +verify(sizeof(SpiceStat) == 20 || sizeof(SpiceStat) == 24);
> +
> +static SpiceStatNode *reds_nodes = NULL;
> static uint64_t *values = NULL;
>
> static void print_stat_tree(int32_t node_index, int depth)
> {
> - SpiceStatNode *node = &reds_stat->nodes[node_index];
> + SpiceStatNode *node = &reds_nodes[node_index];
>
> if ((node->flags & SPICE_STAT_NODE_MASK_SHOW) ==
> SPICE_STAT_NODE_MASK_SHOW) {
> printf("%*s%s", depth * TAB_LEN, "", node->name);
> @@ -66,6 +70,9 @@ int main(int argc, char **argv)
> int shm_name_len;
> int ret = -1;
> int fd;
> + struct stat st;
> + unsigned header_size = sizeof(SpiceStat);
> + SpiceStat *reds_stat = (SpiceStat *)MAP_FAILED;
>
> if (argc != 2 || !(kvm_pid = atoi(argv[1]))) {
> printf("usage: reds_stat [qemu_pid] (e.g. `pgrep
> qemu`)\n");
> @@ -84,6 +91,12 @@ int main(int argc, char **argv)
> }
> shm_size = sizeof(SpiceStat);
> reds_stat = (SpiceStat *)mmap(NULL, shm_size, PROT_READ,
> MAP_SHARED, fd, 0);
> + if (fstat(fd, &st) == 0) {
> + unsigned size = st.st_size % sizeof(SpiceStatNode);
> + if (size == 20 || size == 24) {
> + header_size = size;
> + }
> + }
> if (reds_stat == (SpiceStat *)MAP_FAILED) {
> perror("mmap");
> goto error;
> @@ -104,12 +117,13 @@ int main(int argc, char **argv)
> if (num_of_nodes != reds_stat->num_of_nodes) {
> num_of_nodes = reds_stat->num_of_nodes;
> shm_old_size = shm_size;
> - shm_size = sizeof(SpiceStat) + num_of_nodes *
> sizeof(SpiceStatNode);
> + shm_size = header_size + num_of_nodes *
> sizeof(SpiceStatNode);
> reds_stat = mremap(reds_stat, shm_old_size, shm_size,
> MREMAP_MAYMOVE);
> if (reds_stat == (SpiceStat *)MAP_FAILED) {
> perror("mremap");
> goto error;
> }
> + reds_nodes = (SpiceStatNode *)((char *) reds_stat +
> header_size);
> values = (uint64_t *)realloc(values, num_of_nodes *
> sizeof(uint64_t));
> if (values == NULL) {
> perror("realloc");
> --
> 2.7.4
>
> _______________________________________________
> Spice-devel mailing list
> Spice-devel at lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/spice-devel
More information about the Spice-devel
mailing list