From: Suzuki.Poulose@arm.com (Suzuki K Poulose)
To: linux-arm-kernel@lists.infradead.org
Subject: [PATCH V3 09/18] coresight: tmc: allocating memory when needed
Date: Mon, 25 Apr 2016 11:20:15 +0100 [thread overview]
Message-ID: <571DEF5F.5060109@arm.com> (raw)
In-Reply-To: <1461345255-11758-10-git-send-email-mathieu.poirier@linaro.org>
On 22/04/16 18:14, Mathieu Poirier wrote:
> static int tmc_enable_etf_sink(struct coresight_device *csdev, u32 mode)
> {
> + bool used = false;
> + char *buf = NULL;
> unsigned long flags;
> struct tmc_drvdata *drvdata = dev_get_drvdata(csdev->dev.parent);
>
> + /* This shouldn't be happening */
> + if (WARN_ON(mode != CS_MODE_SYSFS))
> + return -EINVAL;
> +
> + /*
> + * If a buffer is already allocated *keep holding* the lock and
> + * jump to the fast path. Otherwise release the lock and allocate
> + * memory to work with.
> + */
> spin_lock_irqsave(&drvdata->spinlock, flags);
> + if (drvdata->buf)
> + goto fast_path;
> +
> + spin_unlock_irqrestore(&drvdata->spinlock, flags);
> +
> + /* Allocating the memory here while outside of the spinlock */
> + buf = kzalloc(drvdata->size, GFP_KERNEL);
> + if (!buf)
> + return -ENOMEM;
> +
> + /* Let's try again */
> + spin_lock_irqsave(&drvdata->spinlock, flags);
> +fast_path:
nit: As I mentioned in the previous series, could we not avoid the goto in the middle of the
function,by doing :
if (!drvdata->buf) {
unlock();
buf = alloc();
if (!buf) return -ENOMEM;
lock();
}
> if (drvdata->reading) {
> spin_unlock_irqrestore(&drvdata->spinlock, flags);
> + /*
> + * Free allocated memory outside of the spinlock. There is
> + * no need to assert the validity of 'buf' since calling
> + * kfree(NULL) is safe.
> + */
> + kfree(buf);
> return -EBUSY;
> }
It would be good to unify the exit points as we do similar steps.
if (drvdata->reading) {
rc = -EBUSY;
goto out;
}
>
> + /*
> + * If drvdata::buf isn't NULL, memory was allocated for a previous
> + * trace run but wasn't read. If so simply zero-out the memory.
> + * Otherwise use the memory allocated above.
> + *
> + * The memory is freed when users read the buffer using the
> + * /dev/xyz.{etf|etb} interface. See tmc_read_unprepare_etf() for
> + * details.
> + */
> + if (drvdata->buf) {
> + memset(drvdata->buf, 0, drvdata->size);
> + } else {
> + used = true;
> + drvdata->buf = buf;
> + }
> +
> tmc_etb_enable_hw(drvdata);
> drvdata->enable = true;
out:
> spin_unlock_irqrestore(&drvdata->spinlock, flags);
>
> + /* Free memory outside the spinlock if need be */
> + if (!used && buf)
> + kfree(buf);
> +
if (!rc)
dev_info(drvdata->dev, "TMC-ETB/ETF enabled\n");
return rc
> diff --git a/drivers/hwtracing/coresight/coresight-tmc-etr.c b/drivers/hwtracing/coresight/coresight-tmc-etr.c
> index 3483d139a4ac..474c70c089f3 100644
> --- a/drivers/hwtracing/coresight/coresight-tmc-etr.c
> +++ b/drivers/hwtracing/coresight/coresight-tmc-etr.c
> static int tmc_enable_etr_sink(struct coresight_device *csdev, u32 mode)
> {
> + bool used = false;
> unsigned long flags;
> + void __iomem *vaddr = NULL;
> + dma_addr_t paddr;
> struct tmc_drvdata *drvdata = dev_get_drvdata(csdev->dev.parent);
>
> + /* This shouldn't be happening */
> + if (WARN_ON(mode != CS_MODE_SYSFS))
> + return -EINVAL;
> +
> + /*
> + * If a buffer is already allocated *keep holding* the lock and
> + * jump to the fast path. Otherwise release the lock and allocate
> + * memory to work with.
> + */
> + spin_lock_irqsave(&drvdata->spinlock, flags);
> + if (drvdata->vaddr)
> + goto fast_path;
> +
> + spin_unlock_irqrestore(&drvdata->spinlock, flags);
> +
> + /*
> + * Contiguous memory can't be allocated while a spinlock is held.
> + * As such allocate memory here and free it if a buffer has already
> + * been allocated (from a previous session).
> + */
> + vaddr = dma_alloc_coherent(drvdata->dev, drvdata->size,
> + &paddr, GFP_KERNEL);
> + if (!vaddr)
> + return -ENOMEM;
> +
> + /* Let's try again */
> spin_lock_irqsave(&drvdata->spinlock, flags);
> +fast_path:
nit: Same as above.
I am not too particular about the above changes, but would be good to have them
reader friendly.
Either way,
Reviewed-by: Suzuki K Poulose <suzuki.poulose@arm.com>
Suzuki
WARNING: multiple messages have this Message-ID (diff)
From: Suzuki K Poulose <Suzuki.Poulose@arm.com>
To: Mathieu Poirier <mathieu.poirier@linaro.org>,
linux-arm-kernel@lists.infradead.org
Cc: linux-kernel@vger.kernel.org
Subject: Re: [PATCH V3 09/18] coresight: tmc: allocating memory when needed
Date: Mon, 25 Apr 2016 11:20:15 +0100 [thread overview]
Message-ID: <571DEF5F.5060109@arm.com> (raw)
In-Reply-To: <1461345255-11758-10-git-send-email-mathieu.poirier@linaro.org>
On 22/04/16 18:14, Mathieu Poirier wrote:
> static int tmc_enable_etf_sink(struct coresight_device *csdev, u32 mode)
> {
> + bool used = false;
> + char *buf = NULL;
> unsigned long flags;
> struct tmc_drvdata *drvdata = dev_get_drvdata(csdev->dev.parent);
>
> + /* This shouldn't be happening */
> + if (WARN_ON(mode != CS_MODE_SYSFS))
> + return -EINVAL;
> +
> + /*
> + * If a buffer is already allocated *keep holding* the lock and
> + * jump to the fast path. Otherwise release the lock and allocate
> + * memory to work with.
> + */
> spin_lock_irqsave(&drvdata->spinlock, flags);
> + if (drvdata->buf)
> + goto fast_path;
> +
> + spin_unlock_irqrestore(&drvdata->spinlock, flags);
> +
> + /* Allocating the memory here while outside of the spinlock */
> + buf = kzalloc(drvdata->size, GFP_KERNEL);
> + if (!buf)
> + return -ENOMEM;
> +
> + /* Let's try again */
> + spin_lock_irqsave(&drvdata->spinlock, flags);
> +fast_path:
nit: As I mentioned in the previous series, could we not avoid the goto in the middle of the
function,by doing :
if (!drvdata->buf) {
unlock();
buf = alloc();
if (!buf) return -ENOMEM;
lock();
}
> if (drvdata->reading) {
> spin_unlock_irqrestore(&drvdata->spinlock, flags);
> + /*
> + * Free allocated memory outside of the spinlock. There is
> + * no need to assert the validity of 'buf' since calling
> + * kfree(NULL) is safe.
> + */
> + kfree(buf);
> return -EBUSY;
> }
It would be good to unify the exit points as we do similar steps.
if (drvdata->reading) {
rc = -EBUSY;
goto out;
}
>
> + /*
> + * If drvdata::buf isn't NULL, memory was allocated for a previous
> + * trace run but wasn't read. If so simply zero-out the memory.
> + * Otherwise use the memory allocated above.
> + *
> + * The memory is freed when users read the buffer using the
> + * /dev/xyz.{etf|etb} interface. See tmc_read_unprepare_etf() for
> + * details.
> + */
> + if (drvdata->buf) {
> + memset(drvdata->buf, 0, drvdata->size);
> + } else {
> + used = true;
> + drvdata->buf = buf;
> + }
> +
> tmc_etb_enable_hw(drvdata);
> drvdata->enable = true;
out:
> spin_unlock_irqrestore(&drvdata->spinlock, flags);
>
> + /* Free memory outside the spinlock if need be */
> + if (!used && buf)
> + kfree(buf);
> +
if (!rc)
dev_info(drvdata->dev, "TMC-ETB/ETF enabled\n");
return rc
> diff --git a/drivers/hwtracing/coresight/coresight-tmc-etr.c b/drivers/hwtracing/coresight/coresight-tmc-etr.c
> index 3483d139a4ac..474c70c089f3 100644
> --- a/drivers/hwtracing/coresight/coresight-tmc-etr.c
> +++ b/drivers/hwtracing/coresight/coresight-tmc-etr.c
> static int tmc_enable_etr_sink(struct coresight_device *csdev, u32 mode)
> {
> + bool used = false;
> unsigned long flags;
> + void __iomem *vaddr = NULL;
> + dma_addr_t paddr;
> struct tmc_drvdata *drvdata = dev_get_drvdata(csdev->dev.parent);
>
> + /* This shouldn't be happening */
> + if (WARN_ON(mode != CS_MODE_SYSFS))
> + return -EINVAL;
> +
> + /*
> + * If a buffer is already allocated *keep holding* the lock and
> + * jump to the fast path. Otherwise release the lock and allocate
> + * memory to work with.
> + */
> + spin_lock_irqsave(&drvdata->spinlock, flags);
> + if (drvdata->vaddr)
> + goto fast_path;
> +
> + spin_unlock_irqrestore(&drvdata->spinlock, flags);
> +
> + /*
> + * Contiguous memory can't be allocated while a spinlock is held.
> + * As such allocate memory here and free it if a buffer has already
> + * been allocated (from a previous session).
> + */
> + vaddr = dma_alloc_coherent(drvdata->dev, drvdata->size,
> + &paddr, GFP_KERNEL);
> + if (!vaddr)
> + return -ENOMEM;
> +
> + /* Let's try again */
> spin_lock_irqsave(&drvdata->spinlock, flags);
> +fast_path:
nit: Same as above.
I am not too particular about the above changes, but would be good to have them
reader friendly.
Either way,
Reviewed-by: Suzuki K Poulose <suzuki.poulose@arm.com>
Suzuki
next prev parent reply other threads:[~2016-04-25 10:20 UTC|newest]
Thread overview: 76+ messages / expand[flat|nested] mbox.gz Atom feed top
2016-04-22 17:13 [PATCH V3 00/18] coresight: tmc: make driver usable by Perf Mathieu Poirier
2016-04-22 17:13 ` Mathieu Poirier
2016-04-22 17:13 ` [PATCH V3 01/18] coresight: tmc: modifying naming convention Mathieu Poirier
2016-04-22 17:13 ` Mathieu Poirier
2016-04-22 17:13 ` [PATCH V3 02/18] coresight: tmc: waiting for TMCReady bit before programming Mathieu Poirier
2016-04-22 17:13 ` Mathieu Poirier
2016-04-22 17:14 ` [PATCH V3 03/18] coresight: tmc: re-implementing tmc_read_prepare/unprepare() functions Mathieu Poirier
2016-04-22 17:14 ` Mathieu Poirier
2016-04-22 17:14 ` [PATCH V3 04/18] coresight: tmc: clearly define number of transfers per burst Mathieu Poirier
2016-04-22 17:14 ` Mathieu Poirier
2016-04-22 17:14 ` [PATCH V3 05/18] coresight: tmc: introducing new header file Mathieu Poirier
2016-04-22 17:14 ` Mathieu Poirier
2016-04-22 17:14 ` [PATCH V3 06/18] coresight: tmc: cleaning up " Mathieu Poirier
2016-04-22 17:14 ` Mathieu Poirier
2016-04-22 17:14 ` [PATCH V3 07/18] coresight: tmc: splitting driver in ETB/ETF and ETR components Mathieu Poirier
2016-04-22 17:14 ` Mathieu Poirier
2016-04-22 17:14 ` [PATCH V3 08/18] coresight: tmc: making prepare/unprepare functions generic Mathieu Poirier
2016-04-22 17:14 ` Mathieu Poirier
2016-04-22 17:14 ` [PATCH V3 09/18] coresight: tmc: allocating memory when needed Mathieu Poirier
2016-04-22 17:14 ` Mathieu Poirier
2016-04-25 10:20 ` Suzuki K Poulose [this message]
2016-04-25 10:20 ` Suzuki K Poulose
2016-04-25 14:24 ` Mathieu Poirier
2016-04-25 14:24 ` Mathieu Poirier
2016-04-22 17:14 ` [PATCH V3 10/18] coresight: tmc: getting the right read_count on tmc_open() Mathieu Poirier
2016-04-22 17:14 ` Mathieu Poirier
2016-04-25 10:47 ` Suzuki K Poulose
2016-04-25 10:47 ` Suzuki K Poulose
2016-04-25 14:25 ` Mathieu Poirier
2016-04-25 14:25 ` Mathieu Poirier
2016-04-22 17:14 ` [PATCH V3 11/18] coresight: tmc: adding mode of operation for link/sinks Mathieu Poirier
2016-04-22 17:14 ` Mathieu Poirier
2016-04-22 17:14 ` [PATCH V3 12/18] coresight: tmc: dump system memory content only when needed Mathieu Poirier
2016-04-22 17:14 ` Mathieu Poirier
2016-04-25 11:16 ` Suzuki K Poulose
2016-04-25 11:16 ` Suzuki K Poulose
2016-04-25 14:38 ` Mathieu Poirier
2016-04-25 14:38 ` Mathieu Poirier
2016-04-25 14:49 ` Suzuki K Poulose
2016-04-25 14:49 ` Suzuki K Poulose
2016-04-22 17:14 ` [PATCH V3 13/18] coresight: tmc: make sysFS and Perf mode mutually exclusive Mathieu Poirier
2016-04-22 17:14 ` Mathieu Poirier
2016-04-25 14:32 ` Suzuki K Poulose
2016-04-25 14:32 ` Suzuki K Poulose
2016-04-25 14:48 ` Mathieu Poirier
2016-04-25 14:48 ` Mathieu Poirier
2016-04-25 14:52 ` Suzuki K Poulose
2016-04-25 14:52 ` Suzuki K Poulose
2016-04-25 15:05 ` Mathieu Poirier
2016-04-25 15:05 ` Mathieu Poirier
2016-04-25 15:11 ` Suzuki K Poulose
2016-04-25 15:11 ` Suzuki K Poulose
2016-04-25 15:18 ` Mathieu Poirier
2016-04-25 15:18 ` Mathieu Poirier
2016-04-26 9:23 ` Suzuki K Poulose
2016-04-26 9:23 ` Suzuki K Poulose
2016-04-22 17:14 ` [PATCH V3 14/18] coresight: tmc: keep track of memory width Mathieu Poirier
2016-04-22 17:14 ` Mathieu Poirier
2016-04-25 14:41 ` Suzuki K Poulose
2016-04-25 14:41 ` Suzuki K Poulose
2016-04-25 14:55 ` Mathieu Poirier
2016-04-25 14:55 ` Mathieu Poirier
2016-04-25 15:09 ` Suzuki K Poulose
2016-04-25 15:09 ` Suzuki K Poulose
2016-04-25 15:25 ` Mathieu Poirier
2016-04-25 15:25 ` Mathieu Poirier
2016-04-25 15:28 ` Suzuki K Poulose
2016-04-25 15:28 ` Suzuki K Poulose
2016-04-22 17:14 ` [PATCH V3 15/18] coresight: moving struct cs_buffers to header file Mathieu Poirier
2016-04-22 17:14 ` Mathieu Poirier
2016-04-22 17:14 ` [PATCH V3 16/18] coresight: tmc: implementing TMC-ETF AUX space API Mathieu Poirier
2016-04-22 17:14 ` Mathieu Poirier
2016-04-22 17:14 ` [PATCH V3 17/18] coresight: tmc: implementing TMC-ETR " Mathieu Poirier
2016-04-22 17:14 ` Mathieu Poirier
2016-04-22 17:14 ` [PATCH V3 18/18] coresight: configuring ETF in FIFO mode when acting as link Mathieu Poirier
2016-04-22 17:14 ` Mathieu Poirier
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=571DEF5F.5060109@arm.com \
--to=suzuki.poulose@arm.com \
--cc=linux-arm-kernel@lists.infradead.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.