crypto: af_alg - get_page upon reassignment to TX SGL
When a page is assigned to a TX SGL, call get_page to increment the reference counter. It is possible that one page is referenced in multiple SGLs: - in the global TX SGL in case a previous af_alg_pull_tsgl only reassigned parts of a page to a per-request TX SGL - in the per-request TX SGL as assigned by af_alg_pull_tsgl Note, multiple requests can be active at the same time whose TX SGLs all point to different parts of the same page. Signed-off-by: Stephan Mueller <smueller@chronox.de> Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
This commit is contained in:
parent
32e67b9af0
commit
2d45a7e898
@ -641,9 +641,9 @@ void af_alg_pull_tsgl(struct sock *sk, size_t used, struct scatterlist *dst,
|
|||||||
if (dst_offset >= plen) {
|
if (dst_offset >= plen) {
|
||||||
/* discard page before offset */
|
/* discard page before offset */
|
||||||
dst_offset -= plen;
|
dst_offset -= plen;
|
||||||
put_page(page);
|
|
||||||
} else {
|
} else {
|
||||||
/* reassign page to dst after offset */
|
/* reassign page to dst after offset */
|
||||||
|
get_page(page);
|
||||||
sg_set_page(dst + j, page,
|
sg_set_page(dst + j, page,
|
||||||
plen - dst_offset,
|
plen - dst_offset,
|
||||||
sg[i].offset + dst_offset);
|
sg[i].offset + dst_offset);
|
||||||
@ -661,9 +661,7 @@ void af_alg_pull_tsgl(struct sock *sk, size_t used, struct scatterlist *dst,
|
|||||||
if (sg[i].length)
|
if (sg[i].length)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if (!dst)
|
put_page(page);
|
||||||
put_page(page);
|
|
||||||
|
|
||||||
sg_assign_page(sg + i, NULL);
|
sg_assign_page(sg + i, NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user