Commit 4bb50606 authored by Zack Rusin's avatar Zack Rusin
Browse files

drm/vmwgfx: Add a mksstat counter for cotable resizes



There's been a lot of cotable resizes on startup which we can track
by adding a mks stat to measure both the invocation count and
time spent doing cotable resizes.

This is only used if kernel is configured with CONFIG_DRM_VMWGFX_MKSSTATS
The stats are collected on the host size inside the vmware-stats.log
file.

Signed-off-by: default avatarZack Rusin <zackr@vmware.com>
Reviewed-by: default avatarMichael Banack <banackm@vmware.com>
Reviewed-by: default avatarMartin Krastev <krastevm@vmware.com>
Reviewed-by: default avatarMaaz Mombasawala <mombasawalam@vmware.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20221022040236.616490-16-zack@kde.org
parent 2e10cdc6
Loading
Loading
Loading
Loading
+11 −2
Original line number Diff line number Diff line
@@ -33,6 +33,7 @@
#include <drm/ttm/ttm_placement.h>

#include "vmwgfx_drv.h"
#include "vmwgfx_mksstat.h"
#include "vmwgfx_resource_priv.h"
#include "vmwgfx_so.h"

@@ -395,9 +396,12 @@ static int vmw_cotable_resize(struct vmw_resource *res, size_t new_size)
	int ret;
	size_t i;

	MKS_STAT_TIME_DECL(MKSSTAT_KERN_COTABLE_RESIZE);
	MKS_STAT_TIME_PUSH(MKSSTAT_KERN_COTABLE_RESIZE);

	ret = vmw_cotable_readback(res);
	if (ret)
		return ret;
		goto out_done;

	cur_size_read_back = vcotbl->size_read_back;
	vcotbl->size_read_back = old_size_read_back;
@@ -411,7 +415,7 @@ static int vmw_cotable_resize(struct vmw_resource *res, size_t new_size)
			    true, true, vmw_bo_bo_free, &buf);
	if (ret) {
		DRM_ERROR("Failed initializing new cotable MOB.\n");
		return ret;
		goto out_done;
	}

	bo = &buf->base;
@@ -485,6 +489,8 @@ static int vmw_cotable_resize(struct vmw_resource *res, size_t new_size)
	/* Release the pin acquired in vmw_bo_init */
	ttm_bo_unpin(bo);

	MKS_STAT_TIME_POP(MKSSTAT_KERN_COTABLE_RESIZE);

	return 0;

out_map_new:
@@ -494,6 +500,9 @@ static int vmw_cotable_resize(struct vmw_resource *res, size_t new_size)
	ttm_bo_unreserve(bo);
	vmw_bo_unreference(&buf);

out_done:
	MKS_STAT_TIME_POP(MKSSTAT_KERN_COTABLE_RESIZE);

	return ret;
}

+2 −0
Original line number Diff line number Diff line
@@ -29,6 +29,7 @@
#define _VMWGFX_MKSSTAT_H_

#include <asm/page.h>
#include <linux/kconfig.h>

/* Reservation marker for mksstat pid's */
#define MKSSTAT_PID_RESERVED -1
@@ -41,6 +42,7 @@

typedef enum {
	MKSSTAT_KERN_EXECBUF, /* vmw_execbuf_ioctl */
	MKSSTAT_KERN_COTABLE_RESIZE,

	MKSSTAT_KERN_COUNT /* Reserved entry; always last */
} mksstat_kern_stats_t;
+9 −7
Original line number Diff line number Diff line
@@ -85,7 +85,14 @@ struct rpc_channel {
	u32 cookie_low;
};


#if IS_ENABLED(CONFIG_DRM_VMWGFX_MKSSTATS)
/* Kernel mksGuestStats counter names and desciptions; same order as enum mksstat_kern_stats_t */
static const char* const mksstat_kern_name_desc[MKSSTAT_KERN_COUNT][2] =
{
	{ "vmw_execbuf_ioctl", "vmw_execbuf_ioctl" },
	{ "vmw_cotable_resize", "vmw_cotable_resize" },
};
#endif

/**
 * vmw_open_channel
@@ -695,12 +702,6 @@ static inline void hypervisor_ppn_remove(PPN64 pfn)
/* Header to the text description of mksGuestStat instance descriptor */
#define MKSSTAT_KERNEL_DESCRIPTION "vmwgfx"

/* Kernel mksGuestStats counter names and desciptions; same order as enum mksstat_kern_stats_t */
static const char* const mksstat_kern_name_desc[MKSSTAT_KERN_COUNT][2] =
{
	{ "vmw_execbuf_ioctl", "vmw_execbuf_ioctl" },
};

/**
 * mksstat_init_record: Initializes an MKSGuestStatCounter-based record
 * for the respective mksGuestStat index.
@@ -786,6 +787,7 @@ static int mksstat_init_kern_id(struct page **ppage)
	/* Set up all kernel-internal counters and corresponding structures */
	pstrs_acc = pstrs;
	pstrs_acc = mksstat_init_record_time(MKSSTAT_KERN_EXECBUF, pstat, pinfo, pstrs_acc);
	pstrs_acc = mksstat_init_record_time(MKSSTAT_KERN_COTABLE_RESIZE, pstat, pinfo, pstrs_acc);

	/* Add new counters above, in their order of appearance in mksstat_kern_stats_t */