aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/rtc/rtc-ds1390.c
diff options
context:
space:
mode:
authorRussell King <rmk+kernel@arm.linux.org.uk>2011-05-25 16:47:48 -0400
committerRussell King <rmk+kernel@arm.linux.org.uk>2011-05-25 16:47:48 -0400
commit586893ebc42943008010b4c210cfc9167df615e5 (patch)
treeeec3179235978fba9ca6bfae0799d97c8532ee15 /drivers/rtc/rtc-ds1390.c
parent014322dac6ae0048c928c6ca2faf0d53194f9d15 (diff)
parentbd6356bdafc853201168f718f0059fbe11191461 (diff)
Merge branch 'for-rmk' of git://git.kernel.org/pub/scm/linux/kernel/git/kgene/linux-samsung into devel-stable
Conflicts: arch/arm/Kconfig arch/arm/mach-exynos4/mach-nuri.c
Diffstat (limited to 'drivers/rtc/rtc-ds1390.c')
0 files changed, 0 insertions, 0 deletions
/fs/file.c?h=v2.6.30-rc5&id=ab2af1f5005069321c5d130f09cce577b03f43ef'>ab2af1f50050
1da177e4c3f4
5466b456ed67
1da177e4c3f4
1da177e4c3f4
5466b456ed67


1da177e4c3f4

5466b456ed67
1da177e4c3f4
5466b456ed67

1da177e4c3f4
5466b456ed67
1da177e4c3f4

5466b456ed67
1da177e4c3f4
5466b456ed67



ab2af1f50050
1da177e4c3f4
65f27f38446e
ab2af1f50050
65f27f38446e

ab2af1f50050
1da177e4c3f4
ab2af1f50050





5466b456ed67


ab2af1f50050


1da177e4c3f4
4fd45812cbe8
ab2af1f50050

ab2af1f50050
1da177e4c3f4
ab2af1f50050
ab2af1f50050
4fd45812cbe8
ab2af1f50050
4fd45812cbe8

ab2af1f50050
4fd45812cbe8

ab2af1f50050

5466b456ed67
ab2af1f50050
5466b456ed67
ab2af1f50050
1da177e4c3f4
ab2af1f50050



593be07ae8f6

ab2af1f50050

1da177e4c3f4
ab2af1f50050

ab2af1f50050



5466b456ed67
ab2af1f50050
5466b456ed67
ab2af1f50050
5466b456ed67
5466b456ed67











1da177e4c3f4

5466b456ed67
1da177e4c3f4
5466b456ed67

1da177e4c3f4
ab2af1f50050
5466b456ed67




ab2af1f50050
5466b456ed67


5c598b3428c3









bbea9f69668a
5466b456ed67

bbea9f69668a
5466b456ed67














ab2af1f50050
5466b456ed67



ab2af1f50050
5466b456ed67
ab2af1f50050

1da177e4c3f4
ab2af1f50050
74d392aaabfc




ab2af1f50050




74d392aaabfc
ab2af1f50050

74d392aaabfc
ab2af1f50050
74d392aaabfc

ab2af1f50050
5c598b3428c3









74d392aaabfc

ab2af1f50050
74d392aaabfc
bbea9f69668a
74d392aaabfc


4fd45812cbe8
01b2d93ca4c4
ab2af1f50050
74d392aaabfc
5466b456ed67


ab2af1f50050
74d392aaabfc
1da177e4c3f4



74d392aaabfc




1da177e4c3f4


badf16621c1f
1da177e4c3f4
badf16621c1f
4e1e018ecc6f







74d392aaabfc
bbea9f69668a
74d392aaabfc
4e1e018ecc6f
74d392aaabfc
9cfe015aa424
74d392aaabfc



1da177e4c3f4
ab2af1f50050
02afc6267f6d













02afc6267f6d












afbec7fff492
02afc6267f6d


afbec7fff492











02afc6267f6d

02afc6267f6d



02afc6267f6d
adbecb128cd2
02afc6267f6d
9dec3c4d306b
adbecb128cd2





9dec3c4d306b











02afc6267f6d
9dec3c4d306b
9dec3c4d306b
02afc6267f6d






adbecb128cd2
02afc6267f6d








































afbec7fff492

02afc6267f6d







ab2af1f50050



65f27f38446e
ab2af1f50050





0a945022778f
ab2af1f50050
eceea0b3df05

ab2af1f50050
f52111b15469












1027abe8827b



























































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
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495







                                                             
                         





                          
                          
                         







                              


                             
                                             

                                                        
 






                                                                              
 
                                                   
 
                              


                                                 

 
                                                  
 

                                                                
            
                               

 
                                                  
 



                                                            
 
 
                                                       
 

                                                             
                            
 





                                                 


                                


                           
 
                                           

                                                                     
                                    
 
                     
 
                                              
                  

                                                                           
                   

                                                                               

                       
                                                                  
                               
                                     
                           
                



                                                         

                                                                     

                                                
         

 



                                                                        
                                                                    
 
                              
 
                                              











                                                                      

 
                                                      
 

                            
 
          




                                                                               
           


                                             









                                                                                   
 

                                                          
                         














                                                                          
                   



                        
                   
    

                    
 
  




                                                                            




                                                             
                                          

                                       
                                    
                                     

                               
          









                                                                                  

                                                                              
           
                                       
                                     


                                                        
                                                       
                                              
                
                                                                 


                                    
         
                 



                




                                                                               


                                                    
                            
 
                                   







                                                                    
                                   
                              
                         
 
                            
                                 



                                         
 
 













                                                  












                                                                    
                                                          


                         











                                                                     

                                      



                                                                          
           
                                                         
                                              
 





                                              











                                                              
                                         
                 
 






                                                                        
                                                       








































                                                                              

                                               







                                            



                                                                        
                                                 





                                  
                                
                                           

                                                                              
 












                                                                           



























































                                                                         
/*
 *  linux/fs/file.c
 *
 *  Copyright (C) 1998-1999, Stephen Tweedie and Bill Hawes
 *
 *  Manage the dynamic fd arrays in the process files_struct.
 */

#include <linux/module.h>
#include <linux/fs.h>
#include <linux/mm.h>
#include <linux/time.h>
#include <linux/slab.h>
#include <linux/vmalloc.h>
#include <linux/file.h>
#include <linux/fdtable.h>
#include <linux/bitops.h>
#include <linux/interrupt.h>
#include <linux/spinlock.h>
#include <linux/rcupdate.h>
#include <linux/workqueue.h>

struct fdtable_defer {
	spinlock_t lock;
	struct work_struct wq;
	struct fdtable *next;
};

int sysctl_nr_open __read_mostly = 1024*1024;
int sysctl_nr_open_min = BITS_PER_LONG;
int sysctl_nr_open_max = 1024 * 1024; /* raised later */

/*
 * We use this list to defer free fdtables that have vmalloced
 * sets/arrays. By keeping a per-cpu list, we avoid having to embed
 * the work_struct in fdtable itself which avoids a 64 byte (i386) increase in
 * this per-task structure.
 */
static DEFINE_PER_CPU(struct fdtable_defer, fdtable_defer_list);

static inline void * alloc_fdmem(unsigned int size)
{
	if (size <= PAGE_SIZE)
		return kmalloc(size, GFP_KERNEL);
	else
		return vmalloc(size);
}

static inline void free_fdarr(struct fdtable *fdt)
{
	if (fdt->max_fds <= (PAGE_SIZE / sizeof(struct file *)))
		kfree(fdt->fd);
	else
		vfree(fdt->fd);
}

static inline void free_fdset(struct fdtable *fdt)
{
	if (fdt->max_fds <= (PAGE_SIZE * BITS_PER_BYTE / 2))
		kfree(fdt->open_fds);
	else
		vfree(fdt->open_fds);
}

static void free_fdtable_work(struct work_struct *work)
{
	struct fdtable_defer *f =
		container_of(work, struct fdtable_defer, wq);
	struct fdtable *fdt;

	spin_lock_bh(&f->lock);
	fdt = f->next;
	f->next = NULL;
	spin_unlock_bh(&f->lock);
	while(fdt) {
		struct fdtable *next = fdt->next;
		vfree(fdt->fd);
		free_fdset(fdt);
		kfree(fdt);
		fdt = next;
	}
}

void free_fdtable_rcu(struct rcu_head *rcu)
{
	struct fdtable *fdt = container_of(rcu, struct fdtable, rcu);
	struct fdtable_defer *fddef;

	BUG_ON(!fdt);

	if (fdt->max_fds <= NR_OPEN_DEFAULT) {
		/*
		 * This fdtable is embedded in the files structure and that
		 * structure itself is getting destroyed.
		 */
		kmem_cache_free(files_cachep,
				container_of(fdt, struct files_struct, fdtab));
		return;
	}
	if (fdt->max_fds <= (PAGE_SIZE / sizeof(struct file *))) {
		kfree(fdt->fd);
		kfree(fdt->open_fds);
		kfree(fdt);
	} else {
		fddef = &get_cpu_var(fdtable_defer_list);
		spin_lock(&fddef->lock);
		fdt->next = fddef->next;
		fddef->next = fdt;
		/* vmallocs are handled from the workqueue context */
		schedule_work(&fddef->wq);
		spin_unlock(&fddef->lock);
		put_cpu_var(fdtable_defer_list);
	}
}

/*
 * Expand the fdset in the files_struct.  Called with the files spinlock
 * held for write.
 */
static void copy_fdtable(struct fdtable *nfdt, struct fdtable *ofdt)
{
	unsigned int cpy, set;

	BUG_ON(nfdt->max_fds < ofdt->max_fds);

	cpy = ofdt->max_fds * sizeof(struct file *);
	set = (nfdt->max_fds - ofdt->max_fds) * sizeof(struct file *);
	memcpy(nfdt->fd, ofdt->fd, cpy);
	memset((char *)(nfdt->fd) + cpy, 0, set);

	cpy = ofdt->max_fds / BITS_PER_BYTE;
	set = (nfdt->max_fds - ofdt->max_fds) / BITS_PER_BYTE;
	memcpy(nfdt->open_fds, ofdt->open_fds, cpy);
	memset((char *)(nfdt->open_fds) + cpy, 0, set);
	memcpy(nfdt->close_on_exec, ofdt->close_on_exec, cpy);
	memset((char *)(nfdt->close_on_exec) + cpy, 0, set);
}

static struct fdtable * alloc_fdtable(unsigned int nr)
{
	struct fdtable *fdt;
	char *data;

	/*
	 * Figure out how many fds we actually want to support in this fdtable.
	 * Allocation steps are keyed to the size of the fdarray, since it
	 * grows far faster than any of the other dynamic data. We try to fit
	 * the fdarray into comfortable page-tuned chunks: starting at 1024B
	 * and growing in powers of two from there on.
	 */
	nr /= (1024 / sizeof(struct file *));
	nr = roundup_pow_of_two(nr + 1);
	nr *= (1024 / sizeof(struct file *));
	/*
	 * Note that this can drive nr *below* what we had passed if sysctl_nr_open
	 * had been set lower between the check in expand_files() and here.  Deal
	 * with that in caller, it's cheaper that way.
	 *
	 * We make sure that nr remains a multiple of BITS_PER_LONG - otherwise
	 * bitmaps handling below becomes unpleasant, to put it mildly...
	 */
	if (unlikely(nr > sysctl_nr_open))
		nr = ((sysctl_nr_open - 1) | (BITS_PER_LONG - 1)) + 1;

	fdt = kmalloc(sizeof(struct fdtable), GFP_KERNEL);
	if (!fdt)
		goto out;
	fdt->max_fds = nr;
	data = alloc_fdmem(nr * sizeof(struct file *));
	if (!data)
		goto out_fdt;
	fdt->fd = (struct file **)data;
	data = alloc_fdmem(max_t(unsigned int,
				 2 * nr / BITS_PER_BYTE, L1_CACHE_BYTES));
	if (!data)
		goto out_arr;
	fdt->open_fds = (fd_set *)data;
	data += nr / BITS_PER_BYTE;
	fdt->close_on_exec = (fd_set *)data;
	INIT_RCU_HEAD(&fdt->rcu);
	fdt->next = NULL;

	return fdt;

out_arr:
	free_fdarr(fdt);
out_fdt:
	kfree(fdt);
out:
	return NULL;
}

/*
 * Expand the file descriptor table.
 * This function will allocate a new fdtable and both fd array and fdset, of
 * the given size.
 * Return <0 error code on error; 1 on successful completion.
 * The files->file_lock should be held on entry, and will be held on exit.
 */
static int expand_fdtable(struct files_struct *files, int nr)
	__releases(files->file_lock)
	__acquires(files->file_lock)
{
	struct fdtable *new_fdt, *cur_fdt;

	spin_unlock(&files->file_lock);
	new_fdt = alloc_fdtable(nr);
	spin_lock(&files->file_lock);
	if (!new_fdt)
		return -ENOMEM;
	/*
	 * extremely unlikely race - sysctl_nr_open decreased between the check in
	 * caller and alloc_fdtable().  Cheaper to catch it here...
	 */
	if (unlikely(new_fdt->max_fds <= nr)) {
		free_fdarr(new_fdt);
		free_fdset(new_fdt);
		kfree(new_fdt);
		return -EMFILE;
	}
	/*
	 * Check again since another task may have expanded the fd table while
	 * we dropped the lock
	 */
	cur_fdt = files_fdtable(files);
	if (nr >= cur_fdt->max_fds) {
		/* Continue as planned */
		copy_fdtable(new_fdt, cur_fdt);
		rcu_assign_pointer(files->fdt, new_fdt);