-#if defined(__KERNEL__) && defined(_VX_INFO_DEF_)
-
-#include <asm/atomic.h>
-#include <asm/resource.h>
-
-/* context sub struct */
-
-#define RLIMIT_OPENFD 12
-
-#define NUM_RLIMITS 16
-
-#define VLIMIT_SOCK 16
-
-
-struct _vx_limit {
- atomic_t ticks;
-
- unsigned long rlim[NUM_RLIMITS]; /* Per context limit */
- atomic_t res[NUM_RLIMITS]; /* Current value */
-};
-
-static inline void vx_info_init_limit(struct _vx_limit *limit)
-{
- int lim;
-
- for (lim=0; lim<NUM_RLIMITS; lim++) {
- limit->rlim[lim] = RLIM_INFINITY;
- atomic_set(&limit->res[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; lim<NUM_RLIMITS; lim++) {
- value = atomic_read(&limit->res[lim]);
- if (value && vx_debug_limit)
- printk("!!! limit: %p[%d] = %d on exit.\n",
- limit, lim, value);
- }
-}
-
-
-static inline int vx_info_proc_limit(struct _vx_limit *limit, char *buffer)
-{
- 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]
- );
-}
-
-#else /* _VX_INFO_DEF_ */
#ifndef _VX_LIMIT_H
#define _VX_LIMIT_H
-#include "switch.h"
-/* rlimit vserver commands */
+#define VLIMIT_NSOCK 16
+#define VLIMIT_OPENFD 17
+#define VLIMIT_ANON 18
+#define VLIMIT_SHMEM 19
+#define VLIMIT_SEMARY 20
+#define VLIMIT_NSEMS 21
+#define VLIMIT_DENTRY 22
+#define VLIMIT_MAPPED 23
-#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 {
- uint32_t id;
- uint64_t minimum;
- uint64_t softlimit;
- uint64_t maximum;
-};
+#ifdef __KERNEL__
-struct vcmd_ctx_rlimit_mask_v0 {
- uint32_t minimum;
- uint32_t softlimit;
- uint32_t maximum;
-};
+#define VLIM_NOCHECK ((1L << VLIMIT_DENTRY) | (1L << RLIMIT_RSS))
-#define CRLIM_UNSET (0ULL)
-#define CRLIM_INFINITY (~0ULL)
-#define CRLIM_KEEP (~1ULL)
+/* keep in sync with CRLIM_INFINITY */
-#ifdef __KERNEL__
+#define VLIM_INFINITY (~0ULL)
+
+#ifndef RLIM_INFINITY
+#warning RLIM_INFINITY is undefined
+#endif
+
+#define __rlim_val(l,r,v) ((l)->res[(r)].v)
+
+#define __rlim_soft(l,r) __rlim_val(l,r,soft)
+#define __rlim_hard(l,r) __rlim_val(l,r,hard)
+
+#define __rlim_rcur(l,r) __rlim_val(l,r,rcur)
+#define __rlim_rmin(l,r) __rlim_val(l,r,rmin)
+#define __rlim_rmax(l,r) __rlim_val(l,r,rmax)
-#include <linux/compiler.h>
+#define __rlim_lhit(l,r) __rlim_val(l,r,lhit)
+#define __rlim_hit(l,r) atomic_inc(&__rlim_lhit(l,r))
-extern int vc_get_rlimit(uint32_t, void __user *);
-extern int vc_set_rlimit(uint32_t, void __user *);
-extern int vc_get_rlimit_mask(uint32_t, void __user *);
+typedef atomic_long_t rlim_atomic_t;
+typedef unsigned long rlim_t;
+
+#define __rlim_get(l,r) atomic_long_read(&__rlim_rcur(l,r))
+#define __rlim_set(l,r,v) atomic_long_set(&__rlim_rcur(l,r), v)
+#define __rlim_inc(l,r) atomic_long_inc(&__rlim_rcur(l,r))
+#define __rlim_dec(l,r) atomic_long_dec(&__rlim_rcur(l,r))
+#define __rlim_add(l,r,v) atomic_long_add(v, &__rlim_rcur(l,r))
+#define __rlim_sub(l,r,v) atomic_long_sub(v, &__rlim_rcur(l,r))
+
+
+#if (RLIM_INFINITY == VLIM_INFINITY)
+#define VX_VLIM(r) ((long long)(long)(r))
+#define VX_RLIM(v) ((rlim_t)(v))
+#else
+#define VX_VLIM(r) (((r) == RLIM_INFINITY) \
+ ? VLIM_INFINITY : (long long)(r))
+#define VX_RLIM(v) (((v) == VLIM_INFINITY) \
+ ? RLIM_INFINITY : (rlim_t)(v))
+#endif
struct sysinfo;
void vx_vsi_meminfo(struct sysinfo *);
void vx_vsi_swapinfo(struct sysinfo *);
+#define NUM_LIMITS 24
#endif /* __KERNEL__ */
-
#endif /* _VX_LIMIT_H */
-#endif