Author: mjg
Date: Fri Dec 13 20:54:45 2013
New Revision: 259331
URL: http://svnweb.freebsd.org/changeset/base/259331

Log:
  rlimit: avoid unnecessary copying of rlimits
  
  If refcount is 1 just modify rlimits in place.
  
  MFC after:    2 weeks

Modified:
  head/sys/kern/kern_resource.c

Modified: head/sys/kern/kern_resource.c
==============================================================================
--- head/sys/kern/kern_resource.c       Fri Dec 13 20:53:31 2013        
(r259330)
+++ head/sys/kern/kern_resource.c       Fri Dec 13 20:54:45 2013        
(r259331)
@@ -679,21 +679,29 @@ kern_proc_setrlimit(struct thread *td, s
                limp->rlim_max = RLIM_INFINITY;
 
        oldssiz.rlim_cur = 0;
-       newlim = lim_alloc();
+       newlim = NULL;
        PROC_LOCK(p);
+       if (lim_shared(p->p_limit)) {
+               PROC_UNLOCK(p);
+               newlim = lim_alloc();
+               PROC_LOCK(p);
+       }
        oldlim = p->p_limit;
        alimp = &oldlim->pl_rlimit[which];
        if (limp->rlim_cur > alimp->rlim_max ||
            limp->rlim_max > alimp->rlim_max)
                if ((error = priv_check(td, PRIV_PROC_SETRLIMIT))) {
                        PROC_UNLOCK(p);
-                       lim_free(newlim);
+                       if (newlim != NULL)
+                               lim_free(newlim);
                        return (error);
                }
        if (limp->rlim_cur > limp->rlim_max)
                limp->rlim_cur = limp->rlim_max;
-       lim_copy(newlim, oldlim);
-       alimp = &newlim->pl_rlimit[which];
+       if (newlim != NULL) {
+               lim_copy(newlim, oldlim);
+               alimp = &newlim->pl_rlimit[which];
+       }
 
        switch (which) {
 
@@ -743,9 +751,11 @@ kern_proc_setrlimit(struct thread *td, s
        if (p->p_sysent->sv_fixlimit != NULL)
                p->p_sysent->sv_fixlimit(limp, which);
        *alimp = *limp;
-       p->p_limit = newlim;
+       if (newlim != NULL)
+               p->p_limit = newlim;
        PROC_UNLOCK(p);
-       lim_free(oldlim);
+       if (newlim != NULL)
+               lim_free(oldlim);
 
        if (which == RLIMIT_STACK) {
                /*
_______________________________________________
[email protected] mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-head
To unsubscribe, send any mail to "[email protected]"

Reply via email to