Linux Kernel
3.7.1
Main Page
Related Pages
Modules
Namespaces
Data Structures
Files
File List
Globals
All
Data Structures
Namespaces
Files
Functions
Variables
Typedefs
Enumerations
Enumerator
Macros
Groups
Pages
fs
fscache
internal.h
Go to the documentation of this file.
1
/* Internal definitions for FS-Cache
2
*
3
* Copyright (C) 2004-2007 Red Hat, Inc. All Rights Reserved.
4
* Written by David Howells (
[email protected]
)
5
*
6
* This program is free software; you can redistribute it and/or
7
* modify it under the terms of the GNU General Public License
8
* as published by the Free Software Foundation; either version
9
* 2 of the License, or (at your option) any later version.
10
*/
11
12
/*
13
* Lock order, in the order in which multiple locks should be obtained:
14
* - fscache_addremove_sem
15
* - cookie->lock
16
* - cookie->parent->lock
17
* - cache->object_list_lock
18
* - object->lock
19
* - object->parent->lock
20
* - cookie->stores_lock
21
* - fscache_thread_lock
22
*
23
*/
24
25
#include <
linux/fscache-cache.h
>
26
#include <linux/sched.h>
27
28
#define FSCACHE_MIN_THREADS 4
29
#define FSCACHE_MAX_THREADS 32
30
31
/*
32
* cache.c
33
*/
34
extern
struct
list_head
fscache_cache_list
;
35
extern
struct
rw_semaphore
fscache_addremove_sem
;
36
37
extern
struct
fscache_cache
*
fscache_select_cache_for_object
(
38
struct
fscache_cookie
*);
39
40
/*
41
* cookie.c
42
*/
43
extern
struct
kmem_cache
*
fscache_cookie_jar
;
44
45
extern
void
fscache_cookie_init_once
(
void
*);
46
extern
void
__fscache_cookie_put
(
struct
fscache_cookie
*);
47
48
/*
49
* fsdef.c
50
*/
51
extern
struct
fscache_cookie
fscache_fsdef_index
;
52
extern
struct
fscache_cookie_def
fscache_fsdef_netfs_def
;
53
54
/*
55
* histogram.c
56
*/
57
#ifdef CONFIG_FSCACHE_HISTOGRAM
58
extern
atomic_t
fscache_obj_instantiate_histogram
[
HZ
];
59
extern
atomic_t
fscache_objs_histogram
[
HZ
];
60
extern
atomic_t
fscache_ops_histogram
[
HZ
];
61
extern
atomic_t
fscache_retrieval_delay_histogram
[
HZ
];
62
extern
atomic_t
fscache_retrieval_histogram
[
HZ
];
63
64
static
inline
void
fscache_hist
(
atomic_t
histogram[],
unsigned
long
start_jif)
65
{
66
unsigned
long
jif =
jiffies
- start_jif;
67
if
(jif >=
HZ
)
68
jif =
HZ
- 1;
69
atomic_inc
(&histogram[jif]);
70
}
71
72
extern
const
struct
file_operations
fscache_histogram_fops
;
73
74
#else
75
#define fscache_hist(hist, start_jif) do {} while (0)
76
#endif
77
78
/*
79
* main.c
80
*/
81
extern
unsigned
fscache_defer_lookup
;
82
extern
unsigned
fscache_defer_create
;
83
extern
unsigned
fscache_debug
;
84
extern
struct
kobject
*
fscache_root
;
85
extern
struct
workqueue_struct
*
fscache_object_wq
;
86
extern
struct
workqueue_struct
*
fscache_op_wq
;
87
DECLARE_PER_CPU
(
wait_queue_head_t
, fscache_object_cong_wait);
88
89
static
inline
bool
fscache_object_congested(
void
)
90
{
91
return
workqueue_congested
(
WORK_CPU_UNBOUND
, fscache_object_wq);
92
}
93
94
extern
int
fscache_wait_bit
(
void
*);
95
extern
int
fscache_wait_bit_interruptible
(
void
*);
96
97
/*
98
* object.c
99
*/
100
extern
const
char
fscache_object_states_short
[FSCACHE_OBJECT__NSTATES][5];
101
102
extern
void
fscache_withdrawing_object
(
struct
fscache_cache
*,
103
struct
fscache_object
*);
104
extern
void
fscache_enqueue_object
(
struct
fscache_object
*);
105
106
/*
107
* object-list.c
108
*/
109
#ifdef CONFIG_FSCACHE_OBJECT_LIST
110
extern
const
struct
file_operations
fscache_objlist_fops
;
111
112
extern
void
fscache_objlist_add
(
struct
fscache_object
*);
113
#else
114
#define fscache_objlist_add(object) do {} while(0)
115
#endif
116
117
/*
118
* operation.c
119
*/
120
extern
int
fscache_submit_exclusive_op
(
struct
fscache_object
*,
121
struct
fscache_operation
*);
122
extern
int
fscache_submit_op
(
struct
fscache_object
*,
123
struct
fscache_operation
*);
124
extern
int
fscache_cancel_op
(
struct
fscache_operation
*);
125
extern
void
fscache_abort_object
(
struct
fscache_object
*);
126
extern
void
fscache_start_operations
(
struct
fscache_object
*);
127
extern
void
fscache_operation_gc
(
struct
work_struct
*);
128
129
/*
130
* proc.c
131
*/
132
#ifdef CONFIG_PROC_FS
133
extern
int
__init
fscache_proc_init
(
void
);
134
extern
void
fscache_proc_cleanup
(
void
);
135
#else
136
#define fscache_proc_init() (0)
137
#define fscache_proc_cleanup() do {} while (0)
138
#endif
139
140
/*
141
* stats.c
142
*/
143
#ifdef CONFIG_FSCACHE_STATS
144
extern
atomic_t
fscache_n_ops_processed[
FSCACHE_MAX_THREADS
];
145
extern
atomic_t
fscache_n_objs_processed[
FSCACHE_MAX_THREADS
];
146
147
extern
atomic_t
fscache_n_op_pend
;
148
extern
atomic_t
fscache_n_op_run
;
149
extern
atomic_t
fscache_n_op_enqueue
;
150
extern
atomic_t
fscache_n_op_deferred_release
;
151
extern
atomic_t
fscache_n_op_release
;
152
extern
atomic_t
fscache_n_op_gc
;
153
extern
atomic_t
fscache_n_op_cancelled
;
154
extern
atomic_t
fscache_n_op_rejected
;
155
156
extern
atomic_t
fscache_n_attr_changed
;
157
extern
atomic_t
fscache_n_attr_changed_ok
;
158
extern
atomic_t
fscache_n_attr_changed_nobufs
;
159
extern
atomic_t
fscache_n_attr_changed_nomem
;
160
extern
atomic_t
fscache_n_attr_changed_calls
;
161
162
extern
atomic_t
fscache_n_allocs
;
163
extern
atomic_t
fscache_n_allocs_ok
;
164
extern
atomic_t
fscache_n_allocs_wait
;
165
extern
atomic_t
fscache_n_allocs_nobufs
;
166
extern
atomic_t
fscache_n_allocs_intr
;
167
extern
atomic_t
fscache_n_allocs_object_dead
;
168
extern
atomic_t
fscache_n_alloc_ops
;
169
extern
atomic_t
fscache_n_alloc_op_waits
;
170
171
extern
atomic_t
fscache_n_retrievals
;
172
extern
atomic_t
fscache_n_retrievals_ok
;
173
extern
atomic_t
fscache_n_retrievals_wait
;
174
extern
atomic_t
fscache_n_retrievals_nodata
;
175
extern
atomic_t
fscache_n_retrievals_nobufs
;
176
extern
atomic_t
fscache_n_retrievals_intr
;
177
extern
atomic_t
fscache_n_retrievals_nomem
;
178
extern
atomic_t
fscache_n_retrievals_object_dead
;
179
extern
atomic_t
fscache_n_retrieval_ops
;
180
extern
atomic_t
fscache_n_retrieval_op_waits
;
181
182
extern
atomic_t
fscache_n_stores
;
183
extern
atomic_t
fscache_n_stores_ok
;
184
extern
atomic_t
fscache_n_stores_again
;
185
extern
atomic_t
fscache_n_stores_nobufs
;
186
extern
atomic_t
fscache_n_stores_oom
;
187
extern
atomic_t
fscache_n_store_ops
;
188
extern
atomic_t
fscache_n_store_calls
;
189
extern
atomic_t
fscache_n_store_pages
;
190
extern
atomic_t
fscache_n_store_radix_deletes
;
191
extern
atomic_t
fscache_n_store_pages_over_limit
;
192
193
extern
atomic_t
fscache_n_store_vmscan_not_storing
;
194
extern
atomic_t
fscache_n_store_vmscan_gone
;
195
extern
atomic_t
fscache_n_store_vmscan_busy
;
196
extern
atomic_t
fscache_n_store_vmscan_cancelled
;
197
198
extern
atomic_t
fscache_n_marks
;
199
extern
atomic_t
fscache_n_uncaches
;
200
201
extern
atomic_t
fscache_n_acquires
;
202
extern
atomic_t
fscache_n_acquires_null
;
203
extern
atomic_t
fscache_n_acquires_no_cache
;
204
extern
atomic_t
fscache_n_acquires_ok
;
205
extern
atomic_t
fscache_n_acquires_nobufs
;
206
extern
atomic_t
fscache_n_acquires_oom
;
207
208
extern
atomic_t
fscache_n_updates
;
209
extern
atomic_t
fscache_n_updates_null
;
210
extern
atomic_t
fscache_n_updates_run
;
211
212
extern
atomic_t
fscache_n_relinquishes
;
213
extern
atomic_t
fscache_n_relinquishes_null
;
214
extern
atomic_t
fscache_n_relinquishes_waitcrt
;
215
extern
atomic_t
fscache_n_relinquishes_retire
;
216
217
extern
atomic_t
fscache_n_cookie_index
;
218
extern
atomic_t
fscache_n_cookie_data
;
219
extern
atomic_t
fscache_n_cookie_special
;
220
221
extern
atomic_t
fscache_n_object_alloc
;
222
extern
atomic_t
fscache_n_object_no_alloc
;
223
extern
atomic_t
fscache_n_object_lookups
;
224
extern
atomic_t
fscache_n_object_lookups_negative
;
225
extern
atomic_t
fscache_n_object_lookups_positive
;
226
extern
atomic_t
fscache_n_object_lookups_timed_out
;
227
extern
atomic_t
fscache_n_object_created
;
228
extern
atomic_t
fscache_n_object_avail
;
229
extern
atomic_t
fscache_n_object_dead
;
230
231
extern
atomic_t
fscache_n_checkaux_none
;
232
extern
atomic_t
fscache_n_checkaux_okay
;
233
extern
atomic_t
fscache_n_checkaux_update
;
234
extern
atomic_t
fscache_n_checkaux_obsolete
;
235
236
extern
atomic_t
fscache_n_cop_alloc_object
;
237
extern
atomic_t
fscache_n_cop_lookup_object
;
238
extern
atomic_t
fscache_n_cop_lookup_complete
;
239
extern
atomic_t
fscache_n_cop_grab_object
;
240
extern
atomic_t
fscache_n_cop_update_object
;
241
extern
atomic_t
fscache_n_cop_drop_object
;
242
extern
atomic_t
fscache_n_cop_put_object
;
243
extern
atomic_t
fscache_n_cop_sync_cache
;
244
extern
atomic_t
fscache_n_cop_attr_changed
;
245
extern
atomic_t
fscache_n_cop_read_or_alloc_page
;
246
extern
atomic_t
fscache_n_cop_read_or_alloc_pages
;
247
extern
atomic_t
fscache_n_cop_allocate_page
;
248
extern
atomic_t
fscache_n_cop_allocate_pages
;
249
extern
atomic_t
fscache_n_cop_write_page
;
250
extern
atomic_t
fscache_n_cop_uncache_page
;
251
extern
atomic_t
fscache_n_cop_dissociate_pages
;
252
253
static
inline
void
fscache_stat
(
atomic_t
*
stat
)
254
{
255
atomic_inc
(stat);
256
}
257
258
static
inline
void
fscache_stat_d
(
atomic_t
*
stat
)
259
{
260
atomic_dec
(stat);
261
}
262
263
#define __fscache_stat(stat) (stat)
264
265
extern
const
struct
file_operations
fscache_stats_fops
;
266
#else
267
268
#define __fscache_stat(stat) (NULL)
269
#define fscache_stat(stat) do {} while (0)
270
#define fscache_stat_d(stat) do {} while (0)
271
#endif
272
273
/*
274
* raise an event on an object
275
* - if the event is not masked for that object, then the object is
276
* queued for attention by the thread pool.
277
*/
278
static
inline
void
fscache_raise_event(
struct
fscache_object
*
object
,
279
unsigned
event
)
280
{
281
if
(!
test_and_set_bit
(event, &object->
events
) &&
282
test_bit
(event, &object->
event_mask
))
283
fscache_enqueue_object
(
object
);
284
}
285
286
/*
287
* drop a reference to a cookie
288
*/
289
static
inline
void
fscache_cookie_put(
struct
fscache_cookie
*
cookie
)
290
{
291
BUG_ON
(
atomic_read
(&cookie->
usage
) <= 0);
292
if
(
atomic_dec_and_test
(&cookie->
usage
))
293
__fscache_cookie_put
(cookie);
294
}
295
296
/*
297
* get an extra reference to a netfs retrieval context
298
*/
299
static
inline
300
void
*fscache_get_context(
struct
fscache_cookie
*cookie,
void
*
context
)
301
{
302
if
(cookie->
def
->get_context)
303
cookie->
def
->get_context(cookie->
netfs_data
, context);
304
return
context
;
305
}
306
307
/*
308
* release a reference to a netfs retrieval context
309
*/
310
static
inline
311
void
fscache_put_context(
struct
fscache_cookie
*cookie,
void
*context)
312
{
313
if
(cookie->
def
->put_context)
314
cookie->
def
->put_context(cookie->
netfs_data
, context);
315
}
316
317
/*****************************************************************************/
318
/*
319
* debug tracing
320
*/
321
#define dbgprintk(FMT, ...) \
322
printk(KERN_DEBUG "[%-6.6s] "FMT"\n", current->comm, ##__VA_ARGS__)
323
324
#define kenter(FMT, ...) dbgprintk("==> %s("FMT")", __func__, ##__VA_ARGS__)
325
#define kleave(FMT, ...) dbgprintk("<== %s()"FMT"", __func__, ##__VA_ARGS__)
326
#define kdebug(FMT, ...) dbgprintk(FMT, ##__VA_ARGS__)
327
328
#define kjournal(FMT, ...) no_printk(FMT, ##__VA_ARGS__)
329
330
#ifdef __KDEBUG
331
#define _enter(FMT, ...) kenter(FMT, ##__VA_ARGS__)
332
#define _leave(FMT, ...) kleave(FMT, ##__VA_ARGS__)
333
#define _debug(FMT, ...) kdebug(FMT, ##__VA_ARGS__)
334
335
#elif defined(CONFIG_FSCACHE_DEBUG)
336
#define _enter(FMT, ...) \
337
do { \
338
if (__do_kdebug(ENTER)) \
339
kenter(FMT, ##__VA_ARGS__); \
340
} while (0)
341
342
#define _leave(FMT, ...) \
343
do { \
344
if (__do_kdebug(LEAVE)) \
345
kleave(FMT, ##__VA_ARGS__); \
346
} while (0)
347
348
#define _debug(FMT, ...) \
349
do { \
350
if (__do_kdebug(DEBUG)) \
351
kdebug(FMT, ##__VA_ARGS__); \
352
} while (0)
353
354
#else
355
#define _enter(FMT, ...) no_printk("==> %s("FMT")", __func__, ##__VA_ARGS__)
356
#define _leave(FMT, ...) no_printk("<== %s()"FMT"", __func__, ##__VA_ARGS__)
357
#define _debug(FMT, ...) no_printk(FMT, ##__VA_ARGS__)
358
#endif
359
360
/*
361
* determine whether a particular optional debugging point should be logged
362
* - we need to go through three steps to persuade cpp to correctly join the
363
* shorthand in FSCACHE_DEBUG_LEVEL with its prefix
364
*/
365
#define ____do_kdebug(LEVEL, POINT) \
366
unlikely((fscache_debug & \
367
(FSCACHE_POINT_##POINT << (FSCACHE_DEBUG_ ## LEVEL * 3))))
368
#define ___do_kdebug(LEVEL, POINT) \
369
____do_kdebug(LEVEL, POINT)
370
#define __do_kdebug(POINT) \
371
___do_kdebug(FSCACHE_DEBUG_LEVEL, POINT)
372
373
#define FSCACHE_DEBUG_CACHE 0
374
#define FSCACHE_DEBUG_COOKIE 1
375
#define FSCACHE_DEBUG_PAGE 2
376
#define FSCACHE_DEBUG_OPERATION 3
377
378
#define FSCACHE_POINT_ENTER 1
379
#define FSCACHE_POINT_LEAVE 2
380
#define FSCACHE_POINT_DEBUG 4
381
382
#ifndef FSCACHE_DEBUG_LEVEL
383
#define FSCACHE_DEBUG_LEVEL CACHE
384
#endif
385
386
/*
387
* assertions
388
*/
389
#if 1
/* defined(__KDEBUGALL) */
390
391
#define ASSERT(X) \
392
do { \
393
if (unlikely(!(X))) { \
394
printk(KERN_ERR "\n"); \
395
printk(KERN_ERR "FS-Cache: Assertion failed\n"); \
396
BUG(); \
397
} \
398
} while (0)
399
400
#define ASSERTCMP(X, OP, Y) \
401
do { \
402
if (unlikely(!((X) OP (Y)))) { \
403
printk(KERN_ERR "\n"); \
404
printk(KERN_ERR "FS-Cache: Assertion failed\n"); \
405
printk(KERN_ERR "%lx " #OP " %lx is false\n", \
406
(unsigned long)(X), (unsigned long)(Y)); \
407
BUG(); \
408
} \
409
} while (0)
410
411
#define ASSERTIF(C, X) \
412
do { \
413
if (unlikely((C) && !(X))) { \
414
printk(KERN_ERR "\n"); \
415
printk(KERN_ERR "FS-Cache: Assertion failed\n"); \
416
BUG(); \
417
} \
418
} while (0)
419
420
#define ASSERTIFCMP(C, X, OP, Y) \
421
do { \
422
if (unlikely((C) && !((X) OP (Y)))) { \
423
printk(KERN_ERR "\n"); \
424
printk(KERN_ERR "FS-Cache: Assertion failed\n"); \
425
printk(KERN_ERR "%lx " #OP " %lx is false\n", \
426
(unsigned long)(X), (unsigned long)(Y)); \
427
BUG(); \
428
} \
429
} while (0)
430
431
#else
432
433
#define ASSERT(X) do {} while (0)
434
#define ASSERTCMP(X, OP, Y) do {} while (0)
435
#define ASSERTIF(C, X) do {} while (0)
436
#define ASSERTIFCMP(C, X, OP, Y) do {} while (0)
437
438
#endif
/* assert or not */
Generated on Thu Jan 10 2013 13:12:29 for Linux Kernel by
1.8.2