fedora core 6 1.2949 + vserver 2.2.0
[linux-2.6.git] / include / linux / vserver / limit.h
index d9e1eea..0fd90c7 100644 (file)
-/* _VX_LIMIT_H defined below */
-
-#if    defined(__KERNEL__) && defined(_VX_INFO_DEF_)
+#ifndef _VX_LIMIT_H
+#define _VX_LIMIT_H
 
-#include <asm/atomic.h>
-#include <asm/resource.h>
 
-/* context sub struct */
+#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 NUM_LIMITS     20
 
-#define VLIMIT_NSOCK   16
+#ifdef __KERNEL__
 
+#define        VLIM_NOCHECK    ((1L << VLIMIT_DENTRY) | (1L << RLIMIT_RSS))
 
-extern const char *vlimit_name[NUM_LIMITS];
-
-struct _vx_limit {
-       atomic_t ticks;
-
-       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; lim<NUM_LIMITS; lim++) {
-               limit->rlim[lim] = RLIM_INFINITY;
-               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; lim<NUM_LIMITS; lim++) {
-               value = atomic_read(&limit->rcur[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; lim<NUM_LIMITS; lim++) {
-               value = atomic_read(&limit->rcur[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"  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)
-               );
-}
-
-#else  /* _VX_INFO_DEF_ */
-#ifndef _VX_LIMIT_H
-#define _VX_LIMIT_H
+/*     keep in sync with CRLIM_INFINITY */
 
-#include "switch.h"
+#define        VLIM_INFINITY   (~0ULL)
 
-#define VXD_RLIMIT(r,l)                (VXD_CBIT(limit, (l)) && ((r) == (l)))
+#ifndef RLIM_INFINITY
+#warning RLIM_INFINITY is undefined
+#endif
 
-/*  rlimit vserver commands */
+#define __rlim_val(l,r,v)      ((l)->res[(r)].v)
 
-#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)
+#define __rlim_soft(l,r)       __rlim_val(l,r,soft)
+#define __rlim_hard(l,r)       __rlim_val(l,r,hard)
 
-struct vcmd_ctx_rlimit_v0 {
-       uint32_t id;
-       uint64_t minimum;
-       uint64_t softlimit;
-       uint64_t maximum;
-};
+#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)
 
-struct vcmd_ctx_rlimit_mask_v0 {
-       uint32_t minimum;
-       uint32_t softlimit;
-       uint32_t maximum;
-};
+#define __rlim_lhit(l,r)       __rlim_val(l,r,lhit)
+#define __rlim_hit(l,r)                atomic_inc(&__rlim_lhit(l,r))
 
-#define CRLIM_UNSET            (0ULL)
-#define CRLIM_INFINITY         (~0ULL)
-#define CRLIM_KEEP             (~1ULL)
+typedef atomic_long_t rlim_atomic_t;
+typedef unsigned long rlim_t;
 
-#ifdef __KERNEL__
+#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))
 
-#include <linux/compiler.h>
 
-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 *);
+#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
-
-