This source file includes following definitions.
- key_schedule_gc
- key_schedule_gc_links
- key_gc_timer_func
- key_gc_keytype
- key_gc_unused_keys
- key_garbage_collector
   1 
   2 
   3 
   4 
   5 
   6 
   7 
   8 #include <linux/slab.h>
   9 #include <linux/security.h>
  10 #include <keys/keyring-type.h>
  11 #include "internal.h"
  12 
  13 
  14 
  15 
  16 unsigned key_gc_delay = 5 * 60;
  17 
  18 
  19 
  20 
  21 static void key_garbage_collector(struct work_struct *work);
  22 DECLARE_WORK(key_gc_work, key_garbage_collector);
  23 
  24 
  25 
  26 
  27 static void key_gc_timer_func(struct timer_list *);
  28 static DEFINE_TIMER(key_gc_timer, key_gc_timer_func);
  29 
  30 static time64_t key_gc_next_run = TIME64_MAX;
  31 static struct key_type *key_gc_dead_keytype;
  32 
  33 static unsigned long key_gc_flags;
  34 #define KEY_GC_KEY_EXPIRED      0       
  35 #define KEY_GC_REAP_KEYTYPE     1       
  36 #define KEY_GC_REAPING_KEYTYPE  2       
  37 
  38 
  39 
  40 
  41 
  42 
  43 struct key_type key_type_dead = {
  44         .name = ".dead",
  45 };
  46 
  47 
  48 
  49 
  50 
  51 void key_schedule_gc(time64_t gc_at)
  52 {
  53         unsigned long expires;
  54         time64_t now = ktime_get_real_seconds();
  55 
  56         kenter("%lld", gc_at - now);
  57 
  58         if (gc_at <= now || test_bit(KEY_GC_REAP_KEYTYPE, &key_gc_flags)) {
  59                 kdebug("IMMEDIATE");
  60                 schedule_work(&key_gc_work);
  61         } else if (gc_at < key_gc_next_run) {
  62                 kdebug("DEFERRED");
  63                 key_gc_next_run = gc_at;
  64                 expires = jiffies + (gc_at - now) * HZ;
  65                 mod_timer(&key_gc_timer, expires);
  66         }
  67 }
  68 
  69 
  70 
  71 
  72 void key_schedule_gc_links(void)
  73 {
  74         set_bit(KEY_GC_KEY_EXPIRED, &key_gc_flags);
  75         schedule_work(&key_gc_work);
  76 }
  77 
  78 
  79 
  80 
  81 
  82 static void key_gc_timer_func(struct timer_list *unused)
  83 {
  84         kenter("");
  85         key_gc_next_run = TIME64_MAX;
  86         key_schedule_gc_links();
  87 }
  88 
  89 
  90 
  91 
  92 
  93 
  94 
  95 
  96 
  97 
  98 
  99 void key_gc_keytype(struct key_type *ktype)
 100 {
 101         kenter("%s", ktype->name);
 102 
 103         key_gc_dead_keytype = ktype;
 104         set_bit(KEY_GC_REAPING_KEYTYPE, &key_gc_flags);
 105         smp_mb();
 106         set_bit(KEY_GC_REAP_KEYTYPE, &key_gc_flags);
 107 
 108         kdebug("schedule");
 109         schedule_work(&key_gc_work);
 110 
 111         kdebug("sleep");
 112         wait_on_bit(&key_gc_flags, KEY_GC_REAPING_KEYTYPE,
 113                     TASK_UNINTERRUPTIBLE);
 114 
 115         key_gc_dead_keytype = NULL;
 116         kleave("");
 117 }
 118 
 119 
 120 
 121 
 122 static noinline void key_gc_unused_keys(struct list_head *keys)
 123 {
 124         while (!list_empty(keys)) {
 125                 struct key *key =
 126                         list_entry(keys->next, struct key, graveyard_link);
 127                 short state = key->state;
 128 
 129                 list_del(&key->graveyard_link);
 130 
 131                 kdebug("- %u", key->serial);
 132                 key_check(key);
 133 
 134                 
 135                 if (state == KEY_IS_POSITIVE && key->type->destroy)
 136                         key->type->destroy(key);
 137 
 138                 security_key_free(key);
 139 
 140                 
 141                 if (test_bit(KEY_FLAG_IN_QUOTA, &key->flags)) {
 142                         spin_lock(&key->user->lock);
 143                         key->user->qnkeys--;
 144                         key->user->qnbytes -= key->quotalen;
 145                         spin_unlock(&key->user->lock);
 146                 }
 147 
 148                 atomic_dec(&key->user->nkeys);
 149                 if (state != KEY_IS_UNINSTANTIATED)
 150                         atomic_dec(&key->user->nikeys);
 151 
 152                 key_user_put(key->user);
 153                 key_put_tag(key->domain_tag);
 154                 kfree(key->description);
 155 
 156                 memzero_explicit(key, sizeof(*key));
 157                 kmem_cache_free(key_jar, key);
 158         }
 159 }
 160 
 161 
 162 
 163 
 164 
 165 
 166 
 167 
 168 static void key_garbage_collector(struct work_struct *work)
 169 {
 170         static LIST_HEAD(graveyard);
 171         static u8 gc_state;             
 172 #define KEY_GC_REAP_AGAIN       0x01    
 173 #define KEY_GC_REAPING_LINKS    0x02    
 174 #define KEY_GC_SET_TIMER        0x04    
 175 #define KEY_GC_REAPING_DEAD_1   0x10    
 176 #define KEY_GC_REAPING_DEAD_2   0x20    
 177 #define KEY_GC_REAPING_DEAD_3   0x40    
 178 #define KEY_GC_FOUND_DEAD_KEY   0x80    
 179 
 180         struct rb_node *cursor;
 181         struct key *key;
 182         time64_t new_timer, limit;
 183 
 184         kenter("[%lx,%x]", key_gc_flags, gc_state);
 185 
 186         limit = ktime_get_real_seconds();
 187         if (limit > key_gc_delay)
 188                 limit -= key_gc_delay;
 189         else
 190                 limit = key_gc_delay;
 191 
 192         
 193         gc_state &= KEY_GC_REAPING_DEAD_1 | KEY_GC_REAPING_DEAD_2;
 194         gc_state <<= 1;
 195         if (test_and_clear_bit(KEY_GC_KEY_EXPIRED, &key_gc_flags))
 196                 gc_state |= KEY_GC_REAPING_LINKS | KEY_GC_SET_TIMER;
 197 
 198         if (test_and_clear_bit(KEY_GC_REAP_KEYTYPE, &key_gc_flags))
 199                 gc_state |= KEY_GC_REAPING_DEAD_1;
 200         kdebug("new pass %x", gc_state);
 201 
 202         new_timer = TIME64_MAX;
 203 
 204         
 205 
 206 
 207 
 208         spin_lock(&key_serial_lock);
 209         cursor = rb_first(&key_serial_tree);
 210 
 211 continue_scanning:
 212         while (cursor) {
 213                 key = rb_entry(cursor, struct key, serial_node);
 214                 cursor = rb_next(cursor);
 215 
 216                 if (refcount_read(&key->usage) == 0)
 217                         goto found_unreferenced_key;
 218 
 219                 if (unlikely(gc_state & KEY_GC_REAPING_DEAD_1)) {
 220                         if (key->type == key_gc_dead_keytype) {
 221                                 gc_state |= KEY_GC_FOUND_DEAD_KEY;
 222                                 set_bit(KEY_FLAG_DEAD, &key->flags);
 223                                 key->perm = 0;
 224                                 goto skip_dead_key;
 225                         } else if (key->type == &key_type_keyring &&
 226                                    key->restrict_link) {
 227                                 goto found_restricted_keyring;
 228                         }
 229                 }
 230 
 231                 if (gc_state & KEY_GC_SET_TIMER) {
 232                         if (key->expiry > limit && key->expiry < new_timer) {
 233                                 kdebug("will expire %x in %lld",
 234                                        key_serial(key), key->expiry - limit);
 235                                 new_timer = key->expiry;
 236                         }
 237                 }
 238 
 239                 if (unlikely(gc_state & KEY_GC_REAPING_DEAD_2))
 240                         if (key->type == key_gc_dead_keytype)
 241                                 gc_state |= KEY_GC_FOUND_DEAD_KEY;
 242 
 243                 if ((gc_state & KEY_GC_REAPING_LINKS) ||
 244                     unlikely(gc_state & KEY_GC_REAPING_DEAD_2)) {
 245                         if (key->type == &key_type_keyring)
 246                                 goto found_keyring;
 247                 }
 248 
 249                 if (unlikely(gc_state & KEY_GC_REAPING_DEAD_3))
 250                         if (key->type == key_gc_dead_keytype)
 251                                 goto destroy_dead_key;
 252 
 253         skip_dead_key:
 254                 if (spin_is_contended(&key_serial_lock) || need_resched())
 255                         goto contended;
 256         }
 257 
 258 contended:
 259         spin_unlock(&key_serial_lock);
 260 
 261 maybe_resched:
 262         if (cursor) {
 263                 cond_resched();
 264                 spin_lock(&key_serial_lock);
 265                 goto continue_scanning;
 266         }
 267 
 268         
 269 
 270 
 271 
 272         kdebug("pass complete");
 273 
 274         if (gc_state & KEY_GC_SET_TIMER && new_timer != (time64_t)TIME64_MAX) {
 275                 new_timer += key_gc_delay;
 276                 key_schedule_gc(new_timer);
 277         }
 278 
 279         if (unlikely(gc_state & KEY_GC_REAPING_DEAD_2) ||
 280             !list_empty(&graveyard)) {
 281                 
 282 
 283 
 284 
 285 
 286                 kdebug("gc sync");
 287                 synchronize_rcu();
 288         }
 289 
 290         if (!list_empty(&graveyard)) {
 291                 kdebug("gc keys");
 292                 key_gc_unused_keys(&graveyard);
 293         }
 294 
 295         if (unlikely(gc_state & (KEY_GC_REAPING_DEAD_1 |
 296                                  KEY_GC_REAPING_DEAD_2))) {
 297                 if (!(gc_state & KEY_GC_FOUND_DEAD_KEY)) {
 298                         
 299 
 300 
 301                         kdebug("dead short");
 302                         gc_state &= ~(KEY_GC_REAPING_DEAD_1 | KEY_GC_REAPING_DEAD_2);
 303                         gc_state |= KEY_GC_REAPING_DEAD_3;
 304                 } else {
 305                         gc_state |= KEY_GC_REAP_AGAIN;
 306                 }
 307         }
 308 
 309         if (unlikely(gc_state & KEY_GC_REAPING_DEAD_3)) {
 310                 kdebug("dead wake");
 311                 smp_mb();
 312                 clear_bit(KEY_GC_REAPING_KEYTYPE, &key_gc_flags);
 313                 wake_up_bit(&key_gc_flags, KEY_GC_REAPING_KEYTYPE);
 314         }
 315 
 316         if (gc_state & KEY_GC_REAP_AGAIN)
 317                 schedule_work(&key_gc_work);
 318         kleave(" [end %x]", gc_state);
 319         return;
 320 
 321         
 322 
 323 
 324 found_unreferenced_key:
 325         kdebug("unrefd key %d", key->serial);
 326         rb_erase(&key->serial_node, &key_serial_tree);
 327         spin_unlock(&key_serial_lock);
 328 
 329         list_add_tail(&key->graveyard_link, &graveyard);
 330         gc_state |= KEY_GC_REAP_AGAIN;
 331         goto maybe_resched;
 332 
 333         
 334 
 335 
 336 found_restricted_keyring:
 337         spin_unlock(&key_serial_lock);
 338         keyring_restriction_gc(key, key_gc_dead_keytype);
 339         goto maybe_resched;
 340 
 341         
 342 
 343 
 344 
 345 
 346 found_keyring:
 347         spin_unlock(&key_serial_lock);
 348         keyring_gc(key, limit);
 349         goto maybe_resched;
 350 
 351         
 352 
 353 
 354 destroy_dead_key:
 355         spin_unlock(&key_serial_lock);
 356         kdebug("destroy key %d", key->serial);
 357         down_write(&key->sem);
 358         key->type = &key_type_dead;
 359         if (key_gc_dead_keytype->destroy)
 360                 key_gc_dead_keytype->destroy(key);
 361         memset(&key->payload, KEY_DESTROY, sizeof(key->payload));
 362         up_write(&key->sem);
 363         goto maybe_resched;
 364 }