@@ -155,6 +155,25 @@ static void idxd_cleanup_interrupts(struct idxd_device *idxd)
155
155
pci_free_irq_vectors (pdev );
156
156
}
157
157
158
+ static void idxd_clean_wqs (struct idxd_device * idxd )
159
+ {
160
+ struct idxd_wq * wq ;
161
+ struct device * conf_dev ;
162
+ int i ;
163
+
164
+ for (i = 0 ; i < idxd -> max_wqs ; i ++ ) {
165
+ wq = idxd -> wqs [i ];
166
+ if (idxd -> hw .wq_cap .op_config )
167
+ bitmap_free (wq -> opcap_bmap );
168
+ kfree (wq -> wqcfg );
169
+ conf_dev = wq_confdev (wq );
170
+ put_device (conf_dev );
171
+ kfree (wq );
172
+ }
173
+ bitmap_free (idxd -> wq_enable_map );
174
+ kfree (idxd -> wqs );
175
+ }
176
+
158
177
static int idxd_setup_wqs (struct idxd_device * idxd )
159
178
{
160
179
struct device * dev = & idxd -> pdev -> dev ;
@@ -245,6 +264,21 @@ static int idxd_setup_wqs(struct idxd_device *idxd)
245
264
return rc ;
246
265
}
247
266
267
+ static void idxd_clean_engines (struct idxd_device * idxd )
268
+ {
269
+ struct idxd_engine * engine ;
270
+ struct device * conf_dev ;
271
+ int i ;
272
+
273
+ for (i = 0 ; i < idxd -> max_engines ; i ++ ) {
274
+ engine = idxd -> engines [i ];
275
+ conf_dev = engine_confdev (engine );
276
+ put_device (conf_dev );
277
+ kfree (engine );
278
+ }
279
+ kfree (idxd -> engines );
280
+ }
281
+
248
282
static int idxd_setup_engines (struct idxd_device * idxd )
249
283
{
250
284
struct idxd_engine * engine ;
@@ -296,6 +330,19 @@ static int idxd_setup_engines(struct idxd_device *idxd)
296
330
return rc ;
297
331
}
298
332
333
+ static void idxd_clean_groups (struct idxd_device * idxd )
334
+ {
335
+ struct idxd_group * group ;
336
+ int i ;
337
+
338
+ for (i = 0 ; i < idxd -> max_groups ; i ++ ) {
339
+ group = idxd -> groups [i ];
340
+ put_device (group_confdev (group ));
341
+ kfree (group );
342
+ }
343
+ kfree (idxd -> groups );
344
+ }
345
+
299
346
static int idxd_setup_groups (struct idxd_device * idxd )
300
347
{
301
348
struct device * dev = & idxd -> pdev -> dev ;
@@ -410,7 +457,7 @@ static int idxd_init_evl(struct idxd_device *idxd)
410
457
static int idxd_setup_internals (struct idxd_device * idxd )
411
458
{
412
459
struct device * dev = & idxd -> pdev -> dev ;
413
- int rc , i ;
460
+ int rc ;
414
461
415
462
init_waitqueue_head (& idxd -> cmd_waitq );
416
463
@@ -441,14 +488,11 @@ static int idxd_setup_internals(struct idxd_device *idxd)
441
488
err_evl :
442
489
destroy_workqueue (idxd -> wq );
443
490
err_wkq_create :
444
- for (i = 0 ; i < idxd -> max_groups ; i ++ )
445
- put_device (group_confdev (idxd -> groups [i ]));
491
+ idxd_clean_groups (idxd );
446
492
err_group :
447
- for (i = 0 ; i < idxd -> max_engines ; i ++ )
448
- put_device (engine_confdev (idxd -> engines [i ]));
493
+ idxd_clean_engines (idxd );
449
494
err_engine :
450
- for (i = 0 ; i < idxd -> max_wqs ; i ++ )
451
- put_device (wq_confdev (idxd -> wqs [i ]));
495
+ idxd_clean_wqs (idxd );
452
496
err_wqs :
453
497
return rc ;
454
498
}
0 commit comments