diff options
Diffstat (limited to 'net/xfrm/xfrm_ipcomp.c')
| -rw-r--r-- | net/xfrm/xfrm_ipcomp.c | 39 | 
1 files changed, 21 insertions, 18 deletions
diff --git a/net/xfrm/xfrm_ipcomp.c b/net/xfrm/xfrm_ipcomp.c index fc91ad7ee26..ccfdc7115a8 100644 --- a/net/xfrm/xfrm_ipcomp.c +++ b/net/xfrm/xfrm_ipcomp.c @@ -70,26 +70,29 @@ static int ipcomp_decompress(struct xfrm_state *x, struct sk_buff *skb)  	while ((scratch += len, dlen -= len) > 0) {  		skb_frag_t *frag; +		struct page *page;  		err = -EMSGSIZE;  		if (WARN_ON(skb_shinfo(skb)->nr_frags >= MAX_SKB_FRAGS))  			goto out;  		frag = skb_shinfo(skb)->frags + skb_shinfo(skb)->nr_frags; -		frag->page = alloc_page(GFP_ATOMIC); +		page = alloc_page(GFP_ATOMIC);  		err = -ENOMEM; -		if (!frag->page) +		if (!page)  			goto out; +		__skb_frag_set_page(frag, page); +  		len = PAGE_SIZE;  		if (dlen < len)  			len = dlen; -		memcpy(page_address(frag->page), scratch, len); -  		frag->page_offset = 0; -		frag->size = len; +		skb_frag_size_set(frag, len); +		memcpy(skb_frag_address(frag), scratch, len); +  		skb->truesize += len;  		skb->data_len += len;  		skb->len += len; @@ -138,14 +141,14 @@ static int ipcomp_compress(struct xfrm_state *x, struct sk_buff *skb)  	const int plen = skb->len;  	int dlen = IPCOMP_SCRATCH_SIZE;  	u8 *start = skb->data; -	const int cpu = get_cpu(); -	u8 *scratch = *per_cpu_ptr(ipcomp_scratches, cpu); -	struct crypto_comp *tfm = *per_cpu_ptr(ipcd->tfms, cpu); +	struct crypto_comp *tfm; +	u8 *scratch;  	int err;  	local_bh_disable(); +	scratch = *this_cpu_ptr(ipcomp_scratches); +	tfm = *this_cpu_ptr(ipcd->tfms);  	err = crypto_comp_compress(tfm, start, plen, scratch, &dlen); -	local_bh_enable();  	if (err)  		goto out; @@ -155,13 +158,13 @@ static int ipcomp_compress(struct xfrm_state *x, struct sk_buff *skb)  	}  	memcpy(start + sizeof(struct ip_comp_hdr), scratch, dlen); -	put_cpu(); +	local_bh_enable();  	pskb_trim(skb, dlen + sizeof(struct ip_comp_hdr));  	return 0;  out: -	put_cpu(); +	local_bh_enable();  	return err;  } @@ -217,8 +220,8 @@ static void ipcomp_free_scratches(void)  static void * __percpu *ipcomp_alloc_scratches(void)  { -	int i;  	void * __percpu *scratches; +	int i;  	if (ipcomp_scratch_users++)  		return ipcomp_scratches; @@ -230,7 +233,9 @@ static void * __percpu *ipcomp_alloc_scratches(void)  	ipcomp_scratches = scratches;  	for_each_possible_cpu(i) { -		void *scratch = vmalloc(IPCOMP_SCRATCH_SIZE); +		void *scratch; + +		scratch = vmalloc_node(IPCOMP_SCRATCH_SIZE, cpu_to_node(i));  		if (!scratch)  			return NULL;  		*per_cpu_ptr(scratches, i) = scratch; @@ -273,18 +278,16 @@ static struct crypto_comp * __percpu *ipcomp_alloc_tfms(const char *alg_name)  	struct crypto_comp * __percpu *tfms;  	int cpu; -	/* This can be any valid CPU ID so we don't need locking. */ -	cpu = raw_smp_processor_id();  	list_for_each_entry(pos, &ipcomp_tfms_list, list) {  		struct crypto_comp *tfm; -		tfms = pos->tfms; -		tfm = *per_cpu_ptr(tfms, cpu); +		/* This can be any valid CPU ID so we don't need locking. */ +		tfm = __this_cpu_read(*pos->tfms);  		if (!strcmp(crypto_comp_name(tfm), alg_name)) {  			pos->users++; -			return tfms; +			return pos->tfms;  		}  	}  | 
