diff options
author | Andrey Markovytch <andreym@codeaurora.org> | 2016-04-20 17:40:00 +0300 |
---|---|---|
committer | Jeevan Shriram <jshriram@codeaurora.org> | 2016-04-25 17:45:36 -0700 |
commit | e29851c910af605f1b42e9762cc830184826a93b (patch) | |
tree | 91e2bd909d20f0aefff029a62f14e0a3c9337e30 /include/linux | |
parent | 03a29a9ee5f6a45fc52ded7a4f0e063cfe34bf0d (diff) |
PFK: fix race between key set and key invalidate in TZ
When working with multiple files and multiple threads, the following
scenario can occur:
1. File Close -> Key cache removal -> context switch
2. Open new file -> occupy the entry cleaned in 1
-> TZ_ES_SET_ICE_KEY -> context switch
3. Back to 1 -> TZ_ES_INVALIDATE_ICE_KEY
4. Back to 2 -> ICE uses the key that is already invalid
5. Crash due to PARTIALLY_SET_KEY_USED
To fix this, pfk must know when requests using some key are completed.
Only then key removal shall be allowed and until then key invalidation
must wait.
A new callback was added to let clients inform PFK when requests end.
Change-Id: Id7f8a3302fac9fafd1203d8d56ca13d59b45bbd5
Signed-off-by: Gilad Broner <gbroner@codeaurora.org>
Signed-off-by: Andrey Markovytch <andreym@codeaurora.org>
Diffstat (limited to 'include/linux')
-rw-r--r-- | include/linux/pfk.h | 15 |
1 files changed, 11 insertions, 4 deletions
diff --git a/include/linux/pfk.h b/include/linux/pfk.h index f492d758291e..a7e8ecbea8f5 100644 --- a/include/linux/pfk.h +++ b/include/linux/pfk.h @@ -1,4 +1,4 @@ -/* Copyright (c) 2015, The Linux Foundation. All rights reserved. +/* Copyright (c) 2015-2016, The Linux Foundation. All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and @@ -19,13 +19,20 @@ struct ice_crypto_setting; #ifdef CONFIG_PFK -int pfk_load_key(const struct bio *bio, struct ice_crypto_setting *ice_setting); +int pfk_load_key_start(const struct bio *bio, + struct ice_crypto_setting *ice_setting, bool *is_pfe, bool); +int pfk_load_key_end(const struct bio *bio, bool *is_pfe); int pfk_remove_key(const unsigned char *key, size_t key_size); bool pfk_allow_merge_bio(struct bio *bio1, struct bio *bio2); #else -static inline int pfk_load_key(const struct bio *bio, - struct ice_crypto_setting *ice_setting) +static inline int pfk_load_key_start(const struct bio *bio, + struct ice_crypto_setting *ice_setting, bool *is_pfe, bool async) +{ + return -ENODEV; +} + +static inline int pfk_load_key_end(const struct bio *bio, bool *is_pfe) { return -ENODEV; } |