/*-
 * Copyright (c) 1991, 1993
 *	The Regents of the University of California.  All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 * 1. Redistributions of source code must retain the above copyright
 *    notice, this list of conditions and the following disclaimer.
 * 2. Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in the
 *    documentation and/or other materials provided with the distribution.
 * 4. Neither the name of the University nor the names of its contributors
 *    may be used to endorse or promote products derived from this software
 *    without specific prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
 * SUCH DAMAGE.
 *
 *	@(#)resourcevar.h	8.4 (Berkeley) 1/9/95
 * $FreeBSD$
 */

#ifndef	_BSD_SYS_RESOURCEVAR_H_
#define	_BSD_SYS_RESOURCEVAR_H_

#include <sys/bsd_resource.h>
#include <sys/bsd_queue.h>
#ifdef _FREEBSD_KERNEL
#include <sys/bsd__lock.h>
#include <sys/bsd__mutex.h>
#endif

/*
 * Kernel per-process accounting / statistics
 * (not necessarily resident except when running).
 *
 * Locking key:
 *      b - created at fork, never changes
 *      c - locked by proc mtx
 *      j - locked by proc slock
 *      k - only accessed by curthread
 */
struct pstats {
#define	pstat_startzero	p_cru
	struct	rusage p_cru;		/* Stats for reaped children. */
	struct	itimerval p_timer[3];	/* (j) Virtual-time timers. */
#define	pstat_endzero	pstat_startcopy

#define	pstat_startcopy	p_prof
	struct uprof {			/* Profile arguments. */
		caddr_t	pr_base;	/* (c + j) Buffer base. */
		u_long	pr_size;	/* (c + j) Buffer size. */
		u_long	pr_off;		/* (c + j) PC offset. */
		u_long	pr_scale;	/* (c + j) PC scaling. */
	} p_prof;
#define	pstat_endcopy	p_start
	struct	timeval p_start;	/* (b) Starting time. */
};

#ifdef _FREEBSD_KERNEL

/*
 * Kernel shareable process resource limits.  Because this structure
 * is moderately large but changes infrequently, it is normally
 * shared copy-on-write after forks.
 */
struct plimit {
	struct	rlimit pl_rlimit[RLIM_NLIMITS];
	int	pl_refcnt;		/* number of references */
};

/*-
 * Per uid resource consumption
 *
 * Locking guide:
 * (a) Constant from inception
 * (b) Lockless, updated using atomics
 * (c) Locked by global uihashtbl_mtx
 * (d) Locked by the ui_vmsize_mtx
 */
struct uidinfo {
	LIST_ENTRY(uidinfo) ui_hash;	/* (c) hash chain of uidinfos */
	struct mtx ui_vmsize_mtx;
	vm_ooffset_t ui_vmsize;		/* (d) swap reservation by uid */
	long	ui_sbsize;		/* (b) socket buffer space consumed */
	long	ui_proccnt;		/* (b) number of processes */
	long	ui_ptscnt;		/* (b) number of pseudo-terminals */
	uid_t	ui_uid;			/* (a) uid */
	u_int	ui_ref;			/* (b) reference count */
};

#define	UIDINFO_VMSIZE_LOCK(ui)		mtx_lock(&((ui)->ui_vmsize_mtx))
#define	UIDINFO_VMSIZE_UNLOCK(ui)	mtx_unlock(&((ui)->ui_vmsize_mtx))

struct proc;
struct rusage_ext;
struct thread;

void	 addupc_intr(struct thread *td, uintfptr_t pc, u_int ticks);
void	 addupc_task(struct thread *td, uintfptr_t pc, u_int ticks);
void	 calccru(struct proc *p, struct timeval *up, struct timeval *sp);
void	 calcru(struct proc *p, struct timeval *up, struct timeval *sp);
int	 chgproccnt(struct uidinfo *uip, int diff, rlim_t maxval);
int	 chgsbsize(struct uidinfo *uip, u_int *hiwat, u_int to,
	    rlim_t maxval);
int	 chgptscnt(struct uidinfo *uip, int diff, rlim_t maxval);
int	 fuswintr(void *base);
struct plimit
	*lim_alloc(void);
void	 lim_copy(struct plimit *dst, struct plimit *src);
rlim_t	 lim_cur(struct proc *p, int which);
void	 lim_fork(struct proc *p1, struct proc *p2);
void	 lim_free(struct plimit *limp);
struct plimit
	*lim_hold(struct plimit *limp);
rlim_t	 lim_max(struct proc *p, int which);
void	 lim_rlimit(struct proc *p, int which, struct rlimit *rlp);
void	 ruadd(struct rusage *ru, struct rusage_ext *rux, struct rusage *ru2,
	    struct rusage_ext *rux2);
void	 rucollect(struct rusage *ru, struct rusage *ru2);
void	 rufetch(struct proc *p, struct rusage *ru);
void	 rufetchcalc(struct proc *p, struct rusage *ru, struct timeval *up,
	    struct timeval *sp);
void	 ruxagg(struct rusage_ext *rux, struct thread *td);
int	 suswintr(void *base, int word);
struct uidinfo
	*uifind(uid_t uid);
void	 uifree(struct uidinfo *uip);
void	 uihashinit(void);
void	 uihold(struct uidinfo *uip);

#endif /* _FREEBSD_KERNEL */
#endif /* !_BSD_SYS_RESOURCEVAR_H_ */
