aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/of/device.c
Commit message (Expand)AuthorAge
* platform: introduce OF style 'modalias' support for platform busZhang Rui2014-01-16
* of: Output devicetree alias names in ueventStepan Moskovchenko2013-02-06
* drivercore: Output common devicetree information in ueventGrant Likely2012-02-01
* dt/powerpc: move of_bus_type infrastructure to ibmebusGrant Likely2011-02-28
* of/device: Rework to use common platform_device_alloc() for allocating devicesGrant Likely2010-10-21
* of/device: Replace struct of_device with struct platform_deviceGrant Likely2010-08-06
* of/device: Replace of_device with platform_device in includes and core codeGrant Likely2010-07-24
* of: Merge of_platform_bus_type with platform_bus_typeGrant Likely2010-07-24
* of/device: Add OF style matching helper functionGrant Likely2010-07-05
* of: Modify of_device_get_modalias to be passed struct deviceGrant Likely2010-07-05
* of/device: merge of_device_ueventGrant Likely2010-07-05
* of: change of_match_device to work with struct deviceGrant Likely2010-05-22
* of: Always use 'struct device.of_node' to get device node pointer.Grant Likely2010-05-18
* OF-device: Don't overwrite numa_node in device registrationJeremy Kerr2008-10-31
* powerpc/ibmebus: Restore "name" sysfs attribute on ibmebus devicesJoachim Fenkes2008-08-19
* [POWERPC] Move of_device_get_modalias to drivers/ofStephen Rothwell2008-05-16
* [POWERPC] Create modalias file in sysfs for of_platform busOlaf Hering2008-05-14
* [POWERPC] Add of_find_matching_node() helper functionGrant Likely2008-01-16
* Begin consolidation of of_device.hStephen Rothwell2007-07-19
* Begin to consolidate of_device.cStephen Rothwell2007-07-19
ation.org> 2008-12-09 16:14:14 -0500 committer Linus Torvalds <torvalds@linux-foundation.org> 2008-12-10 11:01:52 -0500 revert "percpu_counter: new function percpu_counter_sum_and_set"' href='/cgit/cgit.cgi/litmus-rt-budgetable-locks.git/.git/commit/include/linux/percpu_counter.h?h=update_litmus_2019&id=02d211688727ad02bb4555b1aa8ae2de16b21b39'>02d211688727
bf1d89c81352




02d211688727
bf1d89c81352

0216bfcffe42
1da177e4c3f4






0216bfcffe42
1da177e4c3f4
0216bfcffe42
1da177e4c3f4
0216bfcffe42
1da177e4c3f4

0216bfcffe42
1da177e4c3f4
c84598bbfa75
1da177e4c3f4

7f93cff90fa9




1da177e4c3f4


0216bfcffe42
1da177e4c3f4

833f4077bf7c
1da177e4c3f4
0216bfcffe42
833f4077bf7c
1da177e4c3f4





3a587f47b82f




27f5e0f694fd









1da177e4c3f4
20e897670963
1da177e4c3f4





0c9cf2efd74d





0216bfcffe42
1da177e4c3f4



c84598bbfa75



0216bfcffe42
1da177e4c3f4



52d9f3b40909
e2bab3d92486



bf1d89c81352




7f93cff90fa9




1da177e4c3f4



aa0dff2d09bf
1da177e4c3f4



aa0dff2d09bf
1da177e4c3f4

3cb4f9fa0c5f




1da177e4c3f4
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







                                                                       

                           
                       

                          
                        




                        
                  


                                                                       
                               

  
                                
 









                                                                         
                                                        
                                                                
                                                                             
                                                     
                                                                
 
                                                                             
 
                                                                

 

                                                                         
                                            




                                                                
                                         

 
                                                                 






                                                                          
  
   
                                                                          
 
                             

                                                                   
                     
                           
                 

 




                                                                        


                       
                  

  
                                                                             
 
                            
                 





                                                                     




                                                                             









                                                                             
                  
                                                          





                             





                                                                       
                                                                 



                          



                                                                           
                                                                          



                          
                                                                         



                                                 




                                                                




                                                                        



                                                                 
                                   



                                                                 
                                    

 




                                                                             
                                    
#ifndef _LINUX_PERCPU_COUNTER_H
#define _LINUX_PERCPU_COUNTER_H
/*
 * A simple "approximate counter" for use in ext2 and ext3 superblocks.
 *
 * WARNING: these things are HUGE.  4 kbytes per counter on 32-way P4.
 */

#include <linux/spinlock.h>
#include <linux/smp.h>
#include <linux/list.h>
#include <linux/threads.h>
#include <linux/percpu.h>
#include <linux/types.h>

#ifdef CONFIG_SMP

struct percpu_counter {
	spinlock_t lock;
	s64 count;
#ifdef CONFIG_HOTPLUG_CPU
	struct list_head list;	/* All percpu_counters are on a list */
#endif
	s32 __percpu *counters;
};

extern int percpu_counter_batch;

int __percpu_counter_init(struct percpu_counter *fbc, s64 amount,
			  struct lock_class_key *key);

#define percpu_counter_init(fbc, value)					\
	({								\
		static struct lock_class_key __key;			\
									\
		__percpu_counter_init(fbc, value, &__key);		\
	})

void percpu_counter_destroy(struct percpu_counter *fbc);
void percpu_counter_set(struct percpu_counter *fbc, s64 amount);
void __percpu_counter_add(struct percpu_counter *fbc, s64 amount, s32 batch);
s64 __percpu_counter_sum(struct percpu_counter *fbc);
int percpu_counter_compare(struct percpu_counter *fbc, s64 rhs);

static inline void percpu_counter_add(struct percpu_counter *fbc, s64 amount)
{
	__percpu_counter_add(fbc, amount, percpu_counter_batch);
}

static inline s64 percpu_counter_sum_positive(struct percpu_counter *fbc)
{
	s64 ret = __percpu_counter_sum(fbc);
	return ret < 0 ? 0 : ret;
}

static inline s64 percpu_counter_sum(struct percpu_counter *fbc)
{
	return __percpu_counter_sum(fbc);
}

static inline s64 percpu_counter_read(struct percpu_counter *fbc)
{
	return fbc->count;
}

/*
 * It is possible for the percpu_counter_read() to return a small negative
 * number for some counter which should never be negative.
 *
 */
static inline s64 percpu_counter_read_positive(struct percpu_counter *fbc)
{
	s64 ret = fbc->count;

	barrier();		/* Prevent reloads of fbc->count */
	if (ret >= 0)
		return ret;
	return 0;
}

static inline int percpu_counter_initialized(struct percpu_counter *fbc)
{
	return (fbc->counters != NULL);
}

#else

struct percpu_counter {
	s64 count;
};

static inline int percpu_counter_init(struct percpu_counter *fbc, s64 amount)
{
	fbc->count = amount;
	return 0;
}

static inline void percpu_counter_destroy(struct percpu_counter *fbc)
{
}

static inline void percpu_counter_set(struct percpu_counter *fbc, s64 amount)
{
	fbc->count = amount;
}

static inline int percpu_counter_compare(struct percpu_counter *fbc, s64 rhs)
{
	if (fbc->count > rhs)
		return 1;
	else if (fbc->count < rhs)
		return -1;
	else
		return 0;
}

static inline void
percpu_counter_add(struct percpu_counter *fbc, s64 amount)
{
	preempt_disable();
	fbc->count += amount;
	preempt_enable();
}

static inline void
__percpu_counter_add(struct percpu_counter *fbc, s64 amount, s32 batch)
{
	percpu_counter_add(fbc, amount);
}

static inline s64 percpu_counter_read(struct percpu_counter *fbc)
{
	return fbc->count;
}

/*
 * percpu_counter is intended to track positive numbers. In the UP case the
 * number should never be negative.
 */
static inline s64 percpu_counter_read_positive(struct percpu_counter *fbc)
{
	return fbc->count;
}

static inline s64 percpu_counter_sum_positive(struct percpu_counter *fbc)
{
	return percpu_counter_read_positive(fbc);
}

static inline s64 percpu_counter_sum(struct percpu_counter *fbc)
{
	return percpu_counter_read(fbc);
}

static inline int percpu_counter_initialized(struct percpu_counter *fbc)
{
	return 1;
}

#endif	/* CONFIG_SMP */

static inline void percpu_counter_inc(struct percpu_counter *fbc)
{
	percpu_counter_add(fbc, 1);
}

static inline void percpu_counter_dec(struct percpu_counter *fbc)
{
	percpu_counter_add(fbc, -1);
}

static inline void percpu_counter_sub(struct percpu_counter *fbc, s64 amount)
{
	percpu_counter_add(fbc, -amount);
}

#endif /* _LINUX_PERCPU_COUNTER_H */