X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=include%2Flinux%2Fvserver%2Flimit.h;h=ef9c9fc2d75f159d2b881d64f4d355d8c4504051;hb=9bf4aaab3e101692164d49b7ca357651eb691cb6;hp=27496c1f24d8111f5370ed84dd687f19e13c974f;hpb=b76fcd5f0c655b6e3e9bf534594357025421c66a;p=linux-2.6.git diff --git a/include/linux/vserver/limit.h b/include/linux/vserver/limit.h index 27496c1f2..ef9c9fc2d 100644 --- a/include/linux/vserver/limit.h +++ b/include/linux/vserver/limit.h @@ -1,3 +1,5 @@ +/* _VX_LIMIT_H defined below */ + #if defined(__KERNEL__) && defined(_VX_INFO_DEF_) #include @@ -5,66 +7,86 @@ /* context sub struct */ -#define RLIMIT_OPENFD 12 - -#define NUM_RLIMITS 16 +#define NUM_LIMITS 20 -#define VLIMIT_SOCK 16 +#define VLIMIT_NSOCK 16 +extern const char *vlimit_name[NUM_LIMITS]; struct _vx_limit { atomic_t ticks; - unsigned long rlim[NUM_RLIMITS]; /* Per context limit */ - atomic_t res[NUM_RLIMITS]; /* Current value */ + unsigned long rlim[NUM_LIMITS]; /* Context limit */ + unsigned long rmax[NUM_LIMITS]; /* Context maximum */ + atomic_t rcur[NUM_LIMITS]; /* Current value */ + atomic_t lhit[NUM_LIMITS]; /* Limit hits */ }; static inline void vx_info_init_limit(struct _vx_limit *limit) { int lim; - for (lim=0; limrlim[lim] = RLIM_INFINITY; - atomic_set(&limit->res[lim], 0); + limit->rmax[lim] = 0; + atomic_set(&limit->rcur[lim], 0); + atomic_set(&limit->lhit[lim], 0); } } -extern unsigned int vx_debug_limit; - static inline void vx_info_exit_limit(struct _vx_limit *limit) { - int lim, value; - - for (lim=0; limres[lim]); - if (value && vx_debug_limit) - printk("!!! limit: %p[%d] = %d on exit.\n", - limit, lim, value); +#ifdef CONFIG_VSERVER_DEBUG + unsigned long value; + unsigned int lim; + + for (lim=0; limrcur[lim]); + if (value) + printk("!!! limit: %p[%s,%d] = %ld on exit.\n", + limit, vlimit_name[lim], lim, value); } +#endif +} + +static inline void vx_limit_fixup(struct _vx_limit *limit) +{ + unsigned long value; + unsigned int lim; + + for (lim=0; limrcur[lim]); + if (value > limit->rmax[lim]) + limit->rmax[lim] = value; + if (limit->rmax[lim] > limit->rlim[lim]) + limit->rmax[lim] = limit->rlim[lim]; + } } +#define VX_LIMIT_FMT ":\t%10d\t%10ld\t%10ld\t%6d\n" + +#define VX_LIMIT_ARG(r) \ + ,atomic_read(&limit->rcur[r]) \ + ,limit->rmax[r] \ + ,limit->rlim[r] \ + ,atomic_read(&limit->lhit[r]) static inline int vx_info_proc_limit(struct _vx_limit *limit, char *buffer) { + vx_limit_fixup(limit); return sprintf(buffer, - "PROC:\t%8d/%ld\n" - "VM:\t%8d/%ld\n" - "VML:\t%8d/%ld\n" - "RSS:\t%8d/%ld\n" - "FILES:\t%8d/%ld\n" - "OFD:\t%8d/%ld\n" - ,atomic_read(&limit->res[RLIMIT_NPROC]) - ,limit->rlim[RLIMIT_NPROC] - ,atomic_read(&limit->res[RLIMIT_AS]) - ,limit->rlim[RLIMIT_AS] - ,atomic_read(&limit->res[RLIMIT_MEMLOCK]) - ,limit->rlim[RLIMIT_MEMLOCK] - ,atomic_read(&limit->res[RLIMIT_RSS]) - ,limit->rlim[RLIMIT_RSS] - ,atomic_read(&limit->res[RLIMIT_NOFILE]) - ,limit->rlim[RLIMIT_NOFILE] - ,atomic_read(&limit->res[RLIMIT_OPENFD]) - ,limit->rlim[RLIMIT_OPENFD] + "PROC" VX_LIMIT_FMT + "VM" VX_LIMIT_FMT + "VML" VX_LIMIT_FMT + "RSS" VX_LIMIT_FMT + "FILES" VX_LIMIT_FMT + "SOCK" VX_LIMIT_FMT + VX_LIMIT_ARG(RLIMIT_NPROC) + VX_LIMIT_ARG(RLIMIT_AS) + VX_LIMIT_ARG(RLIMIT_MEMLOCK) + VX_LIMIT_ARG(RLIMIT_RSS) + VX_LIMIT_ARG(RLIMIT_NOFILE) + VX_LIMIT_ARG(VLIMIT_NSOCK) ); } @@ -74,6 +96,8 @@ static inline int vx_info_proc_limit(struct _vx_limit *limit, char *buffer) #include "switch.h" +#define VXD_RLIMIT(r,l) (VXD_CBIT(limit, (l)) && ((r) == (l))) + /* rlimit vserver commands */ #define VCMD_get_rlimit VC_CMD(RLIMIT, 1, 0) @@ -115,3 +139,5 @@ void vx_vsi_swapinfo(struct sysinfo *); #endif /* _VX_LIMIT_H */ #endif + +