From nobody Fri Oct 2 03:47:13 2026 Received: from mail-ej1-f42.google.com (mail-ej1-f42.google.com [209.85.218.42]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id B73FE42D76C for ; Wed, 5 Aug 2026 11:13:56 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.218.42 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1785928438; cv=none; b=ImY4BqJZJL5sFg+aXjW4xo/NOr1uWuMy0F6Ndkxkp8BAXYIP3BW5cBDbUSlUDXkCPnA5FIr9zGi4ry1JbOLmr4FiB3UVoVgsHthCS1+a+zZ0tXbP28uDo1MGMRNtYOcDjueChkyEQ0mOeBKz4jEFpEfNao3TQkXmQd/JtFYovfo= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1785928438; c=relaxed/simple; bh=vFw3z/0ga7sdQjaC0XyqfiOT1pcWYRGLUTotaySJ1yo=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References; b=gVn+nJg2LZ/ACF34WvTthIOwjFmlAcpzaSZzRlZE2gWPwaDmyOa14kVOaYNa9F7s2gqfmDmL/r9kro+C+j835fR7tX5/tEvQ9x4IbvoiZfCMWFAg6V6LTF08rsIgHXhXihjJGBXSA/0uCH3gSePop6K4JaqVYAX6a++tjLP0ugo= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=bbhTZm9J; arc=none smtp.client-ip=209.85.218.42 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="bbhTZm9J" Received: by mail-ej1-f42.google.com with SMTP id a640c23a62f3a-c15cd3fd760so103773866b.2 for ; Wed, 05 Aug 2026 04:13:56 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1785928435; x=1786533235; darn=vger.kernel.org; h=references:in-reply-to:message-id:date:subject:cc:to:from:from:to :cc:subject:date:message-id:reply-to:content-type; bh=xQRw7gsO2UeKw/N04jyZ2vRCrKCyzvuIcQFmZJeWnLc=; b=bbhTZm9JJGN1hq/kn8a0dXjAjAChfmqGs/82ek3IgU+GjunyIYer3HgieNPuYudP4u q8LGiZw3vGRHTnSwlHEYkqbagSFQ/TfsGgOB0nDgIVWQSCIfF0Y3l8D87g1SBeHXumUh TuRU6qPXGvr2mLqOcsdsgYgto+8dxgD5FsoSJiX0cp6OjsRxDGFNGRTBSzYvr79LXmNt idcTexCFDsNIT6pPUBCz/DtT78JVPIrifOSAkwDi6wgrglCp8S4RSaF3QHTofAskcANG aASMSQ9sLkq0M/OnN6NukVVKXJlGK5L4xsTo22QHLEY5dPmCK8oPpfG9x1WLUwg/xNmL eILg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1785928435; x=1786533235; h=references:in-reply-to:message-id:date:subject:cc:to:from:x-gm-gg :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to :content-type; bh=xQRw7gsO2UeKw/N04jyZ2vRCrKCyzvuIcQFmZJeWnLc=; b=PnPWJHv9yqnPUOI3Oc7rQ2tF0WYW3qVhLoqFHrveya6T7rNAvBWK5DcTd2eyXkYdNo b95MzvCY3TOlTtqcuBoL2NbmvPFSWzCqmmI77iNSuZ5DA5MOEKQH9c7JMwLDylsttrXD RG8ouqT6O4Vz27OjNPFugREeH7O3uAssEXaEkub+dYMRq/AVCqBnRywtwsx26UuFgbbO 2iwPVlfOwV7wEWr/dsWbqTgOAQbmfWpMjOVej0+seaj2RRoR00EalT6n79FT2lmvglSY nGu8MWMA6v6EYVp9Sq29sVYqtpOF41GkYtvdyqebdTRopiEzxCJfkG7EnWiTO3OcF7l4 SuUw== X-Forwarded-Encrypted: i=1; AHgh+Rppu9DV2cv87E2mJsnFG9Szf9PddMEsyKggxO4nK7/fKL/k6B20zMRXIYj2RvaEeT/sMW+H68FW0pUJhR8=@vger.kernel.org X-Gm-Message-State: AOJu0YwJ1SGpfHP3bW5gWxAcDtsgUtI/P7WlBEwVJ5zoDZT6+7WtTsUG NzeWTSbwff8a14BWPDvxTKrxAi/Hf3+KCSlp6+5GIuQpVnH1LljY2lOMuCGEejuT X-Gm-Gg: AR+sD12gMDTAB/JlAMvFci6/g+hfoWtYZPWmGQQY2UgYyb3K5o0BUJWyQqeRr42e18n LUpN2SFEpiCTMLAjdqRi/wh+veP7XuQVylg39jI5y3SJBEy+wPi4TXf06e1NkFAg4Ln+eNQMwV3 0SJnZbGgkyF2wBQYYJZHVOyMSbGFs84c5M71r4lFve0LFHwV05qyqcj1FVFJIgLFGcCQWhjxy1O F3Oa8NZq52SJrmNqzk04pQOW79kZc33Ok4/Xr5E8otCNlprdQWG8pGYkoFpXEPm0Vu9oO2bXCQ/ 5X8IOYITUAD+3272rIh0J81RUdI0CBQU78d+1hoMwxu1rpD2IwptWihQSRB8IIZzlnWXDuion8G JGaDKuSqmSeUSCUmz5MNYd9fi7+jIzHzbd9KuWcwtqaax75Ml1l8A+97hEs+xjNwXX3/wBcw236 B4kksOUmLq+BjBNNX2U4+iRFhB22YPLFcvAN16gZ5IHg9QQAnMM24aQkF06aYXXts5noN5c9tSb KRh/F4n0qTPE+7Q X-Received: by 2002:a17:907:9616:b0:c1f:922d:34c3 with SMTP id a640c23a62f3a-c2039b8150fmr253371666b.14.1785928434640; Wed, 05 Aug 2026 04:13:54 -0700 (PDT) Received: from localhost (c-85-228-45-68.bbcust.telenor.se. [85.228.45.68]) by smtp.gmail.com with ESMTPSA id a640c23a62f3a-c2053debd30sm4590566b.7.2026.08.05.04.13.53 (version=TLS1_2 cipher=ECDHE-ECDSA-CHACHA20-POLY1305 bits=256/256); Wed, 05 Aug 2026 04:13:53 -0700 (PDT) From: Eli Billauer To: gregkh@linuxfoundation.org Cc: arnd@arndb.de, linux-kernel@vger.kernel.org, corbet@lwn.net, Eli Billauer Subject: [PATCH v5 1/7] char: xillybus: Improve control of execution flow with mutexes Date: Wed, 5 Aug 2026 13:13:31 +0200 Message-Id: <20260805111337.69178-2-eli.billauer@gmail.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20260805111337.69178-1-eli.billauer@gmail.com> References: <20260805111337.69178-1-eli.billauer@gmail.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" This commit addresses two issues by using mutexes: (1) Add a mutex to protect the fifo_buf_order global variable. The purpose of this variable is avoid repeated failed calls to __get_free_pages() for allocating FIFO memory, when the chunk size was too big. However, if two drivers are initialized at the same time, fifo_init() may run in parallel, and fifo_buf_order may be reduced too much. This is a far-fetched scenario, now completely prevented by fifo_buf_order_mutex. (2) setup_channels() acquires process_in_mutex to prevent process_bulk_in() from accessing the xillyusb_dev struct. With correctly working hardware, process_bulk_in() is never called while setup_channels() runs, because the device has no reason to send data in that phase. The mutex ensures that process_bulk_in() does not touch the members that setup_channels() alters. There is no similar protection for data flow in the other direction, because during the setup process, the only outbound data is the BULK endpoint used for commands, and it remains untouched after its initial setup. Assisted-by: Deepseek:v4-pro Kimi:K2.6 ChatGPT:GPT-5.5 Claude:Sonnet-4.6 Assisted-by: Sashiko-0.2.5:gemini-3.1-pro-preview Signed-off-by: Eli Billauer --- Notes: Changelog: =3D=3D=3D=3D=3D=3D=3D=3D=3D No change on v4->v5. =20 Changes v3->v4: -- Use plain mutex_lock() in fifo_init() rather than guard() in order to avoid mixing guard() with goto, following Sashiko's remark + add attribution to Sashiko for this. =20 Changes v2->v3: -- Add Assisted-by tag to description =20 No change on v1->v2. drivers/char/xillybus/xillyusb.c | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/drivers/char/xillybus/xillyusb.c b/drivers/char/xillybus/xilly= usb.c index 34e7ad3bcab3..560c3568fc96 100644 --- a/drivers/char/xillybus/xillyusb.c +++ b/drivers/char/xillybus/xillyusb.c @@ -50,6 +50,7 @@ MODULE_LICENSE("GPL v2"); static const char xillyname[] =3D "xillyusb"; =20 static unsigned int fifo_buf_order; +static DEFINE_MUTEX(fifo_buf_order_mutex); static struct workqueue_struct *wakeup_wq; =20 #define USB_VENDOR_ID_XILINX 0x03fd @@ -375,6 +376,8 @@ static int fifo_init(struct xillyfifo *fifo, =20 unsigned int log2_fifo_buf_size; =20 + mutex_lock(&fifo_buf_order_mutex); + retry: log2_fifo_buf_size =3D fifo_buf_order + PAGE_SHIFT; =20 @@ -395,8 +398,10 @@ static int fifo_init(struct xillyfifo *fifo, =20 fifo->mem =3D kmalloc_array(fifo->bufnum, sizeof(void *), GFP_KERNEL); =20 - if (!fifo->mem) + if (!fifo->mem) { + mutex_unlock(&fifo_buf_order_mutex); return -ENOMEM; + } =20 for (i =3D 0; i < fifo->bufnum; i++) { fifo->mem[i] =3D (void *) @@ -413,6 +418,8 @@ static int fifo_init(struct xillyfifo *fifo, fifo->writebuf =3D 0; spin_lock_init(&fifo->lock); init_waitqueue_head(&fifo->waitq); + + mutex_unlock(&fifo_buf_order_mutex); return 0; =20 memfail: @@ -426,6 +433,7 @@ static int fifo_init(struct xillyfifo *fifo, fifo_buf_order--; goto retry; } else { + mutex_unlock(&fifo_buf_order_mutex); return -ENOMEM; } } @@ -1943,6 +1951,9 @@ static int setup_channels(struct xillyusb_dev *xdev, struct xillyusb_channel *chan, *new_channels; int i; =20 + /* Don't let process_bulk_in() run while we change the channels */ + guard(mutex)(&xdev->process_in_mutex); + chan =3D kzalloc_objs(*chan, num_channels); if (!chan) return -ENOMEM; --=20 2.34.1 From nobody Fri Oct 2 03:47:13 2026 Received: from mail-ed1-f52.google.com (mail-ed1-f52.google.com [209.85.208.52]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 66EA342FCB3 for ; Wed, 5 Aug 2026 11:13:58 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.208.52 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1785928440; cv=none; b=l3Ipmkr+qAI3CRxYF72Dzm2qPc85rzXld9EBdXLxW2DCw4RQNrQoCIEn21dCo+oui+wFbJePwuxjfYsXb+epBGVxCo5vcNYM+IjCL3PjqlmHcW5Y2MCwWNPOfBAgEceAc/8jcSy5qWpUmVsj0Uqfih98M4xxr6P+xybRvvzSeow= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1785928440; c=relaxed/simple; bh=3RnwFDiFqQ/knUwztEMZjX3bELXiUAjO0dNFjnlXwNU=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References; b=pTUIqjyUSZDQPqhNB2SZSnof+HM4LZTjIrF48ihi45z5G/FnbrlmneNNcLTNNSac+YVb3CJFSU9fanSNxSxXaOWs1oHqH1siKOui14yp0VThze5AxhJu2tMynuKfXdO9gMhmavPR8q/QX6Sb+LN5ZEdnoebno3nfn7KGuig7Tgs= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=Ceps4/Y/; arc=none smtp.client-ip=209.85.208.52 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="Ceps4/Y/" Received: by mail-ed1-f52.google.com with SMTP id 4fb4d7f45d1cf-6a0a4aa99bdso1242000a12.1 for ; Wed, 05 Aug 2026 04:13:58 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1785928437; x=1786533237; darn=vger.kernel.org; h=references:in-reply-to:message-id:date:subject:cc:to:from:from:to :cc:subject:date:message-id:reply-to:content-type; bh=KdzgWchxHHiqR+6i2dUq7NJ9e+9KXsf+Dx2VpbcxW0o=; b=Ceps4/Y/6zBVTNJv9xF7Y3Owms9wWTQP/CML4VzIr2d9wbIH9m11K3UDhiOUPdOilL nBC94nsrkjKR+I/zdzyLLufGfMy6tY0u9fAdrUCelAojgAKpgWLwtccgQPEk8v1ZCPao hvXf26e6ySi8Er1hr4PsRturvSnEVSp/lXvSYNg5K1hMOgfISo2EWsLdpnSnsTEdJZmg Nt2bf1ttZKG6qKx/7ckoevHqhagzg9G29HrzFBjMP5K2X5VPmWuvKjzUt5jEFG0GNXqC xWWjrUzAA+YeRd2L1PdzzGVdYk3I5c1MJCWfh9CJaCymdVTKvBkXbuCcAABbOHMA9+2e vUFQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1785928437; x=1786533237; h=references:in-reply-to:message-id:date:subject:cc:to:from:x-gm-gg :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to :content-type; bh=KdzgWchxHHiqR+6i2dUq7NJ9e+9KXsf+Dx2VpbcxW0o=; b=h9iXyYqgAGubxXp1UjpGBaq7HuuTGql9EgB1UXJO3NdbvXnr2ghxwyL1fD9uiBE+TO 8mvkPtn4UH/yvxNalNlh6k1HF3WIewBJBFwIDn9IpynGNBJh+4UyyQXI51tQyTieBFuG PX+7MtwTY/oYGzNdgZVaOfr7+F714cc/phPyV2KyAw5bFHEbi1w5hoHUP1Cq/1060a0r ReEwOkIqIozzci4dCufjKg9nQIv+WASMA2yV/dY7zmgpvRuO0eiFuIIZgesScDwXAw9Z OLR3ZvgkZoPvWYyEkKtG6lpxkIi2ifbh7/P2NfltDLyxvbOx2RrZfZCJcAN82HwcjDY4 +67w== X-Forwarded-Encrypted: i=1; AHgh+RrbEr3vzPru0s9qVuGBHbgEl/PUGuLoV4nhlYUH4qvySg3oVZH8ZuZ1KVbfheOB/jvuzeSrUzUg+r+vc+k=@vger.kernel.org X-Gm-Message-State: AOJu0YzK6r2+Ne/7CT5DVtXCHGzh7wsprYkSk6GaF8n4EalKcz1cIhUY HsIBuxgb53bUeZhPsshUr5IzB0k79HhMLU7drUtdR6kd+FzCzQxjOrfl X-Gm-Gg: AR+sD12Zg7fuyaBsemFoTGpRTU5v60WaI5IvKb7lxg2cZ3P0HAvj4pm5iqkljOKx9lU 4yGnz6Bg2nQ6naqGZmyMI/pjW6CN1oNgtQPBymNRBpk+dS08FW668uNh2ro17urpBJjzextWc1F r8SP05fkyZQtcsbf1H4SAwOvCmF1yo1thva28/8Mq2Zf/XuePQI66tD6yXjFZrqktVzbvHud5Cr PXobZRg9N2iMsZQx/4zc30qkfcnlhC3xVLnvQDt8Zuj3z3a0EyL8/a5FUY0/8NnN4JIenUi4p6g FkF1ytAbqHW5kmzk9mN9I/nMSgtN4iLot8z42PaHHSn4FrOa2RSUo2HnTPn5i1Jl+MfUN7eZ/Wa EU2gn4Yb78QYLlY70YaM7diveg6kRI3MsLCkQFK7sPfnJkW/bAhWy6cZONfYOQfuh84qMM3o0GT Ufv2oJY/gvVd7d66XwCdcB2QjANfapNKdPWSVcE++tscDeipsqhStRmiT4jCQgWXxl2ipyORgoM LLrZLOI4xFwYn4K X-Received: by 2002:a05:6402:21ce:b0:699:fbe4:16d4 with SMTP id 4fb4d7f45d1cf-6a14f26904cmr2687562a12.18.1785928436447; Wed, 05 Aug 2026 04:13:56 -0700 (PDT) Received: from localhost (c-85-228-45-68.bbcust.telenor.se. [85.228.45.68]) by smtp.gmail.com with ESMTPSA id 4fb4d7f45d1cf-6a17d6216ddsm451261a12.28.2026.08.05.04.13.55 (version=TLS1_2 cipher=ECDHE-ECDSA-CHACHA20-POLY1305 bits=256/256); Wed, 05 Aug 2026 04:13:55 -0700 (PDT) From: Eli Billauer To: gregkh@linuxfoundation.org Cc: arnd@arndb.de, linux-kernel@vger.kernel.org, corbet@lwn.net, Eli Billauer Subject: [PATCH v5 2/7] char: xillybus: Remove duplicate error path code Date: Wed, 5 Aug 2026 13:13:32 +0200 Message-Id: <20260805111337.69178-3-eli.billauer@gmail.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20260805111337.69178-1-eli.billauer@gmail.com> References: <20260805111337.69178-1-eli.billauer@gmail.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Remove dedicated code for the error path, which is both redundant and incorrect: It calls kref_put() before mutex_unlock(&chan->lock). As kref_put() may result in releasing the memory containing the mutex, this could lead to UAF. Assisted-by: Deepseek:v4-pro Kimi:K2.6 ChatGPT:GPT-5.5 Claude:Sonnet-4.6 Assisted-by: Sashiko-0.2.5:gemini-3.1-pro-preview Signed-off-by: Eli Billauer --- Notes: Changelog: =3D=3D=3D=3D=3D=3D=3D=3D=3D No change on v4->v5. =20 Changes v3->v4: -- Correct the commit description to indicate that the removed duplic= ate code wasn't only redundant, but could also lead to a UAF, as point= ed out by Sashiko, and an attribution is hence added too. =20 Changes v2->v3: -- Add Assisted-by tag to description =20 No change on v1->v2. drivers/char/xillybus/xillyusb.c | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/drivers/char/xillybus/xillyusb.c b/drivers/char/xillybus/xilly= usb.c index 560c3568fc96..ee819e2e3f82 100644 --- a/drivers/char/xillybus/xillyusb.c +++ b/drivers/char/xillybus/xillyusb.c @@ -1424,16 +1424,12 @@ static int xillyusb_open(struct inode *inode, struc= t file *filp) if (filp->f_mode & FMODE_WRITE) chan->open_for_write =3D 0; =20 +unmutex_fail: mutex_unlock(&chan->lock); =20 kref_put(&xdev->kref, cleanup_dev); =20 return rc; - -unmutex_fail: - kref_put(&xdev->kref, cleanup_dev); - mutex_unlock(&chan->lock); - return rc; } =20 static ssize_t xillyusb_read(struct file *filp, char __user *userbuf, --=20 2.34.1 From nobody Fri Oct 2 03:47:13 2026 Received: from mail-ej1-f44.google.com (mail-ej1-f44.google.com [209.85.218.44]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 64F7F430CD1 for ; Wed, 5 Aug 2026 11:14:00 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.218.44 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1785928442; cv=none; b=j8Kxsu+ornvuhI9GDwM/eIyX9ZTuF/6/DMLvSpgDMLBiqYCCogHVHB/P/LsICW5caroIn4HV22b/8BaMkeaYW6TcCFKxR4bbAUSEdj/W4cAWy4HwpjzGRUZFpd8n9OAqZwf9TFLHm6pOHGbEJc9XCK66dog+su6yGjVBPnBy0+k= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1785928442; c=relaxed/simple; bh=lVu9kgAFB2Y2C6V7zsmHfe89qsnswfGmZQPAiT59maQ=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References; b=Fnhjpy6mGkRSu6Bp1tXlOPJIfn9B+xXjmpcHv93tyg6VkYYmWjAJA0tcuaB3vva9aJYCfUZfc39smNe+BnULKoX+nZG+Fvr4WJyYGNAXoXx5BhXOi3lWoX5Cme21CvAC0JirKQHmtzkIAQylelF/e0sKDdfoUoUzttueaL14ZPo= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=d8Ra7mqn; arc=none smtp.client-ip=209.85.218.44 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="d8Ra7mqn" Received: by mail-ej1-f44.google.com with SMTP id a640c23a62f3a-c15f020a223so143122866b.1 for ; Wed, 05 Aug 2026 04:14:00 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1785928439; x=1786533239; darn=vger.kernel.org; h=references:in-reply-to:message-id:date:subject:cc:to:from:from:to :cc:subject:date:message-id:reply-to:content-type; bh=s31BvaLz48EiFfE9PVMVRR7SqApnlFTXJUtfp+soN18=; b=d8Ra7mqnno+Su489SBMKfbeleSRfwG7+UqNVUDi2liH7poCOZxV8dotrswcaco+U+n 1Nq62RCFNaKRNTrgapU/GfdhoXEHzUQuseM4REcLPk5KP1s1YErDD1LBDhls85gb8zHu 5L22QVEq9pwf+ZiePRgTyLVZHjmB6YJQohsO7Nc7rhdiPHqtMEW8C1pAsJyYPj8Mujgs t6mZZHwYoDYfE36Bw3PMuSRpItEGTBzpEIFV3mTEgw+aGstSw+0oE4ZJWiJcannHeMa+ 9oy3sFmuKcz/lV9fQfpkhLzvDPPgOCDh3Q9H+8Wag5ZMCMUAsxzFd9E9CSbKlu8EgJzb Rrdg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1785928439; x=1786533239; h=references:in-reply-to:message-id:date:subject:cc:to:from:x-gm-gg :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to :content-type; bh=s31BvaLz48EiFfE9PVMVRR7SqApnlFTXJUtfp+soN18=; b=X9pDJzfUP4J37YETx2T5l2ZTyzotfiNWSjfiueMRNa2z0WnfNBXdXpwYRcUcBpaW20 aJlNDf7Af3N/a9p3r81N16CyC8C4kk61MDXAGTJ5jZ/P8qgOgfKtx/Uxs7H1eSS4llg/ w/k0ec2NOc1kUltzvOKFtyBLXHP4Wg8O8vrFtml8fQ5MrQzqdrPjl9zNT4fJDL1moWKD 4tqQvx7AmKMPNIi1FsL1kYBpj6O2QN7RmejEk0MdIsFBijj0BqPqj8zwKC0tK17lDdAb MO8OCIlDAf+xxBHze1VAeiaL68E0r8DEXvi9jocbXdf9AjtOdYkxhAt81/STxP/voEs3 nuow== X-Forwarded-Encrypted: i=1; AHgh+RpBwuGxMrN1TPCJDdFEQzwQOb0ELNWHIyVd6aJkes2socwD5LeLrYgS5pWsQnqI+mrpJHL1686d7Ue/SH8=@vger.kernel.org X-Gm-Message-State: AOJu0Yyrtu5QTjtVy2Oha4XNyFSL3TVZaZLK7ZP/EY/ENWz2I5Hdk7f1 m1i2uhLb8Ur4eqOytJOu/twqq/f3BW8cajQy4LeGDpXWJNSjQfbIPqGYhAP7l4Zl X-Gm-Gg: AR+sD11dhUKzqu8UDFDy6adb6uQJ3gqRMjZ/tgfdBzlFLVZpZCu59ulTeE9ZHTIqEc9 k/mhk98xWlbzWUi5maEhpEZ98GIxZfhQ/amyspfstvR1lLtkFVKLbEFw9/XJaUvJAkfFAwrP1Q3 00VtdkGtgPWHpivADhnEZ/ZDVvL0lun3cdFByyQAW+zsGeAoih9ppMp/kOUYFZCgpTPjjH2Leif qx9BNgTIEQFLBVLBqOTgpdETWw6l9U7bTDkFfR47eodl3nwFPkrFd4Y/J6cR7pADLAzOhco7xtn 02gqLjPfPxoD88cdOJyDCt+PDtY+IfizDlps6T5TMEoD2KMl+NIXLRhnrqVY1VD1o0L5G5x4ZQR 7V7w0fbhSdPPYyiGvjxLLfvFMb1b9xjvjs4WHpYmKfjhHjViitQfsE/6ortI7oS8u0xW5rAo7Rf Fy61S+SUxbgFLv81WD+tgkulJvDambPvhIO74K9p/H2ytkA7xac+I+aPwaB0umC8b3lWPqymODW WgbtaQOYD6PFnSY X-Received: by 2002:a17:907:db15:b0:c16:71:d9ce with SMTP id a640c23a62f3a-c2039b6ecb3mr267497366b.8.1785928438272; Wed, 05 Aug 2026 04:13:58 -0700 (PDT) Received: from localhost (c-85-228-45-68.bbcust.telenor.se. [85.228.45.68]) by smtp.gmail.com with ESMTPSA id a640c23a62f3a-c2036131747sm100419166b.13.2026.08.05.04.13.57 (version=TLS1_2 cipher=ECDHE-ECDSA-CHACHA20-POLY1305 bits=256/256); Wed, 05 Aug 2026 04:13:57 -0700 (PDT) From: Eli Billauer To: gregkh@linuxfoundation.org Cc: arnd@arndb.de, linux-kernel@vger.kernel.org, corbet@lwn.net, Eli Billauer Subject: [PATCH v5 3/7] char: xillybus: Avoid possible bandwidth inefficiency Date: Wed, 5 Aug 2026 13:13:33 +0200 Message-Id: <20260805111337.69178-4-eli.billauer@gmail.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20260805111337.69178-1-eli.billauer@gmail.com> References: <20260805111337.69178-1-eli.billauer@gmail.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" The host flow controls the payload data flow from the FPGA by sending OPCODE_SET_CHECKPOINT messages. Fix the condition for sending such a message, to correctly handle the case where leap < 0. The previous expression leap > (fifo->size >> 3) was not intended to evaluate true when leap is negative. However, due to C's integer promotion rules, leap (of s32 type) is promoted to unsigned int when compared with the unsigned fifo->size >> 3 expression. As a result, negative leap values are interpreted as large positive numbers, causing the condition to evaluate true unintentionally. Consequently, the device receives correctly formed checkpoint messages that encourage it to send data, but too frequently. This may cause the device to send short data chunks, wasting USB bandwidth. Assisted-by: Deepseek:v4-pro Kimi:K2.6 ChatGPT:GPT-5.5 Claude:Sonnet-4.6 Signed-off-by: Eli Billauer --- Notes: Changelog: =3D=3D=3D=3D=3D=3D=3D=3D=3D No change on v4->v5. =20 No change on v3->v4. =20 Changes v2->v3: -- Add Assisted-by tag to description =20 No change on v1->v2. drivers/char/xillybus/xillyusb.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/drivers/char/xillybus/xillyusb.c b/drivers/char/xillybus/xilly= usb.c index ee819e2e3f82..ef5b1816b277 100644 --- a/drivers/char/xillybus/xillyusb.c +++ b/drivers/char/xillybus/xillyusb.c @@ -1512,8 +1512,8 @@ static ssize_t xillyusb_read(struct file *filp, char = __user *userbuf, */ =20 if (chan->read_data_ok && - (leap > (fifo->size >> 3) || - (checkpoint_for_complete && leap > 0))) { + (leap > 0 && (leap > (fifo->size >> 3) || + checkpoint_for_complete))) { chan->in_current_checkpoint =3D checkpoint; rc =3D xillyusb_send_opcode(xdev, chan_num, OPCODE_SET_CHECKPOINT, --=20 2.34.1 From nobody Fri Oct 2 03:47:13 2026 Received: from mail-ej1-f47.google.com (mail-ej1-f47.google.com [209.85.218.47]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 49A14431A5E for ; Wed, 5 Aug 2026 11:14:02 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.218.47 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1785928444; cv=none; b=NWlvKSP7kCfWbAXFLWYvao0xwXc9/zhEbvCpTRmLoipp/yXTtskhrG+yvE68RggzYj18uesKeGAy3G+3hErJz9NEtcXP+X62Ld+iOHJOWZv89MvkfXNSVrQzp2p7GU+C4UoJimX2RsoEnyNlm53LfIYdrnARljNW8l06r3D2IiY= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1785928444; c=relaxed/simple; bh=fvA09/4M9aVhIsgwPN2BcMGW7Yvhsb2LJ1CEzSvNYBU=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References; b=l1XkofCYUptM5ew8eE7uVIa+WREixvgXeOZoLsh2Oo3BkWL85BoqQKnbEaFrKb3Gt0Xs231gXlrBOsZmeKF6CStDOYtQtiy0XIe6b7EZbbVTBSuuKyFr/+vyA3ngn8GIXWN1/g0LObPSnjn3Nzk5Sdz94mua0d15Vqw3g+c4zR4= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=p3R1ihGB; arc=none smtp.client-ip=209.85.218.47 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="p3R1ihGB" Received: by mail-ej1-f47.google.com with SMTP id a640c23a62f3a-c2020421077so141540066b.3 for ; Wed, 05 Aug 2026 04:14:02 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1785928440; x=1786533240; darn=vger.kernel.org; h=references:in-reply-to:message-id:date:subject:cc:to:from:from:to :cc:subject:date:message-id:reply-to:content-type; bh=Jm+SRxrMh30+bn/DMDP4idMw1iL/4HQY9jA5t5ETxA4=; b=p3R1ihGBCvDESqLwWEzrqGEXX8ki/5WCURFEzIY4QTIV6I24Uew0FgZakLTKOwI1yo 9azCuahxpL4zbeouR5EMd1lc8cXjRTF/dFslTSNuWywFOsrzqHqpcM+fOuPftzhbLEyl XRj4y9hS4EMWXTgbfQWnw8DxOYeTHIpU3HRqVO/GCBVddHg0vUrrBvaD0FpLa+JAYolC 7RMESPvVYEJZU4W2kj+dGgEVqQcyLUr+SjObZyyKIATepMpOz59QTDw+4vMXczsFOymL rQftBn9htO9pz8Mh6G1Q634ABWCyXSChwCwu6Wo0BuGRbZ8/V2Ez6ygvfnJkAZ3tdwtx V8+w== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1785928440; x=1786533240; h=references:in-reply-to:message-id:date:subject:cc:to:from:x-gm-gg :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to :content-type; bh=Jm+SRxrMh30+bn/DMDP4idMw1iL/4HQY9jA5t5ETxA4=; b=LAYISCnX6RSQNRSbLeWYBTGxr9YUSkzzFI3KEUWYfW9+EAPAwndik8PxLYJkQC6YqD riYjuxr1ku93qekquroFmB00aWJ2nYELYUQBk9DoIlx63WXBC/iEqzWkXRvX4O0YGiyl xso8Qo7S2UvUmD/oWaH4oD0H/YO12Ri5b1IaIaOHzd/3/Evpzf9kCjtBWWuHVZaDM7JX cMhdnX1a5s2ksfeG7OtF5HOENJrMTEMtbOSVNB14OwSQ0fZVAD6kGD1b0+ypWLyfuzdg ul0Xv+Ub0AvmXTsCIE57yVs2IuEF8+zzMmpMgck/TkjOFA31xPmNMAPMZtszIhq7nBoa tHVQ== X-Forwarded-Encrypted: i=1; AHgh+Rq2MGupO3/wBAIXmL21ZQ/C3BXVShhEZHqMRIIxj7/46hj6jaWI58cAhJEt0wjc3zPERmViBM6ER68F6kc=@vger.kernel.org X-Gm-Message-State: AOJu0YzSbrfoI9GDMDbCoPOcBVMLuT1qlW0z4HENSaaomprCLFNq1+sY yveEbYgTXR7czmYnbN2SS3guHBZSWjRjpNwS8TZafle0HtIwper1uTzi X-Gm-Gg: AR+sD10jpWOywlskFsJuW0WI3esMCv9WKaH+4cfESIggaXER7X7vZZd9RmofZRjwuYk O3dYrKIWfifnREGzPG+6IRzqGN6ahYW8f6tNDGDSv4uYpUP4r4ID9i95mZb9CMjVRqcK7skvqAd aEZf6v1jPS1mKcPixx2lH/Bx/+foYdEdDiAVCry1PvYc9hymJ+XdHxVm9EJcG56UfoisUTA+ipf MhdnsHvjw3ov4pX07QF4qfYrxiDxRJtnceHKjIQWvK/LDNpoADhnjFHl2iKcWLYPEwzsRE8kEvd JXmXV8Hxlf2bIz7xYND20eL7mC9df4pwx6jw9vi+hm+FB8ibFzKUNyEGzxDJiLyguHEmA7epZUY 8fwlaL5Idv1YacTLQl/amT5V8WAjVnBZSfv9bgaT99cZp8mIvWVqTehzMB/FjxvbNerIpx1F1Vl vf3xQNqW4xGaCnFmNr7UHoWphCWBQ13Feqa8RXOUi3zNskdg39ErIjGmJD8NrruZttmrrP9S5m7 3AwsXvrKXPspvyk X-Received: by 2002:a17:907:724f:b0:c1c:4afd:8d8c with SMTP id a640c23a62f3a-c2039b5ae10mr272800966b.14.1785928440160; Wed, 05 Aug 2026 04:14:00 -0700 (PDT) Received: from localhost (c-85-228-45-68.bbcust.telenor.se. [85.228.45.68]) by smtp.gmail.com with ESMTPSA id a640c23a62f3a-c2036225b96sm97735366b.12.2026.08.05.04.13.59 (version=TLS1_2 cipher=ECDHE-ECDSA-CHACHA20-POLY1305 bits=256/256); Wed, 05 Aug 2026 04:13:59 -0700 (PDT) From: Eli Billauer To: gregkh@linuxfoundation.org Cc: arnd@arndb.de, linux-kernel@vger.kernel.org, corbet@lwn.net, Eli Billauer Subject: [PATCH v5 4/7] char: xillybus: Use unsigned arithmetic for jiffies differences Date: Wed, 5 Aug 2026 13:13:34 +0200 Message-Id: <20260805111337.69178-5-eli.billauer@gmail.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20260805111337.69178-1-eli.billauer@gmail.com> References: <20260805111337.69178-1-eli.billauer@gmail.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Change the type of jiffies-related deadline variables from long to unsigned long, and remove unnecessary casts when computing time remaining as deadline - jiffies. No functional change is expected: although signed overflow is undefined in the C standard, processors perform the calculation correctly in practice. Using unsigned arithmetic is nevertheless the proper way to handle jiffies differences. Assisted-by: Deepseek:v4-pro Kimi:K2.6 ChatGPT:GPT-5.5 Claude:Sonnet-4.6 Signed-off-by: Eli Billauer --- Notes: Changelog: =3D=3D=3D=3D=3D=3D=3D=3D=3D =20 No change on v4->v5. =20 No change on v3->v4. =20 Changes v2->v3: -- Add Assisted-by tag to description =20 No change on v1->v2. drivers/char/xillybus/xillybus_core.c | 5 +++-- drivers/char/xillybus/xillyusb.c | 17 ++++++++++------- 2 files changed, 13 insertions(+), 9 deletions(-) diff --git a/drivers/char/xillybus/xillybus_core.c b/drivers/char/xillybus/= xillybus_core.c index 952ef149aba1..7acebc1e6050 100644 --- a/drivers/char/xillybus/xillybus_core.c +++ b/drivers/char/xillybus/xillybus_core.c @@ -694,7 +694,8 @@ static ssize_t xillybus_read(struct file *filp, char __= user *userbuf, unsigned long flags; int bytes_done =3D 0; int no_time_left =3D 0; - long deadline, left_to_sleep; + unsigned long deadline; + long left_to_sleep; struct xilly_channel *channel =3D filp->private_data; =20 int empty, reached_eof, exhausted, ready; @@ -938,7 +939,7 @@ static ssize_t xillybus_read(struct file *filp, char __= user *userbuf, return -EINTR; } =20 - left_to_sleep =3D deadline - ((long) jiffies); + left_to_sleep =3D deadline - jiffies; =20 /* * If our time is out, skip the waiting. We may miss wr_sleepy diff --git a/drivers/char/xillybus/xillyusb.c b/drivers/char/xillybus/xilly= usb.c index ef5b1816b277..e2270a64b659 100644 --- a/drivers/char/xillybus/xillyusb.c +++ b/drivers/char/xillybus/xillyusb.c @@ -1132,12 +1132,13 @@ static int xillyusb_send_opcode(struct xillyusb_dev= *xdev, */ =20 static int flush_downstream(struct xillyusb_channel *chan, - long timeout, + unsigned long timeout, bool interruptible) { struct xillyusb_dev *xdev =3D chan->xdev; int chan_num =3D chan->chan_idx << 1; - long deadline, left_to_sleep; + unsigned long deadline; + long left_to_sleep; int rc; =20 if (chan->flushed) @@ -1146,7 +1147,8 @@ static int flush_downstream(struct xillyusb_channel *= chan, deadline =3D jiffies + 1 + timeout; =20 if (chan->flushing) { - long cancel_deadline =3D jiffies + 1 + XILLY_RESPONSE_TIMEOUT; + unsigned long cancel_deadline =3D + jiffies + 1 + XILLY_RESPONSE_TIMEOUT; =20 chan->canceled =3D 0; rc =3D xillyusb_send_opcode(xdev, chan_num, @@ -1157,7 +1159,7 @@ static int flush_downstream(struct xillyusb_channel *= chan, =20 /* Ignoring interrupts. Cancellation must be handled */ while (!chan->canceled) { - left_to_sleep =3D cancel_deadline - ((long)jiffies); + left_to_sleep =3D cancel_deadline - jiffies; =20 if (left_to_sleep <=3D 0) { report_io_error(xdev, -EIO); @@ -1207,7 +1209,7 @@ static int flush_downstream(struct xillyusb_channel *= chan, } =20 while (chan->flushing) { - left_to_sleep =3D deadline - ((long)jiffies); + left_to_sleep =3D deadline - jiffies; =20 if (left_to_sleep <=3D 0) return -ETIMEDOUT; @@ -1440,7 +1442,8 @@ static ssize_t xillyusb_read(struct file *filp, char = __user *userbuf, struct xillyfifo *fifo =3D chan->in_fifo; int chan_num =3D (chan->chan_idx << 1) | 1; =20 - long deadline, left_to_sleep; + unsigned long deadline; + long left_to_sleep; int bytes_done =3D 0; bool sent_set_push =3D false; int rc; @@ -1469,7 +1472,7 @@ static ssize_t xillyusb_read(struct file *filp, char = __user *userbuf, bytes_done +=3D rc; chan->in_consumed_bytes +=3D rc; =20 - left_to_sleep =3D deadline - ((long)jiffies); + left_to_sleep =3D deadline - jiffies; =20 /* * Some 32-bit arithmetic that may wrap. Note that --=20 2.34.1 From nobody Fri Oct 2 03:47:13 2026 Received: from mail-ej1-f44.google.com (mail-ej1-f44.google.com [209.85.218.44]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 7DF7E430312 for ; Wed, 5 Aug 2026 11:14:04 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.218.44 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1785928446; cv=none; b=FrPGj76Yl/bdYC9SlL5GTjS9wkcDuBRImkCPn/gDq7zrdS71v6fLFWa9lJoud3Cis1TZWz7crjpCtkhFLm+BeIsetTZVgbJfPAF1v3/VJtSCHUCMT5R9Syvgzko0eL0zMVNO8Afbym5OECtsmhloaXbRkI5Fgv0ixDHrCqKIiuo= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1785928446; c=relaxed/simple; bh=BFg9rizFQXFR+JyWqckZoLt/k0BQskUdlcyCXw36Q5w=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References; b=FxZgowkBMQUPHTu6/AjHdwrs74/sPe9rzzwhaKON4yl5otYbIPI7W/eoJVedCVE7zF8g6ZQI/VtrB4mnpPVhprAOfdLzo0OWdGhZzxEOmQG8sc4t+RyTPfJhAUZo6kI+DZumzZBRRPlbm/CcXkj/EN/1NW7hIJGqjv9YUpddgXA= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=X7tZimbm; arc=none smtp.client-ip=209.85.218.44 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="X7tZimbm" Received: by mail-ej1-f44.google.com with SMTP id a640c23a62f3a-c1677c91969so103725666b.1 for ; Wed, 05 Aug 2026 04:14:04 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1785928442; x=1786533242; darn=vger.kernel.org; h=references:in-reply-to:message-id:date:subject:cc:to:from:from:to :cc:subject:date:message-id:reply-to:content-type; bh=4qOAvqE6ReTe5rLjM7mwLGU4msCzPkiij9LNmtXv4oY=; b=X7tZimbmBmAKrR5KesuF0UfoqnvdVF14sz/xe9j2jJFSvAWPp/wJHaYHqKnLaTj14i 6J+/5mtxbtyJoXgFQipa21Gxx52M4KkKrYBimpdc5qLg9fN53TjJoG/lhcNSiD7w20NB dllM4CXeDS+rUY7/rbR0iKorQOwAmKbo9ZpsOpuAZrkayJOV+D4pKy+C1mu4ZbFyDkcr +NW7ilkyazpQMlKVOtT2xdNEeVNlNG/bp8NWnd4/LuBQVXK3GSXLVUjeR1T+7cz5LyI/ K/5YnXdw6J4emji+ztwu3T/rMBExnZqNtm3PbNLX4jD0OKGPjBKTNdRycaoAeRASj4Lz kiZw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1785928443; x=1786533243; h=references:in-reply-to:message-id:date:subject:cc:to:from:x-gm-gg :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to :content-type; bh=4qOAvqE6ReTe5rLjM7mwLGU4msCzPkiij9LNmtXv4oY=; b=EbSe+kpXcVwfTCAuK3r/YUb7Wp31GvzLJZdKvTRMsV25vUse2IRfu3qR6fOP9v/Y2r dSFg3qVitbuKPnCkYSdpyMJh6ljHYgY8ZDe2TVPz5sA5YB9TN3mH7Dpsj6+VkjJy1nVA ZBDu+l7P9QbJk52x6fj+hu85WgfPcP7lSMB/CWFqSGnG+rYitDvjtFrk9boncnRuQSHD tBdTlU5koDwVEZI014szZCuo6MC2KCfiAmqRvPsFBwS94Qe9PsI5xzJ03l7SxMxlFPIZ 7r+il9yxlu3l2vZdScvQIX+6H+mlIBTollS5iri6I7MfG9GAXiMdNiXGGXy7Eoc+Obf1 sstg== X-Forwarded-Encrypted: i=1; AHgh+RqF7ZGWqxYpMy5LZtt/pceNcbW8GWkTOoNLpJQ2oJKnxpvTmjrbpe3s/VVG1Gf35eZZwY5+oAf3oX492zc=@vger.kernel.org X-Gm-Message-State: AOJu0Yytd8uSv4qAONQEdDt4nz4bGsZrx6pdC6Hin+RfNzNYXLUXaJov SXvey9U6QHovJXD6jrQtulkd1PRCVYLmZsXxjXvKMWhgJzhwE1jIzXdG X-Gm-Gg: AR+sD10/aExCt7yfKyvYDUktkGoOX718RtE//F4NbLu8YbIlNOV96AozmvInJJ734Fn WyTpBZYa4f8Qcw8rC8GLUW3xbPgsTmqstxu+t+nHykrmpJ9fTANHtWD/68f430M5X3W5qegkxwe V8E7fQkIezefzlXNDVpE1X5u5AfDasxbCB19BiCpY0te1XyHryLrNV4ZU1yi+Xhe4MLllMKQpdj BucyjL3gloqZ2Bvjr7NQFwYHXi8qOBL7VgT0epZimyrQ+7i55OdTxpFw0h4+Hghx3Tl/ZSXSN1w SPBOja8ixCNvU3QjWlbLK4lz11p2FTLO081IFOIXQdLm1Xkal6IuMGcS/ZiDh+g6CJVDmzewk6E PyiBiJ0MwwU4LF/S5XlWU8Jd15KwvAKq4wvsPIGvbRRW04hcxC5tZsSrHBIkFjG9RSzPzDa4veH A4ncFl4UPLAYgEWWGJ571bDwXnm7d2jfMxExpQEy9cQuK0tNA4kcopz41CjiWfvNVIphMaSCLKh BMKnVyMHnYB5hlF X-Received: by 2002:a17:907:809:b0:c12:4647:a629 with SMTP id a640c23a62f3a-c2039cb38acmr253565466b.25.1785928442552; Wed, 05 Aug 2026 04:14:02 -0700 (PDT) Received: from localhost (c-85-228-45-68.bbcust.telenor.se. [85.228.45.68]) by smtp.gmail.com with ESMTPSA id a640c23a62f3a-c2053debd30sm4599466b.7.2026.08.05.04.14.01 (version=TLS1_2 cipher=ECDHE-ECDSA-CHACHA20-POLY1305 bits=256/256); Wed, 05 Aug 2026 04:14:01 -0700 (PDT) From: Eli Billauer To: gregkh@linuxfoundation.org Cc: arnd@arndb.de, linux-kernel@vger.kernel.org, corbet@lwn.net, Eli Billauer Subject: [PATCH v5 5/7] char: xillybus: Integer arithmetic improvements Date: Wed, 5 Aug 2026 13:13:35 +0200 Message-Id: <20260805111337.69178-6-eli.billauer@gmail.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20260805111337.69178-1-eli.billauer@gmail.com> References: <20260805111337.69178-1-eli.billauer@gmail.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Choose unsigned integers instead of signed where natural and required to ensure defined overflow behavoir. Simplify an arithmetic expression too. No functional change is expected, as the relevant variables normally never reach values where this transition matters. Assisted-by: Deepseek:v4-pro Kimi:K2.6 ChatGPT:GPT-5.5 Claude:Sonnet-4.6 Assisted-by: Sashiko-0.2.5:gemini-3.1-pro-preview Signed-off-by: Eli Billauer --- Notes: Changelog: =3D=3D=3D=3D=3D=3D=3D=3D=3D =20 Changes v4->v5: -- Use unsigned literal ("1U") instead of signed to ensure defined behavior when left-shifted (in response to Sashiko's remark) =20 No change on v3->v4. =20 Changes v2->v3: -- Add Assisted-by tag to description =20 No change on v1->v2. drivers/char/xillybus/xillybus_core.c | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/drivers/char/xillybus/xillybus_core.c b/drivers/char/xillybus/= xillybus_core.c index 7acebc1e6050..3ae95e6b17e9 100644 --- a/drivers/char/xillybus/xillybus_core.c +++ b/drivers/char/xillybus/xillybus_core.c @@ -343,7 +343,8 @@ static int xilly_map_single(struct xilly_endpoint *ep, static int xilly_get_dma_buffers(struct xilly_endpoint *ep, struct xilly_alloc_state *s, struct xilly_buffer **buffers, - int bufnum, int bytebufsize) + unsigned int bufnum, + unsigned int bytebufsize) { int i, rc; dma_addr_t dma_addr; @@ -431,8 +432,8 @@ static int xilly_setupchannels(struct xilly_endpoint *e= p, struct device *dev =3D ep->dev; int i, entry, rc; struct xilly_channel *channel; - int channelnum, bufnum, bufsize, format, is_writebuf; - int bytebufsize; + unsigned int channelnum, bufnum, bufsize, format, is_writebuf; + unsigned int bytebufsize; int synchronous, allowpartial, exclusive_open, seekable; int supports_nonempty; int msg_buf_done =3D 0; @@ -512,7 +513,7 @@ static int xilly_setupchannels(struct xilly_endpoint *e= p, format =3D (chandesc[1] >> 4) & 0x03; allowpartial =3D (chandesc[1] >> 6) & 0x01; synchronous =3D (chandesc[1] >> 7) & 0x01; - bufsize =3D 1 << (chandesc[2] & 0x1f); + bufsize =3D 1U << (chandesc[2] & 0x1f); bufnum =3D 1 << (chandesc[3] & 0x0f); exclusive_open =3D (chandesc[2] >> 7) & 0x01; seekable =3D (chandesc[2] >> 6) & 0x01; @@ -531,8 +532,7 @@ static int xilly_setupchannels(struct xilly_endpoint *e= p, channel->log2_element_size =3D ((format > 2) ? 2 : format); =20 - bytebufsize =3D bufsize * - (1 << channel->log2_element_size); + bytebufsize =3D bufsize << channel->log2_element_size; =20 buffers =3D devm_kcalloc(dev, bufnum, sizeof(struct xilly_buffer *), @@ -589,7 +589,7 @@ static int xilly_setupchannels(struct xilly_endpoint *e= p, static int xilly_scan_idt(struct xilly_endpoint *endpoint, struct xilly_idt_handle *idt_handle) { - int count =3D 0; + unsigned int count =3D 0; unsigned char *idt =3D endpoint->channels[1]->wr_buffers[0]->addr; unsigned char *end_of_idt =3D idt + endpoint->idtlen - 4; unsigned char *scan; --=20 2.34.1 From nobody Fri Oct 2 03:47:13 2026 Received: from mail-ed1-f47.google.com (mail-ed1-f47.google.com [209.85.208.47]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 731FA432BE3 for ; Wed, 5 Aug 2026 11:14:07 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.208.47 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1785928449; cv=none; b=XeZnx+gP14KWvuNq7s006mtDSKkjcNiaM211yYOBHvcvifSaiStuRu83Bpbkv/G2oloolpRSUgMYg7uqAP09hm60T8J7ZcuB9biEqpC/jyCxI/PjZyHts4MiRLtHPExZB2RAd5AgCY3ldV4+7ViF8jSnJ2U8do0SjpDgXfWCDMI= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1785928449; c=relaxed/simple; bh=Jo/AsdzuGi6AwyHY7kedSutWW51rq4D6xxEDvPXtQuc=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References; b=bxEZn/g5zFaHQyoXytVLSqUoJqeE8h+xETgsK4fwEJRCRW7Fj83mnSpF3VVi39DrK1VR9Ik+O3JXtwg2M07QoLMbuqkyyvf/bnZWJPSCng40B3YwQrKIMCk34a78Nrl13zzcjtTEa6ixGpPXYV3l3NWm3gZj+i31j/eJ11+69yY= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=O0g7yoRT; arc=none smtp.client-ip=209.85.208.47 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="O0g7yoRT" Received: by mail-ed1-f47.google.com with SMTP id 4fb4d7f45d1cf-6983f20a8bfso1353788a12.1 for ; Wed, 05 Aug 2026 04:14:07 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1785928446; x=1786533246; darn=vger.kernel.org; h=references:in-reply-to:message-id:date:subject:cc:to:from:from:to :cc:subject:date:message-id:reply-to:content-type; bh=fAwxijsOB25NoBSDeTerpI8z8eF1PLas5teFEBq0ElE=; b=O0g7yoRTrK52aOn9M06h6BHNz+8azRe8+rlB0velhKz1oZP4uq0t1xZ7DmL+YYBAHZ T68Z7uzOPbRuOFPWy7RTNU6uIDiZOCA4dgA7TxY5T/8KVi2fm2k965xA/8JXl6BXW2Or bC/CgKk9oY6gDFI9X2ifqfg9IxmfYWs7QaJFx98OCLLhS2yX76Q4XwvZWN4Ybz3FV9Ab KJFf65m0N8agUrL+gaxh64xPCK1IiM0eMcNgUKJrfq97Yclr9uvpVimYz57SKnNuonQ+ RkdPq5g4yusMVVJeoJdynAxAhdKD7qUsKuh03D1bBHZqis54Qs0rSdo1VRxJ+lIZv650 /KMw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1785928446; x=1786533246; h=references:in-reply-to:message-id:date:subject:cc:to:from:x-gm-gg :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to :content-type; bh=fAwxijsOB25NoBSDeTerpI8z8eF1PLas5teFEBq0ElE=; b=l+arWZ9m8BcWGMkwg28wQWIx71wTm8B1crdz3A3B2fplb/fpNQ7ME0AgDzjxreSSw/ B7vcBKWi38LWzmYgpEXG87N98ngt0cXdQzYP3p+R8YYiTz0PistDYGR47lpFoz5oBSti DYUQP4g7cSma7wI6s6IKlSenM581khtwEYhYcL0ocQs239Rbo3L8dJjhYuDEmxS7jsxE B1w7z79b5OQO9q+vB7TIvMXyVw1/pr+B+TzB/L6ssKLWHhDHtyxI7uGQ+ZINyAFvQ971 eoa8fTOxkgMZDTaZ8182Qwja/cvQEXxnKYHXf7F62QMEgHqLDMh+sJK9+B4QZ9H/W1QE YeDg== X-Forwarded-Encrypted: i=1; AHgh+Rq15oA7xb34YBq6VCHrAkoKufRHdzdtyLdiwqWUbYS3wjODFFLvOwY8ly7Nxb2OTklGg7xbbvPCuw3BndA=@vger.kernel.org X-Gm-Message-State: AOJu0Yx6mLPCtbDQjspXsN1cYguEaxAcQHPaW5ejx/VI4YWyS2uF7J56 ORmzca1QN/wRJ0pPBaZjKVWn47psjoWlQuGpB1XA/efZ25lAgdWRrJb7RefbK0Ka X-Gm-Gg: AR+sD13eIlQTF5kPb6NFuBNFzvON5Rw2PbnZrdA7vBtZRXYizh7yp8etcFiqW6Y6qWo 6F1KcXo+Cqzlzv4XOasnOOTCc7zb/bcXhlCQGiQtY7ooOnbHIMEmL2iKF6VvGY6F+4QvMyzLWrg OC6p7oC/QrN37cHwa870ht+xVMKGuAAZxze74HJHIZgPPKoj62+hKHLzuxQvva21l2jgcgGsiEq HRnW8yJ5xgI6JWgeTp81uDuLhwjxMyp+FeSU8DS+KGgZHbjPiZCOLbZCQRiMQ3j6AFqd2Vd7Amx RgTSPN9bhBNSkMrvwrDob4EzyWa86f4qi0eZb6YDQqdP1STsCrsmfTcmZWrV3NnZFo6sXOmqQaV JRs4wJnt92NHPIPuqOaAtljIjJ7+6ZVaUhzc5tjxGac0ZKRUHByG3ViEAIKMxYi6Zr7nA/wQkyK le2ZOhFIGuXMuqoQBkyZO4reZUlwgYfB8ipNLHemygu/KgTaLrYAwo/88Toa2Zv99j8HMhqHo6g YLTXS0+8Jvi7nbt X-Received: by 2002:a05:6402:4515:b0:6a0:33f6:13b4 with SMTP id 4fb4d7f45d1cf-6a14f13c34dmr3120438a12.13.1785928445506; Wed, 05 Aug 2026 04:14:05 -0700 (PDT) Received: from localhost (c-85-228-45-68.bbcust.telenor.se. [85.228.45.68]) by smtp.gmail.com with ESMTPSA id 4fb4d7f45d1cf-6a17d6216cesm485106a12.31.2026.08.05.04.14.03 (version=TLS1_2 cipher=ECDHE-ECDSA-CHACHA20-POLY1305 bits=256/256); Wed, 05 Aug 2026 04:14:04 -0700 (PDT) From: Eli Billauer To: gregkh@linuxfoundation.org Cc: arnd@arndb.de, linux-kernel@vger.kernel.org, corbet@lwn.net, Eli Billauer Subject: [PATCH v5 6/7] char: xillybus: Add defensive sanity checks Date: Wed, 5 Aug 2026 13:13:36 +0200 Message-Id: <20260805111337.69178-7-eli.billauer@gmail.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20260805111337.69178-1-eli.billauer@gmail.com> References: <20260805111337.69178-1-eli.billauer@gmail.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Add validation checks for values derived from hardware or user input to prevent incorrect behavior with malformed data. Assisted-by: Deepseek:v4-pro Kimi:K2.6 ChatGPT:GPT-5.5 Claude:Sonnet-4.6 Signed-off-by: Eli Billauer --- Notes: Changelog: =3D=3D=3D=3D=3D=3D=3D=3D=3D No change on v4->v5. =20 Changes v3->v4: -- xillyusb.c: Use mutex_unlock() in response to sanity check failure in fifo_init(), as guard() isn't used anymore on this mutex. -- xillyusb.c and xillybus_core.c: Remove sanity check on data count on read() and write() fops methods, as this check is alrea= dy done by the kernel's vfs_read() and vfs_write(). =20 Changes v2->v3: -- Add Assisted-by tag to description =20 Changes v1->v2: -- xillybus_class.c: Assign @rc a value before goto in xillybus_init_chrdev(). -- xillybus_class.c: Improve check on @inode in xillybus_find_inode(). -- xillybus_of.c: Remove redundant dev_err(), as platform_get_irq() outputs an error message if necessary. drivers/char/xillybus/xillybus_class.c | 18 +++++++++++++-- drivers/char/xillybus/xillybus_class.h | 3 +++ drivers/char/xillybus/xillybus_core.c | 31 ++++++++++++++++++++++++-- drivers/char/xillybus/xillybus_of.c | 3 +++ drivers/char/xillybus/xillyusb.c | 25 ++++++++++++++++++++- 5 files changed, 75 insertions(+), 5 deletions(-) diff --git a/drivers/char/xillybus/xillybus_class.c b/drivers/char/xillybus= /xillybus_class.c index 5e8f03b77064..f7e0da233e2a 100644 --- a/drivers/char/xillybus/xillybus_class.c +++ b/drivers/char/xillybus/xillybus_class.c @@ -57,6 +57,9 @@ int xillybus_init_chrdev(struct device *dev, size_t namelen; struct xilly_unit *unit, *u; =20 + if (num_nodes <=3D 0 || num_nodes > XILLYBUS_MAX_NODES || !idt || !prefix= || !dev) + return -ENODEV; + unit =3D kzalloc_obj(*unit); =20 if (!unit) @@ -68,6 +71,12 @@ int xillybus_init_chrdev(struct device *dev, snprintf(unit->name, UNITNAMELEN, "%s", prefix); =20 for (i =3D 0; enumerate; i++) { + if (i > 99) { + dev_err(dev, "Failed to obtain unique unit name\n"); + rc =3D -ENODEV; + goto fail_obtain; + } + snprintf(unit->name, UNITNAMELEN, "%s_%02d", prefix, i); =20 @@ -215,10 +224,15 @@ EXPORT_SYMBOL(xillybus_cleanup_chrdev); int xillybus_find_inode(struct inode *inode, void **private_data, int *index) { - int minor =3D iminor(inode); - int major =3D imajor(inode); + int minor, major; struct xilly_unit *unit =3D NULL, *iter; =20 + if (!inode || !private_data || !index) + return -ENODEV; + + minor =3D iminor(inode); + major =3D imajor(inode); + mutex_lock(&unit_mutex); =20 list_for_each_entry(iter, &unit_list, list_entry) diff --git a/drivers/char/xillybus/xillybus_class.h b/drivers/char/xillybus= /xillybus_class.h index 5dbfdfc95c65..4dbed9adcaf8 100644 --- a/drivers/char/xillybus/xillybus_class.h +++ b/drivers/char/xillybus/xillybus_class.h @@ -8,6 +8,9 @@ #ifndef __XILLYBUS_CLASS_H #define __XILLYBUS_CLASS_H =20 +#define XILLYBUS_MAX_NODES 1024 +#define XILLYBUS_MAX_IDT 1048576 + #include #include #include diff --git a/drivers/char/xillybus/xillybus_core.c b/drivers/char/xillybus/= xillybus_core.c index 3ae95e6b17e9..fc489908c40c 100644 --- a/drivers/char/xillybus/xillybus_core.c +++ b/drivers/char/xillybus/xillybus_core.c @@ -351,6 +351,12 @@ static int xilly_get_dma_buffers(struct xilly_endpoint= *ep, struct device *dev =3D ep->dev; struct xilly_buffer *this_buffer =3D NULL; /* Init to silence warning */ =20 + if (bytebufsize =3D=3D 0 || bytebufsize > 0x40000000) { + dev_err(ep->dev, + "Illegal buffer size requested in IDT. Aborting.\n"); + return -ENODEV; + } + if (buffers) { /* Not the message buffer */ this_buffer =3D devm_kcalloc(dev, bufnum, sizeof(struct xilly_buffer), @@ -623,6 +629,12 @@ static int xilly_scan_idt(struct xilly_endpoint *endpo= int, return -ENODEV; } =20 + if (count =3D=3D 0 || count > XILLYBUS_MAX_NODES) { + dev_err(endpoint->dev, + "Unreasonable number of channels. Aborting.\n"); + return -ENODEV; + } + idt_handle->entries =3D len >> 2; endpoint->num_channels =3D count; =20 @@ -725,8 +737,18 @@ static ssize_t xillybus_read(struct file *filp, char _= _user *userbuf, bufidx =3D channel->wr_host_buf_idx; bufpos =3D channel->wr_host_buf_pos; howmany =3D ((channel->wr_buffers[bufidx]->end_offset - + 1) << channel->log2_element_size) - - bufpos; + + 1) << channel->log2_element_size); + + if (howmany > channel->wr_buf_size || + howmany < bufpos) { + dev_err(channel->endpoint->dev, + "Illegal buffer fill level from hardware\n"); + channel->endpoint->fatal_error =3D 1; + spin_unlock_irqrestore(&channel->wr_spinlock, flags); + break; + } + + howmany -=3D bufpos; =20 /* Update wr_host_* to its post-operation state */ if (howmany > bytes_to_do) { @@ -1902,6 +1924,11 @@ int xillybus_endpoint_discovery(struct xilly_endpoin= t *endpoint) return -ENODEV; } =20 + if (endpoint->idtlen < 4 || endpoint->idtlen > XILLYBUS_MAX_IDT) { + dev_err(endpoint->dev, "Invalid IDT length. Aborting.\n"); + return -ENODEV; + } + /* Enable DMA */ iowrite32((u32) (0x0002 | (endpoint->dma_using_dac & 0x0001)), endpoint->registers + fpga_dma_control_reg); diff --git a/drivers/char/xillybus/xillybus_of.c b/drivers/char/xillybus/xi= llybus_of.c index 46e1046abfca..44b0c754deb2 100644 --- a/drivers/char/xillybus/xillybus_of.c +++ b/drivers/char/xillybus/xillybus_of.c @@ -53,6 +53,9 @@ static int xilly_drv_probe(struct platform_device *op) =20 irq =3D platform_get_irq(op, 0); =20 + if (irq < 0) + return irq; + rc =3D devm_request_irq(dev, irq, xillybus_isr, 0, xillyname, endpoint); =20 if (rc) diff --git a/drivers/char/xillybus/xillyusb.c b/drivers/char/xillybus/xilly= usb.c index e2270a64b659..5b6a15962885 100644 --- a/drivers/char/xillybus/xillyusb.c +++ b/drivers/char/xillybus/xillyusb.c @@ -396,6 +396,12 @@ static int fifo_init(struct xillyfifo *fifo, fifo->size =3D fifo->bufnum * fifo->bufsize; fifo->buf_order =3D buf_order; =20 + if (!fifo->size || /* Unsigned integer overflow */ + fifo->size > 0x40000000) { /* Avoid signed int issues */ + mutex_unlock(&fifo_buf_order_mutex); + return -ENOMEM; /* Reported as greed for memory */ + } + fifo->mem =3D kmalloc_array(fifo->bufnum, sizeof(void *), GFP_KERNEL); =20 if (!fifo->mem) { @@ -893,6 +899,7 @@ static int process_in_opcode(struct xillyusb_dev *xdev, struct xillyusb_channel *chan; struct device *dev =3D xdev->dev; int chan_idx =3D chan_num >> 1; + struct xillyfifo *in_fifo; =20 if (chan_idx >=3D xdev->num_channels) { dev_err(dev, "Received illegal channel ID %d from FPGA\n", @@ -917,7 +924,10 @@ static int process_in_opcode(struct xillyusb_dev *xdev, */ smp_wmb(); WRITE_ONCE(chan->read_data_ok, 0); - wake_up_interruptible(&chan->in_fifo->waitq); + + in_fifo =3D READ_ONCE(chan->in_fifo); + if (in_fifo) + wake_up_interruptible(&in_fifo->waitq); break; =20 case OPCODE_REACHED_CHECKPOINT: @@ -2077,6 +2087,13 @@ static int xillyusb_discovery(struct usb_interface *= interface) } =20 idt_len =3D READ_ONCE(idt_fifo.fill); + + if (idt_len < 4 || idt_len > XILLYBUS_MAX_IDT) { + rc =3D -ENODEV; + dev_err(&interface->dev, "Invalid IDT length. Aborting.\n"); + goto unfifo; + } + idt =3D kmalloc(idt_len, GFP_KERNEL); =20 if (!idt) { @@ -2111,6 +2128,12 @@ static int xillyusb_discovery(struct usb_interface *= interface) goto unidt; } =20 + if (num_channels =3D=3D 0 || num_channels > XILLYBUS_MAX_NODES) { + dev_err(&interface->dev, "Unreasonable number of channels. Aborting.\n"); + rc =3D -ENODEV; + goto unidt; + } + rc =3D setup_channels(xdev, (void *)idt + 3, num_channels); =20 if (rc) --=20 2.34.1 From nobody Fri Oct 2 03:47:13 2026 Received: from mail-ej1-f52.google.com (mail-ej1-f52.google.com [209.85.218.52]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id B5D73434E33 for ; Wed, 5 Aug 2026 11:14:09 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.218.52 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1785928452; cv=none; b=vEj6tbXqJ4gzRbf/Sxb6FbCFFCVkJum+S1AoRujrm0Y678dI2YLzsAToHPAn/Ra9dhcOyD5YJtKJO+B3b1rBKZ2p1DXPx+rjrfysC357sF3GVOwWqLZfJDWDbEUxbjVoxcjDXk194i3ITR/s8JIqmh2HrqvZBnsKA22QB5weUys= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1785928452; c=relaxed/simple; bh=FOOghro7qZwYgHNjKKxdFCrxBNiG7JkWlE0RVdGXOS8=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References; b=rbRMrE50wCZsXppKnTpa6+WTuxsuIFlWrd1yBrNB6EJ4TOdJCZsou4DJXLA9voHdsi8pljQPycLrctZQrP05/EjNThP3N5qlOoIqoGiGM43p79jTAENlMBvZYJyE36PQ3FU7fOVfqNawm3NV9wMDVrJelFD4QSjoNOQL5Up6+Nw= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=OlOyHWVD; arc=none smtp.client-ip=209.85.218.52 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="OlOyHWVD" Received: by mail-ej1-f52.google.com with SMTP id a640c23a62f3a-c1f5208b38dso161849166b.0 for ; Wed, 05 Aug 2026 04:14:09 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1785928448; x=1786533248; darn=vger.kernel.org; h=references:in-reply-to:message-id:date:subject:cc:to:from:from:to :cc:subject:date:message-id:reply-to:content-type; bh=MSWyXzm+G3lBkplOgT3Cpqpm+rO82dv/Nj41oYb8Fh0=; b=OlOyHWVDBNmD39rauz6TxyvGEREYouhvKuJ6LvyRojXkbH1eEJBiL7Uf1dzUWDgo9c zeij26lacl8KsUX/FkRuukhsjqxI3RC8VlNnc1R7Ya6LjncN5zbB0YUcRl53G7dfMDny a0euHPRdffdiOWXnm1j1uPqmhWZG2/E8hiLkY1LDr+zV8dIoUYOXrI1U/qy86kZJtOBi C6fgMsm/WZQKN+AL/kmWwKOm2r2o6rgqMlIkydhYNzZUfzXfPNQfPHAz+vlTXJ1FMYcF GKnVOJekvq+2BKrRcoY5ooZwKBP0O7XigTxdqVPQPwjzWKIk8ND3YDTaKj4t86euhsxv AEGw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1785928448; x=1786533248; h=references:in-reply-to:message-id:date:subject:cc:to:from:x-gm-gg :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to :content-type; bh=MSWyXzm+G3lBkplOgT3Cpqpm+rO82dv/Nj41oYb8Fh0=; b=VnAV2EpICjOFDFzpNzU6R4vX95cYJUki5ifT9K1t73SG/+ZFv6/tqVnTYONrra6NtU pd+rhvmM4tVFaRAwBsIyvUI+YOCzQP5wFGry+IhHgSamcRENEskwtHTXqDtFE2wBl03q 9UbVea7XaL0IwpxNj0BzBhUEwRP+/PSuqj8GC5oyIf+dCGZESbilqkVkkrxO6+HTWWg2 mseu/3CxFnfC+ExUCrS73jNd/qCArsb7BhFLyzCisXoX+buYx4eGe8tkrIh4gSpwYg1n CA/exopk2EuhCkz9Qe+CbU7ARwx7I4uh/Q+gjgray5lt4yA2GfEmVWhjnB99KOC4FXCZ uNvQ== X-Forwarded-Encrypted: i=1; AHgh+RpMTBgDofMChwG779zz49VXUxXDowGuca0zed3MA13o9VslPksBv3cNzrBZyhLRzInoasWSbWJeZDqCNNs=@vger.kernel.org X-Gm-Message-State: AOJu0YwScp5fffUoCCNdSZU3/AtmSRsZkqO24CDosLQ9RYTHJQWUo/kL e8CBdOrqAVSjk/Ri9K37GePVqeJDTKqPu5mzFdghezsN3LL2QU8xbmnPN4hg89Un X-Gm-Gg: AR+sD102J5d5qUa1/f87/dghd5aUL8gNlXaQdLzP6PebjOTbbdwuLzUunrmMpEGRn0b 7ZRS/FzOZ6AzWECpDh7J4gfjmWCXsrzXgWheuj1IR1x0C8eIFAW++bMm5tzcmPkXEegydJmJ5si IEXz8XATqQPBSdNp0jS4biZk/oNQ1vRzzxiPD8KzNLH9qk4j9oiO/pWuokgJJpqzmKcFgJx7lxw pexOLnG17D0lkKcAyQez1g66xsMRRiKHHaAn3cnEnwYlmB8EId82p6nb7eMeAbPoOh4O/0faVb/ v+xeWejeYcSz8w8wXMqj2OtcUbdxB/dPnUqMGdvNGGjpYFI/YglhNrcdJQ93cA5wIJJv14u12Sq eQfejGrwYApAvQwFP87f8rm0W/egKvbjTWHUmtWo8y5iN5gOne9UA1xIUa8/x3KypbW1Awyzacb eQVVj83dib16XO2qeaeFwV2HN2vqWLCqjOyaBkhVR1jZCwoWqJOaqmt0qGsek2HYbe0rPdMCcMS wnzSQPh1yCxa6QC X-Received: by 2002:a17:906:fe4b:b0:c16:6c84:4b8e with SMTP id a640c23a62f3a-c2039cc42bamr297299766b.14.1785928447664; Wed, 05 Aug 2026 04:14:07 -0700 (PDT) Received: from localhost (c-85-228-45-68.bbcust.telenor.se. [85.228.45.68]) by smtp.gmail.com with ESMTPSA id a640c23a62f3a-c20364227e8sm98598766b.42.2026.08.05.04.14.06 (version=TLS1_2 cipher=ECDHE-ECDSA-CHACHA20-POLY1305 bits=256/256); Wed, 05 Aug 2026 04:14:06 -0700 (PDT) From: Eli Billauer To: gregkh@linuxfoundation.org Cc: arnd@arndb.de, linux-kernel@vger.kernel.org, corbet@lwn.net, Eli Billauer Subject: [PATCH v5 7/7] char: xillybus: Ignore and report unsolicited interrupts Date: Wed, 5 Aug 2026 13:13:37 +0200 Message-Id: <20260805111337.69178-8-eli.billauer@gmail.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20260805111337.69178-1-eli.billauer@gmail.com> References: <20260805111337.69178-1-eli.billauer@gmail.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" During initialization, the hardware should issue interrupts only in response to requests from the host. Ignore and log unexpected interrupts, as these indicate misbehaving hardware, and return IRQ_NONE when the interrupt appears to be spurious. In the same spirit, in xilly_quiesce(), assign endpoint->num_channels =3D 0 before allowing the ISR, in order to expose whether the hardware incorrectly sends messages related to data channels during shutdown. Assisted-by: Deepseek:v4-pro Kimi:K2.6 ChatGPT:GPT-5.5 Claude:Sonnet-4.6 Assisted-by: Sashiko-0.2.5:gemini-3.1-pro-preview Signed-off-by: Eli Billauer --- Notes: Changelog: =3D=3D=3D=3D=3D=3D=3D=3D=3D No change on v4->v5. =20 Changes v3->v4: -- Return IRQ_NONE if the interrupt is considered spurious, following Sashiko's remark + add attribution to Sashiko. =20 Changes v2->v3: -- Add Assisted-by tag to description =20 No change on v1->v2. drivers/char/xillybus/xillybus.h | 3 ++ drivers/char/xillybus/xillybus_core.c | 47 ++++++++++++++++++++++++++- 2 files changed, 49 insertions(+), 1 deletion(-) diff --git a/drivers/char/xillybus/xillybus.h b/drivers/char/xillybus/xilly= bus.h index 51de7cbc579e..98c7ac4dd1f9 100644 --- a/drivers/char/xillybus/xillybus.h +++ b/drivers/char/xillybus/xillybus.h @@ -94,6 +94,9 @@ struct xilly_endpoint { __iomem void *registers; int fatal_error; =20 + bool allow_isr; + spinlock_t allow_isr_lock; + struct mutex register_mutex; wait_queue_head_t ep_wait; =20 diff --git a/drivers/char/xillybus/xillybus_core.c b/drivers/char/xillybus/= xillybus_core.c index fc489908c40c..b35d8eda15c9 100644 --- a/drivers/char/xillybus/xillybus_core.c +++ b/drivers/char/xillybus/xillybus_core.c @@ -72,6 +72,8 @@ static struct workqueue_struct *xillybus_wq; * * rd_spinlock does the same with rd_*_buf_idx, rd_empty and end_offset. * + * allow_isr_lock protects allow_isr. + * * register_mutex is endpoint-specific, and is held when non-atomic * register operations are performed. wr_mutex and rd_mutex may be * held when register_mutex is taken, but none of the spinlocks. Note that @@ -84,7 +86,8 @@ static struct workqueue_struct *xillybus_wq; * Only interruptible blocking is allowed on mutexes and wait queues. * * All in all, the locking order goes (with skips allowed, of course): - * wr_mutex -> rd_mutex -> register_mutex -> wr_spinlock -> rd_spinlock + * wr_mutex -> rd_mutex -> register_mutex -> + * allow_isr_lock -> wr_spinlock -> rd_spinlock */ =20 static void malformed_message(struct xilly_endpoint *endpoint, u32 *buf) @@ -119,6 +122,13 @@ irqreturn_t xillybus_isr(int irq, void *data) unsigned int msg_channel, msg_bufno, msg_data, msg_dir; struct xilly_channel *channel; =20 + guard(spinlock)(&ep->allow_isr_lock); + + if (!ep->allow_isr) { + dev_err_ratelimited(ep->dev, "Unexpected interrupt! Something is wrong w= ith the hardware.\n"); + return IRQ_NONE; + } + buf =3D ep->msgbuf_addr; buf_size =3D ep->msg_buf_size/sizeof(u32); =20 @@ -137,6 +147,7 @@ irqreturn_t xillybus_isr(int irq, void *data) if (++ep->failed_messages > 10) { dev_err(ep->dev, "Lost sync with interrupt messages. Stopping.\n"); + return IRQ_NONE; } else { dma_sync_single_for_device(ep->dev, ep->msgbuf_dma_addr, @@ -283,6 +294,19 @@ irqreturn_t xillybus_isr(int irq, void *data) } EXPORT_SYMBOL(xillybus_isr); =20 +/* + * xilly_allow_isr() is similar to enabling / disabling the interrupt, + * with the difference that if an interrupt is issued while ep->allow_isr + * is false, this is visible in the kernel log. + */ + +static void xilly_allow_isr(struct xilly_endpoint *ep, bool newstate) +{ + guard(spinlock_irqsave)(&ep->allow_isr_lock); + + ep->allow_isr =3D newstate; +} + /* * A few trivial memory management functions. * NOTE: These functions are used only on probe and remove, and therefore @@ -651,6 +675,8 @@ static int xilly_obtain_idt(struct xilly_endpoint *endp= oint) =20 channel->wr_sleepy =3D 1; =20 + xilly_allow_isr(endpoint, true); + iowrite32(1 | (3 << 24), /* Opcode 3 for channel 0 =3D Send IDT */ endpoint->registers + fpga_buf_ctrl_reg); @@ -659,6 +685,8 @@ static int xilly_obtain_idt(struct xilly_endpoint *endp= oint) (!channel->wr_sleepy), XILLY_TIMEOUT); =20 + xilly_allow_isr(endpoint, false); + if (t <=3D 0) { dev_err(endpoint->dev, "Failed to obtain IDT. Aborting.\n"); =20 @@ -1837,6 +1865,9 @@ struct xilly_endpoint *xillybus_init_endpoint(struct = device *dev) endpoint->failed_messages =3D 0; endpoint->fatal_error =3D 0; =20 + endpoint->allow_isr =3D false; + spin_lock_init(&endpoint->allow_isr_lock); + init_waitqueue_head(&endpoint->ep_wait); mutex_init(&endpoint->register_mutex); =20 @@ -1849,6 +1880,9 @@ static int xilly_quiesce(struct xilly_endpoint *endpo= int) long t; =20 endpoint->idtlen =3D -1; + endpoint->num_channels =3D 0; + + xilly_allow_isr(endpoint, true); =20 iowrite32((u32) (endpoint->dma_using_dac & 0x0001), endpoint->registers + fpga_dma_control_reg); @@ -1856,6 +1890,9 @@ static int xilly_quiesce(struct xilly_endpoint *endpo= int) t =3D wait_event_interruptible_timeout(endpoint->ep_wait, (endpoint->idtlen >=3D 0), XILLY_TIMEOUT); + + xilly_allow_isr(endpoint, false); + if (t <=3D 0) { dev_err(endpoint->dev, "Failed to quiesce the device on exit.\n"); @@ -1909,6 +1946,8 @@ int xillybus_endpoint_discovery(struct xilly_endpoint= *endpoint) =20 endpoint->idtlen =3D -1; =20 + xilly_allow_isr(endpoint, true); + /* * Set DMA 32/64 bit mode, quiesce the device (?!) and get IDT * buffer size. @@ -1919,6 +1958,9 @@ int xillybus_endpoint_discovery(struct xilly_endpoint= *endpoint) t =3D wait_event_interruptible_timeout(endpoint->ep_wait, (endpoint->idtlen >=3D 0), XILLY_TIMEOUT); + + xilly_allow_isr(endpoint, false); + if (t <=3D 0) { dev_err(endpoint->dev, "No response from FPGA. Aborting.\n"); return -ENODEV; @@ -1945,6 +1987,7 @@ int xillybus_endpoint_discovery(struct xilly_endpoint= *endpoint) if (rc) goto failed_idt; =20 + /* xilly_obtain_idt() allows and then disallows the ISR */ rc =3D xilly_obtain_idt(endpoint); if (rc) goto failed_idt; @@ -1963,6 +2006,8 @@ int xillybus_endpoint_discovery(struct xilly_endpoint= *endpoint) if (rc) goto failed_idt; =20 + xilly_allow_isr(endpoint, true); + rc =3D xillybus_init_chrdev(dev, &xillybus_fops, endpoint->owner, endpoint, idt_handle.names, --=20 2.34.1