From nobody Sat Oct 3 08:45:48 2026 Received: from mail-ed1-f41.google.com (mail-ed1-f41.google.com [209.85.208.41]) (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 C13123FD121 for ; Wed, 5 Aug 2026 09:35:42 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.208.41 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1785922544; cv=none; b=Nd/amFbOCeKwr7qB2DIITRItsELBJNRChBU/2j/rfJd0r/shRRfu0WoSC5BKKwzerzRx/IOIS+pKZCvSVSxWU5DtaiHMaJeDQLpTitKLde41rru8krPsWrqfFzQVlQF6KOWwWRRvdiCwcLD3inagd7oTNIM9Xu3yGdEDpIj3+vA= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1785922544; c=relaxed/simple; bh=q66HLdCYKRRsu+CZElgAerKAoYzQDJBRy2q/4u8Fk/g=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References; b=SQlrOppg6DXP73XW30tzLMh0bEKcZ7NsvdIdVUekStrzcefrk01HMqKVwEfrM9/mix2MRyGUx3PbDZbzpkshEMK+nDfer47f+IVrrerx6qWMG9biO879r3x+dd8VUZ0DiQbEr9Xf3M8xIwKeajGhaVuQnmeUK4qglF2JhR9uJyw= 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=pjfkSHl1; arc=none smtp.client-ip=209.85.208.41 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="pjfkSHl1" Received: by mail-ed1-f41.google.com with SMTP id 4fb4d7f45d1cf-69f7fa1c548so1125635a12.2 for ; Wed, 05 Aug 2026 02:35:42 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1785922541; x=1786527341; 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=Nxq12XQVNJ86CkZORzZuuH+9O2BmrlK1pCWISZ3LSdw=; b=pjfkSHl1k8bzL35jk7EJwmya5IdFfRndrxo578MjWWo/vmsiIc3/LeZLJja3C1J3nM AZBhXi0r+X/08OchrSpNBb4YTJO4MrZDB2dGcWrl5MzHFxg/6mF3CpDdeFQTbjv5CERs aq3iX2NmCRRtZhnXmUT1xfIAN5rnr7HMW5628xztv66dNjzbiMlSOBvhPzb/VnGo4WUw gzgIVDSb5ySyNQYRyxITepQyx4ufjtfF5AORiuoDPZtvzyi+0UPRcDLkd1K0lGWAwhWy objtKI8yeH+SVFVuExRfb9vDNyGYysdq+D1xs/Rp/ywHOS8pbub8os+elfMKM2I/0xsG EV+w== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1785922541; x=1786527341; 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=Nxq12XQVNJ86CkZORzZuuH+9O2BmrlK1pCWISZ3LSdw=; b=DLkTDx/LtOeZsp6n8MPyL1xJ/5a0IsTkPLDNLZ51E71zEjSlDjvha11m9LsPinKbY+ zmQ7MuLw/fk82W3TbTNRTzx14aL9HbTVMXEK1jHY+scrSuRtqQp0OpbsOF/7+zUeDI/7 90C+oNXp3bKbNJ9GvDFSXuzYDLIUEyXsPlWvqaLHBYXF21Pgj+36DqAW+sx+Qn7eLH36 kaAK23czb8bDnaTqKBToR/Z44F2MwkLTCOpof0WgFjosPqKdhxGAmalAgOR8wiWhKCrZ U6DWcdSIc+cbDNyfSpLHMdXH2jBEITtRjZvaf0glDFCJqhSKp8vStnKsvAKMUcIebJzQ NbCg== X-Forwarded-Encrypted: i=1; AHgh+RonqophAcUae16dHhRgjxdt+MnoT6QUo/aKPqpP+QVNgZrzZIontS7tVL0xfLonaoDxfNv5XBYwW8KlF98=@vger.kernel.org X-Gm-Message-State: AOJu0YxuV8/I5C9LdBam5nWJE7J85LD+OgzHDCrNa3gGaWYIdtg2i0oB q6bczmjlC1hq23ZeF0tyKfBWzTZD7R8Z/BZ3GnVmxE4CkBouY2kK7ObG X-Gm-Gg: AR+sD12+4A55JCQC9xUx0NjzXZa3/fLAWhOi+ch4xBS7imquY9cm/NwwCp8IzslXijl 8MlzFDRGIaaLkn/Kk77aw9OnO9LssDt8PlgsZR3mdB7URZJlJ0AL/POHS8l+Mt2aVSaQwCd2+Ij dNj8wTlYlR3Qy48f5DKe7nOHzFjGAMJyLwxc9Ub0kYl8QYt3z7TWHEc8T+OFmz3o9Fs+RbUdpkY MwD42Ro6i4O1CovT16oalzIKUoRDOrB1QkTpWUrNqHQIjEq45ELWw4VUH7cri8GtfnAkSoQMyRn vRnylvotIlI6mw1MnQ6E6I3JhLU+82XAo97HNRYPj0dPUtLx1xvq9vYrM2dr9Rd8uET7WSicPEa oTfR/JDEkTiCowkRZup+oy5KGVc5DEclWriqF8NeE4xVP46t9qXuxibs7qFpAW/xuTcLMqTgMY8 L5wbAY9Sbc2CcdTuvwi5Q9OoEjKBJcBpcychq/o6MbK/196wHJFX0WCl2sdhnuUG6ntu65z431y 7UV0gpcSMow8IpM X-Received: by 2002:a05:6402:4559:b0:698:b6c8:70db with SMTP id 4fb4d7f45d1cf-6a14f0b916bmr2198132a12.8.1785922540868; Wed, 05 Aug 2026 02:35:40 -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-6a1453d3825sm1729158a12.0.2026.08.05.02.35.39 (version=TLS1_2 cipher=ECDHE-ECDSA-CHACHA20-POLY1305 bits=256/256); Wed, 05 Aug 2026 02:35:40 -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 v4 1/7] char: xillybus: Improve control of execution flow with mutexes Date: Wed, 5 Aug 2026 11:34:30 +0200 Message-Id: <20260805093436.59740-2-eli.billauer@gmail.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20260805093436.59740-1-eli.billauer@gmail.com> References: <20260805093436.59740-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 =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 Sat Oct 3 08:45:48 2026 Received: from mail-ed1-f44.google.com (mail-ed1-f44.google.com [209.85.208.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 E44D43FDBE2 for ; Wed, 5 Aug 2026 09:35:44 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.208.44 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1785922546; cv=none; b=FN/1/kDc/aTht9TgrZbayowLfmut7iADAN4d2pYYpsn6Xkh3sCOPBffMIHTDz4ccdjHHgFPK4kEBn5kKPVc/COxbkmzNJCKbDNaFpL+2BBa1el7OQ5+1K2dnhr4bbvNaw7+MdmRJaodNrRUDFH4FETBZKGhX9kgvOIw279S8zuE= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1785922546; c=relaxed/simple; bh=wbEz3/GgiyV/LRwtjv5NF5lwFtBKS/paYLiWip9AfRs=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References; b=FA6iUkcP8ypfiMovSlq6ny4XwLXDBWMA4U85K/t3U8EaqYKc7Y9tRYKQ5PtC0V0z0/OChMI7nVaP9wba1PCe9oOOlYaQhseuLZGdXFsFV2LtQCLq90ibVAkBn9dXUJazrFliRXATIviqrQmnCN4jS86djdCtIS3POgfxkZw+GN8= 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=joO7kjEh; arc=none smtp.client-ip=209.85.208.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="joO7kjEh" Received: by mail-ed1-f44.google.com with SMTP id 4fb4d7f45d1cf-6a063d211ebso989908a12.3 for ; Wed, 05 Aug 2026 02:35:44 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1785922543; x=1786527343; 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=phuXBEgi+sUfdKAX70E2L8fJ1PdsrWN+n3/h1ZeXFss=; b=joO7kjEh56ucMqHIfFXpTeQcWRGeVbVW3XNHKRrrkGam0PGkL5s38U8y4hFMHniR1Q LmovuhHcICBJ8X0rI5kbvrQaqZZBKOwvhrIrAAybeiGrK+JnD3+glbj41b+WrsK79fvU TQJqJLyEnOKjIwMiZQXTeCFjNfzJXGo5BEwIZTd6shvqi5Y7hDHeUF9MhwW3NOOSOrle t4Irlj7QOx6Sdvt1Ba2/QuY3zqj9jN2/hWLt9EfWmGKZphjfkbl9dZWn4Q3uvyNuSp8I KwW42tjthEBPP7t+5zir9O55xpkBegR/xjiLFxkpX7HftLfunXQO6oBDF28tkLpOGvyx 0kpg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1785922543; x=1786527343; 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=phuXBEgi+sUfdKAX70E2L8fJ1PdsrWN+n3/h1ZeXFss=; b=H9B+ZzHjeZT7Du6P4WuSg4Nc+jhnJhFeKDzjDul703I+6s1QW/bE6Km+dlwXoYcaPc cYcXp9WJH5S2Ao0dLoTVvg+wWZkRUExSOi3kZS3EP6QEMyYsluM+LITj2132TuNhCGYW ZPfUslmbwmGMwG7yRad4jfi95tG7tZT/RZ4yPizmB3IK3KeaX3CeaE9bRTcTG/1HB7MG KgdGcboNl3qky8VU8e/TnRcDxw4I8yh+ZR+yEeb4LO4Q5/IEHKY9Pg3VP8jfcak1LFzd JbN+KxxZ1E8auw1MMWMXkZG0estDVJ/U2Yqv6AjoBDkSd2yk/6oq6jfqAULqucu0yLZP YrQg== X-Forwarded-Encrypted: i=1; AHgh+RqunfUpp3ldIyGOB0agm30DXn0Jh4JpBKYDHhcUlck8CcP7Y89DtB6B7WJ+ShCELbRy+4dF3VOF0GTAVDM=@vger.kernel.org X-Gm-Message-State: AOJu0YyxfslWCsX1gHmEPW9aNianlCWBR0kuIb9P24d66iYnAJDzingY GJrsGobZraVUuD/q96M43SLd2qmwbdXRYZfp1r2bP/be1F5l6dpuXkUhv4wGx+tobJo= X-Gm-Gg: AR+sD10yqXNTgCtSrQfPR3xUzGrsq65vHIBX10ugTxzyPnUy0fqPpGs15z7g9Ty8QLt 6jwfxIE5NYOvRPlrBn26q4rYgwGaDh/uAK2BJvAHrDMZ0rzxcprnoHSggHK+wFl78uL9HWOK2vO ZEqeiX4ahw/nQ9Pm6mFsNmXQ9NgTp2VFLzZoXu6rHHeUdSE+zyl+RpbV4e1AN/h4pixXuiJBmoq +pWV06D83YO9DO953vDFZb4BAvoYb8JXLLsdfwO98pIQWOezSEpFVCzN8E3n5rvvwpB5KOE4wWX 1IBGURrK4i4qBK+iIlsWAOdSVsvASWC4UCYQ4HHFnm/Wx26xvOuQNx1M0p3J15MY1+JGYJuTWwm oC4u1dO7TaPj3Crnw60Nf0yx5R3/s21k37OwU7ee9ToQm6pWw9VCNICmPJWVNxVyI2TqwrXzX0a scVFMCQh/IWxVCd012kaDuzXzSqj9Bf2Ebwae4HkA0HCjqREboBbjKVsYsjYtFofzu49BS6DG3Y cj+RFfngEtpV9rd X-Received: by 2002:a05:6402:1cd0:b0:6a0:a644:355e with SMTP id 4fb4d7f45d1cf-6a14f0a1306mr2873890a12.2.1785922543057; Wed, 05 Aug 2026 02:35:43 -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-6a17760bff2sm934561a12.20.2026.08.05.02.35.41 (version=TLS1_2 cipher=ECDHE-ECDSA-CHACHA20-POLY1305 bits=256/256); Wed, 05 Aug 2026 02:35:41 -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 v4 2/7] char: xillybus: Remove duplicate error path code Date: Wed, 5 Aug 2026 11:34:31 +0200 Message-Id: <20260805093436.59740-3-eli.billauer@gmail.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20260805093436.59740-1-eli.billauer@gmail.com> References: <20260805093436.59740-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 =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 Sat Oct 3 08:45:48 2026 Received: from mail-ed1-f43.google.com (mail-ed1-f43.google.com [209.85.208.43]) (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 A688B3C199B for ; Wed, 5 Aug 2026 09:35:46 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.208.43 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1785922548; cv=none; b=N91UYEJWEBGTSyyiUAS8eGZfOnvlm7uWqTBuuq4TCuzEgQSWdA5fSm8k/0YEASWAXk9yhS+IvRM5PkRd+NaMCKqLCulDgs0NAFsn8Hfky5KZt0f4KmXoAdZY2SoUj5BiWRhR5GmjTwYfbfC8nb+tdt/t3+j8lNz/qZqTcS1JU/8= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1785922548; c=relaxed/simple; bh=nlAx5fsu2AHnSkBpEdoinWcuL6oav9jolzSmj/atocg=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References; b=plOTsXBZf2yLlje8Vr6s2XpVu3f9oD5iLUoOzpBT04d/TYqfpTsOyf/H9KjVzV/B1V/sljEm57x0Kkyzz6q2LdM+J3glxKsYFKSIyniOvhGFMvOS25qrFmcjYrU/IOD9aKYyXS3H9sYIE/h/j0SwpydfA8/SeuNdwKqJnuQ8xNE= 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=H1M3I00q; arc=none smtp.client-ip=209.85.208.43 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="H1M3I00q" Received: by mail-ed1-f43.google.com with SMTP id 4fb4d7f45d1cf-6a082b3671fso924081a12.3 for ; Wed, 05 Aug 2026 02:35:46 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1785922545; x=1786527345; 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=YpYDoGADK8xl8Xh4EpfREYz6Ppfbb5MMZKbEyqLs/H0=; b=H1M3I00qOkvl0wqfiihvG1jjqL3M9b5tnXL6lk6ZHnfh/VGcUdbo+PdpTuR7qqPjiq JQx5UdEfMzbQykkmQEGJIZ2uuXk8XUHbL55MOk/uh8Amq0vtcmLulIq517hPVWOY5BXw H02lktNNe4tz/TkWjKiZda+z0dsyxJzWpnTvgpZQN/BxrEB/SpWBz1xU+tJbTxMG0zYi tA5wVfRPi4wCN4/+tRRKnfcwR4DcpO907e9Psi2I1EZoZIz6su87bn4P4OV2ukk26SWM vRJas4+gxyOXbUaA2b7abyB91QKDE0ijxcc3swup7ccxRAdE6ftxlSiaD8/NRU05adLG RBOA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1785922545; x=1786527345; 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=YpYDoGADK8xl8Xh4EpfREYz6Ppfbb5MMZKbEyqLs/H0=; b=WE5+sk+5Exn0XIlB6Nna9R0wTEHnb886l7CaNxKbjHGVOgMBn6jPwz5VdCFGcDhxqV iiydt42ndCXyHlcFVoJqasb7VPFrlR4hin+DGYJfzPPV5SE845vYtETpSEJKhCFyO7qT DFPkCDmY1A/UvZ6oE5x5jumtBJv+imuCTLC8JGpzFu5ILp9wX/PrEAOjHYyq5787b5fc F6o0LD8ac2v3f+cN3+deBJ+ivxdPICTknPhm80q56KPdJ1a9sOSIg6HW5Evn2D/tB5JK JIlZHHT9NtVy8wN2811f+igOxXkim9EDzYvfqxeYCQGB9eei/0vlT6yifKYUP4+p9CKr 8ASg== X-Forwarded-Encrypted: i=1; AHgh+RojAuJprwoMGsa6IympgrjTbU7S4Zt3TUUZVA5zsimRRqJCBeJvuiziZ4/byah5Rn2gsb/WIyyDVxrJBdU=@vger.kernel.org X-Gm-Message-State: AOJu0YyBxZESerzpf4ihS1/ABNR5/Z+zHXUB2Zkvi1o3j61FqfrFWwxr a1TXxao74HvTxgDJTn5w6KgBnOoLbyVfot/qo9AYpwI4ycXG13D7fupN X-Gm-Gg: AR+sD137+0syjmGx4+WQxwZaq0mHShGlcxF9SZaz6bgq2GPyDhDECmBfyPGcr4J0Cov i09q+qANnD93lkSR7j01duTV7IeJo2piOLR3HVRg/7+CaYfaG23vn5PHaEWjL6BZkrbb0q2otMp JH/+zoBxCVQEj5NQFA9FasNM4WR3ujVyIcJop1ECtHyVX761T1xWmmBxT8Ebi7DcYgLxtiZZjbF itekzRkAarAeo0VX2hwZgtZLwwc7hkWoRH3YcQEY6OaSdHHXfanGNNSvxiVcoLMShrRvWj0+r58 lEsqRBJ4azHL0eGeZWMshZ4qwrN7eaui1U5WZtPr8/+C/nPavQNsqAanAsr3Y5d0gW8AF8K5vYF hvfcFThpVy4VM5vtvFLekcf3pUQoasH/g2T2NMZ/igD6dGDBH00AHmMsol//BZMYQDT+8Yb5nce JDgHanKKTZ72/NNjguvHKQO5bfQ3ZGNE/97vpVT/zNIyTzz+kpjVDAN/gclVb53Ns7OzWaw304V rNBsxjfupRtgg6Qb2uyXK1u9STN X-Received: by 2002:a05:6402:5045:b0:6a1:2863:ad75 with SMTP id 4fb4d7f45d1cf-6a14f12f0c3mr2568258a12.13.1785922544822; Wed, 05 Aug 2026 02:35:44 -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-6a145c27d7bsm1667402a12.4.2026.08.05.02.35.44 (version=TLS1_2 cipher=ECDHE-ECDSA-CHACHA20-POLY1305 bits=256/256); Wed, 05 Aug 2026 02:35:44 -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 v4 3/7] char: xillybus: Avoid possible bandwidth inefficiency Date: Wed, 5 Aug 2026 11:34:32 +0200 Message-Id: <20260805093436.59740-4-eli.billauer@gmail.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20260805093436.59740-1-eli.billauer@gmail.com> References: <20260805093436.59740-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 =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 Sat Oct 3 08:45:48 2026 Received: from mail-ed1-f46.google.com (mail-ed1-f46.google.com [209.85.208.46]) (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 9C7C83FDBE7 for ; Wed, 5 Aug 2026 09:35:48 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.208.46 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1785922550; cv=none; b=XiY7CJxIAx3XL6tCnToIY4Yda0t99Da4MAibdmNY1EAkxonJy8aNr4LhFZN6BaqoxZVmRQWkLQoEDWXL0fHwZi1ZBNLwOVnpCEC5fyKXfRYMtC3em75fa2z43LX3D967l3h26CUPe/m6eT2ogn4lzkB/M+ZMjf0Zyi5TDb6iRY8= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1785922550; c=relaxed/simple; bh=p+p8W4MgN9b8RWWgCixK+8EJrMWDnZxeABj4CHUbl9c=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References; b=UFjDW8VZGfyGdbDQ6lMXnxYMuTLFXCxlOfiV9T2vIYPScsEKM42si1HkGB36wJS3sT4ekCEdSmvO2Ece2X/5CQc2FBUIuKfZZe2+Fo+lMtveY+z9wQ6UO1ggAP3GtgxYdTLDnkJoVozM6w4uNyJ2SOl36frxe0Zk1cX+g/U1eD0= 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=oZSdI0g6; arc=none smtp.client-ip=209.85.208.46 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="oZSdI0g6" Received: by mail-ed1-f46.google.com with SMTP id 4fb4d7f45d1cf-6a14f762de4so930280a12.0 for ; Wed, 05 Aug 2026 02:35:48 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1785922547; x=1786527347; 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=DcNVtLGy4fr4mNMQ0zx7myIqGPoEGYnS3E48RlqOqW4=; b=oZSdI0g68xGUV1opKsPxZNqNDfUttAXROTzKUIGWK97pt8U/bpBwiKbxhY/7PsjItm 9SonLkqtinQ70IZxNGxqyaNPliPAYPJjhAPwgin6KPFe7IotqQLJItsy3y9Qxe1o6DDe DfAyf/JAQBEwqRUaCW0ibyrriIy9LtABKA6fijJepcnkl3bbI4A/jpOO3hXsWbFG/osz d7ITQ2HRWpQnVP/Y0Qj6Q1QVrvwUXrzYuJCoQoqcHjwqWrAV8zK7ug2cx8nnr3sPs6ti xj8pYZMqSYZnZck5bUZd+nvA50ik5Q5lS/FIhdX1iNEU8GX1EyX1QSVtpVsucTn2ZPs1 uyBw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1785922547; x=1786527347; 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=DcNVtLGy4fr4mNMQ0zx7myIqGPoEGYnS3E48RlqOqW4=; b=LTKJoY9N7oQvTdaW4Ju848GCWw3qCbIgM7TRD2MVWnlyywRQpNLpbrtJG1O9MSxJLu TXhuwlG3w+TU9GxaDBNu1x6e5jOX1SgRjOFTYav/lQAFTYl/4HMVI/D+pY/MxNK5RQwA KBylqAoPecFfyQyHUqBGDarouhBQaVXqV1UOM+ctJyt7nFh/B2lEEwclu/UptbdjT3o6 zRHviVffH/v2XmxiU49M+4dZONHDstY38sCVdRbgCjk53L4AjNGjBwY2e4zxGpezgmT4 0qy/kmEEZ4LpvBOrfFjuAf955z+T51R/HJtItk8MWN/Ek2jbIRZ4CvqFI6bDjkvAsBYV IPPQ== X-Forwarded-Encrypted: i=1; AHgh+RrMFB9LOiQ7RDT5+CW+FG2sXUkV7bqWrk3fJ6tkNzJUi/2EOV2m3dknDd7hH19xK+sa6lWDzoKOgbR/7eU=@vger.kernel.org X-Gm-Message-State: AOJu0YyaZSwDRIuKj8mOVq4RbSlPUOpTJh4en95UXAmJRlKuwAghy3yB teSYLAg8aWjtEgGVFvN9MtDudaoUUrUNmOcY6qqc+FD1LlegBqSjhX0z X-Gm-Gg: AR+sD12BNrvM29o75scdcwoO6eO7XU4JgTsb1/qNeIk+woZ5COvM0BIXppMuqmuqpt4 h+VYCoDqjug+7TD6+KdRV2MW3M4vggVKbCAX2s7Bx/npSL9nLPs3VQWr1spW0HiIeCkNf1AikmS IqavQAryrZyTxTJQANspxiO7dm8TB7PvS5PGCy4IpSWOQr6AwlFUsxZzACPrTlHKnoGbLd0DcuL RiTsNEMoEsKHRi82V5UZPg34lT6WaewxYg6zgJuJZIToXwFD/Ci1TbIRGOb/bWkdkzG6DD5OAc2 Rz8XCyU6klXN0xaXpt0SUca9GyT4lKtyKwPQaIhdUFU5D7DUmQDZPDk8m1wD7RDV0pgQ5+MOA03 Sy9hSm0Sn8q4aGikVelGRlYqg9FyJXFpRULNiYdwjwQMPRG3Wv2AVF+FDtIOW05010Y27HlhDZa UBLjfqYz191KbFDKkFUa2oNIAIKRqkQyQ8o/i/s50HH8k8WDU+IFEL2k49zbU9z4S5azCjTux/r JiqhcoQuE+Pqhcn X-Received: by 2002:a17:907:d38b:b0:c16:13c3:b1ef with SMTP id a640c23a62f3a-c2039d1daabmr226716766b.24.1785922546673; Wed, 05 Aug 2026 02:35:46 -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-6a145de6d01sm1596561a12.18.2026.08.05.02.35.45 (version=TLS1_2 cipher=ECDHE-ECDSA-CHACHA20-POLY1305 bits=256/256); Wed, 05 Aug 2026 02:35:46 -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 v4 4/7] char: xillybus: Use unsigned arithmetic for jiffies differences Date: Wed, 5 Aug 2026 11:34:33 +0200 Message-Id: <20260805093436.59740-5-eli.billauer@gmail.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20260805093436.59740-1-eli.billauer@gmail.com> References: <20260805093436.59740-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 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 Sat Oct 3 08:45:48 2026 Received: from mail-ej1-f43.google.com (mail-ej1-f43.google.com [209.85.218.43]) (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 2723C3FC5B7 for ; Wed, 5 Aug 2026 09:35:50 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.218.43 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1785922553; cv=none; b=ZDx0/AJwHkq8uYsocflqQchNrJuAN/o6dsiiG/eZovfJvDkfxgCqEokWn7epnaRkDPBDvrUAaJjEGh47wt37FXCHE5v0ff0O+yxX+LI8L+XUOZFqQChEDDJYcxtIzrBS1IKzlIrShb8WYrNKZLjKHsR6LwmAehSBRCxfMOsYLvw= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1785922553; c=relaxed/simple; bh=KXowkc/ljD5yI4iSSJBvq6TaV/Gb23GeEQGfZKg1n+E=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References; b=mjJhB862pHuvrM/yzCw6WHzDwTFuYL166pUrjNMXOOAOv2Xz1Sy8/jWXffEbVqSnX5/BMU4fqCs7lRIVkQKrpeXUJwOZOUs1pHHvbJHBiLcVJpRF29O5F57cqFR/SPjqSuLDRfIEudPEKIaom4O/LY0S0HCM0FVDi0EAGJmdGVI= 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=ICYYqaON; arc=none smtp.client-ip=209.85.218.43 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="ICYYqaON" Received: by mail-ej1-f43.google.com with SMTP id a640c23a62f3a-c15ca7a7ca9so83079166b.0 for ; Wed, 05 Aug 2026 02:35:49 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1785922548; x=1786527348; 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=Ku8QTspetYj8lLR50mkVMOWBFvWv4K2J0SdwVp76moE=; b=ICYYqaON6w1OENaZTBLK1QBt2nGos+J4K9Qz+DSEcoWRgCTLEC250oFfpftu/81pOw OL/nQ/xPB5VVgPwWLZWY/eyiYBRK68n7QeO0R9k3wUBTPWJpteS7WFp1eLgcpzRWTf2r dsf6VsPxjq8wJRlNxLSPNph8bpRLX3Yqf5DcEaiKI8y7e24z4CKT+QjcjGQhoAIasVh4 z0ja1Rfo9i7tFNC3nr+ggRgGsisnVQ2dZJgZ96h+C1Eu+/D7mN2zVjfM0q0mUml7uH+4 9Nl74NYt6wZffIGJCln4vo2RXUUky/+3+i2wt/iWiPCnLutGMUeLy84AOuDG+fKH67uC NkPg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1785922548; x=1786527348; 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=Ku8QTspetYj8lLR50mkVMOWBFvWv4K2J0SdwVp76moE=; b=O1CXaKl59h++QCWxWVek3v9q4J3eUdiS9c869Hq1Jggk7rhQ0KEMIZiw+rIV+uo6jo qDJ0tfgZ7SKxe/ixVNzVq3NA9laLffQMNBx7S83NfcNm4ZyYu2OtiDbzvhuHKyeI+7zD YrdwWkgKSONFMOwlKFb2Ol/z/4FdUfgHmjpM8BkCEOI2fbf+5l6ZC562HVHpZH4DOVl/ MS3f6x7bgA39CJi464SZfM+RUueZmCUB0A4+WdaE/rc0vkri/9OWqUPgL1u/JSy820lL TTaOD4vWNF+AaepTKDQ+M951qTK6ZKnLuxAOYT8LMI3GMTzwEtkTl1xheeAqL1igcMBg z6Eg== X-Forwarded-Encrypted: i=1; AHgh+Rp00jAmRmkkpzS/nyrJSgB1PhqZOiBUfIPspxVaIR+hp3Jsz5ccJRemZ2JfFohP9rjIqBqzmWLVYPEZkcQ=@vger.kernel.org X-Gm-Message-State: AOJu0Yyy7EqDZbxyOGcsyRMeBH+aJmv7vAdZVY6C5z8lFygefkTA6v/n jsSLvYzRAazH1AQbzztZAVPhbQumxgfvmyIM4wect3GuvJTnENx3q4aF X-Gm-Gg: AR+sD13JEC4i6AU3Ybrbw9vu/lhtabVVGIXgmVGNt4ZTDs1stneLqT0Vz2kxFyZzU4N dayRqxeHE/kPeqmykaadNcxKjuzPMuZGrSB+F73yyaU3fnv69+PVZViDkwHsaJqCZo16mvSQyfe 6CLsI2I0rGemxdN2GlaeqDdqBI6sVj68Ys3MYk7EdBVK4RK55Mste7O5KjMKoBS1jpNe/zYdpvK q7IYVR5bKvUmBQyfP/B5AezhcxJFa4Np+y2yGR0CLZdbFPhEq+NgR/UqFn00l7NHJcgQropJiyA /Cj4sc2e7WmuU3FWcZIhcdi3i8QapTqkO5OftB8KjZiwtv6jvXPYTLVH2X7JvmshCzSoPNWcc7J YzwUSgxtGjH1ZuH3wAIoSVPNTHfWeMRjeHW2lfilH7HjYgf4089GnPGLqtFpuEjF3MBqZ0WsGDN mnwR5fvu55gU05LDe1uIfci9WHWLBnmDBfY4oBNaCFBQl0Fc5We9s1To0F15Ekgf6VB5yHZguJz pwo2pm7NUjBpvzj X-Received: by 2002:a17:907:9455:b0:c15:bea2:d209 with SMTP id a640c23a62f3a-c2039abd3e8mr244824666b.4.1785922548220; Wed, 05 Aug 2026 02:35:48 -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-c203645c087sm87197666b.58.2026.08.05.02.35.47 (version=TLS1_2 cipher=ECDHE-ECDSA-CHACHA20-POLY1305 bits=256/256); Wed, 05 Aug 2026 02:35:47 -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 v4 5/7] char: xillybus: Integer arithmetic improvements Date: Wed, 5 Aug 2026 11:34:34 +0200 Message-Id: <20260805093436.59740-6-eli.billauer@gmail.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20260805093436.59740-1-eli.billauer@gmail.com> References: <20260805093436.59740-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 also ensure overflow wraps as expected. 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 Signed-off-by: Eli Billauer --- Notes: Changelog: =3D=3D=3D=3D=3D=3D=3D=3D=3D =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 | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/drivers/char/xillybus/xillybus_core.c b/drivers/char/xillybus/= xillybus_core.c index 7acebc1e6050..b264578b2572 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; @@ -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 Sat Oct 3 08:45:48 2026 Received: from mail-ed1-f54.google.com (mail-ed1-f54.google.com [209.85.208.54]) (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 2A4332F1FD7 for ; Wed, 5 Aug 2026 09:35:53 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.208.54 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1785922556; cv=none; b=hxUcG67GdlpT6TBn+7qd9xmK87buElmLGS851BkgmUD5WQzBWqORAq8vF1pfOd+vinVkDUN0buYdIxVGvSfscUZs7knIITxgtPhofVzuqT0bewZzJvvGv7KcwJ8x/do5sg4uQSvecHE7SAMid4N8mBvpx7C5UiE3zPVbiypx7Dc= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1785922556; c=relaxed/simple; bh=LEeciKp1jtVCyABoz9P0zidQ5UQx4Himxqp1lDk5wjI=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References; b=C0mV0f/Vr8ms8gzfJMF9olr7cWOzM+29KprBIQeSq+kGqBjvHWTT706qMI1AhVmJkujjKwqlstOhJajDwg+hdYZeWzvgUNwEk9WVpM0DGHf6r46gPUh4Vff1tEbDguKD2Wl9Q5u4+sPSz9Bn6gAVNZiji98YfrUUbsCLEhDgLPc= 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=JHADHolC; arc=none smtp.client-ip=209.85.208.54 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="JHADHolC" Received: by mail-ed1-f54.google.com with SMTP id 4fb4d7f45d1cf-6a0a4a17f91so1135155a12.1 for ; Wed, 05 Aug 2026 02:35:53 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1785922552; x=1786527352; 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=jDIj1IB1toOapiL1j0cj+fCCXDxdvdYq1IsWpOS35sg=; b=JHADHolCVnmq1qaGzFnaSobe1OjjrnTo3ez3oBwFbeo8HI2sSkR0L124rlsk/PcHnU j4yS2jlQGmrivTUQ3OPG5l6z8UW5b9gwmdqtWoTs70hNXFzH5QhVI9wxKoQ9ENnCTseB 7a5Wx9yfeFwYFCOVoKtsnaeAOVjJ+xZHsMKOMU04cAkn/D/MssCWZ1IACycuzHdEIkMp O41RvnMC8O48n8DDYOuALFiGxsN3uKEvYkAnQhJksCX/ZqFOScyYF3LH8PTqZr2LDeX2 bGGx50eftUF3QH6WnkA7SzpY2X6q/S/CNme758Nb/AYrgUcAJ0V1l99gK7hrAMY7qUMg qS4A== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1785922552; x=1786527352; 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=jDIj1IB1toOapiL1j0cj+fCCXDxdvdYq1IsWpOS35sg=; b=Z6UQgDlUQwxFJuP9mT1/g95YkW7XuQbNT4TAhgMxyYp87oQvsq+f3l/0gaxDH7rYre oYKLreQ/yw/ScbVJLhFt8bInlTXkKKkdGwdH8zMTxGyM45wtsX0fEhbdicRh+TAAf+hz 9rpccBuBxqrcnFsmxss8PkiGyqBShYMncyXQmodunIte9dYhO3tatlzXCPftluHsL1+/ DKo305ANpkXmUvOVyB4xStySGLO04VeiC0/8D90IpHX6IHnB28FtPuVQ+6DAkgzEP8cg vtQcyx0VtBLPBhOV8l2BAWekL+rh2ezhVSm5v8u58tXxqFKt7H5V8S22sVpw5w9MEsNO BaHA== X-Forwarded-Encrypted: i=1; AHgh+Ro1FLR7Ebf6rQ03cZDAxVFyPoyETLy/HMcJLHII0gKgnyszYj6hcv/NxivpME/XjCE01aXuuEQv3pp7Ugc=@vger.kernel.org X-Gm-Message-State: AOJu0YzPQrEUPtNM25KU17/ZMamieAMQD4ExjlzCfPp58We8j0XYGhA0 7hWSJD6ZwJtoyBog7qK+eVJxbKdKD7wdsUDNNLCm20HrjWCyBezwDXak X-Gm-Gg: AR+sD13jKEadPprWG48pzgUdOJn0xLHeysnViYc84GoJcyN2fTVgsq5OpCcwf9waokf JmeS8pGem74BWlThprpUzMO7YFrjg0+tZiE8BhZCE6D3vwZr5Pn1Ly8mK1BECAhhf9tac/2d18b Frn8mjSjYkEBsZ+h82WXBfGci0LnPkEUs6SAtCZZ6GSFk8RSyiBxJXSCrPe2xWRJ9jFYUGDzYVT 98DCPsFJcZtYEz5J1NuK2Zi/0QqjWKgkz6j2AOvccc2BwoV78GPVWSam5mdQQ4muzL6dUirL6M6 QETLT5h+i1R1iYSarUNiRDG5YAMW+NoicxNaC4CgrFqdL6HaxUCgGfo5gIedIXLJbGoDMU1to+Z NmqIBcfMLpdZ/vUiuzuQr+6qAE2kmkaGYjL1fyd3ZJAWC95KIpIGEkX3RwD6PkxtpRp7djz5P6g CoDvgW2eBUCaPJEfCqFm25KJA2+zNnOJ98ZeKjP6XZIqLvfdZGzslxcPwkCq3TWmbSiQ91WXEhd 95U9z88TkAZvylq4k1mE+WfypQ= X-Received: by 2002:a05:6402:5416:b0:6a0:8885:e6f0 with SMTP id 4fb4d7f45d1cf-6a14f07cfd1mr2788626a12.3.1785922550020; Wed, 05 Aug 2026 02:35:50 -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-6a1453d3825sm1729416a12.0.2026.08.05.02.35.49 (version=TLS1_2 cipher=ECDHE-ECDSA-CHACHA20-POLY1305 bits=256/256); Wed, 05 Aug 2026 02:35:49 -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 v4 6/7] char: xillybus: Add defensive sanity checks Date: Wed, 5 Aug 2026 11:34:35 +0200 Message-Id: <20260805093436.59740-7-eli.billauer@gmail.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20260805093436.59740-1-eli.billauer@gmail.com> References: <20260805093436.59740-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 =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 b264578b2572..6bc72d9dfb16 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 Sat Oct 3 08:45:48 2026 Received: from mail-ej1-f43.google.com (mail-ej1-f43.google.com [209.85.218.43]) (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 0A9A33FBED9 for ; Wed, 5 Aug 2026 09:35:55 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.218.43 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1785922557; cv=none; b=sTNo8HFXZMOrtpe4OFgAN9VOzCbZDdjXX3HHNWxIL1/c/W9ZnLHLlsUEUj12Vm0NBPLdL0tFstaCaaBKfmwDre3Snz1+Cdsm3F6teGLHLTu2frjoqBcTvZlSJ3iE8byZkjLqG8VySVA75GySlcqMmFsXh/oza3kY5UDaINOv12E= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1785922557; c=relaxed/simple; bh=/LmQT0ek0Mooi3MI+1xhBI34VXWuqXBjL5XHyS+N4Ps=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References; b=UAEyQaxfV1QUSGzZfeVVJRC6Et9GXB+oPEgc60fdnVHEP4WniGUy2Vug1PE0mBKfByM58wuxHQm/B2yDSfP5PxiyhEb3+EHFUB0O/eXHTK65qfDZgjIgVXzl9bVVOZwNhIoWMXbjaGF5atj70uSxuq443Fuac3INfVQtb05Gcuc= 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=IBXbHWaU; arc=none smtp.client-ip=209.85.218.43 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="IBXbHWaU" Received: by mail-ej1-f43.google.com with SMTP id a640c23a62f3a-c1c52d920b8so125071766b.2 for ; Wed, 05 Aug 2026 02:35:55 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1785922554; x=1786527354; 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=zY9r44Lb7ex++1L3xPMlIrRosbjH5n7EJEbtOHpnc/g=; b=IBXbHWaUj+26toFSqOq2PqlZnju3/dCfRy+shJ4IPw+SwaKMEusrWI4uXvbQELeKWU gu7kIwN0vnNuISTNnED+5etv/pN2jy7Hc4P5D6fM/hmnomwDYTaej8TSnq8juD9swWXL PmL53Vj5GKqqCeuROwxcCKZSbdNLj9vrqSszXm+kSA5tIUFq+YumKLr4xwPjG9kIxtPk OzDujByTcnPQFNhzXfgtANX2bk9vu6ILhDioAdfbyPZIxFSTly6zNnyJwwvk10cIBdrz jAvkOVNL0IHAlyKqcPCmyYhBVY7CR5E0vQtDGaT4YbRxfP5jSCEHUxcfDJ0sEW9l7H5I 3sxg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1785922554; x=1786527354; 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=zY9r44Lb7ex++1L3xPMlIrRosbjH5n7EJEbtOHpnc/g=; b=aPpc1XhQdKx5ZblZX+W/+sH7qJUdJ1Pn0DZAxt7yyL4kKNbDqKTydcqcz4f35fzhTN Tyab+h09Rj4NSajvRllf6vSnrrCoaBk5iRk2RUZlkAD39HdhWC9N3PwDBFOCz+3NcxLC OGq8MV0JxsdKtaDBWD9d0kvE7HqDsg3DcJy0DmQ4gdrRN1Omd446CxiW0VAJxNY0YTeR w7LWetfcdmN4evbYIcUZXNPp3+pwv0koiBNrAqGjxGd73decCtvV1liE4U8yVqN70bAz WvDICfm0aaKqf33Tgt5Ifni3/DD1gPwovMnv37QYzZndfXpQ++PRgf0oQaFmwHGowmvK klVw== X-Forwarded-Encrypted: i=1; AHgh+RoLUEfKiayCvBqK+WUK54tT9YfKzIwlp4uzDV4X8JyB73SrS6tFzuzILVSFA8KLXZ5ZZ9X0J29qFMuG7eA=@vger.kernel.org X-Gm-Message-State: AOJu0YzklRax/OMbqWsc1KkB4Gwx2q4vB08DP/ShPrYyvjvyteRjDUl3 cy+LuQWMmICehBWTaqCu/3wIfSJqT7aiSeXNRIqrs3yg/QL5KgdrG4DArXwwnYjAuSw= X-Gm-Gg: AR+sD10wt+9NBwM1OtAxF+lRWNKE8YvRTLIbYBA5z7mKoPU1rguwzREZxbeDcG45Aj1 ILKnJN5FWLZKoM2xTtv4Oj8WSiaStDFGwb8bWbv/5izlOhkJy1SWSF+5aZaDTylR5Pw79+vjE1X kpEO8UXv7CbxNTSf7D62Kr8it+X+zmI8nHxUvOmFwuWK2SIzNi0cT/Ln/Rli1/zfG0TgBoOYMZj ylhV/2ViRFSZo6RiIfSrsYKtU7JRD7UYkrnfFM+Xv8deCy6tuLC18fOaUntKOMr2S+Lk0+POJGX 1jTD4mKowOYw8b3IWNnX8pQBU/Bo7Caj6lr//gcrbPq92dpis/NFsJ7tC9FH9NHHzIsdSHhExN0 ielk/HAX1zvWTDus8RqqlmYkCIvITvwlQTQPWBezTqWFX3oILrOQNg2zACN5KMQ50TCj5Y7VQov 4UnC6urzvRxWQSoVnHaep8yBK6P4y60DlYHtPnzFKrZwmlSkRgOfnUhAHR2Lr8cFn4m11ur5S14 CoAK9u7cP6UYj3x X-Received: by 2002:a17:907:934d:b0:c12:9b98:209e with SMTP id a640c23a62f3a-c2039c6806fmr223553266b.23.1785922553847; Wed, 05 Aug 2026 02:35:53 -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-c20363e72a5sm87586166b.33.2026.08.05.02.35.53 (version=TLS1_2 cipher=ECDHE-ECDSA-CHACHA20-POLY1305 bits=256/256); Wed, 05 Aug 2026 02:35: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 v4 7/7] char: xillybus: Ignore and report unsolicited interrupts Date: Wed, 5 Aug 2026 11:34:36 +0200 Message-Id: <20260805093436.59740-8-eli.billauer@gmail.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20260805093436.59740-1-eli.billauer@gmail.com> References: <20260805093436.59740-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 =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 6bc72d9dfb16..037e3801d068 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