From: Tao Cui <cui.tao@linux.dev>
To: akpm@linux-foundation.org, dgilbert@interlog.com, mkp@kernel.org,
loberman@redhat.com, jmeneghi@redhat.com, kraxel@redhat.com,
vivek.kasireddy@intel.com, mst@redhat.com, jasowangio@gmail.com,
eperezma@redhat.com, stefanha@redhat.com, sgarzare@redhat.com,
rostedt@goodmis.org, vdonnefort@google.com, mhiramat@kernel.org,
jgg@ziepe.ca, kevin.tian@intel.com, axboe@kernel.dk
Cc: linux-mm@kvack.org, James.Bottomley@HansenPartnership.com,
sumit.semwal@linaro.org, christian.koenig@amd.com,
phasta@kernel.org, joro@8bytes.org, will@kernel.org,
linux-scsi@vger.kernel.org, dri-devel@lists.freedesktop.org,
linux-media@vger.kernel.org, linaro-mm-sig@lists.linaro.org,
kvm@vger.kernel.org, virtualization@lists.linux.dev,
linux-trace-kernel@vger.kernel.org, iommu@lists.linux.dev,
io-uring@vger.kernel.org, linux-kernel@vger.kernel.org,
bobbyeshleman@meta.com, mathieu.desnoyers@efficios.com,
robin.murphy@arm.com, mason@kernel.org, aesteve@redhat.com,
tjmercier@google.com, harry@kernel.org, vbabka@suse.cz,
cui.tao@linux.dev, cuitao@kylinos.cn
Subject: [PATCH 1/7] scsi: sg and st: account the command buffer memory to memcg
Date: Fri, 6 Nov 2026 21:18:23 +0800 [thread overview]
Message-ID: <20261106131829.3228926-2-cui.tao@linux.dev> (raw)
In-Reply-To: <20261106131829.3228926-1-cui.tao@linux.dev>
From: Tao Cui <cuitao@kylinos.cn>
The sg data buffers are unaccounted: the per-fd reserved buffer, the
scatter-gather page array, and the order-0..N pages behind it, plus the
per-device tape buffer in st. All of it is user controllable. The
reserved size is capped only by the device max_sectors, SG_MAX_QUEUE
(16) commands can be in flight per fd, and the fd count is bounded by
RLIMIT_NOFILE. Nothing is charged to the memcg of the process driving
it. The September 2026 fixes in sg_build_indirect reshaped the element
sizing and left the accounting alone.
Mark these allocations __GFP_ACCOUNT so the driving process pays for
the memory it induces.
Signed-off-by: Tao Cui <cuitao@kylinos.cn>
---
drivers/scsi/sg.c | 23 ++++++++++++++++++++---
drivers/scsi/st.c | 7 ++++---
2 files changed, 24 insertions(+), 6 deletions(-)
diff --git a/drivers/scsi/sg.c b/drivers/scsi/sg.c
index 6551f1284d44..9c1414479b21 100644
--- a/drivers/scsi/sg.c
+++ b/drivers/scsi/sg.c
@@ -911,6 +911,19 @@ static int put_compat_request_table(struct compat_sg_req_info __user *o,
}
#endif
+/*
+ * The sg passthrough of the blktrace ioctls has the same exposure as the
+ * block device path: holding the node is the only requirement today, and
+ * a created trace outlives the fd. Must match the gate in
+ * blk_trace_ioctl().
+ */
+static bool sg_is_blktrace_cmd(unsigned int cmd)
+{
+ return cmd == BLKTRACESETUP || cmd == BLKTRACESETUP2 ||
+ cmd == BLKTRACESTART || cmd == BLKTRACESTOP ||
+ cmd == BLKTRACETEARDOWN;
+}
+
static long
sg_ioctl_common(struct file *filp, Sg_device *sdp, Sg_fd *sfp,
unsigned int cmd_in, void __user *p)
@@ -920,6 +933,9 @@ sg_ioctl_common(struct file *filp, Sg_device *sdp, Sg_fd *sfp,
Sg_request *srp;
unsigned long iflags;
+ if (sg_is_blktrace_cmd(cmd_in) && !capable(CAP_SYS_ADMIN))
+ return -EPERM;
+
SCSI_LOG_TIMEOUT(3, sg_printk(KERN_INFO, sdp,
"sg_ioctl: cmd=0x%x\n", (int) cmd_in));
read_only = (O_RDWR != (filp->f_flags & O_ACCMODE));
@@ -1829,7 +1845,7 @@ static int
sg_build_sgat(Sg_scatter_hold * schp, const Sg_fd * sfp, int tablesize)
{
int sg_bufflen = tablesize * sizeof(struct page *);
- gfp_t gfp_flags = GFP_ATOMIC | __GFP_NOWARN;
+ gfp_t gfp_flags = GFP_ATOMIC | __GFP_NOWARN | __GFP_ACCOUNT;
schp->pages = kzalloc(sg_bufflen, gfp_flags);
if (!schp->pages)
@@ -1844,7 +1860,8 @@ sg_build_indirect(Sg_scatter_hold * schp, Sg_fd * sfp, int buff_size)
int ret_sz = 0, i, k, rem_sz, num, mx_sc_elems;
int sg_tablesize = sfp->parentdp->sg_tablesize;
int blk_size = buff_size, order;
- gfp_t gfp_mask = GFP_ATOMIC | __GFP_COMP | __GFP_NOWARN | __GFP_ZERO;
+ gfp_t gfp_mask = GFP_ATOMIC | __GFP_COMP | __GFP_NOWARN |
+ __GFP_ACCOUNT | __GFP_ZERO;
if (blk_size < 0)
return -EFAULT;
@@ -2134,7 +2151,7 @@ sg_add_sfp(Sg_device * sdp)
unsigned long iflags;
int bufflen;
- sfp = kzalloc_obj(*sfp, GFP_ATOMIC | __GFP_NOWARN);
+ sfp = kzalloc_obj(*sfp, GFP_ATOMIC | __GFP_NOWARN | __GFP_ACCOUNT);
if (!sfp)
return ERR_PTR(-ENOMEM);
diff --git a/drivers/scsi/st.c b/drivers/scsi/st.c
index e9d41e3cc2dd..b92633ab2757 100644
--- a/drivers/scsi/st.c
+++ b/drivers/scsi/st.c
@@ -4074,7 +4074,7 @@ static struct st_buffer *new_tape_buffer(int max_sg)
{
struct st_buffer *tb;
- tb = kzalloc_obj(struct st_buffer);
+ tb = kzalloc_obj(struct st_buffer, GFP_KERNEL_ACCOUNT);
if (!tb) {
printk(KERN_NOTICE "st: Can't allocate new tape buffer.\n");
return NULL;
@@ -4083,7 +4083,8 @@ static struct st_buffer *new_tape_buffer(int max_sg)
tb->use_sg = max_sg;
tb->buffer_size = 0;
- tb->reserved_pages = kzalloc_objs(struct page *, max_sg);
+ tb->reserved_pages = kzalloc_objs(struct page *, max_sg,
+ GFP_KERNEL_ACCOUNT);
if (!tb->reserved_pages) {
kfree(tb);
return NULL;
@@ -4109,7 +4110,7 @@ static int enlarge_buffer(struct st_buffer * STbuffer, int new_size)
max_segs = STbuffer->use_sg;
- priority = GFP_KERNEL | __GFP_NOWARN;
+ priority = GFP_KERNEL | __GFP_NOWARN | __GFP_ACCOUNT;
if (STbuffer->cleared)
priority |= __GFP_ZERO;
--
2.43.0
next prev parent reply other threads:[~2026-11-06 13:19 UTC|newest]
Thread overview: 25+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-11-06 13:18 [PATCH 0/7] memcg: account the remaining uncharged kernel allocations Tao Cui
2026-11-06 13:18 ` Tao Cui [this message]
2026-11-07 13:27 ` [PATCH 1/7] scsi: sg and st: account the command buffer memory to memcg sashiko-bot
2026-11-09 2:25 ` Tao Cui
2026-11-06 13:18 ` [PATCH 2/7] dma-buf/udmabuf: account the page array metadata " Tao Cui
2026-11-06 13:23 ` Christian König
2026-11-06 17:25 ` T.J. Mercier
2026-11-09 2:32 ` Tao Cui
2026-11-09 10:56 ` Christian König
2026-11-09 13:44 ` Albert Esteve
2026-11-07 13:27 ` sashiko-bot
2026-11-06 13:18 ` [PATCH 3/7] vhost: account the per-device kernel allocations " Tao Cui
2026-11-07 13:27 ` sashiko-bot
2026-11-06 13:18 ` [PATCH 4/7] tracing: account ring buffer pages and trace_array metadata " Tao Cui
2026-11-07 13:27 ` sashiko-bot
2026-11-09 2:35 ` Tao Cui
2026-11-11 16:47 ` Vincent Donnefort
2026-11-11 23:14 ` Steven Rostedt
2026-11-06 13:18 ` [PATCH 5/7] iommufd: account the hw_queue page array " Tao Cui
2026-11-07 13:27 ` sashiko-bot
2026-11-06 13:18 ` [PATCH 6/7] io_uring: account the ring context and SQPOLL thread data " Tao Cui
2026-11-07 13:27 ` sashiko-bot
2026-11-09 2:37 ` Tao Cui
2026-11-06 13:18 ` [PATCH 7/7] io_uring: account the remaining per-object allocations " Tao Cui
2026-11-07 13:27 ` sashiko-bot
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20261106131829.3228926-2-cui.tao@linux.dev \
--to=cui.tao@linux.dev \
--cc=James.Bottomley@HansenPartnership.com \
--cc=aesteve@redhat.com \
--cc=akpm@linux-foundation.org \
--cc=axboe@kernel.dk \
--cc=bobbyeshleman@meta.com \
--cc=christian.koenig@amd.com \
--cc=cuitao@kylinos.cn \
--cc=dgilbert@interlog.com \
--cc=dri-devel@lists.freedesktop.org \
--cc=eperezma@redhat.com \
--cc=harry@kernel.org \
--cc=io-uring@vger.kernel.org \
--cc=iommu@lists.linux.dev \
--cc=jasowangio@gmail.com \
--cc=jgg@ziepe.ca \
--cc=jmeneghi@redhat.com \
--cc=joro@8bytes.org \
--cc=kevin.tian@intel.com \
--cc=kraxel@redhat.com \
--cc=kvm@vger.kernel.org \
--cc=linaro-mm-sig@lists.linaro.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-media@vger.kernel.org \
--cc=linux-mm@kvack.org \
--cc=linux-scsi@vger.kernel.org \
--cc=linux-trace-kernel@vger.kernel.org \
--cc=loberman@redhat.com \
--cc=mason@kernel.org \
--cc=mathieu.desnoyers@efficios.com \
--cc=mhiramat@kernel.org \
--cc=mkp@kernel.org \
--cc=mst@redhat.com \
--cc=phasta@kernel.org \
--cc=robin.murphy@arm.com \
--cc=rostedt@goodmis.org \
--cc=sgarzare@redhat.com \
--cc=stefanha@redhat.com \
--cc=sumit.semwal@linaro.org \
--cc=tjmercier@google.com \
--cc=vbabka@suse.cz \
--cc=vdonnefort@google.com \
--cc=virtualization@lists.linux.dev \
--cc=vivek.kasireddy@intel.com \
--cc=will@kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.