From: Takashi Iwai <tiwai@suse.de>
To: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
Cc: alsa-devel@alsa-project.org, linux-kernel@vger.kernel.org,
Jaroslav Kysela <perex@perex.cz>, Takashi Iwai <tiwai@suse.com>,
Dan Williams <dan.j.williams@intel.com>
Subject: Re: [PATCH v1 1/1] ALSA: korg1212: Re-use sockptr_t and respective APIs
Date: Fri, 21 Jul 2023 12:08:46 +0200 [thread overview]
Message-ID: <878rb9h901.wl-tiwai@suse.de> (raw)
In-Reply-To: <20230721100146.67293-1-andriy.shevchenko@linux.intel.com>
On Fri, 21 Jul 2023 12:01:46 +0200,
Andy Shevchenko wrote:
>
> The sockptr_t (despite the naming) is a generic type to hold kernel
> or user pointer and there are respective APIs to copy data to or
> from it. Replace open coded variants in the driver by them.
While I see the benefit, I feel this is very confusing. If we use the
API for a generic use, it should be renamed at first.
Also, the current function actually follows the call pattern, and we
know in the caller side whether it's called for a kernel pointer or a
user pointer. So, if any, the PCM core callbacks should be revised to
use a generic pointer instead of fiddling in each driver side.
thanks,
Takashi
>
> Signed-off-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
> ---
> sound/pci/korg1212/korg1212.c | 33 +++++++++++++--------------------
> 1 file changed, 13 insertions(+), 20 deletions(-)
>
> diff --git a/sound/pci/korg1212/korg1212.c b/sound/pci/korg1212/korg1212.c
> index 33b4f95d65b3..92c3eab4d12c 100644
> --- a/sound/pci/korg1212/korg1212.c
> +++ b/sound/pci/korg1212/korg1212.c
> @@ -10,6 +10,7 @@
> #include <linux/interrupt.h>
> #include <linux/pci.h>
> #include <linux/slab.h>
> +#include <linux/sockptr.h>
> #include <linux/wait.h>
> #include <linux/module.h>
> #include <linux/mutex.h>
> @@ -1285,8 +1286,7 @@ static int snd_korg1212_silence(struct snd_korg1212 *korg1212, int pos, int coun
> }
>
> static int snd_korg1212_copy_to(struct snd_pcm_substream *substream,
> - void __user *dst, int pos, int count,
> - bool in_kernel)
> + sockptr_t dst, int pos, int count)
> {
> struct snd_pcm_runtime *runtime = substream->runtime;
> struct snd_korg1212 *korg1212 = snd_pcm_substream_chip(substream);
> @@ -1306,24 +1306,21 @@ static int snd_korg1212_copy_to(struct snd_pcm_substream *substream,
> #if K1212_DEBUG_LEVEL > 0
> if ( (void *) src < (void *) korg1212->recordDataBufsPtr ||
> (void *) src > (void *) korg1212->recordDataBufsPtr[8].bufferData ) {
> - printk(KERN_DEBUG "K1212_DEBUG: snd_korg1212_copy_to KERNEL EFAULT, src=%p dst=%p iter=%d\n", src, dst, i);
> + printk(KERN_DEBUG "K1212_DEBUG: %s KERNEL EFAULT, src=%p dst=%p iter=%d\n",
> + __func__, src, sockptr_is_kernel(dst) ? dst.kernel : dst.user, i);
> return -EFAULT;
> }
> #endif
> - if (in_kernel)
> - memcpy((__force void *)dst, src, size);
> - else if (copy_to_user(dst, src, size))
> + if (copy_to_sockptr_offset(dst, i * size, src, size))
> return -EFAULT;
> src++;
> - dst += size;
> }
>
> return 0;
> }
>
> static int snd_korg1212_copy_from(struct snd_pcm_substream *substream,
> - void __user *src, int pos, int count,
> - bool in_kernel)
> + sockptr_t src, int pos, int count)
> {
> struct snd_pcm_runtime *runtime = substream->runtime;
> struct snd_korg1212 *korg1212 = snd_pcm_substream_chip(substream);
> @@ -1345,16 +1342,14 @@ static int snd_korg1212_copy_from(struct snd_pcm_substream *substream,
> #if K1212_DEBUG_LEVEL > 0
> if ( (void *) dst < (void *) korg1212->playDataBufsPtr ||
> (void *) dst > (void *) korg1212->playDataBufsPtr[8].bufferData ) {
> - printk(KERN_DEBUG "K1212_DEBUG: snd_korg1212_copy_from KERNEL EFAULT, src=%p dst=%p iter=%d\n", src, dst, i);
> + printk(KERN_DEBUG "K1212_DEBUG: %s KERNEL EFAULT, src=%p dst=%p iter=%d\n",
> + __func__, sockptr_is_kernel(src) ? src.kernel : src.user, dst, i);
> return -EFAULT;
> }
> #endif
> - if (in_kernel)
> - memcpy(dst, (__force void *)src, size);
> - else if (copy_from_user(dst, src, size))
> + if (copy_from_sockptr_offset(dst, src, i * size, size))
> return -EFAULT;
> dst++;
> - src += size;
> }
>
> return 0;
> @@ -1644,15 +1639,14 @@ static int snd_korg1212_playback_copy(struct snd_pcm_substream *substream,
> int channel, unsigned long pos,
> void __user *src, unsigned long count)
> {
> - return snd_korg1212_copy_from(substream, src, pos, count, false);
> + return snd_korg1212_copy_from(substream, USER_SOCKPTR(src), pos, count);
> }
>
> static int snd_korg1212_playback_copy_kernel(struct snd_pcm_substream *substream,
> int channel, unsigned long pos,
> void *src, unsigned long count)
> {
> - return snd_korg1212_copy_from(substream, (void __user *)src,
> - pos, count, true);
> + return snd_korg1212_copy_from(substream, KERNEL_SOCKPTR(src), pos, count);
> }
>
> static int snd_korg1212_playback_silence(struct snd_pcm_substream *substream,
> @@ -1672,15 +1666,14 @@ static int snd_korg1212_capture_copy(struct snd_pcm_substream *substream,
> int channel, unsigned long pos,
> void __user *dst, unsigned long count)
> {
> - return snd_korg1212_copy_to(substream, dst, pos, count, false);
> + return snd_korg1212_copy_to(substream, USER_SOCKPTR(dst), pos, count);
> }
>
> static int snd_korg1212_capture_copy_kernel(struct snd_pcm_substream *substream,
> int channel, unsigned long pos,
> void *dst, unsigned long count)
> {
> - return snd_korg1212_copy_to(substream, (void __user *)dst,
> - pos, count, true);
> + return snd_korg1212_copy_to(substream, KERNEL_SOCKPTR(dst), pos, count);
> }
>
> static const struct snd_pcm_ops snd_korg1212_playback_ops = {
> --
> 2.40.0.1.gaa8946217a0b
>
next prev parent reply other threads:[~2023-07-21 10:10 UTC|newest]
Thread overview: 7+ messages / expand[flat|nested] mbox.gz Atom feed top
2023-07-21 10:01 [PATCH v1 1/1] ALSA: korg1212: Re-use sockptr_t and respective APIs Andy Shevchenko
2023-07-21 10:08 ` Takashi Iwai [this message]
2023-07-21 10:42 ` Andy Shevchenko
2023-07-21 10:58 ` Takashi Iwai
2023-07-21 12:58 ` Andy Shevchenko
2023-07-21 14:21 ` Takashi Iwai
2023-07-21 13:58 ` David Laight
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=878rb9h901.wl-tiwai@suse.de \
--to=tiwai@suse.de \
--cc=alsa-devel@alsa-project.org \
--cc=andriy.shevchenko@linux.intel.com \
--cc=dan.j.williams@intel.com \
--cc=linux-kernel@vger.kernel.org \
--cc=perex@perex.cz \
--cc=tiwai@suse.com \
/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.