aboutsummaryrefslogtreecommitdiffstats
path: root/include/linux/console_struct.h
diff options
context:
space:
mode:
Diffstat (limited to 'include/linux/console_struct.h')
0 files changed, 0 insertions, 0 deletions
Memory controller: resource counters' href='/cgit/cgit.cgi/litmus-rt-edfsc.git/commit/kernel/res_counter.c?id=e552b6617067ab785256dcec5ca29eeea981aacb'>e552b6617067
4d8438f044d8

e552b6617067
4d8438f044d8
e552b6617067
28dbc4b6a01f
e552b6617067
4d8438f044d8
28dbc4b6a01f



4d8438f044d8
28dbc4b6a01f
4d8438f044d8

28dbc4b6a01f
4d8438f044d8

28dbc4b6a01f

4d8438f044d8






28dbc4b6a01f
28dbc4b6a01f
4d8438f044d8
e552b6617067


4d8438f044d8





0e90b31f4ba7


4d8438f044d8
0e90b31f4ba7
4d8438f044d8
50bdd430c205
e552b6617067




50bdd430c205
e552b6617067

50bdd430c205


e552b6617067

28dbc4b6a01f
50bdd430c205
e552b6617067
28dbc4b6a01f
2bb2ba9d51a8
50bdd430c205
28dbc4b6a01f
50bdd430c205


28dbc4b6a01f


50bdd430c205
e552b6617067

50bdd430c205
2bb2ba9d51a8
50bdd430c205
2bb2ba9d51a8
e552b6617067
0eea10301708

e552b6617067



c84872e168d1

e552b6617067



296c81d89f4f

e552b6617067






0eea10301708

e552b6617067
0eea10301708
e552b6617067



0eea10301708



e552b6617067



6c191cd01a93












2c7eabf37647



6c191cd01a93
2c7eabf37647
856c13aa1ff6

e552b6617067
856c13aa1ff6
c5b947b28828









52dcf8a1f8ac
856c13aa1ff6

e552b6617067
856c13aa1ff6


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200













                                             
                     
 
                                                                              

                                       
                                      
                                           
                                 

 

                                                                             
 

                    

                                                    


                                   


                              
                                                
                                                    
                   

 

                                                                               
 
                   
                            
                                  
 
                    



                                                     
                                                             
                                      

                                    
                                           

                                      

                 






                                                            
         
                                 
 


                   





                                                                        


                                                                             
                                                                       
 
 
                                                                               




                                          
                              

 


                                                           

                            
                              
                    
 
                              
                                                    
                      
                                    


                                                        


                                      
                   

 
                                                                        
 
                                                              
 
 

                                                           



                                       

                                           



                                         

                                            






                                                                 

                                                                           
 
                                



                                                  



                                                



                                                                      












                                                                 



                                                                 
      
 

                                                                
 
                  









                                                                 
                                   

                               
 


                                
/*
 * resource cgroups
 *
 * Copyright 2007 OpenVZ SWsoft Inc
 *
 * Author: Pavel Emelianov <xemul@openvz.org>
 *
 */

#include <linux/types.h>
#include <linux/parser.h>
#include <linux/fs.h>
#include <linux/res_counter.h>
#include <linux/uaccess.h>
#include <linux/mm.h>

void res_counter_init(struct res_counter *counter, struct res_counter *parent)
{
	spin_lock_init(&counter->lock);
	counter->limit = RESOURCE_MAX;
	counter->soft_limit = RESOURCE_MAX;
	counter->parent = parent;
}

int res_counter_charge_locked(struct res_counter *counter, unsigned long val,
			      bool force)
{
	int ret = 0;

	if (counter->usage + val > counter->limit) {
		counter->failcnt++;
		ret = -ENOMEM;
		if (!force)
			return ret;
	}

	counter->usage += val;
	if (counter->usage > counter->max_usage)
		counter->max_usage = counter->usage;
	return ret;
}

static int __res_counter_charge(struct res_counter *counter, unsigned long val,
				struct res_counter **limit_fail_at, bool force)
{
	int ret, r;
	unsigned long flags;
	struct res_counter *c, *u;

	r = ret = 0;
	*limit_fail_at = NULL;
	local_irq_save(flags);
	for (c = counter; c != NULL; c = c->parent) {
		spin_lock(&c->lock);
		r = res_counter_charge_locked(c, val, force);
		spin_unlock(&c->lock);
		if (r < 0 && !ret) {
			ret = r;
			*limit_fail_at = c;
			if (!force)
				break;
		}
	}

	if (ret < 0 && !force) {
		for (u = counter; u != c; u = u->parent) {
			spin_lock(&u->lock);
			res_counter_uncharge_locked(u, val);
			spin_unlock(&u->lock);
		}
	}
	local_irq_restore(flags);

	return ret;
}

int res_counter_charge(struct res_counter *counter, unsigned long val,
			struct res_counter **limit_fail_at)
{
	return __res_counter_charge(counter, val, limit_fail_at, false);
}

int res_counter_charge_nofail(struct res_counter *counter, unsigned long val,
			      struct res_counter **limit_fail_at)
{
	return __res_counter_charge(counter, val, limit_fail_at, true);
}

u64 res_counter_uncharge_locked(struct res_counter *counter, unsigned long val)
{
	if (WARN_ON(counter->usage < val))
		val = counter->usage;

	counter->usage -= val;
	return counter->usage;
}

u64 res_counter_uncharge_until(struct res_counter *counter,
			       struct res_counter *top,
			       unsigned long val)
{
	unsigned long flags;
	struct res_counter *c;
	u64 ret = 0;

	local_irq_save(flags);
	for (c = counter; c != top; c = c->parent) {
		u64 r;
		spin_lock(&c->lock);