| David Howells | 07fe7cb | 2009-04-03 16:42:35 +0100 | [diff] [blame] | 1 | /* Worker thread pool for slow items, such as filesystem lookups or mkdirs | 
|  | 2 | * | 
|  | 3 | * Copyright (C) 2008 Red Hat, Inc. All Rights Reserved. | 
|  | 4 | * Written by David Howells (dhowells@redhat.com) | 
|  | 5 | * | 
|  | 6 | * This program is free software; you can redistribute it and/or | 
|  | 7 | * modify it under the terms of the GNU General Public Licence | 
|  | 8 | * as published by the Free Software Foundation; either version | 
|  | 9 | * 2 of the Licence, or (at your option) any later version. | 
| David Howells | 8f0aa2f | 2009-04-03 16:42:35 +0100 | [diff] [blame] | 10 | * | 
|  | 11 | * See Documentation/slow-work.txt | 
| David Howells | 07fe7cb | 2009-04-03 16:42:35 +0100 | [diff] [blame] | 12 | */ | 
|  | 13 |  | 
|  | 14 | #ifndef _LINUX_SLOW_WORK_H | 
|  | 15 | #define _LINUX_SLOW_WORK_H | 
|  | 16 |  | 
|  | 17 | #ifdef CONFIG_SLOW_WORK | 
|  | 18 |  | 
| David Howells | 12e22c5 | 2009-04-03 16:42:35 +0100 | [diff] [blame] | 19 | #include <linux/sysctl.h> | 
|  | 20 |  | 
| David Howells | 07fe7cb | 2009-04-03 16:42:35 +0100 | [diff] [blame] | 21 | struct slow_work; | 
|  | 22 |  | 
|  | 23 | /* | 
|  | 24 | * The operations used to support slow work items | 
|  | 25 | */ | 
|  | 26 | struct slow_work_ops { | 
|  | 27 | /* get a ref on a work item | 
|  | 28 | * - return 0 if successful, -ve if not | 
|  | 29 | */ | 
|  | 30 | int (*get_ref)(struct slow_work *work); | 
|  | 31 |  | 
|  | 32 | /* discard a ref to a work item */ | 
|  | 33 | void (*put_ref)(struct slow_work *work); | 
|  | 34 |  | 
|  | 35 | /* execute a work item */ | 
|  | 36 | void (*execute)(struct slow_work *work); | 
|  | 37 | }; | 
|  | 38 |  | 
|  | 39 | /* | 
|  | 40 | * A slow work item | 
|  | 41 | * - A reference is held on the parent object by the thread pool when it is | 
|  | 42 | *   queued | 
|  | 43 | */ | 
|  | 44 | struct slow_work { | 
|  | 45 | unsigned long		flags; | 
|  | 46 | #define SLOW_WORK_PENDING	0	/* item pending (further) execution */ | 
|  | 47 | #define SLOW_WORK_EXECUTING	1	/* item currently executing */ | 
|  | 48 | #define SLOW_WORK_ENQ_DEFERRED	2	/* item enqueue deferred */ | 
|  | 49 | #define SLOW_WORK_VERY_SLOW	3	/* item is very slow */ | 
|  | 50 | const struct slow_work_ops *ops; /* operations table for this item */ | 
|  | 51 | struct list_head	link;	/* link in queue */ | 
|  | 52 | }; | 
|  | 53 |  | 
|  | 54 | /** | 
|  | 55 | * slow_work_init - Initialise a slow work item | 
|  | 56 | * @work: The work item to initialise | 
|  | 57 | * @ops: The operations to use to handle the slow work item | 
|  | 58 | * | 
|  | 59 | * Initialise a slow work item. | 
|  | 60 | */ | 
|  | 61 | static inline void slow_work_init(struct slow_work *work, | 
|  | 62 | const struct slow_work_ops *ops) | 
|  | 63 | { | 
|  | 64 | work->flags = 0; | 
|  | 65 | work->ops = ops; | 
|  | 66 | INIT_LIST_HEAD(&work->link); | 
|  | 67 | } | 
|  | 68 |  | 
|  | 69 | /** | 
| Jonathan Corbet | 5dd559f | 2009-04-21 16:30:32 -0600 | [diff] [blame] | 70 | * vslow_work_init - Initialise a very slow work item | 
| David Howells | 07fe7cb | 2009-04-03 16:42:35 +0100 | [diff] [blame] | 71 | * @work: The work item to initialise | 
|  | 72 | * @ops: The operations to use to handle the slow work item | 
|  | 73 | * | 
|  | 74 | * Initialise a very slow work item.  This item will be restricted such that | 
|  | 75 | * only a certain number of the pool threads will be able to execute items of | 
|  | 76 | * this type. | 
|  | 77 | */ | 
|  | 78 | static inline void vslow_work_init(struct slow_work *work, | 
|  | 79 | const struct slow_work_ops *ops) | 
|  | 80 | { | 
|  | 81 | work->flags = 1 << SLOW_WORK_VERY_SLOW; | 
|  | 82 | work->ops = ops; | 
|  | 83 | INIT_LIST_HEAD(&work->link); | 
|  | 84 | } | 
|  | 85 |  | 
|  | 86 | extern int slow_work_enqueue(struct slow_work *work); | 
|  | 87 | extern int slow_work_register_user(void); | 
|  | 88 | extern void slow_work_unregister_user(void); | 
|  | 89 |  | 
| David Howells | 12e22c5 | 2009-04-03 16:42:35 +0100 | [diff] [blame] | 90 | #ifdef CONFIG_SYSCTL | 
|  | 91 | extern ctl_table slow_work_sysctls[]; | 
|  | 92 | #endif | 
| David Howells | 07fe7cb | 2009-04-03 16:42:35 +0100 | [diff] [blame] | 93 |  | 
|  | 94 | #endif /* CONFIG_SLOW_WORK */ | 
|  | 95 | #endif /* _LINUX_SLOW_WORK_H */ |