aboutsummaryrefslogtreecommitdiffstats
path: root/tools/perf/tests/perf-targz-src-pkg
diff options
context:
space:
mode:
authorBjoern Brandenburg <bbb@mpi-sws.org>2016-07-20 11:44:05 -0400
committerBjoern Brandenburg <bbb@mpi-sws.org>2016-07-20 11:47:09 -0400
commit8c630e9e6e8ba08332596e9b4e0857e39b9324d7 (patch)
tree7ad0cf5b0138939b623695cf54f6eb7b17cf75d6 /tools/perf/tests/perf-targz-src-pkg
parent6b965f34ede4d5acca662e949004d2a2c1b7e14d (diff)
PSN-EDF: use inferred_sporadic_job_release_atHEADmaster
Diffstat (limited to 'tools/perf/tests/perf-targz-src-pkg')
0 files changed, 0 insertions, 0 deletions
of cleanups (v2)' href='/cgit/cgit.cgi/litmus-rt-imx6.git/commit/kernel/user.c?id=18b6e0414e42d95183f07d8177e3ff0241abd825'>18b6e0414e42
1da177e4c3f4


1da177e4c3f4
18b6e0414e42
1da177e4c3f4

5cb350baf580


40aeb400f680
5cb350baf580



40aeb400f680
5cb350baf580

fb5ae64fdde2
5cb350baf580

3959214f9714














5cb350baf580



18b6e0414e42
571428be550f
5cb350baf580


5cb350baf580




1da177e4c3f4








3fa97c9db4f6
6ded6ab9be4f
1da177e4c3f4
3fa97c9db4f6
acce292c82d4
3fa97c9db4f6
1da177e4c3f4




3fa97c9db4f6

36f574135e36


3fa97c9db4f6
5cb350baf580


36f574135e36
1da177e4c3f4

354a1f4d9924
1da177e4c3f4
735de2230f09
8eb703e4f334
1da177e4c3f4
3fa97c9db4f6
1da177e4c3f4
3fa97c9db4f6
1da177e4c3f4

354a1f4d9924
8eb703e4f334

5e8869bb699d
1da177e4c3f4

1da177e4c3f4
18b6e0414e42

1da177e4c3f4



3fa97c9db4f6
1da177e4c3f4

4ef9e11d6867
1da177e4c3f4






3fa97c9db4f6
1da177e4c3f4
5cb350baf580
1da177e4c3f4
8eb703e4f334
8eb703e4f334
8eb703e4f334
1da177e4c3f4

1da177e4c3f4




20c2df83d25c
1da177e4c3f4

735de2230f09
1da177e4c3f4

3fa97c9db4f6
acce292c82d4
3fa97c9db4f6
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
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200














                                                            
                            

                                 
 



                                                      

                                      
                                                 
          
                              


                                




                                                               

                                                                              
                                                                          
 
                                     




                                                                      



                                                                            
   

                                     
                                                                               
                                
                                         


                                         
                            
                                        

  


                                                                
                                                                               



                                                   
                                                   

                                          
                                 

 














                                                                               



                                                                       
                                                                  
                                 


                                                     




                                        








                                                                               
                            
                                                      
 
                                                
                                                        
                                                     




                                     

                            


                       
                              


                                                             
                                         

 
                                                                   
 
                                                           
                                     
 
                                     
                                         
                                       

                  
                                                                

                                        
 

                                             
 

                                               



                                                             
                                             

                                                 
                                        






                                                         
                                               
         
 
                  
 
           
                    

 




                                                                               
                                                                

                                       
                                                                

                                                                          
                                     
                                                                    
                                       




                            
/*
 * The "user cache".
 *
 * (C) Copyright 1991-2000 Linus Torvalds
 *
 * We have a per-user structure to keep track of how many
 * processes, files etc the user has claimed, in order to be
 * able to have per-user limits for system resources. 
 */

#include <linux/init.h>
#include <linux/sched.h>
#include <linux/slab.h>
#include <linux/bitops.h>
#include <linux/key.h>
#include <linux/interrupt.h>
#include <linux/module.h>
#include <linux/user_namespace.h>

/*
 * userns count is 1 for root user, 1 for init_uts_ns,
 * and 1 for... ?
 */
struct user_namespace init_user_ns = {
	.kref = {
		.refcount	= ATOMIC_INIT(3),
	},
	.creator = &root_user,
};
EXPORT_SYMBOL_GPL(init_user_ns);

/*
 * UID task count cache, to get fast user lookup in "alloc_uid"
 * when changing user ID's (ie setuid() and friends).
 */

#define UIDHASH_MASK		(UIDHASH_SZ - 1)
#define __uidhashfn(uid)	(((uid >> UIDHASH_BITS) + uid) & UIDHASH_MASK)
#define uidhashentry(ns, uid)	((ns)->uidhash_table + __uidhashfn((uid)))

static struct kmem_cache *uid_cachep;

/*
 * The uidhash_lock is mostly taken from process context, but it is
 * occasionally also taken from softirq/tasklet context, when
 * task-structs get RCU-freed. Hence all locking must be softirq-safe.
 * But free_uid() is also called with local interrupts disabled, and running
 * local_bh_enable() with local interrupts disabled is an error - we'll run
 * softirq callbacks, and they can unconditionally enable interrupts, and
 * the caller of free_uid() didn't expect that..
 */
static DEFINE_SPINLOCK(uidhash_lock);

/* root_user.__count is 2, 1 for init task cred, 1 for init_user_ns->user_ns */
struct user_struct root_user = {
	.__count	= ATOMIC_INIT(2),
	.processes	= ATOMIC_INIT(1),
	.files		= ATOMIC_INIT(0),
	.sigpending	= ATOMIC_INIT(0),
	.locked_shm     = 0,
	.user_ns	= &init_user_ns,
};

/*
 * These routines must be called with the uidhash spinlock held!
 */
static void uid_hash_insert(struct user_struct *up, struct hlist_head *hashent)
{
	hlist_add_head(&up->uidhash_node, hashent);
}

static void uid_hash_remove(struct user_struct *up)
{
	hlist_del_init(&up->uidhash_node);
	put_user_ns(up->user_ns);
}

static struct user_struct *uid_hash_find(uid_t uid, struct hlist_head *hashent)
{
	struct user_struct *user;
	struct hlist_node *h;

	hlist_for_each_entry(user, h, hashent, uidhash_node) {
		if (user->uid == uid) {
			atomic_inc(&user->__count);
			return user;
		}
	}

	return NULL;
}

/* IRQs are disabled and uidhash_lock is held upon function entry.
 * IRQ state (as stored in flags) is restored and uidhash_lock released
 * upon function exit.
 */
static void free_user(struct user_struct *up, unsigned long flags)
	__releases(&uidhash_lock)
{
	uid_hash_remove(up);
	spin_unlock_irqrestore(&uidhash_lock, flags);
	key_put(up->uid_keyring);
	key_put(up->session_keyring);
	kmem_cache_free(uid_cachep, up);
}

/*
 * Locate the user_struct for the passed UID.  If found, take a ref on it.  The
 * caller must undo that ref with free_uid().
 *
 * If the user_struct could not be found, return NULL.
 */
struct user_struct *find_user(uid_t uid)
{
	struct user_struct *ret;
	unsigned long flags;
	struct user_namespace *ns = current_user_ns();

	spin_lock_irqsave(&uidhash_lock, flags);
	ret = uid_hash_find(uid, uidhashentry(ns, uid));
	spin_unlock_irqrestore(&uidhash_lock, flags);
	return ret;
}

void free_uid(struct user_struct *up)
{
	unsigned long flags;

	if (!up)
		return;

	local_irq_save(flags);
	if (atomic_dec_and_lock(&up->__count, &uidhash_lock))
		free_user(up, flags);
	else
		local_irq_restore(flags);
}

struct user_struct *alloc_uid(struct user_namespace *ns, uid_t uid)
{
	struct hlist_head *hashent = uidhashentry(ns, uid);
	struct user_struct *up, *new;

	spin_lock_irq(&uidhash_lock);
	up = uid_hash_find(uid, hashent);
	spin_unlock_irq(&uidhash_lock);

	if (!up) {
		new = kmem_cache_zalloc(uid_cachep, GFP_KERNEL);
		if (!new)
			goto out_unlock;

		new->uid = uid;
		atomic_set(&new->__count, 1);

		new->user_ns = get_user_ns(ns);

		/*
		 * Before adding this, check whether we raced
		 * on adding the same user already..
		 */
		spin_lock_irq(&uidhash_lock);
		up = uid_hash_find(uid, hashent);
		if (up) {
			put_user_ns(ns);
			key_put(new->uid_keyring);
			key_put(new->session_keyring);
			kmem_cache_free(uid_cachep, new);
		} else {
			uid_hash_insert(new, hashent);
			up = new;
		}
		spin_unlock_irq(&uidhash_lock);
	}

	return up;

out_unlock:
	return NULL;
}

static int __init uid_cache_init(void)
{
	int n;

	uid_cachep = kmem_cache_create("uid_cache", sizeof(struct user_struct),
			0, SLAB_HWCACHE_ALIGN|SLAB_PANIC, NULL);

	for(n = 0; n < UIDHASH_SZ; ++n)
		INIT_HLIST_HEAD(init_user_ns.uidhash_table + n);

	/* Insert the root user immediately (init already runs as root) */
	spin_lock_irq(&uidhash_lock);
	uid_hash_insert(&root_user, uidhashentry(&init_user_ns, 0));
	spin_unlock_irq(&uidhash_lock);

	return 0;
}

module_init(uid_cache_init);