From 8d2b7737657e8b6a1b192b6342e4bb19280fb025 Mon Sep 17 00:00:00 2001 From: Jack Steiner Date: Tue, 15 Dec 2009 16:48:02 -0800 Subject: [PATCH] --- yaml --- r: 176723 b: refs/heads/master c: 091f1a10614db89a108cda980425799730d73d8a h: refs/heads/master i: 176721: 46399796fa07bd5b6262a587272d8a7d17bf2f9d 176719: 5946c5a13247006e7ec5e6c01ccb95d12ce44add v: v3 --- [refs] | 2 +- trunk/drivers/misc/sgi-gru/grufault.c | 5 +++++ trunk/drivers/misc/sgi-gru/grukservices.c | 4 +++- 3 files changed, 9 insertions(+), 2 deletions(-) diff --git a/[refs] b/[refs] index ec9c8a72dfcd..8ff9ec300ed1 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: 827f02febfcdfb03bc056bf479a13b5bcb35dfd7 +refs/heads/master: 091f1a10614db89a108cda980425799730d73d8a diff --git a/trunk/drivers/misc/sgi-gru/grufault.c b/trunk/drivers/misc/sgi-gru/grufault.c index 679e01778286..2605edfbaebe 100644 --- a/trunk/drivers/misc/sgi-gru/grufault.c +++ b/trunk/drivers/misc/sgi-gru/grufault.c @@ -733,6 +733,11 @@ long gru_get_gseg_statistics(unsigned long arg) if (copy_from_user(&req, (void __user *)arg, sizeof(req))) return -EFAULT; + /* + * The library creates arrays of contexts for threaded programs. + * If no gts exists in the array, the context has never been used & all + * statistics are implicitly 0. + */ gts = gru_find_lock_gts(req.gseg); if (gts) { memcpy(&req.stats, >s->ustats, sizeof(gts->ustats)); diff --git a/trunk/drivers/misc/sgi-gru/grukservices.c b/trunk/drivers/misc/sgi-gru/grukservices.c index d2b149facda1..306855cc80fe 100644 --- a/trunk/drivers/misc/sgi-gru/grukservices.c +++ b/trunk/drivers/misc/sgi-gru/grukservices.c @@ -200,13 +200,15 @@ static int gru_free_kernel_contexts(void) bs = gru_base[bid]; if (!bs) continue; + + /* Ignore busy contexts. Don't want to block here. */ if (down_write_trylock(&bs->bs_kgts_sema)) { kgts = bs->bs_kgts; if (kgts && kgts->ts_gru) gru_unload_context(kgts, 0); - kfree(kgts); bs->bs_kgts = NULL; up_write(&bs->bs_kgts_sema); + kfree(kgts); } else { ret++; }