 +
 +#include <linux/linkage.h>
 +
-+.data
++.section .rodata.cst16.ANMASK, "aM", @progbits, 16
 +.align 16
-+
 +ANMASK:	.octa 0x0000000003ffffff0000000003ffffff
++.section .rodata.cst16.ORMASK, "aM", @progbits, 16
++.align 16
 +ORMASK:	.octa 0x00000000010000000000000001000000
 +
 +.text

+void packet_send_queue(struct wireguard_peer *peer)
+{
+	struct sk_buff_head queue;
+	unsigned long flags;
+
+	peer->need_resend_queue = false;
+
+	/* Steal the current queue into our local one. */
+	skb_queue_head_init(&queue);
+	spin_lock_irqsave(&peer->tx_packet_queue.lock, flags);
+	skb_queue_splice_init(&peer->tx_packet_queue, &queue);
+	spin_unlock_irqrestore(&peer->tx_packet_queue.lock, flags);
+
+	if (unlikely(!skb_queue_len(&queue)))
+		return;
+
+	/* We submit it for encryption and sending. */
+	switch (packet_create_data(&queue, peer, message_create_data_done)) {
+	case 0:
+		break;
+	case -EBUSY:

+	memzero_explicit(block, BLAKE2S_BLOCKBYTES);
+}
+
+#ifdef CONFIG_X86_64
+#include <asm/cpufeature.h>
+#include <asm/processor.h>
+#include <asm/fpu/api.h>
+#include <asm/simd.h>
+static bool blake2s_use_avx __read_mostly = false;
+void __init blake2s_fpu_init(void)
+{
+	blake2s_use_avx = boot_cpu_has(X86_FEATURE_AVX);
+}
+asmlinkage void blake2s_compress_avx(struct blake2s_state *state, const u8 block[BLAKE2S_BLOCKBYTES]);
+#else
+void __init blake2s_fpu_init(void) { }
+#endif
+
+static inline void blake2s_compress(struct blake2s_state *state, const u8 block[BLAKE2S_BLOCKBYTES])
+{
+	u32 m[16];
+	u32 v[16];
+	int i;
+
+#ifdef CONFIG_X86_64
+	if (blake2s_use_avx && irq_fpu_usable()) {
+		kernel_fpu_begin();
+		blake2s_compress_avx(state, block);
+		kernel_fpu_end();
+		return;
+	}
+#endif
+
+	for (i = 0; i < 16; ++i)
+		m[i] = le32_to_cpuvp(block + i * sizeof(m[i]));
