From patchwork Sat Nov 23 21:27:08 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jens Axboe X-Patchwork-Id: 1199892 X-Patchwork-Delegate: davem@davemloft.net Return-Path: X-Original-To: patchwork-incoming-netdev@ozlabs.org Delivered-To: patchwork-incoming-netdev@ozlabs.org Authentication-Results: ozlabs.org; spf=none (no SPF record) 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; dmarc=none (p=none dis=none) header.from=kernel.dk Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=kernel-dk.20150623.gappssmtp.com header.i=@kernel-dk.20150623.gappssmtp.com header.b="qvSp40fg"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 47L5wx6c0xz9sQy for ; Sun, 24 Nov 2019 08:27:29 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726855AbfKWV1U (ORCPT ); Sat, 23 Nov 2019 16:27:20 -0500 Received: from mail-pf1-f196.google.com ([209.85.210.196]:37910 "EHLO mail-pf1-f196.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726638AbfKWV1T (ORCPT ); Sat, 23 Nov 2019 16:27:19 -0500 Received: by mail-pf1-f196.google.com with SMTP id c13so5362038pfp.5 for ; Sat, 23 Nov 2019 13:27:17 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=kernel-dk.20150623.gappssmtp.com; s=20150623; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=eEz7AMlwqDoL6jAB3xCVkhaNYVXFYiywy/S2Pwpt2PA=; b=qvSp40fg2GtdQRIczP8CXEHeV3UoDaSqzzHNN80SSalENRawsAygzyKDjo65BJRxhw NkNoFooC+OnOOJeoUnYM6oygDWijDm3EYOVnkywUGoXMUa6VSpCvWkClaGQ+C9UU16I2 s+YJsP5/EBfc5ox7gUOzLIomBl+qGJAh/Wxrhk5yLAFf1cRjDVWvVpGgP4L+C95MzZzB Qx41U90qBnXRqRK1KZ5q+nTSs8QT8oTSksd473zCyy6Q1lhAdjEPS1c1WOq/ZEP5mhqm JBSafFuHan9uekunwPBduZS6JkQp2EhlKwqccBymI7fLNA2gEIP+E47Sjupq666Qkp5N vGjw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=eEz7AMlwqDoL6jAB3xCVkhaNYVXFYiywy/S2Pwpt2PA=; b=qmzxqx5XTWKT+fu8QM6yVGSU79gzStjQCfP2RcfXzyV9lKxjzCMYU8koPtm6JfmveM Iy4vNy2hNt0sl046rkC+k85dbPy2p6DDtX8DAdqjUV6HhihR0TwrEFd+/U6iTTgait5E Ykf2aR9IS8/ZfA0mWapQ6P7pTd7RJaQOEKVUMFxiZ5Vi21cERNfnHEmdps5CkQWRLw1i F9nf8JHycfPvMZ3P7rSpqoNja/TxsbUTptYosqI2LgM2dKnGQFyFES1TMJ4ehaGPumb7 qEM6S5SNl85g4TpuAITjE5ltIMlvEQ3NTelaNkI6OjgkyE69g0awVDhnFYAN+DBoUhRD lZkg== X-Gm-Message-State: APjAAAVwsHPbVmMqOrKTztNr4o3X0w57vnujjxgWBmhWkGPLxHQQrSvn ApXudF7X/Vh/LdafBNYrV7sn2w== X-Google-Smtp-Source: APXvYqzVral3dEv0D0w23VHOLRDe7pvWj83vhSZkJKj7zIxTQXeni1tVes/uqLddfnbXR1NVoTrnag== X-Received: by 2002:a63:115c:: with SMTP id 28mr23368009pgr.6.1574544437246; Sat, 23 Nov 2019 13:27:17 -0800 (PST) Received: from x1.thefacebook.com ([66.219.217.79]) by smtp.gmail.com with ESMTPSA id gx16sm2981169pjb.10.2019.11.23.13.27.15 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 23 Nov 2019 13:27:16 -0800 (PST) From: Jens Axboe To: io-uring@vger.kernel.org Cc: davem@davemloft.net, netdev@vger.kernel.org, Jens Axboe Subject: [PATCH 1/2] net: add __sys_connect_file() helper Date: Sat, 23 Nov 2019 14:27:08 -0700 Message-Id: <20191123212709.4598-2-axboe@kernel.dk> X-Mailer: git-send-email 2.24.0 In-Reply-To: <20191123212709.4598-1-axboe@kernel.dk> References: <20191123212709.4598-1-axboe@kernel.dk> MIME-Version: 1.0 Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org This is identical to __sys_connect(), except it takes a struct file instead of an fd, and it also allows passing in extra file->f_flags flags. The latter is done to support masking in O_NONBLOCK without manipulating the original file flags. No functional changes in this patch. Cc: netdev@vger.kernel.org Cc: David S. Miller Signed-off-by: Jens Axboe --- include/linux/socket.h | 3 +++ net/socket.c | 30 ++++++++++++++++++++++-------- 2 files changed, 25 insertions(+), 8 deletions(-) diff --git a/include/linux/socket.h b/include/linux/socket.h index dd061f741bc1..868b906f1840 100644 --- a/include/linux/socket.h +++ b/include/linux/socket.h @@ -399,6 +399,9 @@ extern int __sys_accept4(int fd, struct sockaddr __user *upeer_sockaddr, int __user *upeer_addrlen, int flags); extern int __sys_socket(int family, int type, int protocol); extern int __sys_bind(int fd, struct sockaddr __user *umyaddr, int addrlen); +extern int __sys_connect_file(struct file *file, + struct sockaddr __user *uservaddr, int addrlen, + int file_flags); extern int __sys_connect(int fd, struct sockaddr __user *uservaddr, int addrlen); extern int __sys_listen(int fd, int backlog); diff --git a/net/socket.c b/net/socket.c index 40ab39f6c5d8..96e44b55d3d3 100644 --- a/net/socket.c +++ b/net/socket.c @@ -1824,32 +1824,46 @@ SYSCALL_DEFINE3(accept, int, fd, struct sockaddr __user *, upeer_sockaddr, * include the -EINPROGRESS status for such sockets. */ -int __sys_connect(int fd, struct sockaddr __user *uservaddr, int addrlen) +int __sys_connect_file(struct file *file, struct sockaddr __user *uservaddr, + int addrlen, int file_flags) { struct socket *sock; struct sockaddr_storage address; - int err, fput_needed; + int err; - sock = sockfd_lookup_light(fd, &err, &fput_needed); + sock = sock_from_file(file, &err); if (!sock) goto out; err = move_addr_to_kernel(uservaddr, addrlen, &address); if (err < 0) - goto out_put; + goto out; err = security_socket_connect(sock, (struct sockaddr *)&address, addrlen); if (err) - goto out_put; + goto out; err = sock->ops->connect(sock, (struct sockaddr *)&address, addrlen, - sock->file->f_flags); -out_put: - fput_light(sock->file, fput_needed); + sock->file->f_flags | file_flags); out: return err; } +int __sys_connect(int fd, struct sockaddr __user *uservaddr, int addrlen) +{ + int ret = -EBADF; + struct fd f; + + f = fdget(fd); + if (f.file) { + ret = __sys_connect_file(f.file, uservaddr, addrlen, 0); + if (f.flags) + fput(f.file); + } + + return ret; +} + SYSCALL_DEFINE3(connect, int, fd, struct sockaddr __user *, uservaddr, int, addrlen) { From patchwork Sat Nov 23 21:27:09 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jens Axboe X-Patchwork-Id: 1199893 X-Patchwork-Delegate: davem@davemloft.net Return-Path: X-Original-To: patchwork-incoming-netdev@ozlabs.org Delivered-To: patchwork-incoming-netdev@ozlabs.org Authentication-Results: ozlabs.org; spf=none (no SPF record) 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; dmarc=none (p=none dis=none) header.from=kernel.dk Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=kernel-dk.20150623.gappssmtp.com header.i=@kernel-dk.20150623.gappssmtp.com header.b="yU1tw9us"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 47L5wy3J1fz9sR1 for ; Sun, 24 Nov 2019 08:27:30 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726920AbfKWV1V (ORCPT ); Sat, 23 Nov 2019 16:27:21 -0500 Received: from mail-pg1-f193.google.com ([209.85.215.193]:39419 "EHLO mail-pg1-f193.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726638AbfKWV1V (ORCPT ); Sat, 23 Nov 2019 16:27:21 -0500 Received: by mail-pg1-f193.google.com with SMTP id b137so2847667pga.6 for ; Sat, 23 Nov 2019 13:27:19 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=kernel-dk.20150623.gappssmtp.com; s=20150623; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=UR0UVLJ/IUMWn5l60pc0zwFWn8/sSH1s224oij3hpAM=; b=yU1tw9usSS8pHAUxiyMghvfPl9agwLDQlGDGDrZUcnwFlxNbugiJLyFne8oc8OA++R toBQmjX4ZkL8k/TNT6DfFyGIW71oAVMEHy7zIC/KuPxxWP7p49dFpxSFRqLgV2MFLbCH ugZo05HKbJQJdTRNk0ebtbj4dbnVetxGYu9M+c3mIXgcZchd+i6oQc0b0OA8JUVRa4Tm /hhSVcn4z7YzH/NwbI3M1Ai7CoF7IRFVfQJESSZEao+D9TYNKdeTeFs8Pb0vuCiHo8pz AxPBK7i/4G08ndlcc67b3qESSGRDXqsJSvXQzoC5oh4hcGPP1FmDGcfwx8NjJDqloyCp 61sg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=UR0UVLJ/IUMWn5l60pc0zwFWn8/sSH1s224oij3hpAM=; b=fnbDTUiSbFZ/Td9vVLB8lbrRPST3qITxLV94og1j7ihTzJrh7mAx9hEdj5mwGhnwoz /mlLrSet9sjVv6RD5Vffm3ZWHMBx5iAow6jm6tUkLr62WrFoYz6UmUe3jSE03UPg4EEt sDc+fjh9akxQB+ZA9ApjV3sT0Z+QzKBMlxFydaNOecejg35dARvjW6vlK49ktnZANKrh n/RmPvfPHxeswEm3NxJU40MguCyJXCQV0eoF5OCHz7pU7zjMjjIgGcezIXk/FYnk3r0K bd5QCZ0kfqC5tRMnsr5sRiyQC4CpmKUGORC9CyXIhjp7B6RW5kWoQhChqb1GwwOspdeL z42A== X-Gm-Message-State: APjAAAVJLMAYJxsMg1fXZzQZxU1/jq/R1uYhfFokygOdkApbbl23Sekl w6QUzBff9saXo8Wclm2UjWnjfQ== X-Google-Smtp-Source: APXvYqxQHtPuijF5lw+QxGLslaUuwSbemBzgSxJB9ARi0Tx6pdmy2IK2/xaCyymVvoZ+wzDNdBxnNw== X-Received: by 2002:a65:520d:: with SMTP id o13mr9352862pgp.433.1574544439102; Sat, 23 Nov 2019 13:27:19 -0800 (PST) Received: from x1.thefacebook.com ([66.219.217.79]) by smtp.gmail.com with ESMTPSA id gx16sm2981169pjb.10.2019.11.23.13.27.17 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 23 Nov 2019 13:27:18 -0800 (PST) From: Jens Axboe To: io-uring@vger.kernel.org Cc: davem@davemloft.net, netdev@vger.kernel.org, Jens Axboe Subject: [PATCH 2/2] io_uring: add support for IORING_OP_CONNECT Date: Sat, 23 Nov 2019 14:27:09 -0700 Message-Id: <20191123212709.4598-3-axboe@kernel.dk> X-Mailer: git-send-email 2.24.0 In-Reply-To: <20191123212709.4598-1-axboe@kernel.dk> References: <20191123212709.4598-1-axboe@kernel.dk> MIME-Version: 1.0 Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org This allows an application to call connect() in an async fashion. Like other opcodes, we first try a non-blocking accept, then punt to async context if we have to. Signed-off-by: Jens Axboe --- fs/io_uring.c | 37 +++++++++++++++++++++++++++++++++++ include/uapi/linux/io_uring.h | 1 + 2 files changed, 38 insertions(+) diff --git a/fs/io_uring.c b/fs/io_uring.c index 0c66cd6ed0b0..5ceec1a4faad 100644 --- a/fs/io_uring.c +++ b/fs/io_uring.c @@ -1968,6 +1968,40 @@ static int io_accept(struct io_kiocb *req, const struct io_uring_sqe *sqe, #endif } +static int io_connect(struct io_kiocb *req, const struct io_uring_sqe *sqe, + struct io_kiocb **nxt, bool force_nonblock) +{ +#if defined(CONFIG_NET) + struct sockaddr __user *addr; + unsigned file_flags; + int addr_len, ret; + + if (unlikely(req->ctx->flags & (IORING_SETUP_IOPOLL|IORING_SETUP_SQPOLL))) + return -EINVAL; + if (sqe->ioprio || sqe->off || sqe->len || sqe->buf_index || sqe->flags) + return -EINVAL; + + addr = (struct sockaddr __user *) (unsigned long) READ_ONCE(sqe->addr); + addr_len = READ_ONCE(sqe->addr2); + file_flags = force_nonblock ? O_NONBLOCK : 0; + + ret = __sys_connect_file(req->file, addr, addr_len, file_flags); + if ((ret == -EAGAIN || ret == -EINPROGRESS) && force_nonblock) { + req->work.flags |= IO_WQ_WORK_NEEDS_FILES; + return -EAGAIN; + } + if (ret == -ERESTARTSYS) + ret = -EINTR; + if (ret < 0 && (req->flags & REQ_F_LINK)) + req->flags |= REQ_F_FAIL_LINK; + io_cqring_add_event(req, ret); + io_put_req_find_next(req, nxt); + return 0; +#else + return -EOPNOTSUPP; +#endif +} + static inline void io_poll_remove_req(struct io_kiocb *req) { if (!RB_EMPTY_NODE(&req->rb_node)) { @@ -2622,6 +2656,9 @@ static int io_issue_sqe(struct io_kiocb *req, struct io_kiocb **nxt, case IORING_OP_ACCEPT: ret = io_accept(req, s->sqe, nxt, force_nonblock); break; + case IORING_OP_CONNECT: + ret = io_connect(req, s->sqe, nxt, force_nonblock); + break; case IORING_OP_ASYNC_CANCEL: ret = io_async_cancel(req, s->sqe, nxt); break; diff --git a/include/uapi/linux/io_uring.h b/include/uapi/linux/io_uring.h index 2a1569211d87..4637ed1d9949 100644 --- a/include/uapi/linux/io_uring.h +++ b/include/uapi/linux/io_uring.h @@ -73,6 +73,7 @@ struct io_uring_sqe { #define IORING_OP_ACCEPT 13 #define IORING_OP_ASYNC_CANCEL 14 #define IORING_OP_LINK_TIMEOUT 15 +#define IORING_OP_CONNECT 16 /* * sqe->fsync_flags