diff options
| author | Thomas Gleixner <tglx@linutronix.de> | 2020-12-15 10:48:07 +0100 | 
|---|---|---|
| committer | Thomas Gleixner <tglx@linutronix.de> | 2020-12-15 10:48:07 +0100 | 
| commit | 3c41e57a1e168d879e923c5583adeae47eec9f64 (patch) | |
| tree | e6272012c4b766189be2821316a3d23d115f5195 /net/tls | |
| parent | d14ce74f1fb376ccbbc0b05ded477ada51253729 (diff) | |
| parent | 2f5fbc4305d07725bfebaedb09e57271315691ef (diff) | |
Merge tag 'irqchip-5.11' of git://git.kernel.org/pub/scm/linux/kernel/git/maz/arm-platforms into irq/core
Pull irqchip updates for 5.11 from Marc Zyngier:
  - Preliminary support for managed interrupts on platform devices
  - Correctly identify allocation of MSIs proxyied by another device
  - Remove the fasteoi IPI flow which has been proved useless
  - Generalise the Ocelot support to new SoCs
  - Improve GICv4.1 vcpu entry, matching the corresponding KVM optimisation
  - Work around spurious interrupts on Qualcomm PDC
  - Random fixes and cleanups
Link: https://lore.kernel.org/r/20201212135626.1479884-1-maz@kernel.org
Diffstat (limited to 'net/tls')
| -rw-r--r-- | net/tls/tls_device.c | 42 | ||||
| -rw-r--r-- | net/tls/tls_sw.c | 8 | 
2 files changed, 38 insertions, 12 deletions
| diff --git a/net/tls/tls_device.c b/net/tls/tls_device.c index cec86229a6a0..a3ab2d3d4e4e 100644 --- a/net/tls/tls_device.c +++ b/net/tls/tls_device.c @@ -694,36 +694,51 @@ static void tls_device_resync_rx(struct tls_context *tls_ctx,  static bool  tls_device_rx_resync_async(struct tls_offload_resync_async *resync_async, -			   s64 resync_req, u32 *seq) +			   s64 resync_req, u32 *seq, u16 *rcd_delta)  {  	u32 is_async = resync_req & RESYNC_REQ_ASYNC;  	u32 req_seq = resync_req >> 32;  	u32 req_end = req_seq + ((resync_req >> 16) & 0xffff); +	u16 i; + +	*rcd_delta = 0;  	if (is_async) { +		/* shouldn't get to wraparound: +		 * too long in async stage, something bad happened +		 */ +		if (WARN_ON_ONCE(resync_async->rcd_delta == USHRT_MAX)) +			return false; +  		/* asynchronous stage: log all headers seq such that  		 * req_seq <= seq <= end_seq, and wait for real resync request  		 */ -		if (between(*seq, req_seq, req_end) && +		if (before(*seq, req_seq)) +			return false; +		if (!after(*seq, req_end) &&  		    resync_async->loglen < TLS_DEVICE_RESYNC_ASYNC_LOGMAX)  			resync_async->log[resync_async->loglen++] = *seq; +		resync_async->rcd_delta++; +  		return false;  	}  	/* synchronous stage: check against the logged entries and  	 * proceed to check the next entries if no match was found  	 */ -	while (resync_async->loglen) { -		if (req_seq == resync_async->log[resync_async->loglen - 1] && -		    atomic64_try_cmpxchg(&resync_async->req, -					 &resync_req, 0)) { -			resync_async->loglen = 0; +	for (i = 0; i < resync_async->loglen; i++) +		if (req_seq == resync_async->log[i] && +		    atomic64_try_cmpxchg(&resync_async->req, &resync_req, 0)) { +			*rcd_delta = resync_async->rcd_delta - i;  			*seq = req_seq; +			resync_async->loglen = 0; +			resync_async->rcd_delta = 0;  			return true;  		} -		resync_async->loglen--; -	} + +	resync_async->loglen = 0; +	resync_async->rcd_delta = 0;  	if (req_seq == *seq &&  	    atomic64_try_cmpxchg(&resync_async->req, @@ -741,6 +756,7 @@ void tls_device_rx_resync_new_rec(struct sock *sk, u32 rcd_len, u32 seq)  	u32 sock_data, is_req_pending;  	struct tls_prot_info *prot;  	s64 resync_req; +	u16 rcd_delta;  	u32 req_seq;  	if (tls_ctx->rx_conf != TLS_HW) @@ -786,8 +802,9 @@ void tls_device_rx_resync_new_rec(struct sock *sk, u32 rcd_len, u32 seq)  			return;  		if (!tls_device_rx_resync_async(rx_ctx->resync_async, -						resync_req, &seq)) +						resync_req, &seq, &rcd_delta))  			return; +		tls_bigint_subtract(rcd_sn, rcd_delta);  		break;  	} @@ -1245,6 +1262,8 @@ void tls_device_offload_cleanup_rx(struct sock *sk)  	if (tls_ctx->tx_conf != TLS_HW) {  		dev_put(netdev);  		tls_ctx->netdev = NULL; +	} else { +		set_bit(TLS_RX_DEV_CLOSED, &tls_ctx->flags);  	}  out:  	up_read(&device_offload_lock); @@ -1274,7 +1293,8 @@ static int tls_device_down(struct net_device *netdev)  		if (ctx->tx_conf == TLS_HW)  			netdev->tlsdev_ops->tls_dev_del(netdev, ctx,  							TLS_OFFLOAD_CTX_DIR_TX); -		if (ctx->rx_conf == TLS_HW) +		if (ctx->rx_conf == TLS_HW && +		    !test_bit(TLS_RX_DEV_CLOSED, &ctx->flags))  			netdev->tlsdev_ops->tls_dev_del(netdev, ctx,  							TLS_OFFLOAD_CTX_DIR_RX);  		WRITE_ONCE(ctx->netdev, NULL); diff --git a/net/tls/tls_sw.c b/net/tls/tls_sw.c index 95ab5545a931..845c628ac1b2 100644 --- a/net/tls/tls_sw.c +++ b/net/tls/tls_sw.c @@ -1295,6 +1295,12 @@ static struct sk_buff *tls_wait_data(struct sock *sk, struct sk_psock *psock,  			return NULL;  		} +		if (!skb_queue_empty(&sk->sk_receive_queue)) { +			__strp_unpause(&ctx->strp); +			if (ctx->recv_pkt) +				return ctx->recv_pkt; +		} +  		if (sk->sk_shutdown & RCV_SHUTDOWN)  			return NULL; @@ -1913,7 +1919,7 @@ pick_next_record:  			 * another message type  			 */  			msg->msg_flags |= MSG_EOR; -			if (ctx->control != TLS_RECORD_TYPE_DATA) +			if (control != TLS_RECORD_TYPE_DATA)  				goto recv_end;  		} else {  			break; | 
