diff options
author | Miloslav Trmač <mitr@redhat.com> | 2010-07-26 19:37:46 +0200 |
---|---|---|
committer | Nikos Mavrogiannopoulos <nmav@gnutls.org> | 2010-07-26 20:25:47 +0200 |
commit | f8ee9fe8abff32704e658923003eae1420f97e16 (patch) | |
tree | 3611a747d0f3c03085df004439e2b252b12d909e /ncr-sessions.c | |
parent | d9828d0890624db84f99b195051f19849e654d8e (diff) | |
download | cryptodev-linux-f8ee9fe8abff32704e658923003eae1420f97e16.tar.gz cryptodev-linux-f8ee9fe8abff32704e658923003eae1420f97e16.tar.xz cryptodev-linux-f8ee9fe8abff32704e658923003eae1420f97e16.zip |
Don't duplicate expansion of session page pointers
Diffstat (limited to 'ncr-sessions.c')
-rw-r--r-- | ncr-sessions.c | 55 |
1 files changed, 23 insertions, 32 deletions
diff --git a/ncr-sessions.c b/ncr-sessions.c index 3eaae42..27c2937 100644 --- a/ncr-sessions.c +++ b/ncr-sessions.c @@ -489,6 +489,27 @@ static void _ncr_session_remove(struct list_sem_st* lst, ncr_session_t desc) return; } +static int _ncr_session_grow_pages(struct session_item_st *ses, int pagecount) +{ + if (pagecount < ses->array_size) + return 0; + + while (ses->array_size < pagecount) + ses->array_size *= 2; + + dprintk(2, KERN_DEBUG, "%s: reallocating to %d elements\n", + __func__, ses->array_size); + ses->pages = krealloc(ses->pages, ses->array_size * + sizeof(struct page *), GFP_KERNEL); + ses->sg = krealloc(ses->sg, ses->array_size * + sizeof(struct scatterlist), GFP_KERNEL); + + if (unlikely(ses->sg == NULL || ses->pages == NULL)) { + return -ENOMEM; + } + return 0; +} + /* Only the output buffer is given as scatterlist */ static int get_userbuf1(struct session_item_st* ses, void __user * udata, size_t udata_size, struct scatterlist **dst_sg, unsigned *dst_cnt) @@ -506,22 +527,7 @@ static int get_userbuf1(struct session_item_st* ses, } pagecount = PAGECOUNT(udata, udata_size); - - if (pagecount > ses->array_size) { - while (ses->array_size < pagecount) - ses->array_size *= 2; - - dprintk(2, KERN_DEBUG, "%s: reallocating to %d elements\n", - __func__, ses->array_size); - ses->pages = krealloc(ses->pages, ses->array_size * - sizeof(struct page *), GFP_KERNEL); - ses->sg = krealloc(ses->sg, ses->array_size * - sizeof(struct scatterlist), GFP_KERNEL); - - if (unlikely(ses->sg == NULL || ses->pages == NULL)) { - return -ENOMEM; - } - } + _ncr_session_grow_pages(ses, pagecount); if (__get_userbuf(udata, udata_size, 1, pagecount, ses->pages, ses->sg)) { @@ -570,22 +576,7 @@ static int get_userbuf2(struct session_item_st* ses, } pagecount = src_pagecount + dst_pagecount; - - if (pagecount > ses->array_size) { - while (ses->array_size < pagecount) - ses->array_size *= 2; - - dprintk(2, KERN_DEBUG, "%s: reallocating to %d elements\n", - __func__, ses->array_size); - ses->pages = krealloc(ses->pages, ses->array_size * - sizeof(struct page *), GFP_KERNEL); - ses->sg = krealloc(ses->sg, ses->array_size * - sizeof(struct scatterlist), GFP_KERNEL); - - if (ses->sg == NULL || ses->pages == NULL) { - return -ENOMEM; - } - } + _ncr_session_grow_pages(ses, pagecount); if (__get_userbuf(op->data.udata.input, input_size, write_src, src_pagecount, ses->pages, ses->sg)) { |