X-Git-Url: http://git.linux-vserver.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=kernel%2Flimit_int.h;h=b567438100d730345fcb8c85c6f7be2d7ccb7931;hb=50e3c58ac5d9afe773c732578b4af0dff8ce588f;hp=a48d242b3a81706a0061cac1c15d743dd738f95a;hpb=c200d0d2c3ddb683ad17627bc924e515aae91e46;p=util-vserver.git diff --git a/kernel/limit_int.h b/kernel/limit_int.h index a48d242..b567438 100644 --- a/kernel/limit_int.h +++ b/kernel/limit_int.h @@ -4,73 +4,80 @@ #ifdef __KERNEL__ -#define VXD_RCRES(r) VXD_CBIT(cres, (r)) -#define VXD_RLIMIT(r) VXD_CBIT(limit, (r)) +#define VXD_RCRES_COND(r) VXD_CBIT(cres, (r)) +#define VXD_RLIMIT_COND(r) VXD_CBIT(limit, (r)) extern const char *vlimit_name[NUM_LIMITS]; static inline void __vx_acc_cres(struct vx_info *vxi, int res, int dir, void *_data, char *_file, int _line) { - if (VXD_RCRES(res)) - vxlprintk(1, "vx_acc_cres[%5d,%s,%2d]: %5d%s (%p)", + if (VXD_RCRES_COND(res)) + vxlprintk(1, "vx_acc_cres[%5d,%s,%2d]: %5ld%s (%p)", (vxi ? vxi->vx_id : -1), vlimit_name[res], res, - (vxi ? atomic_read(&vxi->limit.rcur[res]) : 0), + (vxi ? (long)__rlim_get(&vxi->limit, res) : 0), (dir > 0) ? "++" : "--", _data, _file, _line); if (!vxi) return; if (dir > 0) - atomic_inc(&vxi->limit.rcur[res]); + __rlim_inc(&vxi->limit, res); else - atomic_dec(&vxi->limit.rcur[res]); + __rlim_dec(&vxi->limit, res); } static inline void __vx_add_cres(struct vx_info *vxi, int res, int amount, void *_data, char *_file, int _line) { - if (VXD_RCRES(res)) - vxlprintk(1, "vx_add_cres[%5d,%s,%2d]: %5d += %5d (%p)", + if (VXD_RCRES_COND(res)) + vxlprintk(1, "vx_add_cres[%5d,%s,%2d]: %5ld += %5d (%p)", (vxi ? vxi->vx_id : -1), vlimit_name[res], res, - (vxi ? atomic_read(&vxi->limit.rcur[res]) : 0), + (vxi ? (long)__rlim_get(&vxi->limit, res) : 0), amount, _data, _file, _line); if (amount == 0) return; if (!vxi) return; - atomic_add(amount, &vxi->limit.rcur[res]); + __rlim_add(&vxi->limit, res, amount); } static inline int __vx_cres_avail(struct vx_info *vxi, int res, int num, char *_file, int _line) { - unsigned long value; + rlim_t value; - if (VXD_RLIMIT(res)) - vxlprintk(1, "vx_cres_avail[%5d,%s,%2d]: %5ld > %5d + %5d", + if (VXD_RLIMIT_COND(res)) + vxlprintk(1, "vx_cres_avail[%5d,%s,%2d]: %5ld/%5ld > %5ld + %5d", (vxi ? vxi->vx_id : -1), vlimit_name[res], res, - (vxi ? vxi->limit.rlim[res] : 1), - (vxi ? atomic_read(&vxi->limit.rcur[res]) : 0), + (vxi ? (long)__rlim_soft(&vxi->limit, res) : -1), + (vxi ? (long)__rlim_hard(&vxi->limit, res) : -1), + (vxi ? (long)__rlim_get(&vxi->limit, res) : 0), num, _file, _line); if (num == 0) return 1; if (!vxi) return 1; - value = atomic_read(&vxi->limit.rcur[res]); + value = __rlim_get(&vxi->limit, res); - if (value > vxi->limit.rmax[res]) - vxi->limit.rmax[res] = value; + if (value > __rlim_rmax(&vxi->limit, res)) + __rlim_rmax(&vxi->limit, res) = value; + else if (value < __rlim_rmin(&vxi->limit, res)) + __rlim_rmin(&vxi->limit, res) = value; - if (vxi->limit.rlim[res] == RLIM_INFINITY) - return 1; + if (__rlim_soft(&vxi->limit, res) == RLIM_INFINITY) + return -1; + if (value + num <= __rlim_soft(&vxi->limit, res)) + return -1; - if (value + num <= vxi->limit.rlim[res]) + if (__rlim_hard(&vxi->limit, res) == RLIM_INFINITY) + return 1; + if (value + num <= __rlim_hard(&vxi->limit, res)) return 1; - atomic_inc(&vxi->limit.lhit[res]); + __rlim_hit(&vxi->limit, res); return 0; } #endif /* __KERNEL__ */ -#endif /* _VX_LIMIT_H */ +#endif /* _VX_LIMIT_INT_H */