Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 5958ab88 authored by Jack Steiner's avatar Jack Steiner Committed by Linus Torvalds
Browse files

gru: improve GRU TLB dropin statistics



Update the TLB dropin statistics kept for each GRU context.  Count TLB
dropins separate from the misses - some misses do not result in a TLB
dropin.  Some of the diagnostics need both counts.

Signed-off-by: default avatarJack Steiner <steiner@sgi.com>
Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
parent 2ce4d4c9
Loading
Loading
Loading
Loading
+11 −0
Original line number Diff line number Diff line
@@ -53,6 +53,17 @@ struct gru_chiplet_info {
	int	free_user_cbr;
};

/*
 * Statictics kept for each context.
 */
struct gru_gseg_statistics {
	unsigned long	fmm_tlbmiss;
	unsigned long	upm_tlbmiss;
	unsigned long	tlbdropin;
	unsigned long	context_stolen;
	unsigned long	reserved[10];
};

/* Flags for GRU options on the gru_create_context() call */
/* Select one of the follow 4 options to specify how TLB misses are handled */
#define GRU_OPT_MISS_DEFAULT	0x0000	/* Use default mode */
+3 −2
Original line number Diff line number Diff line
@@ -438,6 +438,7 @@ static int gru_try_dropin(struct gru_state *gru,
	}

	gru_cb_set_istatus_active(cbk);
	gts->ustats.tlbdropin++;
	tfh_write_restart(tfh, gpa, GAA_RAM, vaddr, asid, write,
			  GRU_PAGESIZE(pageshift));
	gru_dbg(grudev,
@@ -580,9 +581,9 @@ static irqreturn_t gru_intr(int chiplet, int blade)
		 * This is running in interrupt context. Trylock the mmap_sem.
		 * If it fails, retry the fault in user context.
		 */
		gts->ustats.fmm_tlbmiss++;
		if (!gts->ts_force_cch_reload &&
					down_read_trylock(&gts->ts_mm->mmap_sem)) {
			gts->ustats.fmm_tlbdropin++;
			gru_try_dropin(gru, gts, tfh, NULL);
			up_read(&gts->ts_mm->mmap_sem);
		} else {
@@ -624,7 +625,7 @@ static int gru_user_dropin(struct gru_thread_state *gts,
	struct gru_mm_struct *gms = gts->ts_gms;
	int ret;

	gts->ustats.upm_tlbdropin++;
	gts->ustats.upm_tlbmiss++;
	while (1) {
		wait_event(gms->ms_wait_queue,
			   atomic_read(&gms->ms_range_active) == 0);
+2 −11
Original line number Diff line number Diff line
@@ -63,18 +63,9 @@
#define THREAD_POINTER(p, th)		(p + GRU_GSEG_PAGESIZE * (th))
#define GSEG_START(cb)			((void *)((unsigned long)(cb) & ~(GRU_GSEG_PAGESIZE - 1)))

/*
 * Statictics kept on a per-GTS basis.
 */
struct gts_statistics {
	unsigned long	fmm_tlbdropin;
	unsigned long	upm_tlbdropin;
	unsigned long	context_stolen;
};

struct gru_get_gseg_statistics_req {
	unsigned long			gseg;
	struct gts_statistics	stats;
	struct gru_gseg_statistics	stats;
};

/*
+1 −1
Original line number Diff line number Diff line
@@ -385,7 +385,7 @@ struct gru_thread_state {
							  allocated CB */
	int			ts_data_valid;	/* Indicates if ts_gdata has
						   valid data */
	struct gts_statistics	ustats;		/* User statistics */
	struct gru_gseg_statistics ustats;	/* User statistics */
	unsigned long		ts_gdata[0];	/* save area for GRU data (CB,
						   DS, CBE) */
};