@@ -72,7 +72,7 @@ static int idxd_setup_interrupts(struct idxd_device *idxd)
72
72
{
73
73
struct pci_dev * pdev = idxd -> pdev ;
74
74
struct device * dev = & pdev -> dev ;
75
- struct idxd_irq_entry * irq_entry ;
75
+ struct idxd_irq_entry * ie ;
76
76
int i , msixcnt ;
77
77
int rc = 0 ;
78
78
@@ -90,96 +90,74 @@ static int idxd_setup_interrupts(struct idxd_device *idxd)
90
90
}
91
91
dev_dbg (dev , "Enabled %d msix vectors\n" , msixcnt );
92
92
93
- /*
94
- * We implement 1 completion list per MSI-X entry except for
95
- * entry 0, which is for errors and others.
96
- */
97
- idxd -> irq_entries = kcalloc_node (msixcnt , sizeof (struct idxd_irq_entry ),
98
- GFP_KERNEL , dev_to_node (dev ));
99
- if (!idxd -> irq_entries ) {
100
- rc = - ENOMEM ;
101
- goto err_irq_entries ;
102
- }
103
-
104
- for (i = 0 ; i < msixcnt ; i ++ ) {
105
- idxd -> irq_entries [i ].id = i ;
106
- idxd -> irq_entries [i ].idxd = idxd ;
107
- /*
108
- * Association of WQ should be assigned starting with irq_entry 1.
109
- * irq_entry 0 is for misc interrupts and has no wq association
110
- */
111
- if (i > 0 )
112
- idxd -> irq_entries [i ].wq = idxd -> wqs [i - 1 ];
113
- idxd -> irq_entries [i ].vector = pci_irq_vector (pdev , i );
114
- idxd -> irq_entries [i ].int_handle = INVALID_INT_HANDLE ;
115
- if (device_pasid_enabled (idxd ) && i > 0 )
116
- idxd -> irq_entries [i ].pasid = idxd -> pasid ;
117
- else
118
- idxd -> irq_entries [i ].pasid = INVALID_IOASID ;
119
- spin_lock_init (& idxd -> irq_entries [i ].list_lock );
120
- }
121
-
122
93
idxd_msix_perm_setup (idxd );
123
94
124
- irq_entry = & idxd -> irq_entries [ 0 ] ;
125
- rc = request_threaded_irq ( irq_entry -> vector , NULL , idxd_misc_thread ,
126
- 0 , "idxd-misc" , irq_entry );
95
+ ie = idxd_get_ie ( idxd , 0 ) ;
96
+ ie -> vector = pci_irq_vector ( pdev , 0 );
97
+ rc = request_threaded_irq ( ie -> vector , NULL , idxd_misc_thread , 0 , "idxd-misc" , ie );
127
98
if (rc < 0 ) {
128
99
dev_err (dev , "Failed to allocate misc interrupt.\n" );
129
100
goto err_misc_irq ;
130
101
}
131
102
132
- dev_dbg (dev , "Allocated idxd-misc handler on msix vector %d\n" , irq_entry -> vector );
103
+ dev_dbg (dev , "Allocated idxd-misc handler on msix vector %d\n" , ie -> vector );
133
104
134
- /* first MSI-X entry is not for wq interrupts */
135
- idxd -> num_wq_irqs = msixcnt - 1 ;
105
+ for (i = 0 ; i < idxd -> max_wqs ; i ++ ) {
106
+ int msix_idx = i + 1 ;
107
+
108
+ ie = idxd_get_ie (idxd , msix_idx );
136
109
137
- for (i = 1 ; i < msixcnt ; i ++ ) {
138
- irq_entry = & idxd -> irq_entries [i ];
110
+ /* MSIX vector 0 special, wq irq entry starts at 1 */
111
+ ie -> id = msix_idx ;
112
+ ie -> vector = pci_irq_vector (pdev , msix_idx );
113
+ ie -> int_handle = INVALID_INT_HANDLE ;
114
+ if (device_pasid_enabled (idxd ) && i > 0 )
115
+ ie -> pasid = idxd -> pasid ;
116
+ else
117
+ ie -> pasid = INVALID_IOASID ;
118
+ spin_lock_init (& ie -> list_lock );
119
+ init_llist_head (& ie -> pending_llist );
120
+ INIT_LIST_HEAD (& ie -> work_list );
139
121
140
- init_llist_head (& idxd -> irq_entries [i ].pending_llist );
141
- INIT_LIST_HEAD (& idxd -> irq_entries [i ].work_list );
142
- rc = request_threaded_irq (irq_entry -> vector , NULL ,
143
- idxd_wq_thread , 0 , "idxd-portal" , irq_entry );
122
+ rc = request_threaded_irq (ie -> vector , NULL , idxd_wq_thread , 0 , "idxd-portal" , ie );
144
123
if (rc < 0 ) {
145
- dev_err (dev , "Failed to allocate irq %d.\n" , irq_entry -> vector );
124
+ dev_err (dev , "Failed to allocate irq %d.\n" , ie -> vector );
146
125
goto err_wq_irqs ;
147
126
}
148
127
149
- dev_dbg (dev , "Allocated idxd-msix %d for vector %d\n" , i , irq_entry -> vector );
128
+ dev_dbg (dev , "Allocated idxd-msix %d for vector %d\n" , i , ie -> vector );
150
129
if (idxd -> request_int_handles ) {
151
- rc = idxd_device_request_int_handle (idxd , i , & irq_entry -> int_handle ,
130
+ rc = idxd_device_request_int_handle (idxd , i , & ie -> int_handle ,
152
131
IDXD_IRQ_MSIX );
153
132
if (rc < 0 ) {
154
- free_irq (irq_entry -> vector , irq_entry );
133
+ free_irq (ie -> vector , ie );
155
134
goto err_wq_irqs ;
156
135
}
157
- dev_dbg (dev , "int handle requested: %u\n" , irq_entry -> int_handle );
136
+ dev_dbg (dev , "int handle requested: %u\n" , ie -> int_handle );
137
+ } else {
138
+ ie -> int_handle = msix_idx ;
158
139
}
140
+
159
141
}
160
142
161
143
idxd_unmask_error_interrupts (idxd );
162
144
return 0 ;
163
145
164
146
err_wq_irqs :
165
147
while (-- i >= 0 ) {
166
- irq_entry = & idxd -> irq_entries [i ];
167
- free_irq (irq_entry -> vector , irq_entry );
168
- if (irq_entry -> int_handle != INVALID_INT_HANDLE ) {
169
- idxd_device_release_int_handle (idxd , irq_entry -> int_handle ,
170
- IDXD_IRQ_MSIX );
171
- irq_entry -> int_handle = INVALID_INT_HANDLE ;
172
- irq_entry -> pasid = INVALID_IOASID ;
148
+ ie = & idxd -> wqs [i ]-> ie ;
149
+ free_irq (ie -> vector , ie );
150
+ if (ie -> int_handle != INVALID_INT_HANDLE ) {
151
+ idxd_device_release_int_handle (idxd , ie -> int_handle , IDXD_IRQ_MSIX );
152
+ ie -> int_handle = INVALID_INT_HANDLE ;
153
+ ie -> pasid = INVALID_IOASID ;
173
154
}
174
- irq_entry -> vector = -1 ;
175
- irq_entry -> wq = NULL ;
176
- irq_entry -> idxd = NULL ;
155
+ ie -> vector = -1 ;
177
156
}
178
157
err_misc_irq :
179
158
/* Disable error interrupt generation */
180
159
idxd_mask_error_interrupts (idxd );
181
160
idxd_msix_perm_clear (idxd );
182
- err_irq_entries :
183
161
pci_free_irq_vectors (pdev );
184
162
dev_err (dev , "No usable interrupts\n" );
185
163
return rc ;
@@ -188,21 +166,18 @@ static int idxd_setup_interrupts(struct idxd_device *idxd)
188
166
static void idxd_cleanup_interrupts (struct idxd_device * idxd )
189
167
{
190
168
struct pci_dev * pdev = idxd -> pdev ;
191
- struct idxd_irq_entry * irq_entry ;
169
+ struct idxd_irq_entry * ie ;
192
170
int i ;
193
171
194
172
for (i = 0 ; i < idxd -> irq_cnt ; i ++ ) {
195
- irq_entry = & idxd -> irq_entries [i ];
196
- if (irq_entry -> int_handle != INVALID_INT_HANDLE ) {
197
- idxd_device_release_int_handle (idxd , irq_entry -> int_handle ,
198
- IDXD_IRQ_MSIX );
199
- irq_entry -> int_handle = INVALID_INT_HANDLE ;
200
- irq_entry -> pasid = INVALID_IOASID ;
173
+ ie = idxd_get_ie (idxd , i );
174
+ if (ie -> int_handle != INVALID_INT_HANDLE ) {
175
+ idxd_device_release_int_handle (idxd , ie -> int_handle , IDXD_IRQ_MSIX );
176
+ ie -> int_handle = INVALID_INT_HANDLE ;
177
+ ie -> pasid = INVALID_IOASID ;
201
178
}
202
- irq_entry -> vector = -1 ;
203
- irq_entry -> wq = NULL ;
204
- irq_entry -> idxd = NULL ;
205
- free_irq (irq_entry -> vector , irq_entry );
179
+ free_irq (ie -> vector , ie );
180
+ ie -> vector = -1 ;
206
181
}
207
182
208
183
idxd_mask_error_interrupts (idxd );
@@ -755,7 +730,7 @@ static void idxd_release_int_handles(struct idxd_device *idxd)
755
730
int i , rc ;
756
731
757
732
for (i = 1 ; i < idxd -> irq_cnt ; i ++ ) {
758
- struct idxd_irq_entry * ie = & idxd -> irq_entries [ i ] ;
733
+ struct idxd_irq_entry * ie = idxd_get_ie ( idxd , i ) ;
759
734
760
735
if (ie -> int_handle != INVALID_INT_HANDLE ) {
761
736
rc = idxd_device_release_int_handle (idxd , ie -> int_handle , IDXD_IRQ_MSIX );
@@ -783,7 +758,7 @@ static void idxd_shutdown(struct pci_dev *pdev)
783
758
idxd_mask_error_interrupts (idxd );
784
759
785
760
for (i = 0 ; i < msixcnt ; i ++ ) {
786
- irq_entry = & idxd -> irq_entries [ i ] ;
761
+ irq_entry = idxd_get_ie ( idxd , i ) ;
787
762
synchronize_irq (irq_entry -> vector );
788
763
if (i == 0 )
789
764
continue ;
@@ -815,7 +790,7 @@ static void idxd_remove(struct pci_dev *pdev)
815
790
idxd_disable_system_pasid (idxd );
816
791
817
792
for (i = 0 ; i < msixcnt ; i ++ ) {
818
- irq_entry = & idxd -> irq_entries [ i ] ;
793
+ irq_entry = idxd_get_ie ( idxd , i ) ;
819
794
free_irq (irq_entry -> vector , irq_entry );
820
795
}
821
796
idxd_msix_perm_clear (idxd );
0 commit comments