svn commit: r285633 - in head/sys: kern sys
Mateusz Guzik
mjg at FreeBSD.org
Thu Jul 16 14:30:14 UTC 2015
Author: mjg
Date: Thu Jul 16 14:30:11 2015
New Revision: 285633
URL: https://svnweb.freebsd.org/changeset/base/285633
Log:
Get rid of lim_update_thread and cred_update_thread.
Their primary use was in thread_cow_update to free up old resources.
Freeing had to be done with proc lock held and _cow_ funcs already knew
how to free old structs.
Modified:
head/sys/kern/init_main.c
head/sys/kern/kern_prot.c
head/sys/kern/kern_resource.c
head/sys/kern/kern_thread.c
head/sys/sys/resourcevar.h
head/sys/sys/ucred.h
Modified: head/sys/kern/init_main.c
==============================================================================
--- head/sys/kern/init_main.c Thu Jul 16 13:57:05 2015 (r285632)
+++ head/sys/kern/init_main.c Thu Jul 16 14:30:11 2015 (r285633)
@@ -827,6 +827,7 @@ static void
create_init(const void *udata __unused)
{
struct ucred *newcred, *oldcred;
+ struct thread *td;
int error;
error = fork1(&thread0, RFFDG | RFPROC | RFSTOPPED, 0, &initproc,
@@ -850,7 +851,9 @@ create_init(const void *udata __unused)
audit_cred_proc1(newcred);
#endif
proc_set_cred(initproc, newcred);
- cred_update_thread(FIRST_THREAD_IN_PROC(initproc));
+ td = FIRST_THREAD_IN_PROC(initproc);
+ crfree(td->td_ucred);
+ td->td_ucred = crhold(initproc->p_ucred);
PROC_UNLOCK(initproc);
sx_xunlock(&proctree_lock);
crfree(oldcred);
Modified: head/sys/kern/kern_prot.c
==============================================================================
--- head/sys/kern/kern_prot.c Thu Jul 16 13:57:05 2015 (r285632)
+++ head/sys/kern/kern_prot.c Thu Jul 16 14:30:11 2015 (r285633)
@@ -1935,24 +1935,6 @@ cru2x(struct ucred *cr, struct xucred *x
}
/*
- * small routine to swap a thread's current ucred for the correct one taken
- * from the process.
- */
-void
-cred_update_thread(struct thread *td)
-{
- struct proc *p;
- struct ucred *cred;
-
- p = td->td_proc;
- cred = td->td_ucred;
- PROC_LOCK_ASSERT(p, MA_OWNED);
- td->td_ucred = crhold(p->p_ucred);
- if (cred != NULL)
- crfree(cred);
-}
-
-/*
* Set initial process credentials.
* Callers are responsible for providing the reference for provided credentials.
*/
Modified: head/sys/kern/kern_resource.c
==============================================================================
--- head/sys/kern/kern_resource.c Thu Jul 16 13:57:05 2015 (r285632)
+++ head/sys/kern/kern_resource.c Thu Jul 16 14:30:11 2015 (r285633)
@@ -1436,17 +1436,3 @@ chgkqcnt(struct uidinfo *uip, int diff,
return (chglimit(uip, &uip->ui_kqcnt, diff, max, "kqcnt"));
}
-
-void
-lim_update_thread(struct thread *td)
-{
- struct proc *p;
- struct plimit *lim;
-
- p = td->td_proc;
- lim = td->td_limit;
- PROC_LOCK_ASSERT(p, MA_OWNED);
- td->td_limit = lim_hold(p->p_limit);
- if (lim != NULL)
- lim_free(lim);
-}
Modified: head/sys/kern/kern_thread.c
==============================================================================
--- head/sys/kern/kern_thread.c Thu Jul 16 13:57:05 2015 (r285632)
+++ head/sys/kern/kern_thread.c Thu Jul 16 14:30:11 2015 (r285633)
@@ -409,9 +409,9 @@ void
thread_cow_free(struct thread *td)
{
- if (td->td_ucred)
+ if (td->td_ucred != NULL)
crfree(td->td_ucred);
- if (td->td_limit)
+ if (td->td_limit != NULL)
lim_free(td->td_limit);
}
@@ -419,15 +419,27 @@ void
thread_cow_update(struct thread *td)
{
struct proc *p;
+ struct ucred *oldcred;
+ struct plimit *oldlimit;
p = td->td_proc;
+ oldcred = NULL;
+ oldlimit = NULL;
PROC_LOCK(p);
- if (td->td_ucred != p->p_ucred)
- cred_update_thread(td);
- if (td->td_limit != p->p_limit)
- lim_update_thread(td);
+ if (td->td_ucred != p->p_ucred) {
+ oldcred = td->td_ucred;
+ td->td_ucred = crhold(p->p_ucred);
+ }
+ if (td->td_limit != p->p_limit) {
+ oldlimit = td->td_limit;
+ td->td_limit = lim_hold(p->p_limit);
+ }
td->td_cowgen = p->p_cowgen;
PROC_UNLOCK(p);
+ if (oldcred != NULL)
+ crfree(oldcred);
+ if (oldlimit != NULL)
+ lim_free(oldlimit);
}
/*
Modified: head/sys/sys/resourcevar.h
==============================================================================
--- head/sys/sys/resourcevar.h Thu Jul 16 13:57:05 2015 (r285632)
+++ head/sys/sys/resourcevar.h Thu Jul 16 14:30:11 2015 (r285633)
@@ -159,7 +159,5 @@ void ui_racct_foreach(void (*callback)(
void *arg2, void *arg3), void *arg2, void *arg3);
#endif
-void lim_update_thread(struct thread *td);
-
#endif /* _KERNEL */
#endif /* !_SYS_RESOURCEVAR_H_ */
Modified: head/sys/sys/ucred.h
==============================================================================
--- head/sys/sys/ucred.h Thu Jul 16 13:57:05 2015 (r285632)
+++ head/sys/sys/ucred.h Thu Jul 16 14:30:11 2015 (r285633)
@@ -105,7 +105,6 @@ void change_svuid(struct ucred *newcred,
void crcopy(struct ucred *dest, struct ucred *src);
struct ucred *crcopysafe(struct proc *p, struct ucred *cr);
struct ucred *crdup(struct ucred *cr);
-void cred_update_thread(struct thread *td);
void proc_set_cred_init(struct proc *p, struct ucred *cr);
struct ucred *proc_set_cred(struct proc *p, struct ucred *cr);
void crfree(struct ucred *cr);
More information about the svn-src-head
mailing list