From owner-p4-projects@FreeBSD.ORG Wed Aug 5 17:34:54 2009 Return-Path: Delivered-To: p4-projects@freebsd.org Received: by hub.freebsd.org (Postfix, from userid 32767) id F08EA1065670; Wed, 5 Aug 2009 17:34:53 +0000 (UTC) Delivered-To: perforce@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id B02FB106564A for ; Wed, 5 Aug 2009 17:34:53 +0000 (UTC) (envelope-from trasz@freebsd.org) Received: from repoman.freebsd.org (repoman.freebsd.org [IPv6:2001:4f8:fff6::29]) by mx1.freebsd.org (Postfix) with ESMTP id 8365F8FC0A for ; Wed, 5 Aug 2009 17:34:53 +0000 (UTC) (envelope-from trasz@freebsd.org) Received: from repoman.freebsd.org (localhost [127.0.0.1]) by repoman.freebsd.org (8.14.3/8.14.3) with ESMTP id n75HYr01078185 for ; Wed, 5 Aug 2009 17:34:53 GMT (envelope-from trasz@freebsd.org) Received: (from perforce@localhost) by repoman.freebsd.org (8.14.3/8.14.3/Submit) id n75HYrMZ078183 for perforce@freebsd.org; Wed, 5 Aug 2009 17:34:53 GMT (envelope-from trasz@freebsd.org) Date: Wed, 5 Aug 2009 17:34:53 GMT Message-Id: <200908051734.n75HYrMZ078183@repoman.freebsd.org> X-Authentication-Warning: repoman.freebsd.org: perforce set sender to trasz@freebsd.org using -f From: Edward Tomasz Napierala To: Perforce Change Reviews Cc: Subject: PERFORCE change 167036 for review X-BeenThere: p4-projects@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: p4 projects tree changes List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Wed, 05 Aug 2009 17:34:56 -0000 http://perforce.freebsd.org/chv.cgi?CH=167036 Change 167036 by trasz@trasz_anger on 2009/08/05 17:34:09 When changing loginclass, update process limits properly. Affected files ... .. //depot/projects/soc2009/trasz_limits/sys/kern/kern_hrl.c#44 edit .. //depot/projects/soc2009/trasz_limits/sys/kern/kern_loginclass.c#4 edit .. //depot/projects/soc2009/trasz_limits/sys/sys/hrl.h#28 edit Differences ... ==== //depot/projects/soc2009/trasz_limits/sys/kern/kern_hrl.c#44 (text+ko) ==== @@ -1514,6 +1514,42 @@ } /* + * Called after loginclass change, to adjust p_limits. + */ +void +hrl_proc_loginclass_changed(struct proc *p) +{ + int error; + struct hrl_limit *limit; + + PROC_LOCK_ASSERT(p, MA_OWNED); + + mtx_lock(&hrl_lock); + + /* + * Remove rules for the old loginclass. + */ + LIST_FOREACH(limit, &p->p_limits, hl_next) { + if (limit->hl_rule->hr_subject != HRL_SUBJECT_LOGINCLASS) + continue; + + LIST_REMOVE(limit, hl_next); + hrl_rule_release(limit->hl_rule); + uma_zfree(hrl_limit_zone, limit); + } + + /* + * Now add rules for the current loginclass. + */ + LIST_FOREACH(limit, &p->p_loginclass->lc_limits, hl_next) { + error = hrl_limit_add_locked(&p->p_limits, limit->hl_rule); + KASSERT(error == 0, ("XXX: better error handling needed")); + } + + mtx_unlock(&hrl_lock); +} + +/* * Inherit resource usage information and copy limits from the parent * process to the child. */ @@ -1565,15 +1601,12 @@ { struct hrl_limit *limit; -restart: mtx_lock(&hrl_lock); while (!LIST_EMPTY(&p->p_limits)) { limit = LIST_FIRST(&p->p_limits); LIST_REMOVE(limit, hl_next); - mtx_unlock(&hrl_lock); hrl_rule_release(limit->hl_rule); uma_zfree(hrl_limit_zone, limit); - goto restart; } mtx_unlock(&hrl_lock); } ==== //depot/projects/soc2009/trasz_limits/sys/kern/kern_loginclass.c#4 (text+ko) ==== @@ -194,6 +194,7 @@ PROC_LOCK(p); oldlc = p->p_loginclass; p->p_loginclass = newlc; + hrl_proc_loginclass_changed(p); PROC_UNLOCK(p); loginclass_release(oldlc); ==== //depot/projects/soc2009/trasz_limits/sys/sys/hrl.h#28 (text+ko) ==== @@ -138,6 +138,10 @@ void hrl_usage_subtract(struct hrl_usage *dest, const struct hrl_usage *src); void hrl_proc_exiting(struct proc *p); + +void hrl_proc_loginclass_changed(struct proc *p); +void hrl_proc_ucred_changed(struct proc *p); + struct hrl_rule *hrl_rule_alloc(int flags); struct hrl_rule *hrl_rule_duplicate(const struct hrl_rule *rule, int flags); void hrl_rule_acquire(struct hrl_rule *rule);