2018-01-23 10:56:41

by Johannes Thumshirn

[permalink] [raw]
Subject: [PATCH v2] bsg: use pr_debug instead of hand craftet macros

Use pr_debug instead of hand craftet macros. This way it is not needed to
re-compile the kernel to enable bsg debug outputs and it's possible to
selectively enable specific prints.

Signed-off-by: Johannes Thumshirn <[email protected]>
Cc: Joe Perches <[email protected]>
Cc: Bart Van Assche <[email protected]>

---
Changes to v1:
* Aligned arguments (Bart)
* Include bd->name in macro (Joe)
---
block/bsg.c | 40 +++++++++++++++++-----------------------
1 file changed, 17 insertions(+), 23 deletions(-)

diff --git a/block/bsg.c b/block/bsg.c
index 452f94f1c5d4..a1bcbb6ba50b 100644
--- a/block/bsg.c
+++ b/block/bsg.c
@@ -32,6 +32,9 @@
#define BSG_DESCRIPTION "Block layer SCSI generic (bsg) driver"
#define BSG_VERSION "0.4"

+#define bsg_dbg(bd, fmt, ...) \
+ pr_debug("%s: " fmt, (bd)->name, ##__VA_ARGS__)
+
struct bsg_device {
struct request_queue *queue;
spinlock_t lock;
@@ -55,14 +58,6 @@ enum {
#define BSG_DEFAULT_CMDS 64
#define BSG_MAX_DEVS 32768

-#undef BSG_DEBUG
-
-#ifdef BSG_DEBUG
-#define dprintk(fmt, args...) printk(KERN_ERR "%s: " fmt, __func__, ##args)
-#else
-#define dprintk(fmt, args...)
-#endif
-
static DEFINE_MUTEX(bsg_mutex);
static DEFINE_IDR(bsg_minor_idr);

@@ -123,7 +118,7 @@ static struct bsg_command *bsg_alloc_command(struct bsg_device *bd)

bc->bd = bd;
INIT_LIST_HEAD(&bc->list);
- dprintk("%s: returning free cmd %p\n", bd->name, bc);
+ bsg_dbg(bd, "returning free cmd %p\n", bc);
return bc;
out:
spin_unlock_irq(&bd->lock);
@@ -222,7 +217,8 @@ bsg_map_hdr(struct bsg_device *bd, struct sg_io_v4 *hdr, fmode_t mode)
if (!bcd->class_dev)
return ERR_PTR(-ENXIO);

- dprintk("map hdr %llx/%u %llx/%u\n", (unsigned long long) hdr->dout_xferp,
+ bsg_dbg(bd, "map hdr %llx/%u %llx/%u\n",
+ (unsigned long long) hdr->dout_xferp,
hdr->dout_xfer_len, (unsigned long long) hdr->din_xferp,
hdr->din_xfer_len);

@@ -299,8 +295,8 @@ static void bsg_rq_end_io(struct request *rq, blk_status_t status)
struct bsg_device *bd = bc->bd;
unsigned long flags;

- dprintk("%s: finished rq %p bc %p, bio %p\n",
- bd->name, rq, bc, bc->bio);
+ bsg_dbg(bd, "finished rq %p bc %p, bio %p\n",
+ rq, bc, bc->bio);

bc->hdr.duration = jiffies_to_msecs(jiffies - bc->hdr.duration);

@@ -333,7 +329,7 @@ static void bsg_add_command(struct bsg_device *bd, struct request_queue *q,
list_add_tail(&bc->list, &bd->busy_list);
spin_unlock_irq(&bd->lock);

- dprintk("%s: queueing rq %p, bc %p\n", bd->name, rq, bc);
+ bsg_dbg(bd, "queueing rq %p, bc %p\n", rq, bc);

rq->end_io_data = bc;
blk_execute_rq_nowait(q, NULL, rq, at_head, bsg_rq_end_io);
@@ -379,7 +375,7 @@ static struct bsg_command *bsg_get_done_cmd(struct bsg_device *bd)
}
} while (1);

- dprintk("%s: returning done %p\n", bd->name, bc);
+ bsg_dbg(bd, "returning done %p\n", bc);

return bc;
}
@@ -390,7 +386,7 @@ static int blk_complete_sgv4_hdr_rq(struct request *rq, struct sg_io_v4 *hdr,
struct scsi_request *req = scsi_req(rq);
int ret = 0;

- dprintk("rq %p bio %p 0x%x\n", rq, bio, req->result);
+ pr_debug("rq %p bio %p 0x%x\n", rq, bio, req->result);
/*
* fill in all the output members
*/
@@ -469,7 +465,7 @@ static int bsg_complete_all_commands(struct bsg_device *bd)
struct bsg_command *bc;
int ret, tret;

- dprintk("%s: entered\n", bd->name);
+ bsg_dbg(bd, "entered\n");

/*
* wait for all commands to complete
@@ -572,7 +568,7 @@ bsg_read(struct file *file, char __user *buf, size_t count, loff_t *ppos)
int ret;
ssize_t bytes_read;

- dprintk("%s: read %zd bytes\n", bd->name, count);
+ bsg_dbg(bd, "read %zd bytes\n", count);

bsg_set_block(bd, file);

@@ -646,7 +642,7 @@ bsg_write(struct file *file, const char __user *buf, size_t count, loff_t *ppos)
ssize_t bytes_written;
int ret;

- dprintk("%s: write %zd bytes\n", bd->name, count);
+ bsg_dbg(bd, "write %zd bytes\n", count);

if (unlikely(uaccess_kernel()))
return -EINVAL;
@@ -664,7 +660,7 @@ bsg_write(struct file *file, const char __user *buf, size_t count, loff_t *ppos)
if (!bytes_written || err_block_err(ret))
bytes_written = ret;

- dprintk("%s: returning %zd\n", bd->name, bytes_written);
+ bsg_dbg(bd, "returning %zd\n", bytes_written);
return bytes_written;
}

@@ -717,7 +713,7 @@ static int bsg_put_device(struct bsg_device *bd)
hlist_del(&bd->dev_list);
mutex_unlock(&bsg_mutex);

- dprintk("%s: tearing down\n", bd->name);
+ bsg_dbg(bd, "tearing down\n");

/*
* close can always block
@@ -744,9 +740,7 @@ static struct bsg_device *bsg_add_device(struct inode *inode,
struct file *file)
{
struct bsg_device *bd;
-#ifdef BSG_DEBUG
unsigned char buf[32];
-#endif

if (!blk_queue_scsi_passthrough(rq)) {
WARN_ONCE(true, "Attempt to register a non-SCSI queue\n");
@@ -771,7 +765,7 @@ static struct bsg_device *bsg_add_device(struct inode *inode,
hlist_add_head(&bd->dev_list, bsg_dev_idx_hash(iminor(inode)));

strncpy(bd->name, dev_name(rq->bsg_dev.class_dev), sizeof(bd->name) - 1);
- dprintk("bound to <%s>, max queue %d\n",
+ bsg_dbg(bd, "bound to <%s>, max queue %d\n",
format_dev_t(buf, inode->i_rdev), bd->max_queue);

mutex_unlock(&bsg_mutex);
--
2.13.6



2018-01-23 12:46:49

by Joe Perches

[permalink] [raw]
Subject: Re: [PATCH v2] bsg: use pr_debug instead of hand craftet macros

On Tue, 2018-01-23 at 11:55 +0100, Johannes Thumshirn wrote:
> Use pr_debug instead of hand craftet macros. This way it is not needed to
> re-compile the kernel to enable bsg debug outputs and it's possible to
> selectively enable specific prints.

Perhaps the email subject could be improved to describe
the new macro and as well, this macro, without a pr_fmt
define somewhat above it loses the __func__ output too.

Perhaps add a description of the capability of the
dynamic debug facility to add the function name using +f.

> Signed-off-by: Johannes Thumshirn <[email protected]>
> Cc: Joe Perches <[email protected]>
> Cc: Bart Van Assche <[email protected]>
>
> ---
> Changes to v1:
> * Aligned arguments (Bart)
> * Include bd->name in macro (Joe)
> ---
> block/bsg.c | 40 +++++++++++++++++-----------------------
> 1 file changed, 17 insertions(+), 23 deletions(-)
>
> diff --git a/block/bsg.c b/block/bsg.c
> index 452f94f1c5d4..a1bcbb6ba50b 100644
> --- a/block/bsg.c
> +++ b/block/bsg.c
> @@ -32,6 +32,9 @@
> #define BSG_DESCRIPTION "Block layer SCSI generic (bsg) driver"
> #define BSG_VERSION "0.4"
>
> +#define bsg_dbg(bd, fmt, ...) \
> + pr_debug("%s: " fmt, (bd)->name, ##__VA_ARGS__)
> +
> struct bsg_device {
> struct request_queue *queue;
> spinlock_t lock;
> @@ -55,14 +58,6 @@ enum {
> #define BSG_DEFAULT_CMDS 64
> #define BSG_MAX_DEVS 32768
>
> -#undef BSG_DEBUG
> -
> -#ifdef BSG_DEBUG
> -#define dprintk(fmt, args...) printk(KERN_ERR "%s: " fmt, __func__, ##args)
> -#else
> -#define dprintk(fmt, args...)
> -#endif
> -
> static DEFINE_MUTEX(bsg_mutex);
> static DEFINE_IDR(bsg_minor_idr);
>
> @@ -123,7 +118,7 @@ static struct bsg_command *bsg_alloc_command(struct bsg_device *bd)
>
> bc->bd = bd;
> INIT_LIST_HEAD(&bc->list);
> - dprintk("%s: returning free cmd %p\n", bd->name, bc);
> + bsg_dbg(bd, "returning free cmd %p\n", bc);
> return bc;
> out:
> spin_unlock_irq(&bd->lock);
> @@ -222,7 +217,8 @@ bsg_map_hdr(struct bsg_device *bd, struct sg_io_v4 *hdr, fmode_t mode)
> if (!bcd->class_dev)
> return ERR_PTR(-ENXIO);
>
> - dprintk("map hdr %llx/%u %llx/%u\n", (unsigned long long) hdr->dout_xferp,
> + bsg_dbg(bd, "map hdr %llx/%u %llx/%u\n",
> + (unsigned long long) hdr->dout_xferp,
> hdr->dout_xfer_len, (unsigned long long) hdr->din_xferp,
> hdr->din_xfer_len);
>
> @@ -299,8 +295,8 @@ static void bsg_rq_end_io(struct request *rq, blk_status_t status)
> struct bsg_device *bd = bc->bd;
> unsigned long flags;
>
> - dprintk("%s: finished rq %p bc %p, bio %p\n",
> - bd->name, rq, bc, bc->bio);
> + bsg_dbg(bd, "finished rq %p bc %p, bio %p\n",
> + rq, bc, bc->bio);
>
> bc->hdr.duration = jiffies_to_msecs(jiffies - bc->hdr.duration);
>
> @@ -333,7 +329,7 @@ static void bsg_add_command(struct bsg_device *bd, struct request_queue *q,
> list_add_tail(&bc->list, &bd->busy_list);
> spin_unlock_irq(&bd->lock);
>
> - dprintk("%s: queueing rq %p, bc %p\n", bd->name, rq, bc);
> + bsg_dbg(bd, "queueing rq %p, bc %p\n", rq, bc);
>
> rq->end_io_data = bc;
> blk_execute_rq_nowait(q, NULL, rq, at_head, bsg_rq_end_io);
> @@ -379,7 +375,7 @@ static struct bsg_command *bsg_get_done_cmd(struct bsg_device *bd)
> }
> } while (1);
>
> - dprintk("%s: returning done %p\n", bd->name, bc);
> + bsg_dbg(bd, "returning done %p\n", bc);
>
> return bc;
> }
> @@ -390,7 +386,7 @@ static int blk_complete_sgv4_hdr_rq(struct request *rq, struct sg_io_v4 *hdr,
> struct scsi_request *req = scsi_req(rq);
> int ret = 0;
>
> - dprintk("rq %p bio %p 0x%x\n", rq, bio, req->result);
> + pr_debug("rq %p bio %p 0x%x\n", rq, bio, req->result);
> /*
> * fill in all the output members
> */
> @@ -469,7 +465,7 @@ static int bsg_complete_all_commands(struct bsg_device *bd)
> struct bsg_command *bc;
> int ret, tret;
>
> - dprintk("%s: entered\n", bd->name);
> + bsg_dbg(bd, "entered\n");
>
> /*
> * wait for all commands to complete
> @@ -572,7 +568,7 @@ bsg_read(struct file *file, char __user *buf, size_t count, loff_t *ppos)
> int ret;
> ssize_t bytes_read;
>
> - dprintk("%s: read %zd bytes\n", bd->name, count);
> + bsg_dbg(bd, "read %zd bytes\n", count);
>
> bsg_set_block(bd, file);
>
> @@ -646,7 +642,7 @@ bsg_write(struct file *file, const char __user *buf, size_t count, loff_t *ppos)
> ssize_t bytes_written;
> int ret;
>
> - dprintk("%s: write %zd bytes\n", bd->name, count);
> + bsg_dbg(bd, "write %zd bytes\n", count);
>
> if (unlikely(uaccess_kernel()))
> return -EINVAL;
> @@ -664,7 +660,7 @@ bsg_write(struct file *file, const char __user *buf, size_t count, loff_t *ppos)
> if (!bytes_written || err_block_err(ret))
> bytes_written = ret;
>
> - dprintk("%s: returning %zd\n", bd->name, bytes_written);
> + bsg_dbg(bd, "returning %zd\n", bytes_written);
> return bytes_written;
> }
>
> @@ -717,7 +713,7 @@ static int bsg_put_device(struct bsg_device *bd)
> hlist_del(&bd->dev_list);
> mutex_unlock(&bsg_mutex);
>
> - dprintk("%s: tearing down\n", bd->name);
> + bsg_dbg(bd, "tearing down\n");
>
> /*
> * close can always block
> @@ -744,9 +740,7 @@ static struct bsg_device *bsg_add_device(struct inode *inode,
> struct file *file)
> {
> struct bsg_device *bd;
> -#ifdef BSG_DEBUG
> unsigned char buf[32];
> -#endif
>
> if (!blk_queue_scsi_passthrough(rq)) {
> WARN_ONCE(true, "Attempt to register a non-SCSI queue\n");
> @@ -771,7 +765,7 @@ static struct bsg_device *bsg_add_device(struct inode *inode,
> hlist_add_head(&bd->dev_list, bsg_dev_idx_hash(iminor(inode)));
>
> strncpy(bd->name, dev_name(rq->bsg_dev.class_dev), sizeof(bd->name) - 1);
> - dprintk("bound to <%s>, max queue %d\n",
> + bsg_dbg(bd, "bound to <%s>, max queue %d\n",
> format_dev_t(buf, inode->i_rdev), bd->max_queue);
>
> mutex_unlock(&bsg_mutex);

2018-01-23 23:13:08

by Bart Van Assche

[permalink] [raw]
Subject: Re: [PATCH v2] bsg: use pr_debug instead of hand craftet macros

On Tue, 2018-01-23 at 04:45 -0800, Joe Perches wrote:
> Perhaps the email subject could be improved to describe
> the new macro and as well, this macro, without a pr_fmt
> define somewhat above it loses the __func__ output too.

Hmm ... I thought that the pr_debug() output can be configured to include
the function name (__func__)? From
https://www.kernel.org/doc/html/latest/admin-guide/dynamic-debug-howto.html:

The flags are:

p enables the pr_debug() callsite.
f Include the function name in the printed message
l Include line number in the printed message
m Include module name in the printed message
t Include thread ID in messages not generated from interrupt context
_ No flags are set. (Or'd with others on input)

Bart.

2018-01-24 02:54:17

by Joe Perches

[permalink] [raw]
Subject: Re: [PATCH v2] bsg: use pr_debug instead of hand craftet macros

On Tue, 2018-01-23 at 23:12 +0000, Bart Van Assche wrote:
> On Tue, 2018-01-23 at 04:45 -0800, Joe Perches wrote:
> > Perhaps the email subject could be improved to describe
> > the new macro and as well, this macro, without a pr_fmt
> > define somewhat above it loses the __func__ output too.
>
> Hmm ... I thought that the pr_debug() output can be configured to include
> the function name (__func__)? From

Exactly right.

> https://www.kernel.org/doc/html/latest/admin-guide/dynamic-debug-howto.html:

which is what I wrote when I said use +f.

It's just nice to mention these changes in the
commit message.

cheers, Joe

2018-01-24 08:05:25

by Johannes Thumshirn

[permalink] [raw]
Subject: Re: [PATCH v2] bsg: use pr_debug instead of hand craftet macros

On Tue, Jan 23, 2018 at 06:53:18PM -0800, Joe Perches wrote:
> On Tue, 2018-01-23 at 23:12 +0000, Bart Van Assche wrote:
> > On Tue, 2018-01-23 at 04:45 -0800, Joe Perches wrote:
> > > Perhaps the email subject could be improved to describe
> > > the new macro and as well, this macro, without a pr_fmt
> > > define somewhat above it loses the __func__ output too.
> >
> > Hmm ... I thought that the pr_debug() output can be configured to include
> > the function name (__func__)? From
>
> Exactly right.
>
> > https://www.kernel.org/doc/html/latest/admin-guide/dynamic-debug-howto.html:
>
> which is what I wrote when I said use +f.
>
> It's just nice to mention these changes in the
> commit message.

Sorry Joe but this slowly approaches the bikeshedding area. Why should I
duplicate the dynamic debug howto?

This was literally a drive-by patch I did while riding on the subway to the
office which was indented to ease debugging problems in the field for our (and
other) support engineers (and they are usually well aware of the +f switch).

Byte,
Johannes
--
Johannes Thumshirn Storage
[email protected] +49 911 74053 689
SUSE LINUX GmbH, Maxfeldstr. 5, 90409 N?rnberg
GF: Felix Imend?rffer, Jane Smithard, Graham Norton
HRB 21284 (AG N?rnberg)
Key fingerprint = EC38 9CAB C2C4 F25D 8600 D0D0 0393 969D 2D76 0850

2018-01-24 11:15:21

by Joe Perches

[permalink] [raw]
Subject: Re: [PATCH v2] bsg: use pr_debug instead of hand craftet macros

On Wed, 2018-01-24 at 09:03 +0100, Johannes Thumshirn wrote:
> On Tue, Jan 23, 2018 at 06:53:18PM -0800, Joe Perches wrote:
> > On Tue, 2018-01-23 at 23:12 +0000, Bart Van Assche wrote:
> > > On Tue, 2018-01-23 at 04:45 -0800, Joe Perches wrote:
> > > > Perhaps the email subject could be improved to describe
> > > > the new macro and as well, this macro, without a pr_fmt
> > > > define somewhat above it loses the __func__ output too.
> > >
> > > Hmm ... I thought that the pr_debug() output can be configured to include
> > > the function name (__func__)? From
> >
> > Exactly right.
> >
> > > https://www.kernel.org/doc/html/latest/admin-guide/dynamic-debug-howto.html:
> >
> > which is what I wrote when I said use +f.
> >
> > It's just nice to mention these changes in the
> > commit message.
>
> Sorry Joe but this slowly approaches the bikeshedding area. Why should I
> duplicate the dynamic debug howto?

Up to you if you want your commit messages to be
more descriptive of the changes you are making.


2018-01-24 16:25:57

by Bart Van Assche

[permalink] [raw]
Subject: Re: [PATCH v2] bsg: use pr_debug instead of hand craftet macros

On Tue, 2018-01-23 at 11:55 +0100, Johannes Thumshirn wrote:
> Use pr_debug instead of hand craftet macros. This way it is not needed to
> re-compile the kernel to enable bsg debug outputs and it's possible to
> selectively enable specific prints.

Reviewed-by: Bart Van Assche <[email protected]>



2018-01-24 16:53:08

by Jens Axboe

[permalink] [raw]
Subject: Re: [PATCH v2] bsg: use pr_debug instead of hand craftet macros

On 1/24/18 9:24 AM, Bart Van Assche wrote:
> On Tue, 2018-01-23 at 11:55 +0100, Johannes Thumshirn wrote:
>> Use pr_debug instead of hand craftet macros. This way it is not needed to
>> re-compile the kernel to enable bsg debug outputs and it's possible to
>> selectively enable specific prints.
>
> Reviewed-by: Bart Van Assche <[email protected]>

Added, thanks Johannes.

--
Jens Axboe