@@ -26,11 +26,6 @@ static struct device_type idxd_group_device_type = {
2626 .release = idxd_conf_sub_device_release ,
2727};
2828
29- static struct device_type idxd_engine_device_type = {
30- .name = "engine" ,
31- .release = idxd_conf_sub_device_release ,
32- };
33-
3429static int idxd_config_bus_match (struct device * dev ,
3530 struct device_driver * drv )
3631{
@@ -464,6 +459,19 @@ static const struct attribute_group *idxd_engine_attribute_groups[] = {
464459 NULL ,
465460};
466461
462+ static void idxd_conf_engine_release (struct device * dev )
463+ {
464+ struct idxd_engine * engine = container_of (dev , struct idxd_engine , conf_dev );
465+
466+ kfree (engine );
467+ }
468+
469+ struct device_type idxd_engine_device_type = {
470+ .name = "engine" ,
471+ .release = idxd_conf_engine_release ,
472+ .groups = idxd_engine_attribute_groups ,
473+ };
474+
467475/* Group attributes */
468476
469477static void idxd_set_free_tokens (struct idxd_device * idxd )
@@ -626,7 +634,7 @@ static ssize_t group_engines_show(struct device *dev,
626634 struct idxd_device * idxd = group -> idxd ;
627635
628636 for (i = 0 ; i < idxd -> max_engines ; i ++ ) {
629- struct idxd_engine * engine = & idxd -> engines [i ];
637+ struct idxd_engine * engine = idxd -> engines [i ];
630638
631639 if (!engine -> group )
632640 continue ;
@@ -1634,37 +1642,27 @@ struct device_type iax_device_type = {
16341642 .groups = idxd_attribute_groups ,
16351643};
16361644
1637- static int idxd_setup_engine_sysfs (struct idxd_device * idxd )
1645+ static int idxd_register_engine_devices (struct idxd_device * idxd )
16381646{
1639- struct device * dev = & idxd -> pdev -> dev ;
1640- int i , rc ;
1647+ int i , j , rc ;
16411648
16421649 for (i = 0 ; i < idxd -> max_engines ; i ++ ) {
1643- struct idxd_engine * engine = & idxd -> engines [i ];
1644-
1645- engine -> conf_dev .parent = & idxd -> conf_dev ;
1646- dev_set_name (& engine -> conf_dev , "engine%d.%d" ,
1647- idxd -> id , engine -> id );
1648- engine -> conf_dev .bus = idxd_get_bus_type (idxd );
1649- engine -> conf_dev .groups = idxd_engine_attribute_groups ;
1650- engine -> conf_dev .type = & idxd_engine_device_type ;
1651- dev_dbg (dev , "Engine device register: %s\n" ,
1652- dev_name (& engine -> conf_dev ));
1653- rc = device_register (& engine -> conf_dev );
1654- if (rc < 0 ) {
1655- put_device (& engine -> conf_dev );
1650+ struct idxd_engine * engine = idxd -> engines [i ];
1651+
1652+ rc = device_add (& engine -> conf_dev );
1653+ if (rc < 0 )
16561654 goto cleanup ;
1657- }
16581655 }
16591656
16601657 return 0 ;
16611658
16621659cleanup :
1663- while (i -- ) {
1664- struct idxd_engine * engine = & idxd -> engines [i ];
1660+ j = i - 1 ;
1661+ for (; i < idxd -> max_engines ; i ++ )
1662+ put_device (& idxd -> engines [i ]-> conf_dev );
16651663
1666- device_unregister ( & engine -> conf_dev );
1667- }
1664+ while ( j -- )
1665+ device_unregister ( & idxd -> engines [ j ] -> conf_dev );
16681666 return rc ;
16691667}
16701668
@@ -1741,23 +1739,25 @@ int idxd_register_devices(struct idxd_device *idxd)
17411739 goto err_wq ;
17421740 }
17431741
1744- rc = idxd_setup_group_sysfs (idxd );
1742+ rc = idxd_register_engine_devices (idxd );
17451743 if (rc < 0 ) {
1746- /* unregister conf dev */
1747- dev_dbg (dev , "Group sysfs registering failed: %d\n" , rc );
1748- goto err ;
1744+ dev_dbg (dev , "Engine devices registering failed: %d\n" , rc );
1745+ goto err_engine ;
17491746 }
17501747
1751- rc = idxd_setup_engine_sysfs (idxd );
1748+ rc = idxd_setup_group_sysfs (idxd );
17521749 if (rc < 0 ) {
17531750 /* unregister conf dev */
1754- dev_dbg (dev , "Engine sysfs registering failed: %d\n" , rc );
1755- goto err ;
1751+ dev_dbg (dev , "Group sysfs registering failed: %d\n" , rc );
1752+ goto err_group ;
17561753 }
17571754
17581755 return 0 ;
17591756
1760- err :
1757+ err_group :
1758+ for (i = 0 ; i < idxd -> max_engines ; i ++ )
1759+ device_unregister (& idxd -> engines [i ]-> conf_dev );
1760+ err_engine :
17611761 for (i = 0 ; i < idxd -> max_wqs ; i ++ )
17621762 device_unregister (& idxd -> wqs [i ]-> conf_dev );
17631763 err_wq :
@@ -1776,7 +1776,7 @@ void idxd_unregister_devices(struct idxd_device *idxd)
17761776 }
17771777
17781778 for (i = 0 ; i < idxd -> max_engines ; i ++ ) {
1779- struct idxd_engine * engine = & idxd -> engines [i ];
1779+ struct idxd_engine * engine = idxd -> engines [i ];
17801780
17811781 device_unregister (& engine -> conf_dev );
17821782 }
0 commit comments