GNU Linux-libre 4.9.337-gnu1
[releases.git] / drivers / staging / lustre / lustre / ptlrpc / sec_bulk.c
1 /*
2  * GPL HEADER START
3  *
4  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
5  *
6  * This program is free software; you can redistribute it and/or modify
7  * it under the terms of the GNU General Public License version 2 only,
8  * as published by the Free Software Foundation.
9  *
10  * This program is distributed in the hope that it will be useful, but
11  * WITHOUT ANY WARRANTY; without even the implied warranty of
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
13  * General Public License version 2 for more details (a copy is included
14  * in the LICENSE file that accompanied this code).
15  *
16  * You should have received a copy of the GNU General Public License
17  * version 2 along with this program; If not, see
18  * http://www.gnu.org/licenses/gpl-2.0.html
19  *
20  * GPL HEADER END
21  */
22 /*
23  * Copyright (c) 2007, 2010, Oracle and/or its affiliates. All rights reserved.
24  * Use is subject to license terms.
25  *
26  * Copyright (c) 2011, 2015, Intel Corporation.
27  */
28 /*
29  * This file is part of Lustre, http://www.lustre.org/
30  * Lustre is a trademark of Sun Microsystems, Inc.
31  *
32  * lustre/ptlrpc/sec_bulk.c
33  *
34  * Author: Eric Mei <ericm@clusterfs.com>
35  */
36
37 #define DEBUG_SUBSYSTEM S_SEC
38
39 #include "../../include/linux/libcfs/libcfs.h"
40
41 #include "../include/obd.h"
42 #include "../include/obd_cksum.h"
43 #include "../include/obd_class.h"
44 #include "../include/obd_support.h"
45 #include "../include/lustre_net.h"
46 #include "../include/lustre_import.h"
47 #include "../include/lustre_dlm.h"
48 #include "../include/lustre_sec.h"
49
50 #include "ptlrpc_internal.h"
51
52 /****************************************
53  * bulk encryption page pools      *
54  ****************************************/
55
56 #define POINTERS_PER_PAGE       (PAGE_SIZE / sizeof(void *))
57 #define PAGES_PER_POOL          (POINTERS_PER_PAGE)
58
59 #define IDLE_IDX_MAX     (100)
60 #define IDLE_IDX_WEIGHT  (3)
61
62 #define CACHE_QUIESCENT_PERIOD  (20)
63
64 static struct ptlrpc_enc_page_pool {
65         /*
66          * constants
67          */
68         unsigned long    epp_max_pages;   /* maximum pages can hold, const */
69         unsigned int     epp_max_pools;   /* number of pools, const */
70
71         /*
72          * wait queue in case of not enough free pages.
73          */
74         wait_queue_head_t      epp_waitq;       /* waiting threads */
75         unsigned int     epp_waitqlen;    /* wait queue length */
76         unsigned long    epp_pages_short; /* # of pages wanted of in-q users */
77         unsigned int     epp_growing:1;   /* during adding pages */
78
79         /*
80          * indicating how idle the pools are, from 0 to MAX_IDLE_IDX
81          * this is counted based on each time when getting pages from
82          * the pools, not based on time. which means in case that system
83          * is idled for a while but the idle_idx might still be low if no
84          * activities happened in the pools.
85          */
86         unsigned long    epp_idle_idx;
87
88         /* last shrink time due to mem tight */
89         time64_t         epp_last_shrink;
90         time64_t         epp_last_access;
91
92         /*
93          * in-pool pages bookkeeping
94          */
95         spinlock_t       epp_lock;         /* protect following fields */
96         unsigned long    epp_total_pages; /* total pages in pools */
97         unsigned long    epp_free_pages;  /* current pages available */
98
99         /*
100          * statistics
101          */
102         unsigned long    epp_st_max_pages;      /* # of pages ever reached */
103         unsigned int     epp_st_grows;    /* # of grows */
104         unsigned int     epp_st_grow_fails;     /* # of add pages failures */
105         unsigned int     epp_st_shrinks;        /* # of shrinks */
106         unsigned long    epp_st_access;  /* # of access */
107         unsigned long    epp_st_missings;       /* # of cache missing */
108         unsigned long    epp_st_lowfree;        /* lowest free pages reached */
109         unsigned int     epp_st_max_wqlen;      /* highest waitqueue length */
110         unsigned long       epp_st_max_wait;       /* in jiffies */
111         /*
112          * pointers to pools
113          */
114         struct page    ***epp_pools;
115 } page_pools;
116
117 /*
118  * /sys/kernel/debug/lustre/sptlrpc/encrypt_page_pools
119  */
120 int sptlrpc_proc_enc_pool_seq_show(struct seq_file *m, void *v)
121 {
122         spin_lock(&page_pools.epp_lock);
123
124         seq_printf(m,
125                    "physical pages:       %lu\n"
126                    "pages per pool:       %lu\n"
127                    "max pages:         %lu\n"
128                    "max pools:         %u\n"
129                    "total pages:             %lu\n"
130                    "total free:       %lu\n"
131                    "idle index:       %lu/100\n"
132                    "last shrink:             %lds\n"
133                    "last access:             %lds\n"
134                    "max pages reached:       %lu\n"
135                    "grows:                 %u\n"
136                    "grows failure:         %u\n"
137                    "shrinks:             %u\n"
138                    "cache access:           %lu\n"
139                    "cache missing:         %lu\n"
140                    "low free mark:         %lu\n"
141                    "max waitqueue depth:     %u\n"
142                    "max wait time:         %ld/%lu\n",
143                    totalram_pages,
144                    PAGES_PER_POOL,
145                    page_pools.epp_max_pages,
146                    page_pools.epp_max_pools,
147                    page_pools.epp_total_pages,
148                    page_pools.epp_free_pages,
149                    page_pools.epp_idle_idx,
150                    (long)(ktime_get_seconds() - page_pools.epp_last_shrink),
151                    (long)(ktime_get_seconds() - page_pools.epp_last_access),
152                    page_pools.epp_st_max_pages,
153                    page_pools.epp_st_grows,
154                    page_pools.epp_st_grow_fails,
155                    page_pools.epp_st_shrinks,
156                    page_pools.epp_st_access,
157                    page_pools.epp_st_missings,
158                    page_pools.epp_st_lowfree,
159                    page_pools.epp_st_max_wqlen,
160                    page_pools.epp_st_max_wait,
161                    msecs_to_jiffies(MSEC_PER_SEC));
162
163         spin_unlock(&page_pools.epp_lock);
164
165         return 0;
166 }
167
168 static void enc_pools_release_free_pages(long npages)
169 {
170         int p_idx, g_idx;
171         int p_idx_max1, p_idx_max2;
172
173         LASSERT(npages > 0);
174         LASSERT(npages <= page_pools.epp_free_pages);
175         LASSERT(page_pools.epp_free_pages <= page_pools.epp_total_pages);
176
177         /* max pool index before the release */
178         p_idx_max2 = (page_pools.epp_total_pages - 1) / PAGES_PER_POOL;
179
180         page_pools.epp_free_pages -= npages;
181         page_pools.epp_total_pages -= npages;
182
183         /* max pool index after the release */
184         p_idx_max1 = page_pools.epp_total_pages == 0 ? -1 :
185                      ((page_pools.epp_total_pages - 1) / PAGES_PER_POOL);
186
187         p_idx = page_pools.epp_free_pages / PAGES_PER_POOL;
188         g_idx = page_pools.epp_free_pages % PAGES_PER_POOL;
189         LASSERT(page_pools.epp_pools[p_idx]);
190
191         while (npages--) {
192                 LASSERT(page_pools.epp_pools[p_idx]);
193                 LASSERT(page_pools.epp_pools[p_idx][g_idx]);
194
195                 __free_page(page_pools.epp_pools[p_idx][g_idx]);
196                 page_pools.epp_pools[p_idx][g_idx] = NULL;
197
198                 if (++g_idx == PAGES_PER_POOL) {
199                         p_idx++;
200                         g_idx = 0;
201                 }
202         }
203
204         /* free unused pools */
205         while (p_idx_max1 < p_idx_max2) {
206                 LASSERT(page_pools.epp_pools[p_idx_max2]);
207                 kfree(page_pools.epp_pools[p_idx_max2]);
208                 page_pools.epp_pools[p_idx_max2] = NULL;
209                 p_idx_max2--;
210         }
211 }
212
213 /*
214  * we try to keep at least PTLRPC_MAX_BRW_PAGES pages in the pool.
215  */
216 static unsigned long enc_pools_shrink_count(struct shrinker *s,
217                                             struct shrink_control *sc)
218 {
219         /*
220          * if no pool access for a long time, we consider it's fully idle.
221          * a little race here is fine.
222          */
223         if (unlikely(ktime_get_seconds() - page_pools.epp_last_access >
224                      CACHE_QUIESCENT_PERIOD)) {
225                 spin_lock(&page_pools.epp_lock);
226                 page_pools.epp_idle_idx = IDLE_IDX_MAX;
227                 spin_unlock(&page_pools.epp_lock);
228         }
229
230         LASSERT(page_pools.epp_idle_idx <= IDLE_IDX_MAX);
231         return max((int)page_pools.epp_free_pages - PTLRPC_MAX_BRW_PAGES, 0) *
232                 (IDLE_IDX_MAX - page_pools.epp_idle_idx) / IDLE_IDX_MAX;
233 }
234
235 /*
236  * we try to keep at least PTLRPC_MAX_BRW_PAGES pages in the pool.
237  */
238 static unsigned long enc_pools_shrink_scan(struct shrinker *s,
239                                            struct shrink_control *sc)
240 {
241         spin_lock(&page_pools.epp_lock);
242         sc->nr_to_scan = min_t(unsigned long, sc->nr_to_scan,
243                               page_pools.epp_free_pages - PTLRPC_MAX_BRW_PAGES);
244         if (sc->nr_to_scan > 0) {
245                 enc_pools_release_free_pages(sc->nr_to_scan);
246                 CDEBUG(D_SEC, "released %ld pages, %ld left\n",
247                        (long)sc->nr_to_scan, page_pools.epp_free_pages);
248
249                 page_pools.epp_st_shrinks++;
250                 page_pools.epp_last_shrink = ktime_get_seconds();
251         }
252         spin_unlock(&page_pools.epp_lock);
253
254         /*
255          * if no pool access for a long time, we consider it's fully idle.
256          * a little race here is fine.
257          */
258         if (unlikely(ktime_get_seconds() - page_pools.epp_last_access >
259                      CACHE_QUIESCENT_PERIOD)) {
260                 spin_lock(&page_pools.epp_lock);
261                 page_pools.epp_idle_idx = IDLE_IDX_MAX;
262                 spin_unlock(&page_pools.epp_lock);
263         }
264
265         LASSERT(page_pools.epp_idle_idx <= IDLE_IDX_MAX);
266         return sc->nr_to_scan;
267 }
268
269 static inline
270 int npages_to_npools(unsigned long npages)
271 {
272         return (int)((npages + PAGES_PER_POOL - 1) / PAGES_PER_POOL);
273 }
274
275 /*
276  * return how many pages cleaned up.
277  */
278 static unsigned long enc_pools_cleanup(struct page ***pools, int npools)
279 {
280         unsigned long cleaned = 0;
281         int i, j;
282
283         for (i = 0; i < npools; i++) {
284                 if (pools[i]) {
285                         for (j = 0; j < PAGES_PER_POOL; j++) {
286                                 if (pools[i][j]) {
287                                         __free_page(pools[i][j]);
288                                         cleaned++;
289                                 }
290                         }
291                         kfree(pools[i]);
292                         pools[i] = NULL;
293                 }
294         }
295
296         return cleaned;
297 }
298
299 static inline void enc_pools_wakeup(void)
300 {
301         assert_spin_locked(&page_pools.epp_lock);
302
303         if (unlikely(page_pools.epp_waitqlen)) {
304                 LASSERT(waitqueue_active(&page_pools.epp_waitq));
305                 wake_up_all(&page_pools.epp_waitq);
306         }
307 }
308
309 void sptlrpc_enc_pool_put_pages(struct ptlrpc_bulk_desc *desc)
310 {
311         int p_idx, g_idx;
312         int i;
313
314         if (!desc->bd_enc_iov)
315                 return;
316
317         LASSERT(desc->bd_iov_count > 0);
318
319         spin_lock(&page_pools.epp_lock);
320
321         p_idx = page_pools.epp_free_pages / PAGES_PER_POOL;
322         g_idx = page_pools.epp_free_pages % PAGES_PER_POOL;
323
324         LASSERT(page_pools.epp_free_pages + desc->bd_iov_count <=
325                 page_pools.epp_total_pages);
326         LASSERT(page_pools.epp_pools[p_idx]);
327
328         for (i = 0; i < desc->bd_iov_count; i++) {
329                 LASSERT(desc->bd_enc_iov[i].bv_page);
330                 LASSERT(g_idx != 0 || page_pools.epp_pools[p_idx]);
331                 LASSERT(!page_pools.epp_pools[p_idx][g_idx]);
332
333                 page_pools.epp_pools[p_idx][g_idx] =
334                                         desc->bd_enc_iov[i].bv_page;
335
336                 if (++g_idx == PAGES_PER_POOL) {
337                         p_idx++;
338                         g_idx = 0;
339                 }
340         }
341
342         page_pools.epp_free_pages += desc->bd_iov_count;
343
344         enc_pools_wakeup();
345
346         spin_unlock(&page_pools.epp_lock);
347
348         kfree(desc->bd_enc_iov);
349         desc->bd_enc_iov = NULL;
350 }
351
352 static inline void enc_pools_alloc(void)
353 {
354         LASSERT(page_pools.epp_max_pools);
355         page_pools.epp_pools =
356                 libcfs_kvzalloc(page_pools.epp_max_pools *
357                                 sizeof(*page_pools.epp_pools),
358                                 GFP_NOFS);
359 }
360
361 static inline void enc_pools_free(void)
362 {
363         LASSERT(page_pools.epp_max_pools);
364         LASSERT(page_pools.epp_pools);
365
366         kvfree(page_pools.epp_pools);
367 }
368
369 static struct shrinker pools_shrinker = {
370         .count_objects  = enc_pools_shrink_count,
371         .scan_objects   = enc_pools_shrink_scan,
372         .seeks          = DEFAULT_SEEKS,
373 };
374
375 int sptlrpc_enc_pool_init(void)
376 {
377         /*
378          * maximum capacity is 1/8 of total physical memory.
379          * is the 1/8 a good number?
380          */
381         page_pools.epp_max_pages = totalram_pages / 8;
382         page_pools.epp_max_pools = npages_to_npools(page_pools.epp_max_pages);
383
384         init_waitqueue_head(&page_pools.epp_waitq);
385         page_pools.epp_waitqlen = 0;
386         page_pools.epp_pages_short = 0;
387
388         page_pools.epp_growing = 0;
389
390         page_pools.epp_idle_idx = 0;
391         page_pools.epp_last_shrink = ktime_get_seconds();
392         page_pools.epp_last_access = ktime_get_seconds();
393
394         spin_lock_init(&page_pools.epp_lock);
395         page_pools.epp_total_pages = 0;
396         page_pools.epp_free_pages = 0;
397
398         page_pools.epp_st_max_pages = 0;
399         page_pools.epp_st_grows = 0;
400         page_pools.epp_st_grow_fails = 0;
401         page_pools.epp_st_shrinks = 0;
402         page_pools.epp_st_access = 0;
403         page_pools.epp_st_missings = 0;
404         page_pools.epp_st_lowfree = 0;
405         page_pools.epp_st_max_wqlen = 0;
406         page_pools.epp_st_max_wait = 0;
407
408         enc_pools_alloc();
409         if (!page_pools.epp_pools)
410                 return -ENOMEM;
411
412         register_shrinker(&pools_shrinker);
413
414         return 0;
415 }
416
417 void sptlrpc_enc_pool_fini(void)
418 {
419         unsigned long cleaned, npools;
420
421         LASSERT(page_pools.epp_pools);
422         LASSERT(page_pools.epp_total_pages == page_pools.epp_free_pages);
423
424         unregister_shrinker(&pools_shrinker);
425
426         npools = npages_to_npools(page_pools.epp_total_pages);
427         cleaned = enc_pools_cleanup(page_pools.epp_pools, npools);
428         LASSERT(cleaned == page_pools.epp_total_pages);
429
430         enc_pools_free();
431
432         if (page_pools.epp_st_access > 0) {
433                 CDEBUG(D_SEC,
434                        "max pages %lu, grows %u, grow fails %u, shrinks %u, access %lu, missing %lu, max qlen %u, max wait %ld/%ld\n",
435                        page_pools.epp_st_max_pages, page_pools.epp_st_grows,
436                        page_pools.epp_st_grow_fails,
437                        page_pools.epp_st_shrinks, page_pools.epp_st_access,
438                        page_pools.epp_st_missings, page_pools.epp_st_max_wqlen,
439                        page_pools.epp_st_max_wait,
440                        msecs_to_jiffies(MSEC_PER_SEC));
441         }
442 }
443
444 static int cfs_hash_alg_id[] = {
445         [BULK_HASH_ALG_NULL]    = CFS_HASH_ALG_NULL,
446         [BULK_HASH_ALG_ADLER32] = CFS_HASH_ALG_ADLER32,
447         [BULK_HASH_ALG_CRC32]   = CFS_HASH_ALG_CRC32,
448         [BULK_HASH_ALG_MD5]     = CFS_HASH_ALG_MD5,
449         [BULK_HASH_ALG_SHA1]    = CFS_HASH_ALG_SHA1,
450         [BULK_HASH_ALG_SHA256]  = CFS_HASH_ALG_SHA256,
451         [BULK_HASH_ALG_SHA384]  = CFS_HASH_ALG_SHA384,
452         [BULK_HASH_ALG_SHA512]  = CFS_HASH_ALG_SHA512,
453 };
454
455 const char *sptlrpc_get_hash_name(__u8 hash_alg)
456 {
457         return cfs_crypto_hash_name(cfs_hash_alg_id[hash_alg]);
458 }
459
460 __u8 sptlrpc_get_hash_alg(const char *algname)
461 {
462         return cfs_crypto_hash_alg(algname);
463 }
464
465 int bulk_sec_desc_unpack(struct lustre_msg *msg, int offset, int swabbed)
466 {
467         struct ptlrpc_bulk_sec_desc *bsd;
468         int                       size = msg->lm_buflens[offset];
469
470         bsd = lustre_msg_buf(msg, offset, sizeof(*bsd));
471         if (!bsd) {
472                 CERROR("Invalid bulk sec desc: size %d\n", size);
473                 return -EINVAL;
474         }
475
476         if (swabbed)
477                 __swab32s(&bsd->bsd_nob);
478
479         if (unlikely(bsd->bsd_version != 0)) {
480                 CERROR("Unexpected version %u\n", bsd->bsd_version);
481                 return -EPROTO;
482         }
483
484         if (unlikely(bsd->bsd_type >= SPTLRPC_BULK_MAX)) {
485                 CERROR("Invalid type %u\n", bsd->bsd_type);
486                 return -EPROTO;
487         }
488
489         /* FIXME more sanity check here */
490
491         if (unlikely(bsd->bsd_svc != SPTLRPC_BULK_SVC_NULL &&
492                      bsd->bsd_svc != SPTLRPC_BULK_SVC_INTG &&
493                      bsd->bsd_svc != SPTLRPC_BULK_SVC_PRIV)) {
494                 CERROR("Invalid svc %u\n", bsd->bsd_svc);
495                 return -EPROTO;
496         }
497
498         return 0;
499 }
500 EXPORT_SYMBOL(bulk_sec_desc_unpack);
501
502 int sptlrpc_get_bulk_checksum(struct ptlrpc_bulk_desc *desc, __u8 alg,
503                               void *buf, int buflen)
504 {
505         struct cfs_crypto_hash_desc *hdesc;
506         int hashsize;
507         unsigned int bufsize;
508         int i, err;
509
510         LASSERT(alg > BULK_HASH_ALG_NULL && alg < BULK_HASH_ALG_MAX);
511         LASSERT(buflen >= 4);
512
513         hdesc = cfs_crypto_hash_init(cfs_hash_alg_id[alg], NULL, 0);
514         if (IS_ERR(hdesc)) {
515                 CERROR("Unable to initialize checksum hash %s\n",
516                        cfs_crypto_hash_name(cfs_hash_alg_id[alg]));
517                 return PTR_ERR(hdesc);
518         }
519
520         hashsize = cfs_crypto_hash_digestsize(cfs_hash_alg_id[alg]);
521
522         for (i = 0; i < desc->bd_iov_count; i++) {
523                 cfs_crypto_hash_update_page(hdesc, desc->bd_iov[i].bv_page,
524                                             desc->bd_iov[i].bv_offset &
525                                             ~PAGE_MASK,
526                                             desc->bd_iov[i].bv_len);
527         }
528
529         if (hashsize > buflen) {
530                 unsigned char hashbuf[CFS_CRYPTO_HASH_DIGESTSIZE_MAX];
531
532                 bufsize = sizeof(hashbuf);
533                 LASSERTF(bufsize >= hashsize, "bufsize = %u < hashsize %u\n",
534                          bufsize, hashsize);
535                 err = cfs_crypto_hash_final(hdesc, hashbuf, &bufsize);
536                 memcpy(buf, hashbuf, buflen);
537         } else {
538                 bufsize = buflen;
539                 err = cfs_crypto_hash_final(hdesc, buf, &bufsize);
540         }
541
542         return err;
543 }