8
8
#include <softirq.h>
9
9
#include <ptdev.h>
10
10
11
- /* SOFTIRQ_PTDEV list for all CPUs */
12
- static struct list_head softirq_dev_entry_list ;
13
11
/* passthrough device link */
14
12
struct list_head ptdev_list ;
15
13
spinlock_t ptdev_lock ;
16
14
17
15
/*
18
- * entry could both be in ptdev_list and softirq_dev_entry_list.
16
+ * entry could both be in ptdev_list and vm-> softirq_dev_entry_list.
19
17
* When release entry, we need make sure entry deleted from both
20
18
* lists. We have to require two locks and the lock sequence is:
21
19
* ptdev_lock
22
- * softirq_dev_lock
20
+ * vm-> softirq_dev_lock
23
21
*/
24
- static spinlock_t softirq_dev_lock ;
25
22
26
23
static void ptdev_enqueue_softirq (struct ptdev_remapping_info * entry )
27
24
{
28
25
uint64_t rflags ;
29
26
30
27
/* enqueue request in order, SOFTIRQ_PTDEV will pickup */
31
- spinlock_irqsave_obtain (& softirq_dev_lock , & rflags );
28
+ spinlock_irqsave_obtain (& entry -> vm -> softirq_dev_lock , & rflags );
32
29
33
30
/* avoid adding recursively */
34
31
list_del (& entry -> softirq_node );
35
32
/* TODO: assert if entry already in list */
36
33
list_add_tail (& entry -> softirq_node ,
37
- & softirq_dev_entry_list );
38
- spinlock_irqrestore_release (& softirq_dev_lock , rflags );
34
+ & entry -> vm -> softirq_dev_entry_list );
35
+ spinlock_irqrestore_release (& entry -> vm -> softirq_dev_lock , rflags );
39
36
fire_softirq (SOFTIRQ_PTDEV );
40
37
}
41
38
42
39
struct ptdev_remapping_info *
43
- ptdev_dequeue_softirq (void )
40
+ ptdev_dequeue_softirq (struct vm * vm )
44
41
{
45
42
uint64_t rflags ;
46
43
struct ptdev_remapping_info * entry = NULL ;
47
44
48
- spinlock_irqsave_obtain (& softirq_dev_lock , & rflags );
45
+ spinlock_irqsave_obtain (& vm -> softirq_dev_lock , & rflags );
49
46
50
- if (!list_empty (& softirq_dev_entry_list )) {
51
- entry = get_first_item (& softirq_dev_entry_list ,
47
+ if (!list_empty (& vm -> softirq_dev_entry_list )) {
48
+ entry = get_first_item (& vm -> softirq_dev_entry_list ,
52
49
struct ptdev_remapping_info , softirq_node );
53
50
list_del_init (& entry -> softirq_node );
54
51
}
55
52
56
- spinlock_irqrestore_release (& softirq_dev_lock , rflags );
53
+ spinlock_irqrestore_release (& vm -> softirq_dev_lock , rflags );
57
54
return entry ;
58
55
}
59
56
@@ -91,9 +88,9 @@ release_entry(struct ptdev_remapping_info *entry)
91
88
* remove entry from softirq list.the ptdev_lock
92
89
* is required before calling release_entry.
93
90
*/
94
- spinlock_irqsave_obtain (& softirq_dev_lock , & rflags );
91
+ spinlock_irqsave_obtain (& entry -> vm -> softirq_dev_lock , & rflags );
95
92
list_del_init (& entry -> softirq_node );
96
- spinlock_irqrestore_release (& softirq_dev_lock , rflags );
93
+ spinlock_irqrestore_release (& entry -> vm -> softirq_dev_lock , rflags );
97
94
98
95
free (entry );
99
96
}
@@ -149,9 +146,9 @@ ptdev_deactivate_entry(struct ptdev_remapping_info *entry)
149
146
entry -> allocated_pirq = IRQ_INVALID ;
150
147
151
148
/* remove from softirq list if added */
152
- spinlock_irqsave_obtain (& softirq_dev_lock , & rflags );
149
+ spinlock_irqsave_obtain (& entry -> vm -> softirq_dev_lock , & rflags );
153
150
list_del_init (& entry -> softirq_node );
154
- spinlock_irqrestore_release (& softirq_dev_lock , rflags );
151
+ spinlock_irqrestore_release (& entry -> vm -> softirq_dev_lock , rflags );
155
152
}
156
153
157
154
void ptdev_init (void )
@@ -161,8 +158,6 @@ void ptdev_init(void)
161
158
162
159
INIT_LIST_HEAD (& ptdev_list );
163
160
spinlock_init (& ptdev_lock );
164
- INIT_LIST_HEAD (& softirq_dev_entry_list );
165
- spinlock_init (& softirq_dev_lock );
166
161
167
162
register_softirq (SOFTIRQ_PTDEV , ptdev_softirq );
168
163
}
0 commit comments