@@ -145,16 +145,74 @@ static int idxd_setup_interrupts(struct idxd_device *idxd)
145145 return rc ;
146146}
147147
148+ static int idxd_setup_wqs (struct idxd_device * idxd )
149+ {
150+ struct device * dev = & idxd -> pdev -> dev ;
151+ struct idxd_wq * wq ;
152+ int i , rc ;
153+
154+ idxd -> wqs = kcalloc_node (idxd -> max_wqs , sizeof (struct idxd_wq * ),
155+ GFP_KERNEL , dev_to_node (dev ));
156+ if (!idxd -> wqs )
157+ return - ENOMEM ;
158+
159+ for (i = 0 ; i < idxd -> max_wqs ; i ++ ) {
160+ wq = kzalloc_node (sizeof (* wq ), GFP_KERNEL , dev_to_node (dev ));
161+ if (!wq ) {
162+ rc = - ENOMEM ;
163+ goto err ;
164+ }
165+
166+ wq -> id = i ;
167+ wq -> idxd = idxd ;
168+ device_initialize (& wq -> conf_dev );
169+ wq -> conf_dev .parent = & idxd -> conf_dev ;
170+ wq -> conf_dev .bus = idxd_get_bus_type (idxd );
171+ wq -> conf_dev .type = & idxd_wq_device_type ;
172+ rc = dev_set_name (& wq -> conf_dev , "wq%d.%d" , idxd -> id , wq -> id );
173+ if (rc < 0 ) {
174+ put_device (& wq -> conf_dev );
175+ goto err ;
176+ }
177+
178+ mutex_init (& wq -> wq_lock );
179+ wq -> idxd_cdev .minor = -1 ;
180+ wq -> max_xfer_bytes = idxd -> max_xfer_bytes ;
181+ wq -> max_batch_size = idxd -> max_batch_size ;
182+ wq -> wqcfg = kzalloc_node (idxd -> wqcfg_size , GFP_KERNEL , dev_to_node (dev ));
183+ if (!wq -> wqcfg ) {
184+ put_device (& wq -> conf_dev );
185+ rc = - ENOMEM ;
186+ goto err ;
187+ }
188+ idxd -> wqs [i ] = wq ;
189+ }
190+
191+ return 0 ;
192+
193+ err :
194+ while (-- i >= 0 )
195+ put_device (& idxd -> wqs [i ]-> conf_dev );
196+ return rc ;
197+ }
198+
148199static int idxd_setup_internals (struct idxd_device * idxd )
149200{
150201 struct device * dev = & idxd -> pdev -> dev ;
151- int i ;
202+ int i , rc ;
152203
153204 init_waitqueue_head (& idxd -> cmd_waitq );
205+
206+ rc = idxd_setup_wqs (idxd );
207+ if (rc < 0 )
208+ return rc ;
209+
154210 idxd -> groups = devm_kcalloc (dev , idxd -> max_groups ,
155211 sizeof (struct idxd_group ), GFP_KERNEL );
156- if (!idxd -> groups )
157- return - ENOMEM ;
212+ if (!idxd -> groups ) {
213+ rc = - ENOMEM ;
214+ goto err ;
215+ }
158216
159217 for (i = 0 ; i < idxd -> max_groups ; i ++ ) {
160218 idxd -> groups [i ].idxd = idxd ;
@@ -163,40 +221,31 @@ static int idxd_setup_internals(struct idxd_device *idxd)
163221 idxd -> groups [i ].tc_b = -1 ;
164222 }
165223
166- idxd -> wqs = devm_kcalloc (dev , idxd -> max_wqs , sizeof (struct idxd_wq ),
167- GFP_KERNEL );
168- if (!idxd -> wqs )
169- return - ENOMEM ;
170-
171224 idxd -> engines = devm_kcalloc (dev , idxd -> max_engines ,
172225 sizeof (struct idxd_engine ), GFP_KERNEL );
173- if (!idxd -> engines )
174- return - ENOMEM ;
175-
176- for (i = 0 ; i < idxd -> max_wqs ; i ++ ) {
177- struct idxd_wq * wq = & idxd -> wqs [i ];
178-
179- wq -> id = i ;
180- wq -> idxd = idxd ;
181- mutex_init (& wq -> wq_lock );
182- wq -> idxd_cdev .minor = -1 ;
183- wq -> max_xfer_bytes = idxd -> max_xfer_bytes ;
184- wq -> max_batch_size = idxd -> max_batch_size ;
185- wq -> wqcfg = devm_kzalloc (dev , idxd -> wqcfg_size , GFP_KERNEL );
186- if (!wq -> wqcfg )
187- return - ENOMEM ;
226+ if (!idxd -> engines ) {
227+ rc = - ENOMEM ;
228+ goto err ;
188229 }
189230
231+
190232 for (i = 0 ; i < idxd -> max_engines ; i ++ ) {
191233 idxd -> engines [i ].idxd = idxd ;
192234 idxd -> engines [i ].id = i ;
193235 }
194236
195237 idxd -> wq = create_workqueue (dev_name (dev ));
196- if (!idxd -> wq )
197- return - ENOMEM ;
238+ if (!idxd -> wq ) {
239+ rc = - ENOMEM ;
240+ goto err ;
241+ }
198242
199243 return 0 ;
244+
245+ err :
246+ for (i = 0 ; i < idxd -> max_wqs ; i ++ )
247+ put_device (& idxd -> wqs [i ]-> conf_dev );
248+ return rc ;
200249}
201250
202251static void idxd_read_table_offsets (struct idxd_device * idxd )
@@ -371,11 +420,11 @@ static int idxd_probe(struct idxd_device *idxd)
371420
372421 rc = idxd_setup_internals (idxd );
373422 if (rc )
374- goto err_setup ;
423+ goto err ;
375424
376425 rc = idxd_setup_interrupts (idxd );
377426 if (rc )
378- goto err_setup ;
427+ goto err ;
379428
380429 dev_dbg (dev , "IDXD interrupt setup complete.\n" );
381430
@@ -384,7 +433,7 @@ static int idxd_probe(struct idxd_device *idxd)
384433 dev_dbg (dev , "IDXD device %d probed successfully\n" , idxd -> id );
385434 return 0 ;
386435
387- err_setup :
436+ err :
388437 if (device_pasid_enabled (idxd ))
389438 idxd_disable_system_pasid (idxd );
390439 return rc ;
0 commit comments