@@ -264,60 +264,42 @@ static int optee_open(struct tee_context *ctx)
264
264
return 0 ;
265
265
}
266
266
267
- static void optee_release (struct tee_context * ctx )
267
+ static void optee_release_helper (struct tee_context * ctx ,
268
+ int (* close_session )(struct tee_context * ctx ,
269
+ u32 session ))
268
270
{
269
271
struct optee_context_data * ctxdata = ctx -> data ;
270
- struct tee_device * teedev = ctx -> teedev ;
271
- struct optee * optee = tee_get_drvdata (teedev );
272
- struct tee_shm * shm ;
273
- struct optee_msg_arg * arg = NULL ;
274
- phys_addr_t parg ;
275
272
struct optee_session * sess ;
276
273
struct optee_session * sess_tmp ;
277
274
278
275
if (!ctxdata )
279
276
return ;
280
277
281
- shm = tee_shm_alloc (ctx , sizeof (struct optee_msg_arg ),
282
- TEE_SHM_MAPPED | TEE_SHM_PRIV );
283
- if (!IS_ERR (shm )) {
284
- arg = tee_shm_get_va (shm , 0 );
285
- /*
286
- * If va2pa fails for some reason, we can't call into
287
- * secure world, only free the memory. Secure OS will leak
288
- * sessions and finally refuse more sessions, but we will
289
- * at least let normal world reclaim its memory.
290
- */
291
- if (!IS_ERR (arg ))
292
- if (tee_shm_va2pa (shm , arg , & parg ))
293
- arg = NULL ; /* prevent usage of parg below */
294
- }
295
-
296
278
list_for_each_entry_safe (sess , sess_tmp , & ctxdata -> sess_list ,
297
279
list_node ) {
298
280
list_del (& sess -> list_node );
299
- if (!IS_ERR_OR_NULL (arg )) {
300
- memset (arg , 0 , sizeof (* arg ));
301
- arg -> cmd = OPTEE_MSG_CMD_CLOSE_SESSION ;
302
- arg -> session = sess -> session_id ;
303
- optee_do_call_with_arg (ctx , parg );
304
- }
281
+ close_session (ctx , sess -> session_id );
305
282
kfree (sess );
306
283
}
307
284
kfree (ctxdata );
285
+ ctx -> data = NULL ;
286
+ }
308
287
309
- if (!IS_ERR (shm ))
310
- tee_shm_free (shm );
288
+ static void optee_release (struct tee_context * ctx )
289
+ {
290
+ optee_release_helper (ctx , optee_close_session_helper );
291
+ }
311
292
312
- ctx -> data = NULL ;
293
+ static void optee_release_supp (struct tee_context * ctx )
294
+ {
295
+ struct optee * optee = tee_get_drvdata (ctx -> teedev );
313
296
314
- if (teedev == optee -> supp_teedev ) {
315
- if (optee -> scan_bus_wq ) {
316
- destroy_workqueue (optee -> scan_bus_wq );
317
- optee -> scan_bus_wq = NULL ;
318
- }
319
- optee_supp_release (& optee -> supp );
297
+ optee_release_helper (ctx , optee_close_session_helper );
298
+ if (optee -> scan_bus_wq ) {
299
+ destroy_workqueue (optee -> scan_bus_wq );
300
+ optee -> scan_bus_wq = NULL ;
320
301
}
302
+ optee_supp_release (& optee -> supp );
321
303
}
322
304
323
305
static const struct tee_driver_ops optee_ops = {
@@ -341,7 +323,7 @@ static const struct tee_desc optee_desc = {
341
323
static const struct tee_driver_ops optee_supp_ops = {
342
324
.get_version = optee_get_version ,
343
325
.open = optee_open ,
344
- .release = optee_release ,
326
+ .release = optee_release_supp ,
345
327
.supp_recv = optee_supp_recv ,
346
328
.supp_send = optee_supp_send ,
347
329
.shm_register = optee_shm_register_supp ,
0 commit comments