summaryrefslogtreecommitdiff
blob: b5c7b1ba57c1db7667d165491d2fa1c1e8588e88 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
diff -urp ../git/linux-2.6.8.1-work/kernel/pid.c linux-2.6.8.1/kernel/pid.c
--- ../git/linux-2.6.8.1-work/kernel/pid.c	2006-06-02 18:02:14.000000000 +0400
+++ linux-2.6.8.1/kernel/pid.c	2006-06-02 18:12:21.000000000 +0400
@@ -470,7 +470,18 @@ int vpid_to_pid(int pid)
 
 static int add_mapping(int pid, int vpid, int veid, struct hlist_head *cache)
 {
-        if (pid > 0 && vpid > 0 && !__lookup_vpid_mapping(vpid, veid)) {
+        if (unlikely(pid <= 0 || vpid <= 0))
+		return 0;
+
+	/* VE can contain non-virtual (VE_ENTER'ed) processes when
+	 * switching to sparse mapping. We should not create mappings
+	 * for them. */
+	if (unlikely(!__is_virtual_pid(vpid) && vpid != 1)) {
+		printk("DEBUG (do not worry, but report): non-virtual pid while switching mode %d %d\n", pid, vpid);
+		return 0;
+	}
+
+	if (!__lookup_vpid_mapping(vpid, veid)) {
 		struct vpid_mapping *m;
 		if (hlist_empty(cache)) {
 			m = kmem_cache_alloc(vpid_mapping_cachep, GFP_ATOMIC);