From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from kanga.kvack.org (kanga.kvack.org [205.233.56.17]) by smtp.lore.kernel.org (Postfix) with ESMTP id 59EBDC5B552 for ; Fri, 30 May 2025 09:35:40 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id E6F2F6B00BC; Fri, 30 May 2025 05:35:39 -0400 (EDT) Received: by kanga.kvack.org (Postfix, from userid 40) id E1EC96B00CC; Fri, 30 May 2025 05:35:39 -0400 (EDT) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id CBFC46B00CD; Fri, 30 May 2025 05:35:39 -0400 (EDT) X-Delivered-To: linux-mm@kvack.org Received: from relay.hostedemail.com (smtprelay0015.hostedemail.com [216.40.44.15]) by kanga.kvack.org (Postfix) with ESMTP id A98486B00BC for ; Fri, 30 May 2025 05:35:39 -0400 (EDT) Received: from smtpin28.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay07.hostedemail.com (Postfix) with ESMTP id 6A744162B52 for ; Fri, 30 May 2025 09:35:39 +0000 (UTC) X-FDA: 83499066798.28.9348CAA Received: from mail-pg1-f176.google.com (mail-pg1-f176.google.com [209.85.215.176]) by imf15.hostedemail.com (Postfix) with ESMTP id B507EA000F for ; Fri, 30 May 2025 09:35:37 +0000 (UTC) Authentication-Results: imf15.hostedemail.com; dkim=pass header.d=bytedance.com header.s=google header.b=W0VCaMXd; spf=pass (imf15.hostedemail.com: domain of libo.gcs85@bytedance.com designates 209.85.215.176 as permitted sender) smtp.mailfrom=libo.gcs85@bytedance.com; dmarc=pass (policy=quarantine) header.from=bytedance.com ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=hostedemail.com; s=arc-20220608; t=1748597737; h=from:from:sender:reply-to:subject:subject:date:date: message-id:message-id:to:to:cc:cc:mime-version:mime-version: content-type:content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references:dkim-signature; bh=NQYeXWECBZU61mIlblKiCexij9wbxTcb3SJTjEcJrDE=; b=HVIQIpiSibBufuICWSb3uXtdJFZ4SlnoOBFq4pLZlp9OHybFLJnq5lJyEGWQ7SXfYEFKvs ktBLvQ2u5ulN7kqlGpq8GgkxUVA/ibWh3B4clgerK5i4Hy5bInBZc6fQawNrAPavatnxS5 Bd8+gML+1MyWZNz18GMB+YcKj+m8lLg= ARC-Authentication-Results: i=1; imf15.hostedemail.com; dkim=pass header.d=bytedance.com header.s=google header.b=W0VCaMXd; spf=pass (imf15.hostedemail.com: domain of libo.gcs85@bytedance.com designates 209.85.215.176 as permitted sender) smtp.mailfrom=libo.gcs85@bytedance.com; dmarc=pass (policy=quarantine) header.from=bytedance.com ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1748597737; a=rsa-sha256; cv=none; b=ZtzYykHCOoLni4SkWUg7xIzeSgSPV4qpOHAnfzroTQu27gA7BXb0QE6vtmO4HJAZ5xuwph bMyAQruOUXaKoEgHGqVzyqL6opXZmUFNAx0ZPb/BVeA9R9EDWImjmCyYnIvrD+4O0/i1TT 1fJQ9+UCVEtgE5LwvTxJ8Z08p+frhKU= Received: by mail-pg1-f176.google.com with SMTP id 41be03b00d2f7-b2c49373c15so1244066a12.3 for ; Fri, 30 May 2025 02:35:37 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=bytedance.com; s=google; t=1748597736; x=1749202536; darn=kvack.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=NQYeXWECBZU61mIlblKiCexij9wbxTcb3SJTjEcJrDE=; b=W0VCaMXdqcYINJrnviWlkVOLAlF7OJqmD++G4dM4z7dF0fAcNOe5Md39YpBb3ijja9 2AQDjD77wRw7WgXcbTKbr7VLDi3U8FmCXf0Anb8It00cvNc1qK5AQKlBWtKeIK7la06/ tohVzKUD3w0bEVpnrhYWTJeF6KWdOJ5VX+w4NeoHLj70qz5sahi7YjFmgbhB+rSpCvUg j/S6CTs3cRLctSoZjCpYHVQOvbiUmEPV/GfzY7uZ2+8TCVz7mzE5JYlaAPTtYRT1NwFW fVCFsd2GrJKxg5V8W2z7pIV2qczezrtctSGnMgoQJS8Nm0jV9ERs5gj0YfXxPI3xdHMK Jxzg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1748597736; x=1749202536; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=NQYeXWECBZU61mIlblKiCexij9wbxTcb3SJTjEcJrDE=; b=fgDF/wbShVVf+5BmLpRLjabmOtC7j0FCuIERqyISHRY8cS2A4cP8J5nU0ziUQ3HXbp gSnbGUZfAqT/cwzHstRVrSO1vCVL6LlC+nkBiu8czsFtX8eAtebmh81u7Pmiwkd8YZwz nHe7QUfMlP6juZEi/ftp4BU/Toaoy4C7PF+dq9QBopvUyDFee0rbj9Gyz5oxVgiPvQ/Z F6Lw2XEFtHaEOeu6wUwvxZyYEUcPKVcjXLs5vbRmJpQhgdV0Mvt+FTUcjBY8e/i53RIT 8aN3GZ+FcXi4lgNjIsUpa1OH6/oKGNO+4tgLIuEEJ5LUjKUIiLFw9pvHgaPY1GlkVAJz Odzw== X-Forwarded-Encrypted: i=1; AJvYcCV3MQwWJ4Te+U9k3uoDNzRK7IoFs4XQiTVQX7Bz87AzjWyAc49k3qZLWF3Ev4AnAwpzFfL4nXsqMg==@kvack.org X-Gm-Message-State: AOJu0Yxvv6wUl8augIsS3OGfZJnagcBLVAfD1iqfdIW0JrCby6LE5OcD LA33QdqsmumnUrghfRMwu8rtoBKcgVSp63IgkVJfOjDQFeg9C8i5WCxDGasz4HtVtNo= X-Gm-Gg: ASbGncsOqXsQhS9+DCyA5zQ9a8UozydBZ2BZlYq3KskT8EJxy13z8hiQxWyM1HDH0/4 Ktd2Adimb4lPpKau0aruavc1X9bAjPoHLRP64YHPUyfNJGWW14pyQ8lDhyG2/522oFHiAQ3xamZ tQ7XblkXIUjfc13FnDYDpXO8bRv3NnTXtwZvfREXCTJaqZn3XZJcgzh8TVL84NJSxwuodGdNlEj pgUN8aJf3Ni7aNdIewQX/7KTMLfYd4Ut8SKKmEooISZO7apgwvEDNKGpDrsT/4IDDGPKokToVfV 0RoUE7D3DERVZ00ewTebt3ihb4DfDw6XscRJS0RlBz1DZbijxe75IL7MN49sRNBuLj3nnuJX2ya X50GO+3Gs0A== X-Google-Smtp-Source: AGHT+IG6nnxH2FVgtgvPODfS+5ObcESlWEhm+JqnaRiZqSXrOdJI4HZuM5tUxbidkIm+8B4kCWHa5w== X-Received: by 2002:a17:90b:3c49:b0:312:ec:4123 with SMTP id 98e67ed59e1d1-3125036bb61mr2199095a91.13.1748597736482; Fri, 30 May 2025 02:35:36 -0700 (PDT) Received: from FQ627FTG20.bytedance.net ([63.216.146.178]) by smtp.gmail.com with ESMTPSA id 98e67ed59e1d1-3124e29f7b8sm838724a91.2.2025.05.30.02.35.21 (version=TLS1_3 cipher=TLS_CHACHA20_POLY1305_SHA256 bits=256/256); Fri, 30 May 2025 02:35:36 -0700 (PDT) From: Bo Li To: tglx@linutronix.de, mingo@redhat.com, bp@alien8.de, dave.hansen@linux.intel.com, x86@kernel.org, luto@kernel.org, kees@kernel.org, akpm@linux-foundation.org, david@redhat.com, juri.lelli@redhat.com, vincent.guittot@linaro.org, peterz@infradead.org Cc: dietmar.eggemann@arm.com, hpa@zytor.com, acme@kernel.org, namhyung@kernel.org, mark.rutland@arm.com, alexander.shishkin@linux.intel.com, jolsa@kernel.org, irogers@google.com, adrian.hunter@intel.com, kan.liang@linux.intel.com, viro@zeniv.linux.org.uk, brauner@kernel.org, jack@suse.cz, lorenzo.stoakes@oracle.com, Liam.Howlett@oracle.com, vbabka@suse.cz, rppt@kernel.org, surenb@google.com, mhocko@suse.com, rostedt@goodmis.org, bsegall@google.com, mgorman@suse.de, vschneid@redhat.com, jannh@google.com, pfalcato@suse.de, riel@surriel.com, harry.yoo@oracle.com, linux-kernel@vger.kernel.org, linux-perf-users@vger.kernel.org, linux-fsdevel@vger.kernel.org, linux-mm@kvack.org, duanxiongchun@bytedance.com, yinhongbo@bytedance.com, dengliang.1214@bytedance.com, xieyongji@bytedance.com, chaiwen.cc@bytedance.com, songmuchun@bytedance.com, yuanzhu@bytedance.com, chengguozhu@bytedance.com, sunjiadong.lff@bytedance.com, Bo Li Subject: [RFC v2 28/35] RPAL: add rpal_uds_fdmap() support Date: Fri, 30 May 2025 17:27:56 +0800 Message-Id: <7d9d805dcfe80358c06f0a02fadd31a7288500b4.1748594841.git.libo.gcs85@bytedance.com> X-Mailer: git-send-email 2.39.5 (Apple Git-154) In-Reply-To: References: MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Rspam-User: X-Rspamd-Queue-Id: B507EA000F X-Rspamd-Server: rspam09 X-Stat-Signature: mg76phsndwrw65b7bup6jminej691s8h X-HE-Tag: 1748597737-645130 X-HE-Meta: U2FsdGVkX1+S1/Y6/QStWLEkOuuAPn6req14oXF2xTn8svjdmc07pp6VEJZwMITFvENvvIo5XZLNdafjHxMnMggExcnHZP4Ou1r82ofT6A1orPek1P7dOkptB/44KsvXc4pPjBixn0JU7BrcY1mTnjnFNCyYINYKvSAyZphwoNYi6Rkq6mAmGNLfwI/Umpka8YERpy1evvccZiQ8i10V0MPH1PP+vw2FteVLSKz7xN10ujtTQWHMt5ua5tj7vbc+hU1aempQsNgkUIP1FPtek9eklmTsWm7EO41SnU+Uy4kWgxTMHBouLw8G1+aSZuoSMgW5LEVfcKDGOGKzfuy6eh5VIzy6gffWfE/aaEGPQTbTBm2fTwr/s9jkjEABxMlOjB1tIWioM2p/npUkb9Cw/RTZ5emHADTxs4beCAqEAdlw30X3p2vssxMvFjo22s1rd63e/fQu0s5V8CaSrR6FBi4QQWYbrr6TtSdIKrQNikJYIJ5TynvGEBRKEif2SSNvKJo6LYOz7fANG4ziHFkK9Evy1marue8riWqGzDrVRaxbn1yFMzue+tEHRuPndBINUBiajZRrV52DvpQzj/WIZ46EOXKs6Cr2eklhRguqaP3lfvWz2gS9Rw71KatiJ3HXm9ioHGhddadm5yF5MDsCua/XauGKqSdVP7mv0lQkx4fHeuWylORGgRXd753Qx5bII9zlls05OHJnXSWlEEaVmBVjTqLMPF5vEvhE8IBsz6Gw4rVtDNhrvUDTDD1DlT8JCc2ax3bN/h9uxXyLvKztlBI/GEWLsu+3HkSyM4LQoDqS93jKOd6ioYVPtOptH2ekxK1LhpDUeb5k72fCi8f4rt+ndI6LHpacRMEmiq2LgF5Q0Azkwxc3HwKyPuMP3cdsnLnNyreOzj50Fp4HswIsXfqoZh4QFm6a9OCS4eVG6AUvWFqSNgcgMw2/mYk6tdWgkiW1bZ7z5jyIGYxkd1Q NN0l/mOx uxbi0G4csWhbHvMnOidRk7fTcNz9gz/2OofAFZA44zLCN3KcUfadm0lQE3RsB0BqJb+0/c71snEdM7/gs5qJ6kdfeiw== X-Bogosity: Ham, tests=bogofilter, spamicity=0.000000, version=1.2.4 Sender: owner-linux-mm@kvack.org Precedence: bulk X-Loop: owner-majordomo@kvack.org List-ID: List-Subscribe: List-Unsubscribe: For a UDS connection between a sender and a receiver, neither side knows which file descriptor (fd) the other uses to manage the connection. The sender cannot determine which user space fd's buffer in the receiver to write data to, necessitating a complex process for both sides to inform each other of fd mappings. This process incurs significant overhead when managing a large number of connections, which requires optimization. This patch introduces the RPAL_IOCTL_UDS_FDMAP interface, which simplifies the establishment of fd mappings between sender and receiver processes for files monitored by epoll. This avoids the need for a complex setup process each time a new connection is created. Signed-off-by: Bo Li --- arch/x86/rpal/internal.h | 3 + arch/x86/rpal/proc.c | 117 +++++++++++++++++++++++++++++++++++++++ fs/eventpoll.c | 19 +++++++ include/linux/rpal.h | 11 ++++ 4 files changed, 150 insertions(+) diff --git a/arch/x86/rpal/internal.h b/arch/x86/rpal/internal.h index e49febce8645..e03f8a90619d 100644 --- a/arch/x86/rpal/internal.h +++ b/arch/x86/rpal/internal.h @@ -11,6 +11,7 @@ #include #include +#include extern bool rpal_inited; @@ -60,3 +61,5 @@ int rpal_alloc_pkey(struct rpal_service *rs, int pkey); int rpal_pkey_setup(struct rpal_service *rs, int pkey); void rpal_set_current_pkru(u32 val, int mode); void rpal_service_pku_init(void); + +extern struct sock *unix_peer_get(struct sock *sk); diff --git a/arch/x86/rpal/proc.c b/arch/x86/rpal/proc.c index 2f9cceec4992..b60c099c4a92 100644 --- a/arch/x86/rpal/proc.c +++ b/arch/x86/rpal/proc.c @@ -9,6 +9,8 @@ #include #include #include +#include +#include #include "internal.h" @@ -34,6 +36,118 @@ static int rpal_get_api_version_and_cap(void __user *p) return 0; } +static void *rpal_uds_peer_data(struct sock *psk, int *pfd) +{ + void *ep = NULL; + unsigned long flags; + struct socket_wq *wq; + wait_queue_entry_t *entry; + wait_queue_head_t *whead; + + rcu_read_lock(); + wq = rcu_dereference(psk->sk_wq); + if (!skwq_has_sleeper(wq)) + goto unlock_rcu; + + whead = &wq->wait; + + spin_lock_irqsave(&whead->lock, flags); + if (list_empty(&whead->head)) { + pr_debug("rpal debug: [%d] cannot find epitem entry\n", + current->pid); + goto unlock_spin; + } + entry = list_first_entry(&whead->head, wait_queue_entry_t, entry); + *pfd = rpal_get_epitemfd(entry); + if (*pfd < 0) { + pr_debug("rpal debug: [%d] cannot find epitem fd\n", + current->pid); + goto unlock_spin; + } + ep = rpal_get_epitemep(entry); + +unlock_spin: + spin_unlock_irqrestore(&whead->lock, flags); +unlock_rcu: + rcu_read_unlock(); + return ep; +} + +static int rpal_find_receiver_rid(int id, void *ep) +{ + struct task_struct *tsk; + struct rpal_service *cur, *tgt; + int rid = -1; + + cur = rpal_current_service(); + + tgt = rpal_get_mapped_service_by_id(cur, id); + if (tgt == NULL) + goto out; + + for_each_thread(tgt->group_leader, tsk) { + if (!rpal_test_task_thread_flag(tsk, RPAL_RECEIVER_BIT)) + continue; + if (tsk->rpal_rd->ep == ep) { + rid = tsk->rpal_rd->rcc->receiver_id; + break; + } + } + + rpal_put_service(tgt); +out: + return rid; +} + +static long rpal_uds_fdmap(unsigned long uarg) +{ + struct rpal_uds_fdmap_arg arg; + struct socket *sock; + struct sock *peer_sk; + void *ep; + int sfd, rid; + struct fd f; + long res; + int ret; + + ret = copy_from_user(&arg, (void __user *)uarg, sizeof(arg)); + if (ret) + return ret; + + f = fdget(arg.cfd); + if (!fd_file(f)) + goto fd_put; + + sock = sock_from_file(fd_file(f)); + if (!sock) + goto fd_put; + + peer_sk = unix_peer_get(sock->sk); + if (peer_sk == NULL) + goto fd_put; + ep = rpal_uds_peer_data(peer_sk, &sfd); + if (ep == NULL) { + pr_debug("rpal debug: [%d] cannot find epitem ep\n", + current->pid); + goto peer_sock_put; + } + rid = rpal_find_receiver_rid(arg.service_id, ep); + if (rid < 0) { + pr_debug("rpal debug: [%d] rpal: cannot find epitem rid\n", + current->pid); + goto peer_sock_put; + } + res = (long)rid << 32 | (long)sfd; + ret = put_user(res, arg.res); + +peer_sock_put: + sock_put(peer_sk); +fd_put: + if (fd_file(f)) + fdput(f); + return ret; +} + static long rpal_ioctl(struct file *file, unsigned int cmd, unsigned long arg) { struct rpal_service *cur = rpal_current_service(); @@ -81,6 +195,9 @@ static long rpal_ioctl(struct file *file, unsigned int cmd, unsigned long arg) ret = put_user(cur->pkey, (int __user *)arg); break; #endif + case RPAL_IOCTL_UDS_FDMAP: + ret = rpal_uds_fdmap(arg); + break; default: return -EINVAL; } diff --git a/fs/eventpoll.c b/fs/eventpoll.c index 437cd5764c03..791321639561 100644 --- a/fs/eventpoll.c +++ b/fs/eventpoll.c @@ -2143,6 +2143,25 @@ static int ep_poll(struct eventpoll *ep, struct epoll_event __user *events, } #ifdef CONFIG_RPAL +void *rpal_get_epitemep(wait_queue_entry_t *wait) +{ + struct epitem *epi = ep_item_from_wait(wait); + + if (!epi) + return NULL; + + return epi->ep; +} + +int rpal_get_epitemfd(wait_queue_entry_t *wait) +{ + struct epitem *epi = ep_item_from_wait(wait); + + if (!epi) + return -1; + + return epi->ffd.fd; +} void rpal_resume_ep(struct task_struct *tsk) { diff --git a/include/linux/rpal.h b/include/linux/rpal.h index 5912ffec6e28..7657e6c6393b 100644 --- a/include/linux/rpal.h +++ b/include/linux/rpal.h @@ -350,6 +350,12 @@ struct rpal_sender_data { struct task_struct *receiver; }; +struct rpal_uds_fdmap_arg { + int service_id; + int cfd; + unsigned long *res; +}; + enum rpal_command_type { RPAL_CMD_GET_API_VERSION_AND_CAP, RPAL_CMD_GET_SERVICE_KEY, @@ -363,6 +369,7 @@ enum rpal_command_type { RPAL_CMD_REQUEST_SERVICE, RPAL_CMD_RELEASE_SERVICE, RPAL_CMD_GET_SERVICE_PKEY, + RPAL_CMD_UDS_FDMAP, RPAL_NR_CMD, }; @@ -393,6 +400,8 @@ enum rpal_command_type { _IOWR(RPAL_IOCTL_MAGIC, RPAL_CMD_RELEASE_SERVICE, unsigned long) #define RPAL_IOCTL_GET_SERVICE_PKEY \ _IOWR(RPAL_IOCTL_MAGIC, RPAL_CMD_GET_SERVICE_PKEY, int *) +#define RPAL_IOCTL_UDS_FDMAP \ + _IOWR(RPAL_IOCTL_MAGIC, RPAL_CMD_UDS_FDMAP, unsigned long) #define rpal_for_each_requested_service(rs, idx) \ for (idx = find_first_bit(rs->requested_service_bitmap, RPAL_NR_ID); \ @@ -594,5 +603,7 @@ int rpal_ep_autoremove_wake_function(wait_queue_entry_t *curr, unsigned int mode, int wake_flags, void *key); void rpal_resume_ep(struct task_struct *tsk); +void *rpal_get_epitemep(wait_queue_entry_t *wait); +int rpal_get_epitemfd(wait_queue_entry_t *wait); int rpal_try_send_events(void *ep, struct rpal_receiver_call_context *rcc); #endif -- 2.20.1