X-Git-Url: http://git.linux-vserver.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=util-vserver%2Fkernel%2Flimit.h;h=d9e1eea015d7544943f27f973f3a4b19f5cbbf70;hb=f5dc4117385ff95985c645b64f4da05f87534c31;hp=74e02cdc3ae440298614fe69c0a7f7494a863095;hpb=09fcd8d24e21368e9e5a5f49aa1c0bbdcafd9aed;p=util-vserver.git diff --git a/util-vserver/kernel/limit.h b/util-vserver/kernel/limit.h index 74e02cd..d9e1eea 100644 --- a/util-vserver/kernel/limit.h +++ b/util-vserver/kernel/limit.h @@ -1,3 +1,5 @@ +/* _VX_LIMIT_H defined below */ + #if defined(__KERNEL__) && defined(_VX_INFO_DEF_) #include @@ -5,46 +7,87 @@ /* context sub struct */ -#define NUM_RLIMITS 16 +#define NUM_LIMITS 20 + +#define VLIMIT_NSOCK 16 -#define VLIMIT_SOCK 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); + } +} + +static inline void vx_info_exit_limit(struct _vx_limit *limit) +{ +#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" - ,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] + "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) ); } @@ -54,20 +97,22 @@ 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) #define VCMD_set_rlimit VC_CMD(RLIMIT, 2, 0) #define VCMD_get_rlimit_mask VC_CMD(RLIMIT, 3, 0) -struct vcmd_ctx_rlimit_v0 { +struct vcmd_ctx_rlimit_v0 { uint32_t id; uint64_t minimum; uint64_t softlimit; uint64_t maximum; }; -struct vcmd_ctx_rlimit_mask_v0 { +struct vcmd_ctx_rlimit_mask_v0 { uint32_t minimum; uint32_t softlimit; uint32_t maximum; @@ -95,3 +140,5 @@ void vx_vsi_swapinfo(struct sysinfo *); #endif /* _VX_LIMIT_H */ #endif + +