From patchwork Fri Jan 12 18:10:21 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: John Fastabend X-Patchwork-Id: 860136 X-Patchwork-Delegate: bpf@iogearbox.net Return-Path: X-Original-To: patchwork-incoming@ozlabs.org Delivered-To: patchwork-incoming@ozlabs.org Authentication-Results: ozlabs.org; spf=none (mailfrom) smtp.mailfrom=vger.kernel.org (client-ip=209.132.180.67; helo=vger.kernel.org; envelope-from=netdev-owner@vger.kernel.org; receiver=) Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.b="Fr2VfVWo"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 3zJ9lf3m1Qz9sNc for ; Sat, 13 Jan 2018 05:10:38 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S965031AbeALSKf (ORCPT ); Fri, 12 Jan 2018 13:10:35 -0500 Received: from mail-pg0-f65.google.com ([74.125.83.65]:45697 "EHLO mail-pg0-f65.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S965141AbeALSKd (ORCPT ); Fri, 12 Jan 2018 13:10:33 -0500 Received: by mail-pg0-f65.google.com with SMTP id c194so5026122pga.12 for ; Fri, 12 Jan 2018 10:10:32 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=subject:from:to:cc:date:message-id:in-reply-to:references :user-agent:mime-version:content-transfer-encoding; bh=Pwwt4wGSD3OsDUF12TTwK95aOzKHSqgfJPiy+FIb9Bo=; b=Fr2VfVWoYenfiRFBjUKETJLVCwgYCsWEHK62qJB0siFO2T3G9uwGGdgimcBCcmFXqq hSTULKspKARrpQ4x7u8kRMqtc9D2MykqZOcjTCvqQsG1/IpGJvJoClSoX9Db0uZx7zGT WiaeE6IKcSbsGcWzH68xDLYVk9YNBGZc7gQaz0vhh1vsB1hsZkRML9oM8NvS4vC5iu4y v+cTd0nxPQnsLYa+wgb6OHu+x46Mh88VIjhQitQOnFOh7DA8wGiok8HjGE6oPdExIZ8+ JWiBhQ89ijOVIMOYyLbWJrxukQxMPEdez0YaUavi5gp+/U5Px3hkRrRvu4VTuxJQ7yJt BpWw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:subject:from:to:cc:date:message-id:in-reply-to :references:user-agent:mime-version:content-transfer-encoding; bh=Pwwt4wGSD3OsDUF12TTwK95aOzKHSqgfJPiy+FIb9Bo=; b=aYs7eBT2cfxxu7JIOVVlNpTrfz1f1zh8+/2n7YPTIF7WaevOqrw+4MpoeoPv8lqfWK 9G0c2VDpWut3s3v2qG0+aAf2UI251G5aVJIcyLHSJCg7S5TZeHTrw3eWdfIIPB2IcA9+ d8uatgHEBqUTJ0aXgxvXBFDGdWk2sTjt12QJVLx9YmRrPPaHGT6nekPxp29WEQXuoDHz /6EL9AxlTMuTpt96MWw1MBuCfIAKakghf9iZe0tYPDappzVi4MRNXB49YzB40SL7ZxK/ XPUdrIDJObhrLmjnWRxLjnh4Cgt2241VBOv8y67SbByI4LoLTyMZ51Vfdw1ztADeDN/t VzdQ== X-Gm-Message-State: AKwxytdN5Xgx+VdNKkZ1tG958QYZeZzbYS2lsSRmm2m1GgICKTpQZi9y tmaPmmZYX6MpRrxuB8soMxq1rw== X-Google-Smtp-Source: ACJfBos4OzrJjrqxLixzfLiQ8iMaDOV3/mBlmYabnupNLGagmHo/8K+rdd2fyUesyNW+Gurz2JchrA== X-Received: by 10.159.230.14 with SMTP id u14mr6694874plq.35.1515780632288; Fri, 12 Jan 2018 10:10:32 -0800 (PST) Received: from [127.0.1.1] ([75.106.27.153]) by smtp.gmail.com with ESMTPSA id n6sm47190613pfg.188.2018.01.12.10.10.26 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Fri, 12 Jan 2018 10:10:31 -0800 (PST) Subject: [bpf-next PATCH 2/7] sock: make static tls function alloc_sg generic sock helper From: John Fastabend To: borkmann@iogearbox.net, john.fastabend@gmail.com, ast@kernel.org Cc: netdev@vger.kernel.org, kafai@fb.com Date: Fri, 12 Jan 2018 10:10:21 -0800 Message-ID: <20180112181021.21531.64552.stgit@john-Precision-Tower-5810> In-Reply-To: <20180112175029.21531.54693.stgit@john-Precision-Tower-5810> References: <20180112175029.21531.54693.stgit@john-Precision-Tower-5810> User-Agent: StGit/0.17.1-dirty MIME-Version: 1.0 Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org The TLS ULP module builds scatterlists from a sock using page_frag_refill(). This is going to be useful for other ULPs so move it into sock file for more general use. In the process remove useless goto at end of while loop. Signed-off-by: John Fastabend --- include/net/sock.h | 4 +++ net/core/sock.c | 56 ++++++++++++++++++++++++++++++++++++++++++ net/tls/tls_sw.c | 69 +++++----------------------------------------------- 3 files changed, 67 insertions(+), 62 deletions(-) diff --git a/include/net/sock.h b/include/net/sock.h index 66fd395..2808343 100644 --- a/include/net/sock.h +++ b/include/net/sock.h @@ -2148,6 +2148,10 @@ static inline struct page_frag *sk_page_frag(struct sock *sk) bool sk_page_frag_refill(struct sock *sk, struct page_frag *pfrag); +int sk_alloc_sg(struct sock *sk, int len, struct scatterlist *sg, + int *sg_num_elem, unsigned int *sg_size, + int first_coalesce); + /* * Default write policy as shown to user space via poll/select/SIGIO */ diff --git a/net/core/sock.c b/net/core/sock.c index 72d14b2..e84c03f 100644 --- a/net/core/sock.c +++ b/net/core/sock.c @@ -2237,6 +2237,62 @@ bool sk_page_frag_refill(struct sock *sk, struct page_frag *pfrag) } EXPORT_SYMBOL(sk_page_frag_refill); +int sk_alloc_sg(struct sock *sk, int len, struct scatterlist *sg, + int *sg_num_elem, unsigned int *sg_size, + int first_coalesce) +{ + struct page_frag *pfrag; + unsigned int size = *sg_size; + int num_elem = *sg_num_elem, use = 0, rc = 0; + struct scatterlist *sge; + unsigned int orig_offset; + + len -= size; + pfrag = sk_page_frag(sk); + + while (len > 0) { + if (!sk_page_frag_refill(sk, pfrag)) { + rc = -ENOMEM; + goto out; + } + + use = min_t(int, len, pfrag->size - pfrag->offset); + + if (!sk_wmem_schedule(sk, use)) { + rc = -ENOMEM; + goto out; + } + + sk_mem_charge(sk, use); + size += use; + orig_offset = pfrag->offset; + pfrag->offset += use; + + sge = sg + num_elem - 1; + if (num_elem > first_coalesce && sg_page(sg) == pfrag->page && + sg->offset + sg->length == orig_offset) { + sg->length += use; + } else { + sge++; + sg_unmark_end(sge); + sg_set_page(sge, pfrag->page, use, orig_offset); + get_page(pfrag->page); + ++num_elem; + if (num_elem == MAX_SKB_FRAGS) { + rc = -ENOSPC; + break; + } + } + + len -= use; + } +out: + *sg_size = size; + *sg_num_elem = num_elem; + return rc; +} +EXPORT_SYMBOL(sk_alloc_sg); + static void __lock_sock(struct sock *sk) __releases(&sk->sk_lock.slock) __acquires(&sk->sk_lock.slock) diff --git a/net/tls/tls_sw.c b/net/tls/tls_sw.c index 73d1921..dabdd1a 100644 --- a/net/tls/tls_sw.c +++ b/net/tls/tls_sw.c @@ -87,71 +87,16 @@ static void trim_both_sgl(struct sock *sk, int target_size) target_size); } -static int alloc_sg(struct sock *sk, int len, struct scatterlist *sg, - int *sg_num_elem, unsigned int *sg_size, - int first_coalesce) -{ - struct page_frag *pfrag; - unsigned int size = *sg_size; - int num_elem = *sg_num_elem, use = 0, rc = 0; - struct scatterlist *sge; - unsigned int orig_offset; - - len -= size; - pfrag = sk_page_frag(sk); - - while (len > 0) { - if (!sk_page_frag_refill(sk, pfrag)) { - rc = -ENOMEM; - goto out; - } - - use = min_t(int, len, pfrag->size - pfrag->offset); - - if (!sk_wmem_schedule(sk, use)) { - rc = -ENOMEM; - goto out; - } - - sk_mem_charge(sk, use); - size += use; - orig_offset = pfrag->offset; - pfrag->offset += use; - - sge = sg + num_elem - 1; - if (num_elem > first_coalesce && sg_page(sg) == pfrag->page && - sg->offset + sg->length == orig_offset) { - sg->length += use; - } else { - sge++; - sg_unmark_end(sge); - sg_set_page(sge, pfrag->page, use, orig_offset); - get_page(pfrag->page); - ++num_elem; - if (num_elem == MAX_SKB_FRAGS) { - rc = -ENOSPC; - break; - } - } - - len -= use; - } - goto out; - -out: - *sg_size = size; - *sg_num_elem = num_elem; - return rc; -} - static int alloc_encrypted_sg(struct sock *sk, int len) { struct tls_context *tls_ctx = tls_get_ctx(sk); struct tls_sw_context *ctx = tls_sw_ctx(tls_ctx); int rc = 0; - rc = alloc_sg(sk, len, ctx->sg_encrypted_data, - &ctx->sg_encrypted_num_elem, &ctx->sg_encrypted_size, 0); + rc = sk_alloc_sg(sk, len, + ctx->sg_encrypted_data, + &ctx->sg_encrypted_num_elem, + &ctx->sg_encrypted_size, 0); return rc; } @@ -162,9 +107,9 @@ static int alloc_plaintext_sg(struct sock *sk, int len) struct tls_sw_context *ctx = tls_sw_ctx(tls_ctx); int rc = 0; - rc = alloc_sg(sk, len, ctx->sg_plaintext_data, - &ctx->sg_plaintext_num_elem, &ctx->sg_plaintext_size, - tls_ctx->pending_open_record_frags); + rc = sk_alloc_sg(sk, len, ctx->sg_plaintext_data, + &ctx->sg_plaintext_num_elem, &ctx->sg_plaintext_size, + tls_ctx->pending_open_record_frags); return rc; }