1 #ifndef _VX_VS_DLIMIT_H
2 #define _VX_VS_DLIMIT_H
7 #include <linux/kernel.h>
8 #include <linux/rcupdate.h>
9 #include <linux/sched.h>
11 #include "vserver/context.h"
12 #include "vserver/dlimit.h"
15 #define vxdprintk(x...) printk("vxd: " x)
17 #define vxdprintk(x...)
21 #define get_dl_info(i) __get_dl_info(i,__FILE__,__LINE__)
23 static inline struct dl_info *__get_dl_info(struct dl_info *dli,
24 const char *_file, int _line)
28 vxdprintk("get_dl_info(%p[#%d.%d])\t%s:%d\n",
29 dli, dli?dli->dl_xid:0, dli?atomic_read(&dli->dl_usecnt):0,
31 atomic_inc(&dli->dl_usecnt);
36 #define free_dl_info(i) \
37 call_rcu(&i->dl_rcu, rcu_free_dl_info, i);
39 #define put_dl_info(i) __put_dl_info(i,__FILE__,__LINE__)
41 static inline void __put_dl_info(struct dl_info *dli, const char *_file, int _line)
45 vxdprintk("put_dl_info(%p[#%d.%d])\t%s:%d\n",
46 dli, dli?dli->dl_xid:0, dli?atomic_read(&dli->dl_usecnt):0,
48 if (atomic_dec_and_test(&dli->dl_usecnt))
53 extern int vx_debug_dlimit;
55 #define __dlimit_char(d) ((d)?'*':' ')
57 static inline int __dl_alloc_space(struct super_block *sb,
58 xid_t xid, dlsize_t nr, const char *file, int line)
60 struct dl_info *dli = NULL;
65 dli = locate_dl_info(sb, xid);
69 spin_lock(&dli->dl_lock);
70 ret = (dli->dl_space_used + nr > dli->dl_space_total);
72 dli->dl_space_used += nr;
73 spin_unlock(&dli->dl_lock);
77 printk("ALLOC (%p,#%d)%c %lld bytes (%d)@ %s:%d\n",
78 sb, xid, __dlimit_char(dli), nr, ret, file, line);
82 static inline void __dl_free_space(struct super_block *sb,
83 xid_t xid, dlsize_t nr, const char *file, int line)
85 struct dl_info *dli = NULL;
89 dli = locate_dl_info(sb, xid);
93 spin_lock(&dli->dl_lock);
94 dli->dl_space_used -= nr;
95 spin_unlock(&dli->dl_lock);
99 printk("FREE (%p,#%d)%c %lld bytes @ %s:%d\n",
100 sb, xid, __dlimit_char(dli), nr, file, line);
103 static inline int __dl_alloc_inode(struct super_block *sb,
104 xid_t xid, const char *file, int line)
109 dli = locate_dl_info(sb, xid);
113 spin_lock(&dli->dl_lock);
114 ret = (dli->dl_inodes_used >= dli->dl_inodes_total);
116 dli->dl_inodes_used++;
117 spin_unlock(&dli->dl_lock);
121 printk("ALLOC (%p,#%d)%c inode (%d)@ %s:%d\n",
122 sb, xid, __dlimit_char(dli), ret, file, line);
126 static inline void __dl_free_inode(struct super_block *sb,
127 xid_t xid, const char *file, int line)
131 dli = locate_dl_info(sb, xid);
135 spin_lock(&dli->dl_lock);
136 dli->dl_inodes_used--;
137 spin_unlock(&dli->dl_lock);
141 printk("FREE (%p,#%d)%c inode @ %s:%d\n",
142 sb, xid, __dlimit_char(dli), file, line);
147 #define DLIMIT_ALLOC_BLOCK(sb, xid, nr) \
148 __dl_alloc_space(sb, xid, \
149 ((dlsize_t)(nr)) << (sb)->s_blocksize_bits, \
152 #define DLIMIT_FREE_BLOCK(sb, xid, nr) \
153 __dl_free_space(sb, xid, \
154 ((dlsize_t)(nr)) << (sb)->s_blocksize_bits, \
157 #define DLIMIT_ALLOC_INODE(sb, xid) \
158 __dl_alloc_inode(sb, xid, __FILE__, __LINE__ )
160 #define DLIMIT_FREE_INODE(sb, xid) \
161 __dl_free_inode(sb, xid, __FILE__, __LINE__ )
164 #define DLIMIT_ADJUST_BLOCK(sb, xid, fb, rb)
168 #warning duplicate inclusion