/*
 *  Copyright (C) 2000-2009, Parallels, Inc. All rights reserved.
 *
 *  This program is free software; you can redistribute it and/or modify
 *  it under the terms of the GNU General Public License as published by
 *  the Free Software Foundation; either version 2 of the License, or
 *  (at your option) any later version.
 *
 *  This program is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *  GNU General Public License for more details.
 *
 *  You should have received a copy of the GNU General Public License
 *  along with this program; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 */
#ifndef	_UB_H_
#define	_UB_H_

#include "types.h"
#include "vzerror.h"
#include "vzsyscalls.h"

#define PROCUBC		"/proc/user_beancounters"
#define PROC_BC_RES	"/proc/bc/resources"

#ifndef UB_KMEMSIZE
#define UB_KMEMSIZE	0	/* Unswappable kernel memory size including
				 * struct task, page directories, etc.
				 */
#endif
#ifndef UB_LOCKEDPAGES
#define UB_LOCKEDPAGES	1	/* Mlock()ed pages. */
#endif
#ifndef UB_PRIVVMPAGES
#define UB_PRIVVMPAGES	2	/* Total number of pages, counting potentially
				 * private pages as private and used.
				 */
#endif
#ifndef UB_SHMPAGES
#define UB_SHMPAGES	3	/* IPC SHM segment size. */
#endif
#ifndef UB_ZSHMPAGES
#define UB_ZSHMPAGES	4	/* Anonymous shared memory. */
#endif
#ifndef UB_NUMPROC
#define UB_NUMPROC	5	/* Number of processes. */
#endif
#ifndef UB_PHYSPAGES
#define UB_PHYSPAGES	6	/* All resident pages, for swapout guarantee. */
#endif
#ifndef UB_VMGUARPAGES
#define UB_VMGUARPAGES	7	/* Guarantee for memory allocation,
				 * checked against PRIVVMPAGES.
				 */
#endif
#ifndef UB_OOMGUARPAGES
#define UB_OOMGUARPAGES	8	/* Guarantees against OOM kill.
				 * Only limit is used, no accounting.
				 */
#endif
#ifndef UB_NUMTCPSOCK
#define UB_NUMTCPSOCK	9	/* Number of TCP sockets. */
#endif
#ifndef UB_NUMFLOCK
#define UB_NUMFLOCK	10	/* Number of file locks. */
#endif
#ifndef UB_NUMPTY
#define UB_NUMPTY	11	/* Number of PTYs. */
#endif
#ifndef UB_NUMSIGINFO
#define UB_NUMSIGINFO	12	/* Number of siginfos. */
#endif
#ifndef UB_TCPSNDBUF
#define UB_TCPSNDBUF	13	/* Total size of tcp send buffers. */
#endif
#ifndef UB_TCPRCVBUF
#define UB_TCPRCVBUF	14	/* Total size of tcp receive buffers. */
#endif
#ifndef UB_OTHERSOCKBUF
#define UB_OTHERSOCKBUF	15	/* Total size of other socket
				 * send buffers (all buffers for PF_UNIX).
				 */
#endif
#ifndef UB_DGRAMRCVBUF
#define UB_DGRAMRCVBUF	16	/* Total size of other socket
				 * receive buffers.
				 */
#endif
#ifndef UB_NUMOTHERSOCK
#define UB_NUMOTHERSOCK	17	/* Number of other sockets. */
#endif
#ifndef UB_DCACHESIZE
#define UB_DCACHESIZE	18	/* Size of busy dentry/inode cache. */
#endif
#ifndef UB_NUMFILE
#define UB_NUMFILE	19	/* Number of open files. */
#endif
#ifndef UB_IPTENTRIES
#define UB_IPTENTRIES	23	/* Number of iptables rules */
#endif
#ifndef UB_SWAPPAGES
#define UB_SWAPPAGES	24
#endif
#define UB_DUMMY	255

/** Data structure for UBC parameter.
 */
typedef struct {
	int res_id;		/**< UBC resource id. */
	unsigned long limit[2];	/**< UBC resource barrier:limit. */
} ub_res;

/** Data structure for UBC parameters.
 */
struct ub_struct {
	unsigned long *kmemsize;
	unsigned long *lockedpages;
	unsigned long *privvmpages;
	unsigned long *shmpages;
	unsigned long *numproc;
	unsigned long *physpages;
	unsigned long *vmguarpages;
	unsigned long *oomguarpages;
	unsigned long *numtcpsock;
	unsigned long *numflock;
	unsigned long *numpty;
	unsigned long *numsiginfo;
	unsigned long *tcpsndbuf;
	unsigned long *tcprcvbuf;
	unsigned long *othersockbuf;
	unsigned long *dgramrcvbuf;
	unsigned long *numothersock;
	unsigned long *numfile;
	unsigned long *dcachesize;
	unsigned long *numiptent;
	unsigned long *avnumproc;
	unsigned long *swappages;
};
typedef struct ub_struct ub_param;

/** Apply UBC resources.
 *
 * @param h		CT handler.
 * @param veid		CT ID.
 * @param ubc		UBC parameters
 * @return		0 on success
 */
int vps_set_ublimit(vps_handler *h, envid_t veid, ub_param *ubc);
int set_ublimit(vps_handler *h, envid_t veid, ub_param *ubc);

/** Check that all required parameters are specified in ub.
 *
 * @param ub		UBC parameters.
 * @return		0 on success.
 */
int check_ub(vps_handler *h, ub_param *ub);

/** Add UBC resource in ub_res format to UBC struct
 *
 * @param ub		UBC parameters.
 * @param res		UBC resource in ub_res format.
 * @return		0 on success.
 */
int add_ub_param(ub_param *ub, ub_res *res);

/** Read UBC resources current usage from /proc/user_beancounters
 *
 * @param veid		CT ID.
 * @param ub		UBC parameters.
 * @return		0 on success.
 */
int vps_read_ubc(envid_t veid, ub_param *ub);
int get_ub_resid(char *name);
void add_ub_limit(struct ub_struct *ub, int res_id, unsigned long *limit);
void free_ub_param(ub_param *ub);
void merge_ub(ub_param *dst, ub_param *src);
int is_vswap_config(const ub_param *param);
#endif
