From owner-p4-projects@FreeBSD.ORG Sun Dec 19 11:55:56 2010 Return-Path: Delivered-To: p4-projects@freebsd.org Received: by hub.freebsd.org (Postfix, from userid 32767) id 52C4C106566B; Sun, 19 Dec 2010 11:55:56 +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 14CF01065670 for ; Sun, 19 Dec 2010 11:55:56 +0000 (UTC) (envelope-from trasz@freebsd.org) Received: from skunkworks.freebsd.org (skunkworks.freebsd.org [IPv6:2001:4f8:fff6::2d]) by mx1.freebsd.org (Postfix) with ESMTP id 01D838FC0A for ; Sun, 19 Dec 2010 11:55:56 +0000 (UTC) Received: from skunkworks.freebsd.org (localhost [127.0.0.1]) by skunkworks.freebsd.org (8.14.4/8.14.4) with ESMTP id oBJBttr4007351 for ; Sun, 19 Dec 2010 11:55:55 GMT (envelope-from trasz@freebsd.org) Received: (from perforce@localhost) by skunkworks.freebsd.org (8.14.4/8.14.4/Submit) id oBJBttxd007348 for perforce@freebsd.org; Sun, 19 Dec 2010 11:55:55 GMT (envelope-from trasz@freebsd.org) Date: Sun, 19 Dec 2010 11:55:55 GMT Message-Id: <201012191155.oBJBttxd007348@skunkworks.freebsd.org> X-Authentication-Warning: skunkworks.freebsd.org: perforce set sender to trasz@freebsd.org using -f From: Edward Tomasz Napierala To: Perforce Change Reviews Precedence: bulk Cc: Subject: PERFORCE change 187053 for review X-BeenThere: p4-projects@freebsd.org X-Mailman-Version: 2.1.5 List-Id: p4 projects tree changes List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sun, 19 Dec 2010 11:55:56 -0000 http://p4web.freebsd.org/@@187053?ac=10 Change 187053 by trasz@trasz_victim on 2010/12/19 11:55:55 Fix rusage_proc_fork() failure handling. Affected files ... .. //depot/projects/soc2009/trasz_limits/sys/kern/kern_fork.c#29 edit Differences ... ==== //depot/projects/soc2009/trasz_limits/sys/kern/kern_fork.c#29 (text+ko) ==== @@ -772,6 +772,21 @@ knlist_init_mtx(&newproc->p_klist, &newproc->p_mtx); STAILQ_INIT(&newproc->p_ktr); + /* + * XXX: This is ugly; when we copy resource usage, we need to bump + * per-cred resource counters. + */ + newproc->p_ucred = p1->p_ucred; + + /* + * Initialize resource container for the child process. + */ + error = container_proc_fork(p1, newproc); + if (error != 0) { + error = EAGAIN; + goto fail1; + } + /* We have to lock the process tree while we look for a pid. */ sx_slock(&proctree_lock); @@ -790,20 +805,6 @@ } /* - * XXX: This is ugly; when we copy resource usage, we need to bump - * per-cred resource counters. - */ - newproc->p_ucred = p1->p_ucred; - - /* - * Initialize resource container for the child process. - */ - error = container_proc_fork(p1, newproc); - if (error != 0) { - error = EAGAIN; - goto fail; - } - /* * After fork, there is exactly one thread running. */ error = rusage_set(newproc, RUSAGE_NTHR, 1); From owner-p4-projects@FreeBSD.ORG Sun Dec 19 13:29:13 2010 Return-Path: Delivered-To: p4-projects@freebsd.org Received: by hub.freebsd.org (Postfix, from userid 32767) id 2E98B1065673; Sun, 19 Dec 2010 13:29:13 +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 E34FC106567A for ; Sun, 19 Dec 2010 13:29:12 +0000 (UTC) (envelope-from trasz@freebsd.org) Received: from skunkworks.freebsd.org (skunkworks.freebsd.org [IPv6:2001:4f8:fff6::2d]) by mx1.freebsd.org (Postfix) with ESMTP id CF91F8FC13 for ; Sun, 19 Dec 2010 13:29:12 +0000 (UTC) Received: from skunkworks.freebsd.org (localhost [127.0.0.1]) by skunkworks.freebsd.org (8.14.4/8.14.4) with ESMTP id oBJDTCtb026072 for ; Sun, 19 Dec 2010 13:29:12 GMT (envelope-from trasz@freebsd.org) Received: (from perforce@localhost) by skunkworks.freebsd.org (8.14.4/8.14.4/Submit) id oBJDTCX5026069 for perforce@freebsd.org; Sun, 19 Dec 2010 13:29:12 GMT (envelope-from trasz@freebsd.org) Date: Sun, 19 Dec 2010 13:29:12 GMT Message-Id: <201012191329.oBJDTCX5026069@skunkworks.freebsd.org> X-Authentication-Warning: skunkworks.freebsd.org: perforce set sender to trasz@freebsd.org using -f From: Edward Tomasz Napierala To: Perforce Change Reviews Precedence: bulk Cc: Subject: PERFORCE change 187054 for review X-BeenThere: p4-projects@freebsd.org X-Mailman-Version: 2.1.5 List-Id: p4 projects tree changes List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sun, 19 Dec 2010 13:29:13 -0000 http://p4web.freebsd.org/@@187054?ac=10 Change 187054 by trasz@trasz_victim on 2010/12/19 13:28:16 Drop the plan to replace all the plimit stuff with containers. Get rid of temporary per-process rules generated by setrusage() and many instances of '#ifdef HRL'. This was incomplete anyway, and when completed it would be far too intrusive. Affected files ... .. //depot/projects/soc2009/trasz_limits/TODO#35 edit .. //depot/projects/soc2009/trasz_limits/sys/compat/linux/linux_misc.c#19 edit .. //depot/projects/soc2009/trasz_limits/sys/compat/svr4/imgact_svr4.c#12 edit .. //depot/projects/soc2009/trasz_limits/sys/fs/fdescfs/fdesc_vfsops.c#6 edit .. //depot/projects/soc2009/trasz_limits/sys/i386/linux/imgact_linux.c#11 edit .. //depot/projects/soc2009/trasz_limits/sys/kern/imgact_aout.c#12 edit .. //depot/projects/soc2009/trasz_limits/sys/kern/imgact_elf.c#20 edit .. //depot/projects/soc2009/trasz_limits/sys/kern/imgact_gzip.c#10 edit .. //depot/projects/soc2009/trasz_limits/sys/kern/kern_loginclass.c#22 edit .. //depot/projects/soc2009/trasz_limits/sys/kern/kern_resource.c#54 edit .. //depot/projects/soc2009/trasz_limits/sys/kern/vfs_vnops.c#21 edit .. //depot/projects/soc2009/trasz_limits/sys/vm/swap_pager.c#15 edit .. //depot/projects/soc2009/trasz_limits/sys/vm/vm_glue.c#10 edit .. //depot/projects/soc2009/trasz_limits/sys/vm/vm_mmap.c#22 edit .. //depot/projects/soc2009/trasz_limits/sys/vm/vm_unix.c#12 edit Differences ... ==== //depot/projects/soc2009/trasz_limits/TODO#35 (text+ko) ==== @@ -102,7 +102,9 @@ HRL-specific issues: - - Bring back per-group limits. + - Reconsider setrlimit(2) handling. + + - Reconsider bringing back per-group limits. - Some things need to be accounted for per-euid, and some per-ruid. Geez. ==== //depot/projects/soc2009/trasz_limits/sys/compat/linux/linux_misc.c#19 (text+ko) ==== @@ -359,26 +359,16 @@ * XXX - this is not complete. it should check current usage PLUS * the resources needed by this library. */ -#ifndef HRL PROC_LOCK(td->td_proc); if (a_out->a_text > maxtsiz || - a_out->a_data + bss_size > lim_cur(td->td_proc, RLIMIT_DATA)) { + a_out->a_data + bss_size > lim_cur(td->td_proc, RLIMIT_DATA) || + rusage_set(td->td_proc, RUSAGE_DATA, a_out->a_data + + bss_size) != 0) { PROC_UNLOCK(td->td_proc); error = ENOMEM; goto cleanup; } PROC_UNLOCK(td->td_proc); -#endif - if (a_out->a_text > maxtsiz) { - error = ENOMEM; - goto cleanup; - } - error = rusage_set(td->td_proc, RUSAGE_DATA, - a_out->a_data + bss_size); - if (error != 0) { - error = ENOMEM; - goto cleanup; - } /* * Prevent more writers. ==== //depot/projects/soc2009/trasz_limits/sys/compat/svr4/imgact_svr4.c#12 (text+ko) ==== @@ -107,21 +107,14 @@ /* * text/data/bss must not exceed limits */ -#ifndef HRL PROC_LOCK(imgp->proc); if (a_out->a_text > maxtsiz || - a_out->a_data + bss_size > lim_cur(imgp->proc, RLIMIT_DATA)) { + a_out->a_data + bss_size > lim_cur(imgp->proc, RLIMIT_DATA) || + rusage_set(imgp->proc, RUSAGE_DATA, a_out->a_data + bss_size) != 0) {; PROC_UNLOCK(imgp->proc); return (ENOMEM); } PROC_UNLOCK(imgp->proc); -#endif /* !HRL */ - if (a_out->a_text > maxtsiz) - return (ENOMEM); - error = rusage_set(imgp->proc, RUSAGE_DATA, - a_out->a_data + bss_size); - if (error != 0) - return (ENOMEM); VOP_UNLOCK(imgp->vp, 0); ==== //depot/projects/soc2009/trasz_limits/sys/fs/fdescfs/fdesc_vfsops.c#6 (text+ko) ==== @@ -197,20 +197,14 @@ * limit is ever reduced below the current number * of open files... ] */ -#ifndef HRL PROC_LOCK(td->td_proc); lim = lim_cur(td->td_proc, RLIMIT_NOFILE); PROC_UNLOCK(td->td_proc); -#endif fdp = td->td_proc->p_fd; FILEDESC_SLOCK(fdp); limit = rusage_get_limit(td->td_proc, RUSAGE_NOFILE); -#ifdef HRL - lim = limit; -#else if (lim > limit) lim = limit; -#endif last = min(fdp->fd_nfiles, lim); freefd = 0; for (i = fdp->fd_freefile; i < last; i++) ==== //depot/projects/soc2009/trasz_limits/sys/i386/linux/imgact_linux.c#11 (text+ko) ==== @@ -105,21 +105,14 @@ /* * text/data/bss must not exceed limits */ -#ifndef HRL PROC_LOCK(imgp->proc); if (a_out->a_text > maxtsiz || - a_out->a_data + bss_size > lim_cur(imgp->proc, RLIMIT_DATA)) { + a_out->a_data + bss_size > lim_cur(imgp->proc, RLIMIT_DATA) || + rusage_set(imgp->proc, RUSAGE_DATA, a_out->a_data + bss_size) != 0) { PROC_UNLOCK(imgp->proc); return (ENOMEM); } PROC_UNLOCK(imgp->proc); -#endif /* !HRL */ - if (a_out->a_text > maxtsiz) - return (ENOMEM); - error = rusage_set(imgp->proc, RUSAGE_DATA, - a_out->a_data + bss_size); - if (error != 0) - return (ENOMEM); VOP_UNLOCK(imgp->vp, 0); ==== //depot/projects/soc2009/trasz_limits/sys/kern/imgact_aout.c#12 (text+ko) ==== @@ -185,25 +185,18 @@ /* * text/data/bss must not exceed limits */ -#ifndef HRL PROC_LOCK(imgp->proc); if (/* text can't exceed maximum text size */ a_out->a_text > maxtsiz || /* data + bss can't exceed rlimit */ - a_out->a_data + bss_size > lim_cur(imgp->proc, RLIMIT_DATA)) { + a_out->a_data + bss_size > lim_cur(imgp->proc, RLIMIT_DATA) || + rusage_set(imgp->proc, RUSAGE_DATA, + a_out->a_data + bss_size) != 0) { PROC_UNLOCK(imgp->proc); return (ENOMEM); } PROC_UNLOCK(imgp->proc); -#endif /* !HRL */ - if (/* text can't exceed maximum text size */ - a_out->a_text > maxtsiz) - return (ENOMEM); - error = rusage_set(imgp->proc, RUSAGE_DATA, - a_out->a_data + bss_size); - if (error != 0) - return (ENOMEM); /* * Avoid a possible deadlock if the current address space is destroyed ==== //depot/projects/soc2009/trasz_limits/sys/kern/imgact_elf.c#20 (text+ko) ==== @@ -874,27 +874,15 @@ * limits after loading the segments since we do * not actually fault in all the segments pages. */ -#ifndef HRL PROC_LOCK(imgp->proc); if (data_size > lim_cur(imgp->proc, RLIMIT_DATA) || text_size > maxtsiz || - total_size > lim_cur(imgp->proc, RLIMIT_VMEM)) { + total_size > lim_cur(imgp->proc, RLIMIT_VMEM) || + rusage_set(imgp->proc, RUSAGE_DATA, data_size) != 0 || + rusage_set(imgp->proc, RUSAGE_VMEM, total_size) != 0) { PROC_UNLOCK(imgp->proc); return (ENOMEM); } -#else - PROC_LOCK(imgp->proc); -#endif /* !HRL */ - if (text_size > maxtsiz) - return (ENOMEM); - error = rusage_set(imgp->proc, RUSAGE_DATA, - data_size); - if (error != 0) - return (ENOMEM); - error = rusage_set(imgp->proc, RUSAGE_VMEM, - total_size); - if (error != 0) - return (ENOMEM); vmspace->vm_tsize = text_size >> PAGE_SHIFT; vmspace->vm_taddr = (caddr_t)(uintptr_t)text_addr; ==== //depot/projects/soc2009/trasz_limits/sys/kern/imgact_gzip.c#10 (text+ko) ==== @@ -210,29 +210,20 @@ /* * text/data/bss must not exceed limits */ -#ifndef HRL PROC_LOCK(gz->ip->proc); if ( /* text can't exceed maximum text size */ gz->a_out.a_text > maxtsiz || /* data + bss can't exceed rlimit */ gz->a_out.a_data + gz->bss_size > - lim_cur(gz->ip->proc, RLIMIT_DATA)) { + lim_cur(gz->ip->proc, RLIMIT_DATA) || + rusage_set(gz->ip->proc, RUSAGE_DATA, + gz->a_out.a_data + gz->bss_size) != 0) { PROC_UNLOCK(gz->ip->proc); gz->where = __LINE__; return (ENOMEM); } PROC_UNLOCK(gz->ip->proc); -#endif /* !HRL */ - if ( /* text can't exceed maximum text size */ - gz->a_out.a_text > maxtsiz) { - gz->where = __LINE__; - return (ENOMEM); - } - error = rusage_set(gz->ip->proc, RUSAGE_DATA, - gz->a_out.a_data + gz->bss_size); - if (error != 0) - return (ENOMEM); /* Find out how far we should go */ gz->file_end = gz->file_offset + gz->a_out.a_text + gz->a_out.a_data; ==== //depot/projects/soc2009/trasz_limits/sys/kern/kern_loginclass.c#22 (text+ko) ==== @@ -85,9 +85,7 @@ mtx_lock(&loginclasses_lock); if (refcount_release(&lc->lc_refcount)) { -#ifdef HRL container_destroy(&lc->lc_container); -#endif LIST_REMOVE(lc, lc_next); mtx_unlock(&loginclasses_lock); free(lc, M_LOGINCLASS); @@ -127,9 +125,7 @@ } /* Add new loginclass. */ -#ifdef HRL container_create(&newlc->lc_container); -#endif strcpy(newlc->lc_name, name); refcount_init(&newlc->lc_refcount, 1); LIST_INSERT_HEAD(&loginclasses, newlc, lc_next); ==== //depot/projects/soc2009/trasz_limits/sys/kern/kern_resource.c#54 (text+ko) ==== @@ -606,13 +606,12 @@ return (error); } -#ifndef HRL static void lim_cb(void *arg) { + struct rlimit rlim; struct thread *td; struct proc *p; - struct rlimit rlim; p = arg; PROC_LOCK_ASSERT(p, MA_OWNED); @@ -640,119 +639,6 @@ if ((p->p_flag & P_WEXIT) == 0) callout_reset(&p->p_limco, hz, lim_cb, p); } -#endif /* !HRL */ - -#ifdef HRL -static void -hrl_handle_setrlimit(u_int which, struct rlimit *lim, struct thread *td) -{ - int error; - struct hrl_rule *rule, *rule2; - - rule = hrl_rule_alloc(M_WAITOK); - rule->hr_subject_type = HRL_SUBJECT_TYPE_PROCESS; - rule->hr_subject.hs_proc = td->td_proc; - rule->hr_action = HRL_ACTION_DENY; - rule->hr_amount = -1; - rule->hr_per = HRL_SUBJECT_TYPE_PROCESS; - - switch (which) { - case RLIMIT_CPU: - rule->hr_resource = RUSAGE_CPU; - rule->hr_action = HRL_ACTION_SIGXCPU; - break; - case RLIMIT_FSIZE: - rule->hr_resource = RUSAGE_FSIZE; - break; - case RLIMIT_DATA: - rule->hr_resource = RUSAGE_DATA; - break; - case RLIMIT_STACK: - rule->hr_resource = RUSAGE_STACK; - rule->hr_action = HRL_ACTION_SIGSEGV; - break; - case RLIMIT_CORE: - rule->hr_resource = RUSAGE_CORE; - break; - case RLIMIT_RSS: - rule->hr_resource = RUSAGE_RSS; - break; - case RLIMIT_MEMLOCK: - rule->hr_resource = RUSAGE_MEMLOCK; - break; - case RLIMIT_NPROC: - rule->hr_resource = RUSAGE_NPROC; - rule->hr_per = HRL_SUBJECT_TYPE_USER; - break; - case RLIMIT_NOFILE: - rule->hr_resource = RUSAGE_NOFILE; - rule->hr_action = HRL_ACTION_SIGXFSZ; - break; - case RLIMIT_SBSIZE: - rule->hr_resource = RUSAGE_SBSIZE; - rule->hr_per = HRL_SUBJECT_TYPE_USER; - break; - case RLIMIT_VMEM: - rule->hr_resource = RUSAGE_VMEM; - break; - case RLIMIT_NPTS: - rule->hr_resource = RUSAGE_NPTS; - rule->hr_per = HRL_SUBJECT_TYPE_USER; - break; - case RLIMIT_SWAP: - rule->hr_resource = RUSAGE_SWAP; - rule->hr_per = HRL_SUBJECT_TYPE_USER; - break; - default: - panic("hrl_handle_setrlimit: unknown limit %d", which); - } - - /* - * Remove a previous limit that might exist for the resource - * with a different hr_amount. - */ - hrl_rule_remove(rule); - - /* - * For rules with action different than "deny", we add another - * rule, "deny". - */ - if (rule->hr_action != HRL_ACTION_DENY) { - rule2 = hrl_rule_duplicate(rule, M_WAITOK); - - /* - * The "deny" action doesn't make sense for some resources, - * such as RUSAGE_CPU. - */ - if (rule2->hr_resource == RUSAGE_CPU) - rule2->hr_action = HRL_ACTION_SIGKILL; - else - rule2->hr_action = HRL_ACTION_DENY; - hrl_rule_remove(rule2); - - if (lim->rlim_cur != RLIM_INFINITY) { - if (rule2->hr_resource == RUSAGE_CPU) - rule2->hr_amount = (uint64_t)lim->rlim_max * - 1000000; - else - rule2->hr_amount = lim->rlim_cur; - error = hrl_rule_add(rule2); - KASSERT(error == 0, ("hrl_rule_add failed")); - } - hrl_rule_release(rule2); - } - - if (lim->rlim_cur != RLIM_INFINITY) { - rule->hr_amount = lim->rlim_cur; - /* Container stores CPU time in microseconds. */ - if (rule->hr_resource == RUSAGE_CPU) - rule->hr_amount *= 1000000; - error = hrl_rule_add(rule); - KASSERT(error == 0, ("hrl_rule_add failed")); - } - hrl_rule_release(rule); -} -#endif /* HRL */ int kern_setrlimit(td, which, limp) @@ -797,14 +683,12 @@ switch (which) { -#ifndef HRL case RLIMIT_CPU: if (limp->rlim_cur != RLIM_INFINITY && p->p_cpulimit == RLIM_INFINITY) callout_reset(&p->p_limco, hz, lim_cb, p); p->p_cpulimit = limp->rlim_cur; break; -#endif case RLIMIT_DATA: if (limp->rlim_cur > maxdsiz) limp->rlim_cur = maxdsiz; @@ -877,10 +761,6 @@ } } -#ifdef HRL - hrl_handle_setrlimit(which, alimp, td); -#endif - return (0); } @@ -1213,10 +1093,8 @@ { p2->p_limit = lim_hold(p1->p_limit); callout_init_mtx(&p2->p_limco, &p2->p_mtx, 0); -#ifndef HRL if (p1->p_cpulimit != RLIM_INFINITY) callout_reset(&p2->p_limco, hz, lim_cb, p2); -#endif } void @@ -1344,9 +1222,7 @@ mtx_init(&uip->ui_vmsize_mtx, "ui_vmsize", NULL, MTX_DEF); LIST_INSERT_HEAD(UIHASH(uid), uip, ui_hash); -#ifdef HRL container_create(&uip->ui_container); -#endif } } uihold(uip); @@ -1394,9 +1270,7 @@ /* Prepare for suboptimal case. */ rw_wlock(&uihashtbl_lock); if (refcount_release(&uip->ui_ref)) { -#ifdef HRL container_destroy(&uip->ui_container); -#endif LIST_REMOVE(uip, ui_hash); rw_wunlock(&uihashtbl_lock); if (uip->ui_sbsize != 0) ==== //depot/projects/soc2009/trasz_limits/sys/kern/vfs_vnops.c#21 (text+ko) ==== @@ -1344,22 +1344,21 @@ vn_rlimit_fsize(const struct vnode *vp, const struct uio *uio, const struct thread *td) { - + uoff_t fsize; + if (vp->v_type != VREG || td == NULL) return (0); -#ifndef HRL + + fsize = (uoff_t)uio->uio_offset + uio->uio_resid; + PROC_LOCK(td->td_proc); - if ((uoff_t)uio->uio_offset + uio->uio_resid > - lim_cur(td->td_proc, RLIMIT_FSIZE)) { + if (fsize > lim_cur(td->td_proc, RLIMIT_FSIZE) || + rusage_set(td->td_proc, RUSAGE_FSIZE, fsize) != 0) { psignal(td->td_proc, SIGXFSZ); PROC_UNLOCK(td->td_proc); return (EFBIG); } PROC_UNLOCK(td->td_proc); -#endif - if (rusage_set(td->td_proc, RUSAGE_FSIZE, - (uoff_t)uio->uio_offset + uio->uio_resid)) - return (EFBIG); return (0); } ==== //depot/projects/soc2009/trasz_limits/sys/vm/swap_pager.c#15 (text+ko) ==== @@ -211,12 +211,13 @@ if (res) { PROC_LOCK(curproc); UIDINFO_VMSIZE_LOCK(uip); + /* + * XXX: What if rusage_add() succeeds, and lim_cur() check fails? + */ if ( rusage_add(curproc, RUSAGE_SWAP, incr) && -#ifndef HRL (overcommit & SWAP_RESERVE_RLIMIT_ON) != 0 && uip->ui_vmsize + incr > lim_cur(curproc, RLIMIT_SWAP) && -#endif priv_check(curthread, PRIV_VM_SWAP_NORLIMIT)) res = 0; else ==== //depot/projects/soc2009/trasz_limits/sys/vm/vm_glue.c#10 (text+ko) ==== @@ -200,15 +200,12 @@ PROC_LOCK(curproc); nsize = ptoa(npages + pmap_wired_count(vm_map_pmap(&curproc->p_vmspace->vm_map))); -#ifndef HRL - if (nsize > lim_cur(curproc, RLIMIT_MEMLOCK)) { + if (nsize > lim_cur(curproc, RLIMIT_MEMLOCK) || + rusage_set(curproc, RUSAGE_MEMLOCK, nsize) != 0) { PROC_UNLOCK(curproc); return (ENOMEM); } -#endif PROC_UNLOCK(curproc); - if (rusage_set(curproc, RUSAGE_MEMLOCK, nsize)) - return (ENOMEM); #if 0 /* * XXX - not yet ==== //depot/projects/soc2009/trasz_limits/sys/vm/vm_mmap.c#22 (text+ko) ==== @@ -1051,12 +1051,10 @@ PROC_LOCK(proc); nsize = ptoa(npages + pmap_wired_count(vm_map_pmap(&proc->p_vmspace->vm_map))); -#ifndef HRL if (nsize > lim_cur(proc, RLIMIT_MEMLOCK)) { PROC_UNLOCK(proc); return (ENOMEM); } -#endif PROC_UNLOCK(proc); if (npages + cnt.v_wire_count > vm_page_max_wired) return (EAGAIN); @@ -1431,7 +1429,6 @@ size = round_page(size); -#ifndef HRL PROC_LOCK(td->td_proc); if (td->td_proc->p_vmspace->vm_map.size + size > lim_cur(td->td_proc, RLIMIT_VMEM)) { @@ -1439,7 +1436,6 @@ return(ENOMEM); } PROC_UNLOCK(td->td_proc); -#endif if (rusage_set(td->td_proc, RUSAGE_VMEM, td->td_proc->p_vmspace->vm_map.size + size)) return (ENOMEM); ==== //depot/projects/soc2009/trasz_limits/sys/vm/vm_unix.c#12 (text+ko) ==== @@ -74,19 +74,15 @@ { struct vmspace *vm = td->td_proc->p_vmspace; vm_offset_t new, old, base; -#ifndef HRL rlim_t datalim, vmemlim; -#endif int rv; int error = 0; boolean_t do_map_wirefuture; -#ifndef HRL PROC_LOCK(td->td_proc); datalim = lim_cur(td->td_proc, RLIMIT_DATA); vmemlim = lim_cur(td->td_proc, RLIMIT_VMEM); PROC_UNLOCK(td->td_proc); -#endif do_map_wirefuture = FALSE; new = round_page((vm_offset_t)uap->nsize); @@ -95,7 +91,6 @@ base = round_page((vm_offset_t) vm->vm_daddr); old = base + ctob(vm->vm_dsize); if (new > base) { -#ifndef HRL /* * Check the resource limit, but allow a process to reduce * its usage, even if it remains over the limit. @@ -104,9 +99,7 @@ error = ENOMEM; goto done; } -#endif /* !HRL */ - error = rusage_set(td->td_proc, RUSAGE_DATA, - new - base); + error = rusage_set(td->td_proc, RUSAGE_DATA, new - base); if (error != 0) { error = ENOMEM; goto done; @@ -126,18 +119,19 @@ goto done; } if (new > old) { -#ifndef HRL if (vm->vm_map.size + (new - old) > vmemlim) { error = ENOMEM; goto done; } -#endif /* !HRL */ error = rusage_set(td->td_proc, RUSAGE_VMEM, vm->vm_map.size + (new - old)); if (error != 0) { error = ENOMEM; goto done; } + /* + * XXX: Rollback for rusage_set() call above? + */ rv = vm_map_insert(&vm->vm_map, NULL, 0, old, new, VM_PROT_RW, VM_PROT_ALL, 0); if (rv != KERN_SUCCESS) { From owner-p4-projects@FreeBSD.ORG Sun Dec 19 18:03:20 2010 Return-Path: Delivered-To: p4-projects@freebsd.org Received: by hub.freebsd.org (Postfix, from userid 32767) id 965391065670; Sun, 19 Dec 2010 18:03:20 +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 5738A106564A for ; Sun, 19 Dec 2010 18:03:20 +0000 (UTC) (envelope-from gpf@FreeBSD.org) Received: from skunkworks.freebsd.org (skunkworks.freebsd.org [IPv6:2001:4f8:fff6::2d]) by mx1.freebsd.org (Postfix) with ESMTP id 44AD98FC08 for ; Sun, 19 Dec 2010 18:03:20 +0000 (UTC) Received: from skunkworks.freebsd.org (localhost [127.0.0.1]) by skunkworks.freebsd.org (8.14.4/8.14.4) with ESMTP id oBJI3K06083184 for ; Sun, 19 Dec 2010 18:03:20 GMT (envelope-from gpf@FreeBSD.org) Received: (from perforce@localhost) by skunkworks.freebsd.org (8.14.4/8.14.4/Submit) id oBJI3Kps083181 for perforce@freebsd.org; Sun, 19 Dec 2010 18:03:20 GMT (envelope-from gpf@FreeBSD.org) Date: Sun, 19 Dec 2010 18:03:20 GMT Message-Id: <201012191803.oBJI3Kps083181@skunkworks.freebsd.org> X-Authentication-Warning: skunkworks.freebsd.org: perforce set sender to gpf@FreeBSD.org using -f From: Efstratios Karatzas To: Perforce Change Reviews Precedence: bulk Cc: Subject: PERFORCE change 187059 for review X-BeenThere: p4-projects@freebsd.org X-Mailman-Version: 2.1.5 List-Id: p4 projects tree changes List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sun, 19 Dec 2010 18:03:20 -0000 http://p4web.freebsd.org/@@187059?ac=10 Change 187059 by gpf@gpf_desktop on 2010/12/19 18:02:50 bugfix: audit_new() may return NULL and audit_proc_coredump() was lacking a check for that. I was able to trigger a pagefault by shutting down audit but only if I did that within the first few seconds after the system had done booting up. Anyhoo, it's fixed now. Affected files ... .. //depot/projects/soc2010/gpf_audit/freebsd/src/sys/security/audit/audit.c#16 edit Differences ... ==== //depot/projects/soc2010/gpf_audit/freebsd/src/sys/security/audit/audit.c#16 (text) ==== @@ -1153,6 +1153,12 @@ */ td->td_pflags |= TDP_AUDITREC; ar = audit_new(AUE_CORE, td); + if (ar == NULL) { + audit_commit(td->td_ar); + td->td_pflags &= ~TDP_AUDITREC; + td->td_ar = NULL; + return; + } if (path != NULL) { pathp = &ar->k_ar->ar_arg_upath1; *pathp = malloc(MAXPATHLEN, M_AUDITPATH, M_WAITOK); From owner-p4-projects@FreeBSD.ORG Mon Dec 20 17:57:37 2010 Return-Path: Delivered-To: p4-projects@freebsd.org Received: by hub.freebsd.org (Postfix, from userid 32767) id 655911065672; Mon, 20 Dec 2010 17:57:37 +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 26B9B106566B for ; Mon, 20 Dec 2010 17:57:37 +0000 (UTC) (envelope-from afiveg@FreeBSD.org) Received: from skunkworks.freebsd.org (skunkworks.freebsd.org [IPv6:2001:4f8:fff6::2d]) by mx1.freebsd.org (Postfix) with ESMTP id 12D088FC15 for ; Mon, 20 Dec 2010 17:57:37 +0000 (UTC) Received: from skunkworks.freebsd.org (localhost [127.0.0.1]) by skunkworks.freebsd.org (8.14.4/8.14.4) with ESMTP id oBKHvaKb079729 for ; Mon, 20 Dec 2010 17:57:36 GMT (envelope-from afiveg@FreeBSD.org) Received: (from perforce@localhost) by skunkworks.freebsd.org (8.14.4/8.14.4/Submit) id oBKHvaQS079726 for perforce@freebsd.org; Mon, 20 Dec 2010 17:57:36 GMT (envelope-from afiveg@FreeBSD.org) Date: Mon, 20 Dec 2010 17:57:36 GMT Message-Id: <201012201757.oBKHvaQS079726@skunkworks.freebsd.org> X-Authentication-Warning: skunkworks.freebsd.org: perforce set sender to afiveg@FreeBSD.org using -f From: Alexandre Fiveg To: Perforce Change Reviews Precedence: bulk Cc: Subject: PERFORCE change 187081 for review X-BeenThere: p4-projects@freebsd.org X-Mailman-Version: 2.1.5 List-Id: p4 projects tree changes List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Mon, 20 Dec 2010 17:57:37 -0000 http://p4web.freebsd.org/@@187081?ac=10 Change 187081 by afiveg@cottonmouth on 2010/12/20 17:57:14 The interface to the userspace applications will be in the libringmap implemented. In the libringmap.h are data structures and functions defined. It is a first draft. Affected files ... .. //depot/projects/soc2010/ringmap/current/contrib/libringmap/libringmap.c#1 add .. //depot/projects/soc2010/ringmap/current/contrib/libringmap/libringmap.h#1 add .. //depot/projects/soc2010/ringmap/current/sys/dev/e1000/if_lem.c#37 edit .. //depot/projects/soc2010/ringmap/current/sys/dev/e1000/if_lem.h#23 edit .. //depot/projects/soc2010/ringmap/current/sys/dev/e1000/ringmap_8254.c#38 edit .. //depot/projects/soc2010/ringmap/current/sys/net/ringmap.c#54 edit .. //depot/projects/soc2010/ringmap/current/sys/net/ringmap.h#53 edit .. //depot/projects/soc2010/ringmap/current/sys/net/ringmap_kernel.h#22 edit .. //depot/projects/soc2010/ringmap/scripts/build_ringmap.sh#36 edit .. //depot/projects/soc2010/ringmap/scripts/set_ringmap.sh#37 edit .. //depot/projects/soc2010/ringmap/scripts/tailf_ringmap_msgs.sh#31 edit .. //depot/projects/soc2010/ringmap/stable_8/lib/libpcap/Makefile#2 edit Differences ... ==== //depot/projects/soc2010/ringmap/current/sys/dev/e1000/if_lem.c#37 (text+ko) ==== @@ -310,7 +310,11 @@ static int lem_rx_int_delay_dflt = EM_TICKS_TO_USECS(EM_RDTR); static int lem_tx_abs_int_delay_dflt = EM_TICKS_TO_USECS(EM_TADV); static int lem_rx_abs_int_delay_dflt = EM_TICKS_TO_USECS(EM_RADV); +#ifndef RINGMAP static int lem_rxd = EM_DEFAULT_RXD; +#else +static int lem_rxd = SLOTS_NUMBER; +#endif static int lem_txd = EM_DEFAULT_TXD; static int lem_smart_pwr_down = FALSE; ==== //depot/projects/soc2010/ringmap/current/sys/dev/e1000/if_lem.h#23 (text+ko) ==== @@ -70,15 +70,17 @@ * (num_tx_desc * sizeof(struct e1000_tx_desc)) % 128 == 0 */ #define EM_MIN_RXD 80 +#ifndef RINGMAP #define EM_MAX_RXD_82543 256 -#ifndef RINGMAP #define EM_MAX_RXD 2048 #define EM_DEFAULT_RXD EM_MAX_RXD_82543 -#else +#else +#define EM_MAX_RXD_82543 SLOTS_NUMBER #define EM_MAX_RXD SLOTS_NUMBER -#define EM_DEFAULT_RXD SLOTS_NUMBER +#define EM_DEFAULT_RXD SLOTS_NUMBER #endif + /* * EM_TIDV - Transmit Interrupt Delay Value * Valid Range: 0-65535 (0=off) ==== //depot/projects/soc2010/ringmap/current/sys/dev/e1000/ringmap_8254.c#38 (text+ko) ==== @@ -25,6 +25,8 @@ void rm_8254_receive_enable (struct ringmap *rm); void rm_8254_intr_disable (struct ringmap *rm); void rm_8254_intr_enable (struct ringmap *rm); +unsigned int rm_8254_get_slotsnum(struct ring *); +void rm_8254_set_slotsnum(struct ring *); extern devclass_t em_devclass; @@ -47,6 +49,8 @@ .receive_enable = rm_8254_receive_enable, .intr_disable = rm_8254_intr_disable, .intr_enable = rm_8254_intr_enable, + .get_slotsnum = rm_8254_get_slotsnum, + .set_slotsnum = rm_8254_set_slotsnum, }; @@ -170,3 +174,15 @@ return (0); } + + +unsigned int rm_8254_get_slotsnum(struct ring *ring) +{ + return (ring->size); +} + + +void rm_8254_set_slotsnum(struct ring *ring) +{ + ring->size = SLOTS_NUMBER; +} ==== //depot/projects/soc2010/ringmap/current/sys/net/ringmap.c#54 (text+ko) ==== @@ -252,7 +252,13 @@ err = EIO; goto out; } - ring->size = SLOTS_NUMBER; + rm->funcs->set_slotsnum(ring); + if (ring->size == 0) { + RINGMAP_ERROR(Could not get the number of buffers in the ring); + contigfree(ring, sizeof(struct ring), M_DEVBUF); + err = EIO; + goto out; + } /* * create the capturing object wich will represent current thread and @@ -260,9 +266,10 @@ */ MALLOC(co, struct capt_object *, sizeof(struct capt_object), M_DEVBUF, (M_ZERO | M_WAITOK)); - if ( co == NULL ) { + if (co == NULL) { contigfree(ring, sizeof(struct ring), M_DEVBUF); - err = EIO; goto out; + err = EIO; + goto out; } co->ring = ring; co->td = td; ==== //depot/projects/soc2010/ringmap/current/sys/net/ringmap.h#53 (text+ko) ==== @@ -19,12 +19,14 @@ */ #define DEFAULT_QUEUE 1 -/* TODO: eliminate it. 1 - enable time stamping in the driver */ +/* 1 - enable time stamping in the driver + * TODO: eliminate it. + */ #define RINGMAP_TIMESTAMP 1 /* - * TODO: should not be as macro: Max number of user threads that capture - * using ringmap + * TODO: should not be as macro + * Max number of user threads that capture using ringmap */ #define RINGMAP_MAX_THREADS 8 @@ -34,9 +36,9 @@ * I am looking how to eliminate it. */ struct address { - vm_paddr_t volatile phys; - vm_offset_t volatile kern; - vm_offset_t volatile user; + vm_paddr_t phys; + vm_offset_t kern; + vm_offset_t user; }; /* @@ -93,7 +95,7 @@ unsigned int volatile userrp; /* Number of slots (descriptors a.k.a memory areas for frames) */ - unsigned int size; + int size; /* Values from adapters statistic registers. Currently is not used */ struct address hw_stats; @@ -126,7 +128,7 @@ unsigned long long intr_num; /* Array of slots (A.K.A packet buffers) */ - struct ring_slot volatile slot[SLOTS_NUMBER]; + struct ring_slot slot[SLOTS_NUMBER]; }; /* For libpcap. To be set in the pcap structure */ @@ -137,13 +139,14 @@ struct ring *ring; }; -/* ************************************* - * IOCTL ' s system calls * - * *************************************/ + +/** + ** IOCTLs + **/ #define RINGMAP_IOC_MAGIC 'T' /* - * Should call the function that synchtonizes hardware TAIL + * Should call the function that synchronizes hardware TAIL * with SW_TAIL(ring) */ #define IOCTL_SYNC_TAIL _IO(RINGMAP_IOC_MAGIC, 1) @@ -153,7 +156,7 @@ /* * Disable interrupts on NIC. In some cases it is safe - * to disable interrupts in order to avoid kernel panics + * to disable interrupts. */ #define IOCTL_DISABLE_INTR _IO(RINGMAP_IOC_MAGIC, 3) @@ -188,10 +191,10 @@ /********************************************** - * Arithmetic in Ring Buffer + * Arithmetic in ring buffer **********************************************/ -/* Software HEAD and TAIL ring pointers */ +/* HEAD and TAIL ring pointers */ #define SW_TAIL(ringp) ((ringp)->userrp) #define SW_HEAD(ringp) ((ringp)->kernrp) @@ -208,11 +211,11 @@ #define R_DISTANCE(a, b) \ RING_DISTANCE((a), (b), (SLOTS_NUMBER)) -/* Distance from head to tail in ring */ +/* Distance from head to tail in the ring */ #define SW_HEAD_TO_TAIL_DIST(ringp) \ R_DISTANCE(SW_HEAD(ringp), SW_TAIL(ringp)) -/* Distance from tail to head in ring */ +/* Distance from tail to head in the ring */ #define SW_TAIL_TO_HEAD_DIST(ringp) \ ((SW_TAIL(ringp) == SW_HEAD(ringp)) ? SLOTS_NUMBER : \ R_DISTANCE(SW_TAIL(ringp), SW_HEAD(ringp))) @@ -221,7 +224,7 @@ (SW_TAIL(ringp)) = R_MODULO(SW_TAIL(ringp) + 1); #define RING_IS_EMPTY(ringp) \ - ((SW_TAIL_TO_HEAD_DIST(ringp)) <= 1) + ((SW_TAIL_TO_HEAD_DIST(ringp)) == 1) #define RING_NOT_EMPTY(ringp) \ ((SW_TAIL_TO_HEAD_DIST(ringp)) > 1) @@ -229,6 +232,10 @@ #define RING_IS_FULL(ringp) \ ((SW_HEAD_TO_TAIL_DIST(ringp)) == 0) + +/** + ** Access to the ring members + **/ #define RING_SLOT(ringp, i) \ ((ringp)->slot[(i)]) @@ -250,23 +257,23 @@ #define K_PACKET(ringp, i) \ RING_SLOT((ringp), (i)).packet.kern -/* - * DEBUG OUTPUT - */ +/** + ** DEBUG OUTPUT + **/ #ifndef RINGMAP_IOCTL_DEB -#define RINGMAP_IOCTL_DEB 1 +#define RINGMAP_IOCTL_DEB 0 #else #define RINGMAP_IOCTL_DEB 1 #endif #ifndef RINGMAP_INTR_DEB -#define RINGMAP_INTR_DEB 1 +#define RINGMAP_INTR_DEB 0 #else #define RINGMAP_INTR_DEB 1 #endif #ifndef __RINGMAP_DEB -#define __RINGMAP_DEB 1 +#define __RINGMAP_DEB 0 #elif #define __RINGMAP_DEB 1 #endif ==== //depot/projects/soc2010/ringmap/current/sys/net/ringmap_kernel.h#22 (text+ko) ==== @@ -4,6 +4,7 @@ struct ring; struct capt_object { + /* Slots number in the ring buffer */ struct ringmap *rm; struct thread *td; @@ -134,6 +135,10 @@ void (*receive_enable)(struct ringmap *rm); void (*intr_enable)(struct ringmap *rm); + + /* Slots number in the ring buffer */ + void (*set_slotsnum)(struct ring *); + unsigned int (*get_slotsnum)(struct ring *); }; ==== //depot/projects/soc2010/ringmap/scripts/build_ringmap.sh#36 (text+ko) ==== ==== //depot/projects/soc2010/ringmap/scripts/set_ringmap.sh#37 (text+ko) ==== ==== //depot/projects/soc2010/ringmap/scripts/tailf_ringmap_msgs.sh#31 (text+ko) ==== ==== //depot/projects/soc2010/ringmap/stable_8/lib/libpcap/Makefile#2 (text+ko) ==== @@ -11,6 +11,11 @@ etherent.c savefile.c bpf_filter.c bpf_image.c bpf_dump.c \ scanner.l version.c +.if defined(LIBPCAP_RINGMAP) +CFLAGS+=-g -DRINGMAP +SRCS+=ringmap_pcap.c +.endif + # Old compatibility headers INCS= pcap.h pcap-int.h pcap-namedb.h pcap-bpf.h From owner-p4-projects@FreeBSD.ORG Mon Dec 20 18:02:01 2010 Return-Path: Delivered-To: p4-projects@freebsd.org Received: by hub.freebsd.org (Postfix, from userid 32767) id 24B491065674; Mon, 20 Dec 2010 18:02:01 +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 DB5B4106566C for ; Mon, 20 Dec 2010 18:02:00 +0000 (UTC) (envelope-from afiveg@FreeBSD.org) Received: from skunkworks.freebsd.org (skunkworks.freebsd.org [IPv6:2001:4f8:fff6::2d]) by mx1.freebsd.org (Postfix) with ESMTP id C83518FC13 for ; Mon, 20 Dec 2010 18:02:00 +0000 (UTC) Received: from skunkworks.freebsd.org (localhost [127.0.0.1]) by skunkworks.freebsd.org (8.14.4/8.14.4) with ESMTP id oBKI206w081606 for ; Mon, 20 Dec 2010 18:02:00 GMT (envelope-from afiveg@FreeBSD.org) Received: (from perforce@localhost) by skunkworks.freebsd.org (8.14.4/8.14.4/Submit) id oBKI209j081603 for perforce@freebsd.org; Mon, 20 Dec 2010 18:02:00 GMT (envelope-from afiveg@FreeBSD.org) Date: Mon, 20 Dec 2010 18:02:00 GMT Message-Id: <201012201802.oBKI209j081603@skunkworks.freebsd.org> X-Authentication-Warning: skunkworks.freebsd.org: perforce set sender to afiveg@FreeBSD.org using -f From: Alexandre Fiveg To: Perforce Change Reviews Precedence: bulk Cc: Subject: PERFORCE change 187082 for review X-BeenThere: p4-projects@freebsd.org X-Mailman-Version: 2.1.5 List-Id: p4 projects tree changes List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Mon, 20 Dec 2010 18:02:01 -0000 http://p4web.freebsd.org/@@187082?ac=10 Change 187082 by afiveg@cottonmouth on 2010/12/20 18:01:00 Initial port to -STABLE Affected files ... .. //depot/projects/soc2010/ringmap/stable_8/contrib/libpcap/ringmap_pcap.c#1 add .. //depot/projects/soc2010/ringmap/stable_8/sys/dev/e1000/ringmap_8254.c#1 add .. //depot/projects/soc2010/ringmap/stable_8/sys/net/ringmap.c#1 add .. //depot/projects/soc2010/ringmap/stable_8/sys/net/ringmap.h#1 add .. //depot/projects/soc2010/ringmap/stable_8/sys/net/ringmap_kernel.h#1 add Differences ... From owner-p4-projects@FreeBSD.ORG Tue Dec 21 17:36:12 2010 Return-Path: Delivered-To: p4-projects@freebsd.org Received: by hub.freebsd.org (Postfix, from userid 32767) id 9DD731065674; Tue, 21 Dec 2010 17:36:12 +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 47D361065672 for ; Tue, 21 Dec 2010 17:36:12 +0000 (UTC) (envelope-from afiveg@FreeBSD.org) Received: from skunkworks.freebsd.org (skunkworks.freebsd.org [IPv6:2001:4f8:fff6::2d]) by mx1.freebsd.org (Postfix) with ESMTP id 3452B8FC22 for ; Tue, 21 Dec 2010 17:36:12 +0000 (UTC) Received: from skunkworks.freebsd.org (localhost [127.0.0.1]) by skunkworks.freebsd.org (8.14.4/8.14.4) with ESMTP id oBLHaC3f079630 for ; Tue, 21 Dec 2010 17:36:12 GMT (envelope-from afiveg@FreeBSD.org) Received: (from perforce@localhost) by skunkworks.freebsd.org (8.14.4/8.14.4/Submit) id oBLHaBg5079627 for perforce@freebsd.org; Tue, 21 Dec 2010 17:36:11 GMT (envelope-from afiveg@FreeBSD.org) Date: Tue, 21 Dec 2010 17:36:11 GMT Message-Id: <201012211736.oBLHaBg5079627@skunkworks.freebsd.org> X-Authentication-Warning: skunkworks.freebsd.org: perforce set sender to afiveg@FreeBSD.org using -f From: Alexandre Fiveg To: Perforce Change Reviews Precedence: bulk Cc: Subject: PERFORCE change 187104 for review X-BeenThere: p4-projects@freebsd.org X-Mailman-Version: 2.1.5 List-Id: p4 projects tree changes List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Tue, 21 Dec 2010 17:36:12 -0000 http://p4web.freebsd.org/@@187104?ac=10 Change 187104 by afiveg@cottonmouth on 2010/12/21 17:35:15 ringmap is ported to -STABLE. One BUG is still remain: The userspace process is not awoken after receive a first packet. Affected files ... .. //depot/projects/soc2010/ringmap/current/sys/dev/e1000/if_lem.c#38 edit .. //depot/projects/soc2010/ringmap/scripts/build_ringmap.sh#37 edit .. //depot/projects/soc2010/ringmap/scripts/set_ringmap.sh#38 edit .. //depot/projects/soc2010/ringmap/scripts/tailf_ringmap_msgs.sh#32 edit .. //depot/projects/soc2010/ringmap/stable_8/contrib/libpcap/pcap-bpf.c#2 edit .. //depot/projects/soc2010/ringmap/stable_8/contrib/libpcap/pcap-int.h#2 edit .. //depot/projects/soc2010/ringmap/stable_8/contrib/libpcap/pcap.c#2 edit .. //depot/projects/soc2010/ringmap/stable_8/contrib/libpcap/ringmap_pcap.c#2 edit .. //depot/projects/soc2010/ringmap/stable_8/lib/libpcap/Makefile#3 edit .. //depot/projects/soc2010/ringmap/stable_8/sys/dev/e1000/if_lem.c#2 edit .. //depot/projects/soc2010/ringmap/stable_8/sys/dev/e1000/if_lem.h#2 edit .. //depot/projects/soc2010/ringmap/stable_8/sys/dev/e1000/ringmap_8254.c#2 edit .. //depot/projects/soc2010/ringmap/stable_8/sys/i386/conf/I686_STABLE#2 edit .. //depot/projects/soc2010/ringmap/stable_8/sys/modules/ringmap/Makefile#1 add .. //depot/projects/soc2010/ringmap/stable_8/sys/modules/ringmap/Makefile.em#1 add .. //depot/projects/soc2010/ringmap/stable_8/sys/net/ringmap.c#2 edit .. //depot/projects/soc2010/ringmap/stable_8/sys/net/ringmap.h#2 edit .. //depot/projects/soc2010/ringmap/stable_8/sys/net/ringmap_kernel.h#2 edit Differences ... ==== //depot/projects/soc2010/ringmap/current/sys/dev/e1000/if_lem.c#38 (text+ko) ==== ==== //depot/projects/soc2010/ringmap/scripts/build_ringmap.sh#37 (text+ko) ==== @@ -1,7 +1,21 @@ #!/usr/local/bin/bash -RINGMAP_BUILD_DIR=../current/sys/modules/ringmap/ -LIBPCAP_BUILD_DIR=../current/lib/libpcap/ +# wich system release +uname -r | grep STABLE | grep 8 +if [ $? -eq 0 ] +then + echo "Building ringmap for FreeBSD-STABLE..." + echo + sleep 1 + RINGMAP_BUILD_DIR=../stable_8/sys/modules/ringmap/ + LIBPCAP_BUILD_DIR=../stable_8/lib/libpcap/ +else + echo "Building ringmap for FreeBSD-CURRENT..." + echo + sleep 1 + RINGMAP_BUILD_DIR=../current/sys/modules/ringmap/ + LIBPCAP_BUILD_DIR=../current/lib/libpcap/ +fi make_ringmap() { cd ${RINGMAP_BUILD_DIR} @@ -50,12 +64,12 @@ exit 1; fi +sync + echo echo Everything seems to be Ok. echo For loading ringmap driver and for installing libpcap do: echo sudo ./set_ringmap.sh echo -sync - exit 0 ==== //depot/projects/soc2010/ringmap/scripts/set_ringmap.sh#38 (text+ko) ==== @@ -1,7 +1,21 @@ #!/bin/sh -RINGMAP_BUILD_DIR=../current/sys/modules/ringmap/ -LIBPCAP_BUILD_DIR=../current/lib/libpcap/ +# wich system release +uname -r | grep STABLE | grep 8 +if [ $? -eq 0 ] +then + echo "Installing ringmap for FreeBSD-STABLE..." + echo + sleep 1 + RINGMAP_BUILD_DIR=../stable_8/sys/modules/ringmap/ + LIBPCAP_BUILD_DIR=../stable_8/lib/libpcap/ +else + echo "Installing ringmap for FreeBSD-CURRENT..." + echo + sleep 1 + RINGMAP_BUILD_DIR=../current/sys/modules/ringmap/ + LIBPCAP_BUILD_DIR=../current/lib/libpcap/ +fi check_module() { @@ -46,4 +60,7 @@ echo sync + +echo "Before using ringmap set the network interface in monitoring mode" +echo exit 0 ==== //depot/projects/soc2010/ringmap/scripts/tailf_ringmap_msgs.sh#32 (text+ko) ==== ==== //depot/projects/soc2010/ringmap/stable_8/contrib/libpcap/pcap-bpf.c#2 (text+ko) ==== @@ -161,6 +161,11 @@ #define DLT_IEEE802_11_RADIO_AVS 163 #endif +#ifdef RINGMAP +#include +extern void uninit_mmapped_capturing(pcap_t *); +#endif + static int pcap_can_set_rfmon_bpf(pcap_t *p); static int pcap_activate_bpf(pcap_t *p); static int pcap_setfilter_bpf(pcap_t *p, struct bpf_program *fp); @@ -1135,6 +1140,11 @@ struct ifreq ifr; #endif +#ifdef RINGMAP + if (p->rp.status == 1) { + uninit_mmapped_capturing(p); + } +#endif if (p->md.must_clear != 0) { /* * There's something we have to do when closing this ==== //depot/projects/soc2010/ringmap/stable_8/contrib/libpcap/pcap-int.h#2 (text+ko) ==== @@ -56,6 +56,10 @@ #include #endif +#ifdef RINGMAP +#include "../../sys/net/ringmap.h" +#endif + #if (defined(_MSC_VER) && (_MSC_VER <= 1200)) /* we are compiling with Visual Studio 6, that doesn't support the LL suffix*/ /* @@ -331,6 +335,10 @@ u_int *dlt_list; struct pcap_pkthdr pcap_header; /* This is needed for the pcap_next_ex() to work */ + +#ifdef RINGMAP + struct pcap_ringmap rp; +#endif }; /* ==== //depot/projects/soc2010/ringmap/stable_8/contrib/libpcap/pcap.c#2 (text+ko) ==== @@ -71,6 +71,15 @@ #include #endif +#ifdef RINGMAP +#include + +extern int init_mmapped_capturing(const char *device, pcap_t *); +extern void ringmap_setfilter(struct bpf_program *, pcap_t *); +extern int pcap_read_ringmap(pcap_t *, int , pcap_handler , u_char *); +#endif + + int pcap_not_initialized(pcap_t *pcap) { @@ -229,6 +238,10 @@ pcap_t *p; int status; +#ifdef RINGMAP + RINGMAP_FUNC_DEBUG(start); +#endif + p = pcap_create(source, errbuf); if (p == NULL) return (NULL); @@ -255,6 +268,27 @@ status = pcap_activate(p); if (status < 0) goto fail; + +#ifdef RINGMAP + /* + * The setting of ringmap flags should be done in enother function. Why ? + * We want be able to switch on\off ringmap functionality by setting + * ringmap_flags. In order to do it, the external libpcap application + * should first call the function for setting ringmap_flags. But this + * requires the modification of these application. Thats why I set + * ringmap_flags staticaly here + */ + p->rp.status = set_ringmap_status(1, p); + + /* Replace 1 with RINGMAP_ACTIVE macro */ + if (p->rp.status == 1) { + if (init_mmapped_capturing(source, p) < 0) + goto fail; + p->read_op = pcap_read_ringmap; + } +#endif + + return (p); fail: if (status == PCAP_ERROR || status == PCAP_ERROR_NO_SUCH_DEVICE || @@ -984,7 +1018,18 @@ int pcap_setfilter(pcap_t *p, struct bpf_program *fp) { +#ifdef RINGMAP + int err = p->setfilter_op(p, fp); + + if (p->rp.status == 1) { + if (err == 0) + ringmap_setfilter(fp, p); + } + + return (err); +#else return p->setfilter_op(p, fp); +#endif } /* ==== //depot/projects/soc2010/ringmap/stable_8/contrib/libpcap/ringmap_pcap.c#2 (text+ko) ==== ==== //depot/projects/soc2010/ringmap/stable_8/lib/libpcap/Makefile#3 (text+ko) ==== @@ -12,7 +12,7 @@ scanner.l version.c .if defined(LIBPCAP_RINGMAP) -CFLAGS+=-g -DRINGMAP +CFLAGS+=-g -DRINGMAP -D__RINGMAP_DEB SRCS+=ringmap_pcap.c .endif ==== //depot/projects/soc2010/ringmap/stable_8/sys/dev/e1000/if_lem.c#2 (text+ko) ==== @@ -81,6 +81,14 @@ #include #include "e1000_api.h" + +#ifdef RINGMAP +#include +extern struct ringmap * ringmap_attach(device_t, struct ringmap_functions *); +extern int ringmap_detach (struct ringmap *); +extern struct ringmap_functions ringmap_8254_functions; +#endif + #include "if_lem.h" /********************************************************************* @@ -658,6 +666,14 @@ adapter->led_dev = led_create(lem_led_func, adapter, device_get_nameunit(dev)); +#ifdef RINGMAP + adapter->rm = ringmap_attach (dev, &ringmap_8254_functions); + if (adapter->rm == NULL) { + goto err_rx_struct; + } +#endif + + INIT_DEBUGOUT("lem_attach: end"); return (0); @@ -698,6 +714,10 @@ INIT_DEBUGOUT("em_detach: begin"); +#ifdef RINGMAP + ringmap_detach (adapter->rm); +#endif + /* Make sure VLANS are not using driver */ #if __FreeBSD_version >= 700000 if (adapter->ifp->if_vlantrunk != NULL) { @@ -3459,6 +3479,10 @@ int i, rx_sent = 0; struct e1000_rx_desc *current_desc; +#ifdef RINGMAP + struct capt_object *co = NULL; +#endif + EM_RX_LOCK(adapter); i = adapter->next_rx_desc_to_check; current_desc = &adapter->rx_desc_base[i]; @@ -3472,6 +3496,10 @@ return (FALSE); } +#ifdef RINGMAP + co = adapter->rm->funcs->delayed_isr(adapter, adapter->rm); +#endif + while ((current_desc->status & E1000_RXD_STAT_DD) && (count != 0) && (ifp->if_drv_flags & IFF_DRV_RUNNING)) { @@ -3524,10 +3552,25 @@ } if (accept_frame) { + +#ifdef RINGMAP + RINGMAP_LOCK(adapter->rm); + if ((co != NULL) && (co->ring != NULL)) + adapter->rm->funcs->per_packet_iteration(co, i); + else { +#endif + if (lem_get_buf(adapter, i) != 0) { ifp->if_iqdrops++; +#ifdef RINGMAP + RINGMAP_UNLOCK(adapter->rm); +#endif goto discard; } +#ifdef RINGMAP + } + RINGMAP_UNLOCK(adapter->rm); +#endif /* Assign correct length to the current fragment */ mp->m_len = len; @@ -3614,20 +3657,50 @@ /* Call into the stack */ if (m != NULL) { adapter->next_rx_desc_to_check = i; + +#ifdef RINGMAP + RINGMAP_LOCK(adapter->rm); + if ((co == NULL) || (co->ring == NULL)) { +#endif EM_RX_UNLOCK(adapter); (*ifp->if_input)(ifp, m); EM_RX_LOCK(adapter); + +#ifdef RINGMAP + } + RINGMAP_UNLOCK(adapter->rm); +#endif + rx_sent++; i = adapter->next_rx_desc_to_check; } current_desc = &adapter->rx_desc_base[i]; } + +#ifdef RINGMAP + RINGMAP_LOCK(adapter->rm); + if ((co != NULL) && (co->ring != NULL) && (RING_NOT_EMPTY(co->ring))) + wakeup(co->ring); + RINGMAP_UNLOCK(adapter->rm); +#endif + adapter->next_rx_desc_to_check = i; /* Advance the E1000's Receive Queue #0 "Tail Pointer". */ if (--i < 0) i = adapter->num_rx_desc - 1; - E1000_WRITE_REG(&adapter->hw, E1000_RDT(0), i); + + /* RINGMAP: Don't write RDT. We'll do it after user has read packet */ +#ifdef RINGMAP + RINGMAP_LOCK(adapter->rm); + if ((co == NULL) || (co->ring == NULL)) { +#endif + E1000_WRITE_REG(&adapter->hw, E1000_RDT(0), i); +#ifdef RINGMAP + } + RINGMAP_UNLOCK(adapter->rm); +#endif + if (done != NULL) *done = rx_sent; EM_RX_UNLOCK(adapter); ==== //depot/projects/soc2010/ringmap/stable_8/sys/dev/e1000/if_lem.h#2 (text+ko) ==== @@ -70,9 +70,15 @@ * (num_tx_desc * sizeof(struct e1000_tx_desc)) % 128 == 0 */ #define EM_MIN_RXD 80 +#ifndef RINGMAP #define EM_MAX_RXD_82543 256 -#define EM_MAX_RXD 4096 +#define EM_MAX_RXD 2048 #define EM_DEFAULT_RXD EM_MAX_RXD_82543 +#else +#define EM_MAX_RXD_82543 SLOTS_NUMBER +#define EM_MAX_RXD SLOTS_NUMBER +#define EM_DEFAULT_RXD SLOTS_NUMBER +#endif /* * EM_TIDV - Transmit Interrupt Delay Value @@ -421,6 +427,9 @@ boolean_t pcix_82544; boolean_t in_detach; +#ifdef RINGMAP + struct ringmap *rm; +#endif struct e1000_hw_stats stats; }; ==== //depot/projects/soc2010/ringmap/stable_8/sys/dev/e1000/ringmap_8254.c#2 (text+ko) ==== ==== //depot/projects/soc2010/ringmap/stable_8/sys/i386/conf/I686_STABLE#2 (text+ko) ==== @@ -202,7 +202,7 @@ # PCI Ethernet NICs. #device de # DEC/Intel DC21x4x (``Tulip'') -device em # Intel PRO/1000 Gigabit Ethernet Family +#device em # Intel PRO/1000 Gigabit Ethernet Family #device igb # Intel PRO/1000 PCIE Server Gigabit Family #device ixgb # Intel PRO/10GbE Ethernet Card #device le # AMD Am7900 LANCE and Am79C9xx PCnet ==== //depot/projects/soc2010/ringmap/stable_8/sys/net/ringmap.c#2 (text+ko) ==== @@ -338,6 +338,7 @@ CAPT_OBJECT_DEB(co); rm = co->rm; + /* TODO: wake up if we are currently sleeping */ contigfree(co->ring, sizeof(struct ring), M_DEVBUF); co->ring = NULL; ==== //depot/projects/soc2010/ringmap/stable_8/sys/net/ringmap.h#2 (text+ko) ==== @@ -274,7 +274,7 @@ #ifndef __RINGMAP_DEB #define __RINGMAP_DEB 0 -#elif +#else #define __RINGMAP_DEB 1 #endif ==== //depot/projects/soc2010/ringmap/stable_8/sys/net/ringmap_kernel.h#2 (text+ko) ==== From owner-p4-projects@FreeBSD.ORG Tue Dec 21 18:28:54 2010 Return-Path: Delivered-To: p4-projects@freebsd.org Received: by hub.freebsd.org (Postfix, from userid 32767) id 1B4DE1065674; Tue, 21 Dec 2010 18:28:54 +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 B9A3E1065672 for ; Tue, 21 Dec 2010 18:28:53 +0000 (UTC) (envelope-from afiveg@FreeBSD.org) Received: from skunkworks.freebsd.org (skunkworks.freebsd.org [IPv6:2001:4f8:fff6::2d]) by mx1.freebsd.org (Postfix) with ESMTP id 8C9528FC1C for ; Tue, 21 Dec 2010 18:28:53 +0000 (UTC) Received: from skunkworks.freebsd.org (localhost [127.0.0.1]) by skunkworks.freebsd.org (8.14.4/8.14.4) with ESMTP id oBLISr1q089953 for ; Tue, 21 Dec 2010 18:28:53 GMT (envelope-from afiveg@FreeBSD.org) Received: (from perforce@localhost) by skunkworks.freebsd.org (8.14.4/8.14.4/Submit) id oBLISrT9089950 for perforce@freebsd.org; Tue, 21 Dec 2010 18:28:53 GMT (envelope-from afiveg@FreeBSD.org) Date: Tue, 21 Dec 2010 18:28:53 GMT Message-Id: <201012211828.oBLISrT9089950@skunkworks.freebsd.org> X-Authentication-Warning: skunkworks.freebsd.org: perforce set sender to afiveg@FreeBSD.org using -f From: Alexandre Fiveg To: Perforce Change Reviews Precedence: bulk Cc: Subject: PERFORCE change 187106 for review X-BeenThere: p4-projects@freebsd.org X-Mailman-Version: 2.1.5 List-Id: p4 projects tree changes List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Tue, 21 Dec 2010 18:28:54 -0000 http://p4web.freebsd.org/@@187106?ac=10 Change 187106 by afiveg@cottonmouth on 2010/12/21 18:28:21 The previous bug is fixed: ring->kernrp should point to the next from the current checked slot in the ring. Ringmap is ported to 8.1-STABLE. Next performance tests will be done. Affected files ... .. //depot/projects/soc2010/ringmap/scripts/build_ringmap.sh#38 edit .. //depot/projects/soc2010/ringmap/scripts/set_ringmap.sh#39 edit .. //depot/projects/soc2010/ringmap/scripts/tailf_ringmap_msgs.sh#33 edit .. //depot/projects/soc2010/ringmap/stable_8/contrib/libpcap/ringmap_pcap.c#3 edit .. //depot/projects/soc2010/ringmap/stable_8/lib/libpcap/Makefile#4 edit .. //depot/projects/soc2010/ringmap/stable_8/sys/modules/ringmap/Makefile#2 edit .. //depot/projects/soc2010/ringmap/stable_8/sys/modules/ringmap/Makefile.em#2 edit .. //depot/projects/soc2010/ringmap/stable_8/sys/net/ringmap.c#3 edit Differences ... ==== //depot/projects/soc2010/ringmap/scripts/build_ringmap.sh#38 (text+ko) ==== ==== //depot/projects/soc2010/ringmap/scripts/set_ringmap.sh#39 (text+ko) ==== ==== //depot/projects/soc2010/ringmap/scripts/tailf_ringmap_msgs.sh#33 (text+ko) ==== ==== //depot/projects/soc2010/ringmap/stable_8/contrib/libpcap/ringmap_pcap.c#3 (text+ko) ==== ==== //depot/projects/soc2010/ringmap/stable_8/lib/libpcap/Makefile#4 (text+ko) ==== @@ -12,7 +12,7 @@ scanner.l version.c .if defined(LIBPCAP_RINGMAP) -CFLAGS+=-g -DRINGMAP -D__RINGMAP_DEB +CFLAGS+=-g -DRINGMAP SRCS+=ringmap_pcap.c .endif ==== //depot/projects/soc2010/ringmap/stable_8/sys/modules/ringmap/Makefile#2 (text+ko) ==== ==== //depot/projects/soc2010/ringmap/stable_8/sys/modules/ringmap/Makefile.em#2 (text+ko) ==== @@ -15,7 +15,7 @@ PCIE_SHARED = e1000_80003es2lan.c e1000_ich8lan.c e1000_82571.c e1000_82575.c LEGACY_SHARED = e1000_82540.c e1000_82542.c e1000_82541.c e1000_82543.c -CFLAGS += -g -I${.CURDIR}/../../dev/e1000 -DRINGMAP +CFLAGS += -g -I${.CURDIR}/../../dev/e1000 -DRINGMAP # DEVICE_POLLING for a non-interrupt-driven method #CFLAGS += -DDEVICE_POLLING ==== //depot/projects/soc2010/ringmap/stable_8/sys/net/ringmap.c#3 (text+ko) ==== @@ -568,10 +568,12 @@ #if (RINGMAP_INTR_DEB) PRINT_RING_PTRS(co->ring); #endif - rm->funcs->set_tail(co->ring->userrp, co->hw_rx_ring); /* set hardware speciffic time stamp function */ getmicrotime(&co->ring->last_ts); + ++co->ring->intr_num; + rm->funcs->set_tail(co->ring->userrp, co->hw_rx_ring); + break; } } @@ -597,7 +599,7 @@ if (rm->funcs->pkt_filter != NULL) rm->funcs->pkt_filter(co, slot_num); - co->ring->kernrp = slot_num; + co->ring->kernrp = R_MODULO(slot_num + 1); #ifdef RINGMAP_TIMESTAMP co->ring->slot[slot_num].ts = co->ring->last_ts; #endif From owner-p4-projects@FreeBSD.ORG Wed Dec 22 15:21:32 2010 Return-Path: Delivered-To: p4-projects@freebsd.org Received: by hub.freebsd.org (Postfix, from userid 32767) id BC39110656A8; Wed, 22 Dec 2010 15:21:32 +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 7E607106566C for ; Wed, 22 Dec 2010 15:21:32 +0000 (UTC) (envelope-from afiveg@FreeBSD.org) Received: from skunkworks.freebsd.org (skunkworks.freebsd.org [IPv6:2001:4f8:fff6::2d]) by mx1.freebsd.org (Postfix) with ESMTP id 622098FC16 for ; Wed, 22 Dec 2010 15:21:32 +0000 (UTC) Received: from skunkworks.freebsd.org (localhost [127.0.0.1]) by skunkworks.freebsd.org (8.14.4/8.14.4) with ESMTP id oBMFLW65051710 for ; Wed, 22 Dec 2010 15:21:32 GMT (envelope-from afiveg@FreeBSD.org) Received: (from perforce@localhost) by skunkworks.freebsd.org (8.14.4/8.14.4/Submit) id oBMFLW7d051707 for perforce@freebsd.org; Wed, 22 Dec 2010 15:21:32 GMT (envelope-from afiveg@FreeBSD.org) Date: Wed, 22 Dec 2010 15:21:32 GMT Message-Id: <201012221521.oBMFLW7d051707@skunkworks.freebsd.org> X-Authentication-Warning: skunkworks.freebsd.org: perforce set sender to afiveg@FreeBSD.org using -f From: Alexandre Fiveg To: Perforce Change Reviews Precedence: bulk Cc: Subject: PERFORCE change 187132 for review X-BeenThere: p4-projects@freebsd.org X-Mailman-Version: 2.1.5 List-Id: p4 projects tree changes List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Wed, 22 Dec 2010 15:21:33 -0000 http://p4web.freebsd.org/@@187132?ac=10 Change 187132 by afiveg@cottonmouth on 2010/12/22 15:20:52 Bugfix: panic by kldunload during the capturing thread sleeps and waits for new packets. Affected files ... .. //depot/projects/soc2010/ringmap/current/sys/net/ringmap.c#55 edit .. //depot/projects/soc2010/ringmap/current/sys/net/ringmap.h#54 edit .. //depot/projects/soc2010/ringmap/current/sys/net/ringmap_kernel.h#23 edit .. //depot/projects/soc2010/ringmap/scripts/build_ringmap.sh#39 edit .. //depot/projects/soc2010/ringmap/scripts/set_ringmap.sh#40 edit .. //depot/projects/soc2010/ringmap/scripts/tailf_ringmap_msgs.sh#34 edit .. //depot/projects/soc2010/ringmap/stable_8/contrib/libpcap/ringmap_pcap.c#4 edit .. //depot/projects/soc2010/ringmap/stable_8/sys/net/ringmap.c#4 edit .. //depot/projects/soc2010/ringmap/stable_8/sys/net/ringmap.h#3 edit .. //depot/projects/soc2010/ringmap/stable_8/sys/net/ringmap_kernel.h#3 edit Differences ... ==== //depot/projects/soc2010/ringmap/current/sys/net/ringmap.c#55 (text+ko) ==== @@ -13,6 +13,7 @@ #include #include #include +#include #include #include @@ -274,6 +275,7 @@ co->ring = ring; co->td = td; co->rm = rm; + co->can_sleep = 1; SLIST_INSERT_HEAD(&rm->object_list, co, objects); @@ -332,17 +334,27 @@ RINGMAP_FUNC_DEBUG(start); co = (struct capt_object *)data; + if (co == NULL) { + return ; + } RINGMAP_LOCK(co->rm); CAPT_OBJECT_DEB(co); rm = co->rm; + + /* probably we are sleeping now */ + co->can_sleep = 0; + wakeup(co->ring); + contigfree(co->ring, sizeof(struct ring), M_DEVBUF); co->ring = NULL; - SLIST_REMOVE(&rm->object_list, co, capt_object, objects); - FREE(co, M_DEVBUF); + if (!SLIST_EMPTY(&rm->object_list)) { + SLIST_REMOVE(&rm->object_list, co, capt_object, objects); + FREE(co, M_DEVBUF); + } if (rm->open_cnt > 0) --rm->open_cnt; @@ -410,7 +422,7 @@ if (err != 0) { RINGMAP_IOCTL(Error! Can not get private data!); return (err); - } + } rm = co->rm; @@ -418,30 +430,40 @@ /* Sleep and wait for new packets */ case IOCTL_SLEEP_WAIT: + RINGMAP_LOCK(rm); /* Set the new value into the adapter's TAIL register */ rm->funcs->set_tail(co->ring->userrp, co->hw_rx_ring); CAPT_OBJECT_DEB(co); + /* Is it allowed to sleep ? */ + if (co->can_sleep == 0) { + err = EINVAL; + RINGMAP_UNLOCK(rm); + goto out; + } + /* * Before we are going to sleep it makes a sence to check if we - * really must do it + * really must do it. For example if the ring is not empty, then + * the tread does not need seep and wait for new packets. */ - while (RING_IS_EMPTY(co->ring)) { - RINGMAP_IOCTL(Sleep and wait for new packets); + if (RING_NOT_EMPTY(co->ring)) { + err = EINVAL; + RINGMAP_UNLOCK(rm); + goto out; + } + + RINGMAP_IOCTL(Sleep and wait for new packets); - /* Count how many times we wait for new packets */ - co->ring->user_wait_kern++; + /* Count how many times we wait for new packets */ + co->ring->user_wait_kern++; + RINGMAP_UNLOCK(rm); - err = tsleep(co->ring, - (PRI_MAX_ITHD) | PCATCH, "ioctl", 0); - /* go back into user-space by catching signal */ - if (err) - goto out; - } + err = tsleep(co->ring, + (PRI_MAX_ITHD) | PCATCH, "ioctl", 0); break; - /* Synchronize sowftware ring-tail with hardware-ring-tail (RDT) */ case IOCTL_SYNC_TAIL: RINGMAP_LOCK(rm); @@ -449,7 +471,6 @@ RINGMAP_UNLOCK(rm); break; - case IOCTL_SETFILTER: bpf_prog = (struct bpf_program *)data; flen = bpf_prog->bf_len; @@ -477,14 +498,12 @@ co->rm->funcs->pkt_filter = ringmap_bpf_filter; break; - /* Tell user how many queues we have */ case IOCTL_GETQUEUE_NUM: qn = rm->funcs->get_queuesnum(); *(int *)data = qn; break; - /* Associate the ring/queue with the capturing object */ case IOCTL_ATTACH_RING: /* First stop receive and interupts while we allocate our data */ @@ -512,7 +531,6 @@ rm->funcs->receive_enable(rm); break; - default: RINGMAP_ERROR("Undefined command!"); err = ENODEV; @@ -567,10 +585,12 @@ #if (RINGMAP_INTR_DEB) PRINT_RING_PTRS(co->ring); #endif - rm->funcs->set_tail(co->ring->userrp, co->hw_rx_ring); /* set hardware speciffic time stamp function */ getmicrotime(&co->ring->last_ts); + ++co->ring->intr_num; + rm->funcs->set_tail(co->ring->userrp, co->hw_rx_ring); + break; } } @@ -596,7 +616,7 @@ if (rm->funcs->pkt_filter != NULL) rm->funcs->pkt_filter(co, slot_num); - co->ring->kernrp = slot_num; + co->ring->kernrp = R_MODULO(slot_num + 1); #ifdef RINGMAP_TIMESTAMP co->ring->slot[slot_num].ts = co->ring->last_ts; #endif ==== //depot/projects/soc2010/ringmap/current/sys/net/ringmap.h#54 (text+ko) ==== @@ -274,7 +274,7 @@ #ifndef __RINGMAP_DEB #define __RINGMAP_DEB 0 -#elif +#else #define __RINGMAP_DEB 1 #endif ==== //depot/projects/soc2010/ringmap/current/sys/net/ringmap_kernel.h#23 (text+ko) ==== @@ -32,6 +32,9 @@ */ void *intr_context; + /* If the thread can sleep */ + int volatile can_sleep; + /* Let's concatenate our objects */ SLIST_ENTRY(capt_object) objects; }; ==== //depot/projects/soc2010/ringmap/scripts/build_ringmap.sh#39 (text+ko) ==== @@ -1,16 +1,16 @@ #!/usr/local/bin/bash # wich system release -uname -r | grep STABLE | grep 8 +uname -r | grep STABLE | grep 8 1>/dev/null if [ $? -eq 0 ] then - echo "Building ringmap for FreeBSD-STABLE..." + echo ; echo "Building ringmap for FreeBSD-STABLE..." echo sleep 1 RINGMAP_BUILD_DIR=../stable_8/sys/modules/ringmap/ LIBPCAP_BUILD_DIR=../stable_8/lib/libpcap/ else - echo "Building ringmap for FreeBSD-CURRENT..." + echo ; echo "Building ringmap for FreeBSD-CURRENT..." echo sleep 1 RINGMAP_BUILD_DIR=../current/sys/modules/ringmap/ ==== //depot/projects/soc2010/ringmap/scripts/set_ringmap.sh#40 (text+ko) ==== @@ -1,7 +1,7 @@ #!/bin/sh # wich system release -uname -r | grep STABLE | grep 8 +uname -r | grep STABLE | grep 8 1>/dev/null if [ $? -eq 0 ] then echo "Installing ringmap for FreeBSD-STABLE..." ==== //depot/projects/soc2010/ringmap/scripts/tailf_ringmap_msgs.sh#34 (text+ko) ==== ==== //depot/projects/soc2010/ringmap/stable_8/contrib/libpcap/ringmap_pcap.c#4 (text+ko) ==== @@ -267,7 +267,7 @@ /* catching signals */ if (err_sleep) { - if (errno == EINTR) { + if ((errno == EINTR) || (errno == EINVAL)) { pcap_close(p); exit(0); } ==== //depot/projects/soc2010/ringmap/stable_8/sys/net/ringmap.c#4 (text+ko) ==== @@ -13,6 +13,7 @@ #include #include #include +#include #include #include @@ -274,6 +275,7 @@ co->ring = ring; co->td = td; co->rm = rm; + co->can_sleep = 1; SLIST_INSERT_HEAD(&rm->object_list, co, objects); @@ -332,18 +334,27 @@ RINGMAP_FUNC_DEBUG(start); co = (struct capt_object *)data; + if (co == NULL) { + return ; + } RINGMAP_LOCK(co->rm); CAPT_OBJECT_DEB(co); rm = co->rm; - /* TODO: wake up if we are currently sleeping */ + + /* probably we are sleeping now */ + co->can_sleep = 0; + wakeup(co->ring); + contigfree(co->ring, sizeof(struct ring), M_DEVBUF); co->ring = NULL; - SLIST_REMOVE(&rm->object_list, co, capt_object, objects); - FREE(co, M_DEVBUF); + if (!SLIST_EMPTY(&rm->object_list)) { + SLIST_REMOVE(&rm->object_list, co, capt_object, objects); + FREE(co, M_DEVBUF); + } if (rm->open_cnt > 0) --rm->open_cnt; @@ -411,7 +422,7 @@ if (err != 0) { RINGMAP_IOCTL(Error! Can not get private data!); return (err); - } + } rm = co->rm; @@ -419,30 +430,40 @@ /* Sleep and wait for new packets */ case IOCTL_SLEEP_WAIT: + RINGMAP_LOCK(rm); /* Set the new value into the adapter's TAIL register */ rm->funcs->set_tail(co->ring->userrp, co->hw_rx_ring); CAPT_OBJECT_DEB(co); + /* Is it allowed to sleep ? */ + if (co->can_sleep == 0) { + err = EINVAL; + RINGMAP_UNLOCK(rm); + goto out; + } + /* * Before we are going to sleep it makes a sence to check if we - * really must do it + * really must do it. For example if the ring is not empty, then + * the tread does not need seep and wait for new packets. */ - while (RING_IS_EMPTY(co->ring)) { - RINGMAP_IOCTL(Sleep and wait for new packets); + if (RING_NOT_EMPTY(co->ring)) { + err = EINVAL; + RINGMAP_UNLOCK(rm); + goto out; + } + + RINGMAP_IOCTL(Sleep and wait for new packets); - /* Count how many times we wait for new packets */ - co->ring->user_wait_kern++; + /* Count how many times we wait for new packets */ + co->ring->user_wait_kern++; + RINGMAP_UNLOCK(rm); - err = tsleep(co->ring, - (PRI_MAX_ITHD) | PCATCH, "ioctl", 0); - /* go back into user-space by catching signal */ - if (err) - goto out; - } + err = tsleep(co->ring, + (PRI_MAX_ITHD) | PCATCH, "ioctl", 0); break; - /* Synchronize sowftware ring-tail with hardware-ring-tail (RDT) */ case IOCTL_SYNC_TAIL: RINGMAP_LOCK(rm); @@ -450,7 +471,6 @@ RINGMAP_UNLOCK(rm); break; - case IOCTL_SETFILTER: bpf_prog = (struct bpf_program *)data; flen = bpf_prog->bf_len; @@ -478,14 +498,12 @@ co->rm->funcs->pkt_filter = ringmap_bpf_filter; break; - /* Tell user how many queues we have */ case IOCTL_GETQUEUE_NUM: qn = rm->funcs->get_queuesnum(); *(int *)data = qn; break; - /* Associate the ring/queue with the capturing object */ case IOCTL_ATTACH_RING: /* First stop receive and interupts while we allocate our data */ @@ -513,7 +531,6 @@ rm->funcs->receive_enable(rm); break; - default: RINGMAP_ERROR("Undefined command!"); err = ENODEV; ==== //depot/projects/soc2010/ringmap/stable_8/sys/net/ringmap.h#3 (text+ko) ==== ==== //depot/projects/soc2010/ringmap/stable_8/sys/net/ringmap_kernel.h#3 (text+ko) ==== @@ -32,6 +32,9 @@ */ void *intr_context; + /* If the thread can sleep */ + int volatile can_sleep; + /* Let's concatenate our objects */ SLIST_ENTRY(capt_object) objects; }; From owner-p4-projects@FreeBSD.ORG Thu Dec 23 13:22:07 2010 Return-Path: Delivered-To: p4-projects@freebsd.org Received: by hub.freebsd.org (Postfix, from userid 32767) id 9C3541065670; Thu, 23 Dec 2010 13:22:07 +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 5C0FE106566B for ; Thu, 23 Dec 2010 13:22:07 +0000 (UTC) (envelope-from trasz@freebsd.org) Received: from skunkworks.freebsd.org (skunkworks.freebsd.org [IPv6:2001:4f8:fff6::2d]) by mx1.freebsd.org (Postfix) with ESMTP id 49A178FC12 for ; Thu, 23 Dec 2010 13:22:07 +0000 (UTC) Received: from skunkworks.freebsd.org (localhost [127.0.0.1]) by skunkworks.freebsd.org (8.14.4/8.14.4) with ESMTP id oBNDM7xw037185 for ; Thu, 23 Dec 2010 13:22:07 GMT (envelope-from trasz@freebsd.org) Received: (from perforce@localhost) by skunkworks.freebsd.org (8.14.4/8.14.4/Submit) id oBNDM75v037182 for perforce@freebsd.org; Thu, 23 Dec 2010 13:22:07 GMT (envelope-from trasz@freebsd.org) Date: Thu, 23 Dec 2010 13:22:07 GMT Message-Id: <201012231322.oBNDM75v037182@skunkworks.freebsd.org> X-Authentication-Warning: skunkworks.freebsd.org: perforce set sender to trasz@freebsd.org using -f From: Edward Tomasz Napierala To: Perforce Change Reviews Precedence: bulk Cc: Subject: PERFORCE change 187160 for review X-BeenThere: p4-projects@freebsd.org X-Mailman-Version: 2.1.5 List-Id: p4 projects tree changes List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Thu, 23 Dec 2010 13:22:07 -0000 http://p4web.freebsd.org/@@187160?ac=10 Change 187160 by trasz@trasz_victim on 2010/12/23 13:21:05 Fix error handling in vslock(). Affected files ... .. //depot/projects/soc2009/trasz_limits/TODO#36 edit .. //depot/projects/soc2009/trasz_limits/sys/vm/vm_glue.c#11 edit Differences ... ==== //depot/projects/soc2009/trasz_limits/TODO#36 (text+ko) ==== @@ -100,6 +100,8 @@ to be investigated; there are many of them and it wouldn't be user-friendly to add ten new resource counters. + - What about RLIMIT_RTPRIO and RLIMIT_RTTIME? Linux seems to have these. + HRL-specific issues: - Reconsider setrlimit(2) handling. ==== //depot/projects/soc2009/trasz_limits/sys/vm/vm_glue.c#11 (text+ko) ==== @@ -200,8 +200,7 @@ PROC_LOCK(curproc); nsize = ptoa(npages + pmap_wired_count(vm_map_pmap(&curproc->p_vmspace->vm_map))); - if (nsize > lim_cur(curproc, RLIMIT_MEMLOCK) || - rusage_set(curproc, RUSAGE_MEMLOCK, nsize) != 0) { + if (nsize > lim_cur(curproc, RLIMIT_MEMLOCK)) { PROC_UNLOCK(curproc); return (ENOMEM); } @@ -219,10 +218,12 @@ if (npages + cnt.v_wire_count > vm_page_max_wired) return (EAGAIN); #endif + if (rusage_set(curproc, RUSAGE_MEMLOCK, nsize)) + return (ENOMEM); error = vm_map_wire(&curproc->p_vmspace->vm_map, start, end, VM_MAP_WIRE_SYSTEM | VM_MAP_WIRE_NOHOLES); if (error != KERN_SUCCESS) - rusage_sub(curproc, RUSAGE_MEMLOCK, + rusage_set(curproc, RUSAGE_MEMLOCK, ptoa(pmap_wired_count(vm_map_pmap(&curproc->p_vmspace->vm_map)))); /* * Return EFAULT on error to match copy{in,out}() behaviour From owner-p4-projects@FreeBSD.ORG Thu Dec 23 14:49:56 2010 Return-Path: Delivered-To: p4-projects@freebsd.org Received: by hub.freebsd.org (Postfix, from userid 32767) id 8208F1065672; Thu, 23 Dec 2010 14:49:56 +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 2209D106564A for ; Thu, 23 Dec 2010 14:49:56 +0000 (UTC) (envelope-from trasz@freebsd.org) Received: from skunkworks.freebsd.org (skunkworks.freebsd.org [IPv6:2001:4f8:fff6::2d]) by mx1.freebsd.org (Postfix) with ESMTP id 062CC8FC0C for ; Thu, 23 Dec 2010 14:49:56 +0000 (UTC) Received: from skunkworks.freebsd.org (localhost [127.0.0.1]) by skunkworks.freebsd.org (8.14.4/8.14.4) with ESMTP id oBNEnt8G053362 for ; Thu, 23 Dec 2010 14:49:55 GMT (envelope-from trasz@freebsd.org) Received: (from perforce@localhost) by skunkworks.freebsd.org (8.14.4/8.14.4/Submit) id oBNEntD9053359 for perforce@freebsd.org; Thu, 23 Dec 2010 14:49:55 GMT (envelope-from trasz@freebsd.org) Date: Thu, 23 Dec 2010 14:49:55 GMT Message-Id: <201012231449.oBNEntD9053359@skunkworks.freebsd.org> X-Authentication-Warning: skunkworks.freebsd.org: perforce set sender to trasz@freebsd.org using -f From: Edward Tomasz Napierala To: Perforce Change Reviews Precedence: bulk Cc: Subject: PERFORCE change 187161 for review X-BeenThere: p4-projects@freebsd.org X-Mailman-Version: 2.1.5 List-Id: p4 projects tree changes List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Thu, 23 Dec 2010 14:49:56 -0000 http://p4web.freebsd.org/@@187161?ac=10 Change 187161 by trasz@trasz_victim on 2010/12/23 14:48:53 Introduce rusage_set_force and rework error handling in obreak(). Affected files ... .. //depot/projects/soc2009/trasz_limits/sys/kern/kern_container.c#42 edit .. //depot/projects/soc2009/trasz_limits/sys/sys/container.h#19 edit .. //depot/projects/soc2009/trasz_limits/sys/vm/vm_unix.c#13 edit Differences ... ==== //depot/projects/soc2009/trasz_limits/sys/kern/kern_container.c#42 (text+ko) ==== @@ -399,6 +399,29 @@ return (error); } +void +rusage_set_force(struct proc *p, int resource, uint64_t amount) +{ + int64_t diff; + + if (p->p_flag & P_SYSTEM) + return; + + SDT_PROBE(container, kernel, rusage, set, p, resource, amount, 0, 0); + + KASSERT(amount >= 0, ("rusage_set: invalid amount for resource %d: %ju", + resource, amount)); + + mtx_lock(&container_lock); + diff = amount - p->p_container.c_resources[resource]; + container_alloc_resource(&p->p_container, resource, diff); + mtx_unlock(&container_lock); + if (diff > 0) + rusage_add_cred(p->p_ucred, resource, diff); + else if (diff < 0) + rusage_sub_cred(p->p_ucred, resource, -diff); +} + /* * Returns amount of 'resource' the process 'p' can keep allocated. * Allocating more than that would be denied, unless the resource ==== //depot/projects/soc2009/trasz_limits/sys/sys/container.h#19 (text+ko) ==== @@ -98,6 +98,7 @@ void rusage_add_cred(struct ucred *cred, int resource, uint64_t amount); void rusage_add_force(struct proc *p, int resource, uint64_t amount); int rusage_set(struct proc *p, int resource, uint64_t amount); +void rusage_set_force(struct proc *p, int resource, uint64_t amount); void rusage_sub(struct proc *p, int resource, uint64_t amount); void rusage_sub_cred(struct ucred *cred, int resource, uint64_t amount); uint64_t rusage_get_limit(struct proc *p, int resource); ==== //depot/projects/soc2009/trasz_limits/sys/vm/vm_unix.c#13 (text+ko) ==== @@ -99,12 +99,6 @@ error = ENOMEM; goto done; } - error = rusage_set(td->td_proc, RUSAGE_DATA, new - base); - if (error != 0) { - error = ENOMEM; - goto done; - } - if (new > vm_map_max(&vm->vm_map)) { error = ENOMEM; goto done; @@ -123,18 +117,23 @@ error = ENOMEM; goto done; } + error = rusage_set(td->td_proc, RUSAGE_DATA, new - base); + if (error != 0) { + error = ENOMEM; + goto done; + } error = rusage_set(td->td_proc, RUSAGE_VMEM, vm->vm_map.size + (new - old)); if (error != 0) { + rusage_set_force(td->td_proc, RUSAGE_DATA, old - base); error = ENOMEM; goto done; } - /* - * XXX: Rollback for rusage_set() call above? - */ rv = vm_map_insert(&vm->vm_map, NULL, 0, old, new, VM_PROT_RW, VM_PROT_ALL, 0); if (rv != KERN_SUCCESS) { + rusage_set_force(td->td_proc, RUSAGE_DATA, old - base); + rusage_set_force(td->td_proc, RUSAGE_VMEM, vm->vm_map.size); error = ENOMEM; goto done; } @@ -160,6 +159,8 @@ goto done; } vm->vm_dsize -= btoc(old - new); + rusage_set_force(td->td_proc, RUSAGE_DATA, new - base); + rusage_set_force(td->td_proc, RUSAGE_VMEM, vm->vm_map.size); } done: vm_map_unlock(&vm->vm_map); From owner-p4-projects@FreeBSD.ORG Thu Dec 23 17:38:51 2010 Return-Path: Delivered-To: p4-projects@freebsd.org Received: by hub.freebsd.org (Postfix, from userid 32767) id E31371065672; Thu, 23 Dec 2010 17:38:50 +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 A5EBE106564A for ; Thu, 23 Dec 2010 17:38:50 +0000 (UTC) (envelope-from trasz@freebsd.org) Received: from skunkworks.freebsd.org (skunkworks.freebsd.org [IPv6:2001:4f8:fff6::2d]) by mx1.freebsd.org (Postfix) with ESMTP id 5C0478FC14 for ; Thu, 23 Dec 2010 17:38:50 +0000 (UTC) Received: from skunkworks.freebsd.org (localhost [127.0.0.1]) by skunkworks.freebsd.org (8.14.4/8.14.4) with ESMTP id oBNHcoh3088424 for ; Thu, 23 Dec 2010 17:38:50 GMT (envelope-from trasz@freebsd.org) Received: (from perforce@localhost) by skunkworks.freebsd.org (8.14.4/8.14.4/Submit) id oBNHcoen088421 for perforce@freebsd.org; Thu, 23 Dec 2010 17:38:50 GMT (envelope-from trasz@freebsd.org) Date: Thu, 23 Dec 2010 17:38:50 GMT Message-Id: <201012231738.oBNHcoen088421@skunkworks.freebsd.org> X-Authentication-Warning: skunkworks.freebsd.org: perforce set sender to trasz@freebsd.org using -f From: Edward Tomasz Napierala To: Perforce Change Reviews Precedence: bulk Cc: Subject: PERFORCE change 187163 for review X-BeenThere: p4-projects@freebsd.org X-Mailman-Version: 2.1.5 List-Id: p4 projects tree changes List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Thu, 23 Dec 2010 17:38:51 -0000 http://p4web.freebsd.org/@@187163?ac=10 Change 187163 by trasz@trasz_victim on 2010/12/23 17:37:47 Rework swap usage accounting. Affected files ... .. //depot/projects/soc2009/trasz_limits/sys/vm/swap_pager.c#16 edit Differences ... ==== //depot/projects/soc2009/trasz_limits/sys/vm/swap_pager.c#16 (text+ko) ==== @@ -192,6 +192,9 @@ if (incr & PAGE_MASK) panic("swap_reserve: & PAGE_MASK"); + if (rusage_add(curproc, RUSAGE_SWAP, incr)) + return (0); + res = 0; mtx_lock(&sw_dev_mtx); r = swap_reserved + incr; @@ -211,12 +214,7 @@ if (res) { PROC_LOCK(curproc); UIDINFO_VMSIZE_LOCK(uip); - /* - * XXX: What if rusage_add() succeeds, and lim_cur() check fails? - */ - if ( - rusage_add(curproc, RUSAGE_SWAP, incr) && - (overcommit & SWAP_RESERVE_RLIMIT_ON) != 0 && + if ((overcommit & SWAP_RESERVE_RLIMIT_ON) != 0 && uip->ui_vmsize + incr > lim_cur(curproc, RLIMIT_SWAP) && priv_check(curthread, PRIV_VM_SWAP_NORLIMIT)) res = 0; @@ -235,6 +233,9 @@ curproc->p_pid, uip->ui_uid, incr); } + if (!res) + rusage_sub(curproc, RUSAGE_SWAP, incr); + return (res); } From owner-p4-projects@FreeBSD.ORG Thu Dec 23 21:01:50 2010 Return-Path: Delivered-To: p4-projects@freebsd.org Received: by hub.freebsd.org (Postfix, from userid 32767) id B2E4B106566C; Thu, 23 Dec 2010 21:01:50 +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 74A7A106566B for ; Thu, 23 Dec 2010 21:01:50 +0000 (UTC) (envelope-from trasz@freebsd.org) Received: from skunkworks.freebsd.org (skunkworks.freebsd.org [IPv6:2001:4f8:fff6::2d]) by mx1.freebsd.org (Postfix) with ESMTP id 477928FC0C for ; Thu, 23 Dec 2010 21:01:50 +0000 (UTC) Received: from skunkworks.freebsd.org (localhost [127.0.0.1]) by skunkworks.freebsd.org (8.14.4/8.14.4) with ESMTP id oBNL1ole031042 for ; Thu, 23 Dec 2010 21:01:50 GMT (envelope-from trasz@freebsd.org) Received: (from perforce@localhost) by skunkworks.freebsd.org (8.14.4/8.14.4/Submit) id oBNL1oMm031038 for perforce@freebsd.org; Thu, 23 Dec 2010 21:01:50 GMT (envelope-from trasz@freebsd.org) Date: Thu, 23 Dec 2010 21:01:50 GMT Message-Id: <201012232101.oBNL1oMm031038@skunkworks.freebsd.org> X-Authentication-Warning: skunkworks.freebsd.org: perforce set sender to trasz@freebsd.org using -f From: Edward Tomasz Napierala To: Perforce Change Reviews Precedence: bulk Cc: Subject: PERFORCE change 187167 for review X-BeenThere: p4-projects@freebsd.org X-Mailman-Version: 2.1.5 List-Id: p4 projects tree changes List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Thu, 23 Dec 2010 21:01:50 -0000 http://p4web.freebsd.org/@@187167?ac=10 Change 187167 by trasz@trasz_victim on 2010/12/23 21:01:45 In struct pts_softc, replace uidinfo with ucred. Affected files ... .. //depot/projects/soc2009/trasz_limits/sys/kern/tty_pts.c#22 edit Differences ... ==== //depot/projects/soc2009/trasz_limits/sys/kern/tty_pts.c#22 (text+ko) ==== @@ -98,7 +98,7 @@ struct cdev *pts_cdev; /* (c) Master device node. */ #endif /* PTS_EXTERNAL */ - struct uidinfo *pts_uidinfo; /* (c) Resource limit. */ + struct ucred *pts_cred; /* (c) Resource limit. */ }; /* @@ -684,8 +684,8 @@ if (psc->pts_unit >= 0) free_unr(pts_pool, psc->pts_unit); - chgptscnt(psc->pts_uidinfo, -1, 0); - uifree(psc->pts_uidinfo); + chgptscnt(psc->pts_cred->cr_ruidinfo, -1, 0); + crfree(psc->pts_cred); knlist_destroy(&psc->pts_inpoll.si_note); knlist_destroy(&psc->pts_outpoll.si_note); @@ -719,14 +719,14 @@ struct tty *tp; struct pts_softc *psc; struct proc *p = td->td_proc; - struct uidinfo *uid = td->td_ucred->cr_ruidinfo; + struct ucred *cred = td->td_ucred; /* Resource limiting. */ error = rusage_add(p, RUSAGE_NPTS, 1); if (error != 0) return (EAGAIN); PROC_LOCK(p); - ok = chgptscnt(uid, 1, lim_cur(p, RLIMIT_NPTS)); + ok = chgptscnt(cred->cr_ruidinfo, 1, lim_cur(p, RLIMIT_NPTS)); PROC_UNLOCK(p); if (!ok) { rusage_sub(p, RUSAGE_NPTS, 1); @@ -737,7 +737,7 @@ unit = alloc_unr(pts_pool); if (unit < 0) { rusage_sub(p, RUSAGE_NPTS, 1); - chgptscnt(uid, -1, 0); + chgptscnt(cred->cr_ruidinfo, -1, 0); return (EAGAIN); } @@ -747,8 +747,7 @@ cv_init(&psc->pts_outwait, "ptsout"); psc->pts_unit = unit; - psc->pts_uidinfo = uid; - uihold(uid); + psc->pts_cred = crhold(cred); tp = tty_alloc(&pts_class, psc); knlist_init_mtx(&psc->pts_inpoll.si_note, tp->t_mtx); @@ -771,14 +770,14 @@ struct tty *tp; struct pts_softc *psc; struct proc *p = td->td_proc; - struct uidinfo *uid = td->td_ucred->cr_ruidinfo; + struct ucred *cred = td->td_ucred; /* Resource limiting. */ error = rusage_add(p, RUSAGE_NPTS, 1); if (error != 0) return (EAGAIN); PROC_LOCK(p); - ok = chgptscnt(uid, 1, lim_cur(p, RLIMIT_NPTS)); + ok = chgptscnt(cred->cr_ruidinfo, 1, lim_cur(p, RLIMIT_NPTS)); PROC_UNLOCK(p); if (!ok) { rusage_sub(p, RUSAGE_NPTS, 1); @@ -792,8 +791,7 @@ psc->pts_unit = -1; psc->pts_cdev = dev; - psc->pts_uidinfo = uid; - uihold(uid); + psc->pts_cred = crhold(cred);; tp = tty_alloc(&pts_class, psc); knlist_init_mtx(&psc->pts_inpoll.si_note, tp->t_mtx); From owner-p4-projects@FreeBSD.ORG Thu Dec 23 21:17:47 2010 Return-Path: Delivered-To: p4-projects@freebsd.org Received: by hub.freebsd.org (Postfix, from userid 32767) id 7FE4A106566B; Thu, 23 Dec 2010 21:17:47 +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 429CC1065672 for ; Thu, 23 Dec 2010 21:17:47 +0000 (UTC) (envelope-from trasz@freebsd.org) Received: from skunkworks.freebsd.org (skunkworks.freebsd.org [IPv6:2001:4f8:fff6::2d]) by mx1.freebsd.org (Postfix) with ESMTP id 2FEDD8FC08 for ; Thu, 23 Dec 2010 21:17:47 +0000 (UTC) Received: from skunkworks.freebsd.org (localhost [127.0.0.1]) by skunkworks.freebsd.org (8.14.4/8.14.4) with ESMTP id oBNLHlVj033936 for ; Thu, 23 Dec 2010 21:17:47 GMT (envelope-from trasz@freebsd.org) Received: (from perforce@localhost) by skunkworks.freebsd.org (8.14.4/8.14.4/Submit) id oBNLHlGS033933 for perforce@freebsd.org; Thu, 23 Dec 2010 21:17:47 GMT (envelope-from trasz@freebsd.org) Date: Thu, 23 Dec 2010 21:17:47 GMT Message-Id: <201012232117.oBNLHlGS033933@skunkworks.freebsd.org> X-Authentication-Warning: skunkworks.freebsd.org: perforce set sender to trasz@freebsd.org using -f From: Edward Tomasz Napierala To: Perforce Change Reviews Precedence: bulk Cc: Subject: PERFORCE change 187168 for review X-BeenThere: p4-projects@freebsd.org X-Mailman-Version: 2.1.5 List-Id: p4 projects tree changes List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Thu, 23 Dec 2010 21:17:47 -0000 http://p4web.freebsd.org/@@187168?ac=10 Change 187168 by trasz@trasz_victim on 2010/12/23 21:16:55 Now that we keep a pointer to ucred for terminals, make RUSAGE_NPTS sloppy. This means the per-ucred (per-jail, per-user etc) values are now right, although the per-process ones are meaningless. Life is all about choices. Affected files ... .. //depot/projects/soc2009/trasz_limits/sys/kern/kern_container.c#43 edit .. //depot/projects/soc2009/trasz_limits/sys/kern/tty_pts.c#23 edit Differences ... ==== //depot/projects/soc2009/trasz_limits/sys/kern/kern_container.c#43 (text+ko) ==== @@ -104,6 +104,7 @@ case RUSAGE_MEMLOCK: case RUSAGE_NPROC: case RUSAGE_SBSIZE: + case RUSAGE_NPTS: case RUSAGE_SWAP: case RUSAGE_NTHR: case RUSAGE_NMSGQ: @@ -140,6 +141,7 @@ switch (resource) { case RUSAGE_SBSIZE: + case RUSAGE_NPTS: case RUSAGE_SWAP: case RUSAGE_NMSGQ: case RUSAGE_MSGQQUEUED: ==== //depot/projects/soc2009/trasz_limits/sys/kern/tty_pts.c#23 (text+ko) ==== @@ -576,8 +576,6 @@ tty_lock(tp); tty_rel_gone(tp); - rusage_sub(td->td_proc, RUSAGE_NPTS, 1); - /* * Open of /dev/ptmx or /dev/ptyXX changes the type of file * from DTYPE_VNODE to DTYPE_PTS. vn_open() increases vnode @@ -685,6 +683,7 @@ free_unr(pts_pool, psc->pts_unit); chgptscnt(psc->pts_cred->cr_ruidinfo, -1, 0); + rusage_sub_cred(psc->pts_cred, RUSAGE_NPTS, 1); crfree(psc->pts_cred); knlist_destroy(&psc->pts_inpoll.si_note); From owner-p4-projects@FreeBSD.ORG Fri Dec 24 11:20:24 2010 Return-Path: Delivered-To: p4-projects@freebsd.org Received: by hub.freebsd.org (Postfix, from userid 32767) id 934A11065675; Fri, 24 Dec 2010 11:20:24 +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 48D43106566C for ; Fri, 24 Dec 2010 11:20:24 +0000 (UTC) (envelope-from trasz@freebsd.org) Received: from skunkworks.freebsd.org (skunkworks.freebsd.org [IPv6:2001:4f8:fff6::2d]) by mx1.freebsd.org (Postfix) with ESMTP id 365E08FC1D for ; Fri, 24 Dec 2010 11:20:24 +0000 (UTC) Received: from skunkworks.freebsd.org (localhost [127.0.0.1]) by skunkworks.freebsd.org (8.14.4/8.14.4) with ESMTP id oBOBKOtK005017 for ; Fri, 24 Dec 2010 11:20:24 GMT (envelope-from trasz@freebsd.org) Received: (from perforce@localhost) by skunkworks.freebsd.org (8.14.4/8.14.4/Submit) id oBOBKOxf005013 for perforce@freebsd.org; Fri, 24 Dec 2010 11:20:24 GMT (envelope-from trasz@freebsd.org) Date: Fri, 24 Dec 2010 11:20:24 GMT Message-Id: <201012241120.oBOBKOxf005013@skunkworks.freebsd.org> X-Authentication-Warning: skunkworks.freebsd.org: perforce set sender to trasz@freebsd.org using -f From: Edward Tomasz Napierala To: Perforce Change Reviews Precedence: bulk Cc: Subject: PERFORCE change 187176 for review X-BeenThere: p4-projects@freebsd.org X-Mailman-Version: 2.1.5 List-Id: p4 projects tree changes List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Fri, 24 Dec 2010 11:20:24 -0000 http://p4web.freebsd.org/@@187176?ac=10 Change 187176 by trasz@trasz_victim on 2010/12/24 11:19:23 Fix error handling. Affected files ... .. //depot/projects/soc2009/trasz_limits/sys/kern/kern_container.c#44 edit Differences ... ==== //depot/projects/soc2009/trasz_limits/sys/kern/kern_container.c#44 (text+ko) ==== @@ -547,7 +547,13 @@ error = hrl_proc_fork(parent, child); if (error != 0) { mtx_lock(&container_lock); - container_destroy(&child->p_container); + /* + * XXX: The only purpose of these two lines is to prevent from + * tripping checks in container_destroy(). + */ + for (i = 0; i <= RUSAGE_MAX; i++) + rusage_set_locked(child, i, 0); + container_destroy_locked(&child->p_container); mtx_unlock(&container_lock); } }