mirror of
https://github.com/edk2-porting/linux-next.git
synced 2024-12-23 20:53:53 +08:00
net/tls: Replace TLS_RX_SYNC_RUNNING with RCU
RCU synchronization is guaranteed to finish in finite time, unlike a busy loop that polls a flag. This patch is a preparation for the bugfix in the next patch, where the same synchronize_net() call will also be used to sync with the TX datapath. Signed-off-by: Maxim Mikityanskiy <maximmi@nvidia.com> Reviewed-by: Tariq Toukan <tariqt@nvidia.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
f336d0b93a
commit
05fc8b6cbd
@ -193,7 +193,6 @@ struct tls_offload_context_tx {
|
||||
(sizeof(struct tls_offload_context_tx) + TLS_DRIVER_STATE_SIZE_TX)
|
||||
|
||||
enum tls_context_flags {
|
||||
TLS_RX_SYNC_RUNNING = 0,
|
||||
/* Unlike RX where resync is driven entirely by the core in TX only
|
||||
* the driver knows when things went out of sync, so we need the flag
|
||||
* to be atomic.
|
||||
|
@ -680,15 +680,13 @@ static void tls_device_resync_rx(struct tls_context *tls_ctx,
|
||||
struct tls_offload_context_rx *rx_ctx = tls_offload_ctx_rx(tls_ctx);
|
||||
struct net_device *netdev;
|
||||
|
||||
if (WARN_ON(test_and_set_bit(TLS_RX_SYNC_RUNNING, &tls_ctx->flags)))
|
||||
return;
|
||||
|
||||
trace_tls_device_rx_resync_send(sk, seq, rcd_sn, rx_ctx->resync_type);
|
||||
rcu_read_lock();
|
||||
netdev = READ_ONCE(tls_ctx->netdev);
|
||||
if (netdev)
|
||||
netdev->tlsdev_ops->tls_dev_resync(netdev, sk, seq, rcd_sn,
|
||||
TLS_OFFLOAD_CTX_DIR_RX);
|
||||
clear_bit_unlock(TLS_RX_SYNC_RUNNING, &tls_ctx->flags);
|
||||
rcu_read_unlock();
|
||||
TLS_INC_STATS(sock_net(sk), LINUX_MIB_TLSRXDEVICERESYNC);
|
||||
}
|
||||
|
||||
@ -1300,9 +1298,7 @@ static int tls_device_down(struct net_device *netdev)
|
||||
netdev->tlsdev_ops->tls_dev_del(netdev, ctx,
|
||||
TLS_OFFLOAD_CTX_DIR_RX);
|
||||
WRITE_ONCE(ctx->netdev, NULL);
|
||||
smp_mb__before_atomic(); /* pairs with test_and_set_bit() */
|
||||
while (test_bit(TLS_RX_SYNC_RUNNING, &ctx->flags))
|
||||
usleep_range(10, 200);
|
||||
synchronize_net();
|
||||
dev_put(netdev);
|
||||
list_del_init(&ctx->list);
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user