From nobody Fri Dec 19 06:07:54 2025 Received: from mail-io1-f48.google.com (mail-io1-f48.google.com [209.85.166.48]) (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 3FE054AEE4 for ; Thu, 11 Apr 2024 15:32:10 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.166.48 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1712849531; cv=none; b=WrpS7qGQg2Z7ulN2TJBwvmZtSsFOH4WXVQcePZcT3YtsirCjgEIJwfN711FF/M28dhAfEGTv6EEdq70GQ93ELIg1zurxGDS999Th7+X4WfcMMTRpN8Zod7+yLjLnw8JQby7ItPY6t5WDk+y7/zJ7nWp/Cd6yS5aR+5VIwX240uY= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1712849531; c=relaxed/simple; bh=V4OjKlhW+1r1w596hsTLaY2KUU1d/5CE0khjue5wnpo=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=lDoTMUV/FTPouHT6atyodb7rG1rDl6OYwbVTjNQCnZIBs7/THR0a0AdustvKbyXX+WxzTrQ+iZ8mwv0kFSvfXOW2rv4iMXcn5+VVl8LYWR5ULhvvgeS1CSKJgSo0Ul921xOYINZowqNY0/MZLX91JlqmYhTFIQFmJzIzwvs5OPU= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=kernel.dk; spf=pass smtp.mailfrom=kernel.dk; dkim=pass (2048-bit key) header.d=kernel-dk.20230601.gappssmtp.com header.i=@kernel-dk.20230601.gappssmtp.com header.b=lhCySkFl; arc=none smtp.client-ip=209.85.166.48 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=kernel.dk Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=kernel.dk Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel-dk.20230601.gappssmtp.com header.i=@kernel-dk.20230601.gappssmtp.com header.b="lhCySkFl" Received: by mail-io1-f48.google.com with SMTP id ca18e2360f4ac-7cc0e831e11so170420139f.1 for ; Thu, 11 Apr 2024 08:32:10 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=kernel-dk.20230601.gappssmtp.com; s=20230601; t=1712849529; x=1713454329; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=gHGMPVjYkcCZSLtyI9o+5xRAMWVV6AJ4ug8MxTGe0WM=; b=lhCySkFlOXPnFPCbduLNeqNOQZrj23LFJtHXdbn3m9wk67dWmkhsFs0y/woxEWO4s1 jtF+51Z+m6vyaBbM8ZBOPzGM/Hlw6QZNOOqB9bBuNOqKXwzE82ZZD8AUcC5UUxoO4vUa RZLAwzj/3ONNpt1bzPj3gJ21NGhwrQZmfE08W5dEZw36eLfb9Wb9xVC6/M7f7v0bl/zs eejeTMyzK7m5jgrjiO9T8fp6iFcK07wwQWqBryhcb/OQS6k7wwYFjtzLhGHCIV48jHmu 6aJMwY81H5oTMsHoj8zY06nwMPDdRCifYhb4LFwyMAX2/62bWXuh4Yg/Yv8f/xpf7VYO jDhg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1712849529; x=1713454329; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=gHGMPVjYkcCZSLtyI9o+5xRAMWVV6AJ4ug8MxTGe0WM=; b=Te/VeJNqlvDeB2wllB/wnCEWAcgVB0XfEXofMaG1Hcjqb6VBPmDdUDcVnn/zONmx1D PaqC5ecuA87qbenX0wto+3lPPGFqLFkb1Rwg80k4TFH9h4ZeD7fXhzCNa0zCeses6upo 2PCCxFYyH2RtK4UuCyznzl46AkkStdUIId/qhfdEdwOWO8DStzL0MhMq87R55Leywqc6 66Zt5g0RlRf6651jY0JyOt34E+PD/P8LgFugjZPw1OkEpomcghgwJbnK1KT5Rw8yxRXt Yaz/x3o/UcnQB/inHl9Lvarfy+gQ93/HR/9hW50AwGPdXTpq3fzazVBq9LQZwBXNKBVX CQbg== X-Gm-Message-State: AOJu0YzI2gmUC84mOjvYjloOwFWXKKGtLKwyaocCoXB5FTy13++9AtRG +M0wvy3UOoz/QobAo2R4r6m+0yYgQQlssjjgc0CLWDRU/2cBima/V+bcI1Kmw6oohlx1pmnM7P2 c X-Google-Smtp-Source: AGHT+IG4nApm7JmA7yhgIWAnTjLoKu5kVDNGDNRK7JpOsywQJdhM+Ao2jS30cAsWY6H1h1QKuNP+cg== X-Received: by 2002:a05:6e02:b26:b0:368:974b:f7c7 with SMTP id e6-20020a056e020b2600b00368974bf7c7mr7608037ilu.0.1712849529182; Thu, 11 Apr 2024 08:32:09 -0700 (PDT) Received: from localhost.localdomain ([96.43.243.2]) by smtp.gmail.com with ESMTPSA id jc25-20020a056638891900b0047f14b7f6c0sm457056jab.5.2024.04.11.08.32.07 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 11 Apr 2024 08:32:07 -0700 (PDT) From: Jens Axboe To: linux-kernel@vger.kernel.org Cc: Jens Axboe Subject: [PATCH 024/437] char/mem: convert to read/write iterators Date: Thu, 11 Apr 2024 09:12:44 -0600 Message-ID: <20240411153126.16201-25-axboe@kernel.dk> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20240411153126.16201-1-axboe@kernel.dk> References: <20240411153126.16201-1-axboe@kernel.dk> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Signed-off-by: Jens Axboe --- drivers/char/mem.c | 106 ++++++++++++--------------------------------- 1 file changed, 27 insertions(+), 79 deletions(-) diff --git a/drivers/char/mem.c b/drivers/char/mem.c index 3c6670cf905f..00ab09ad98e6 100644 --- a/drivers/char/mem.c +++ b/drivers/char/mem.c @@ -183,16 +183,17 @@ static ssize_t read_mem(struct file *file, char __use= r *buf, kfree(bounce); return err; } +FOPS_READ_ITER_HELPER(read_mem); =20 -static ssize_t write_mem(struct file *file, const char __user *buf, - size_t count, loff_t *ppos) +static ssize_t write_mem(struct kiocb *iocb, struct iov_iter *from) { - phys_addr_t p =3D *ppos; + size_t count =3D iov_iter_count(from); + phys_addr_t p =3D iocb->ki_pos; ssize_t written, sz; unsigned long copied; void *ptr; =20 - if (p !=3D *ppos) + if (p !=3D iocb->ki_pos) return -EFBIG; =20 if (!valid_phys_addr_range(p, count)) @@ -235,7 +236,7 @@ static ssize_t write_mem(struct file *file, const char = __user *buf, return -EFAULT; } =20 - copied =3D copy_from_user(ptr, buf, sz); + copied =3D copy_from_iter(ptr, sz, from); unxlate_dev_mem_ptr(p, ptr); if (copied) { written +=3D sz - copied; @@ -245,7 +246,6 @@ static ssize_t write_mem(struct file *file, const char = __user *buf, } } =20 - buf +=3D sz; p +=3D sz; count -=3D sz; written +=3D sz; @@ -253,7 +253,7 @@ static ssize_t write_mem(struct file *file, const char = __user *buf, break; } =20 - *ppos +=3D written; + iocb->ki_pos +=3D written; return written; } =20 @@ -383,58 +383,39 @@ static int mmap_mem(struct file *file, struct vm_area= _struct *vma) return 0; } =20 -static ssize_t read_port(struct file *file, char __user *buf, - size_t count, loff_t *ppos) +static ssize_t read_port(struct kiocb *iocb, struct iov_iter *to) { - unsigned long i =3D *ppos; - char __user *tmp =3D buf; + unsigned long i =3D iocb->ki_pos, org_i =3D i; + size_t count =3D iov_iter_count(to); =20 - if (!access_ok(buf, count)) - return -EFAULT; while (count-- > 0 && i < 65536) { - if (__put_user(inb(i), tmp) < 0) + char val =3D inb(i); + if (put_iter(val, to)) return -EFAULT; i++; - tmp++; } - *ppos =3D i; - return tmp-buf; + iocb->ki_pos =3D i; + return i - org_i; } =20 -static ssize_t write_port(struct file *file, const char __user *buf, - size_t count, loff_t *ppos) +static ssize_t write_port(struct kiocb *iocb, struct iov_iter *from) { - unsigned long i =3D *ppos; - const char __user *tmp =3D buf; + unsigned long i =3D iocb->ki_pos, org_i =3D i; + size_t count =3D iov_iter_count(from); =20 - if (!access_ok(buf, count)) - return -EFAULT; while (count-- > 0 && i < 65536) { char c; =20 - if (__get_user(c, tmp)) { - if (tmp > buf) + if (get_iter(c, from)) { + if (i !=3D org_i) break; return -EFAULT; } outb(c, i); i++; - tmp++; } - *ppos =3D i; - return tmp-buf; -} - -static ssize_t read_null(struct file *file, char __user *buf, - size_t count, loff_t *ppos) -{ - return 0; -} - -static ssize_t write_null(struct file *file, const char __user *buf, - size_t count, loff_t *ppos) -{ - return count; + iocb->ki_pos =3D i; + return i - org_i; } =20 static ssize_t read_iter_null(struct kiocb *iocb, struct iov_iter *to) @@ -490,33 +471,6 @@ static ssize_t read_iter_zero(struct kiocb *iocb, stru= ct iov_iter *iter) return written; } =20 -static ssize_t read_zero(struct file *file, char __user *buf, - size_t count, loff_t *ppos) -{ - size_t cleared =3D 0; - - while (count) { - size_t chunk =3D min_t(size_t, count, PAGE_SIZE); - size_t left; - - left =3D clear_user(buf + cleared, chunk); - if (unlikely(left)) { - cleared +=3D (chunk - left); - if (!cleared) - return -EFAULT; - break; - } - cleared +=3D chunk; - count -=3D chunk; - - if (signal_pending(current)) - break; - cond_resched(); - } - - return cleared; -} - static int mmap_zero(struct file *file, struct vm_area_struct *vma) { #ifndef CONFIG_MMU @@ -550,8 +504,7 @@ static unsigned long get_unmapped_area_zero(struct file= *file, #endif } =20 -static ssize_t write_full(struct file *file, const char __user *buf, - size_t count, loff_t *ppos) +static ssize_t write_full_iter(struct kiocb *iocb, struct iov_iter *from) { return -ENOSPC; } @@ -626,15 +579,14 @@ static int open_port(struct inode *inode, struct file= *filp) =20 #define zero_lseek null_lseek #define full_lseek null_lseek -#define write_zero write_null #define write_iter_zero write_iter_null #define splice_write_zero splice_write_null #define open_mem open_port =20 static const struct file_operations __maybe_unused mem_fops =3D { .llseek =3D memory_lseek, - .read =3D read_mem, - .write =3D write_mem, + .read_iter =3D read_mem_iter, + .write_iter =3D write_mem, .mmap =3D mmap_mem, .open =3D open_mem, #ifndef CONFIG_MMU @@ -645,8 +597,6 @@ static const struct file_operations __maybe_unused mem_= fops =3D { =20 static const struct file_operations null_fops =3D { .llseek =3D null_lseek, - .read =3D read_null, - .write =3D write_null, .read_iter =3D read_iter_null, .write_iter =3D write_iter_null, .splice_write =3D splice_write_null, @@ -655,16 +605,14 @@ static const struct file_operations null_fops =3D { =20 static const struct file_operations __maybe_unused port_fops =3D { .llseek =3D memory_lseek, - .read =3D read_port, - .write =3D write_port, + .read_iter =3D read_port, + .write_iter =3D write_port, .open =3D open_port, }; =20 static const struct file_operations zero_fops =3D { .llseek =3D zero_lseek, - .write =3D write_zero, .read_iter =3D read_iter_zero, - .read =3D read_zero, .write_iter =3D write_iter_zero, .splice_read =3D copy_splice_read, .splice_write =3D splice_write_zero, @@ -678,7 +626,7 @@ static const struct file_operations zero_fops =3D { static const struct file_operations full_fops =3D { .llseek =3D full_lseek, .read_iter =3D read_iter_zero, - .write =3D write_full, + .write_iter =3D write_full_iter, .splice_read =3D copy_splice_read, }; =20 --=20 2.43.0