Skip to content

Commit d4774ac

Browse files
Jakub Kicinskidavem330
authored andcommitted
net/tls: use RCU for the adder to the offload record list
All modifications to TLS record list happen under the socket lock. Since records form an ordered queue readers are only concerned about elements being removed, additions can happen concurrently. Use RCU primitives to ensure the correct access types (READ_ONCE/WRITE_ONCE). Signed-off-by: Jakub Kicinski <[email protected]> Reviewed-by: Dirk van der Merwe <[email protected]> Signed-off-by: David S. Miller <[email protected]>
1 parent 7ccd451 commit d4774ac

File tree

1 file changed

+13
-8
lines changed

1 file changed

+13
-8
lines changed

net/tls/tls_device.c

Lines changed: 13 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -280,9 +280,7 @@ static int tls_push_record(struct sock *sk,
280280

281281
tls_append_frag(record, &dummy_tag_frag, prot->tag_size);
282282
record->end_seq = tp->write_seq + record->len;
283-
spin_lock_irq(&offload_ctx->lock);
284-
list_add_tail(&record->list, &offload_ctx->records_list);
285-
spin_unlock_irq(&offload_ctx->lock);
283+
list_add_tail_rcu(&record->list, &offload_ctx->records_list);
286284
offload_ctx->open_record = NULL;
287285

288286
if (test_bit(TLS_TX_SYNC_SCHED, &ctx->flags))
@@ -535,12 +533,16 @@ struct tls_record_info *tls_get_record(struct tls_offload_context_tx *context,
535533
/* if retransmit_hint is irrelevant start
536534
* from the beggining of the list
537535
*/
538-
info = list_first_entry(&context->records_list,
539-
struct tls_record_info, list);
536+
info = list_first_entry_or_null(&context->records_list,
537+
struct tls_record_info, list);
538+
if (!info)
539+
return NULL;
540540
record_sn = context->unacked_record_sn;
541541
}
542542

543-
list_for_each_entry_from(info, &context->records_list, list) {
543+
/* We just need the _rcu for the READ_ONCE() */
544+
rcu_read_lock();
545+
list_for_each_entry_from_rcu(info, &context->records_list, list) {
544546
if (before(seq, info->end_seq)) {
545547
if (!context->retransmit_hint ||
546548
after(info->end_seq,
@@ -549,12 +551,15 @@ struct tls_record_info *tls_get_record(struct tls_offload_context_tx *context,
549551
context->retransmit_hint = info;
550552
}
551553
*p_record_sn = record_sn;
552-
return info;
554+
goto exit_rcu_unlock;
553555
}
554556
record_sn++;
555557
}
558+
info = NULL;
556559

557-
return NULL;
560+
exit_rcu_unlock:
561+
rcu_read_unlock();
562+
return info;
558563
}
559564
EXPORT_SYMBOL(tls_get_record);
560565

0 commit comments

Comments
 (0)