* [PATCH 0/9] treewide: convert vprintk uses to %pV
@ 2010-11-10 0:35 Joe Perches
2010-11-10 0:35 ` [PATCH 1/9] drivers/gpu/drm/drm_stub.c: Use printf extension %pV Joe Perches
` (9 more replies)
0 siblings, 10 replies; 20+ messages in thread
From: Joe Perches @ 2010-11-10 0:35 UTC (permalink / raw)
To: linux-kernel
Cc: dri-devel, netdev, linux-wireless, cluster-devel, linux-nilfs, linux-nfs
Multiple secessive calls to printk can be interleaved.
Avoid this possible interleaving by using %pV
Joe Perches (9):
drivers/gpu/drm/drm_stub.c: Use printf extension %pV
drivers/isdn/mISDN: Use printf extension %pV
drivers/net/wireless/ath/debug.c: Use printf extension %pV
drivers/net/wireless/b43/main.c: Use printf extension %pV
drivers/net/wireless/b43legacy/main.c: Use printf extension %pV
fs/gfs2/glock.c: Use printf extension %pV
fs/nilfs2/super.c: Use printf extension %pV
fs/quota/dquot.c: Use printf extension %pV
net/sunrpc/svc.c: Use printf extension %pV
drivers/gpu/drm/drm_stub.c | 14 +++++++--
drivers/isdn/mISDN/layer1.c | 10 +++++--
drivers/isdn/mISDN/layer2.c | 12 ++++++--
drivers/isdn/mISDN/tei.c | 23 +++++++++++----
drivers/net/wireless/ath/debug.c | 9 +++++-
drivers/net/wireless/b43/main.c | 48 ++++++++++++++++++++++++--------
drivers/net/wireless/b43legacy/main.c | 47 ++++++++++++++++++++++++--------
fs/gfs2/glock.c | 9 +++++-
fs/nilfs2/super.c | 23 +++++++++++-----
fs/quota/dquot.c | 12 +++++---
net/sunrpc/svc.c | 12 +++++---
11 files changed, 161 insertions(+), 58 deletions(-)
--
1.7.3.1.g432b3.dirty
^ permalink raw reply [flat|nested] 20+ messages in thread
* [PATCH 1/9] drivers/gpu/drm/drm_stub.c: Use printf extension %pV
2010-11-10 0:35 [PATCH 0/9] treewide: convert vprintk uses to %pV Joe Perches
@ 2010-11-10 0:35 ` Joe Perches
2010-11-10 2:16 ` Kristian Høgsberg
2010-11-10 0:35 ` [PATCH 2/9] drivers/isdn/mISDN: " Joe Perches
` (8 subsequent siblings)
9 siblings, 1 reply; 20+ messages in thread
From: Joe Perches @ 2010-11-10 0:35 UTC (permalink / raw)
To: linux-kernel; +Cc: David Airlie, dri-devel
Using %pV reduces the number of printk calls and
eliminates any possible message interleaving from
other printk calls.
Signed-off-by: Joe Perches <joe@perches.com>
---
drivers/gpu/drm/drm_stub.c | 14 +++++++++++---
1 files changed, 11 insertions(+), 3 deletions(-)
diff --git a/drivers/gpu/drm/drm_stub.c b/drivers/gpu/drm/drm_stub.c
index cdc89ee..e632527 100644
--- a/drivers/gpu/drm/drm_stub.c
+++ b/drivers/gpu/drm/drm_stub.c
@@ -57,13 +57,21 @@ void drm_ut_debug_printk(unsigned int request_level,
const char *function_name,
const char *format, ...)
{
+ struct va_format vaf;
va_list args;
if (drm_debug & request_level) {
- if (function_name)
- printk(KERN_DEBUG "[%s:%s], ", prefix, function_name);
va_start(args, format);
- vprintk(format, args);
+
+ vaf.fmt = format;
+ vaf.va = &args;
+
+ if (function_name)
+ printk(KERN_DEBUG "[%s:%s], %pV",
+ prefix, function_name, &vaf);
+ else
+ printk(KERN_DEBUG "%pV", &vaf);
+
va_end(args);
}
}
--
1.7.3.1.g432b3.dirty
^ permalink raw reply related [flat|nested] 20+ messages in thread
* [PATCH 2/9] drivers/isdn/mISDN: Use printf extension %pV
2010-11-10 0:35 [PATCH 0/9] treewide: convert vprintk uses to %pV Joe Perches
2010-11-10 0:35 ` [PATCH 1/9] drivers/gpu/drm/drm_stub.c: Use printf extension %pV Joe Perches
@ 2010-11-10 0:35 ` Joe Perches
2010-11-16 18:23 ` David Miller
2010-11-10 0:35 ` [PATCH 3/9] drivers/net/wireless/ath/debug.c: " Joe Perches
` (7 subsequent siblings)
9 siblings, 1 reply; 20+ messages in thread
From: Joe Perches @ 2010-11-10 0:35 UTC (permalink / raw)
To: linux-kernel; +Cc: Karsten Keil, netdev
Using %pV reduces the number of printk calls and
eliminates any possible message interleaving from
other printk calls.
Signed-off-by: Joe Perches <joe@perches.com>
---
drivers/isdn/mISDN/layer1.c | 10 +++++++---
drivers/isdn/mISDN/layer2.c | 12 +++++++++---
drivers/isdn/mISDN/tei.c | 23 +++++++++++++++++------
3 files changed, 33 insertions(+), 12 deletions(-)
diff --git a/drivers/isdn/mISDN/layer1.c b/drivers/isdn/mISDN/layer1.c
index ac4aa18..5cc7c00 100644
--- a/drivers/isdn/mISDN/layer1.c
+++ b/drivers/isdn/mISDN/layer1.c
@@ -99,12 +99,16 @@ static void
l1m_debug(struct FsmInst *fi, char *fmt, ...)
{
struct layer1 *l1 = fi->userdata;
+ struct va_format vaf;
va_list va;
va_start(va, fmt);
- printk(KERN_DEBUG "%s: ", dev_name(&l1->dch->dev.dev));
- vprintk(fmt, va);
- printk("\n");
+
+ vaf.fmt = fmt;
+ vaf.va = &va;
+
+ printk(KERN_DEBUG "%s: %pV\n", dev_name(&l1->dch->dev.dev), &vaf);
+
va_end(va);
}
diff --git a/drivers/isdn/mISDN/layer2.c b/drivers/isdn/mISDN/layer2.c
index c973717..4ae7505 100644
--- a/drivers/isdn/mISDN/layer2.c
+++ b/drivers/isdn/mISDN/layer2.c
@@ -95,14 +95,20 @@ static void
l2m_debug(struct FsmInst *fi, char *fmt, ...)
{
struct layer2 *l2 = fi->userdata;
+ struct va_format vaf;
va_list va;
if (!(*debug & DEBUG_L2_FSM))
return;
+
va_start(va, fmt);
- printk(KERN_DEBUG "l2 (sapi %d tei %d): ", l2->sapi, l2->tei);
- vprintk(fmt, va);
- printk("\n");
+
+ vaf.fmt = fmt;
+ vaf.va = &va;
+
+ printk(KERN_DEBUG "l2 (sapi %d tei %d): %pV\n",
+ l2->sapi, l2->tei, &vaf);
+
va_end(va);
}
diff --git a/drivers/isdn/mISDN/tei.c b/drivers/isdn/mISDN/tei.c
index 1b85d9d..687c9b6 100644
--- a/drivers/isdn/mISDN/tei.c
+++ b/drivers/isdn/mISDN/tei.c
@@ -79,14 +79,19 @@ static void
da_debug(struct FsmInst *fi, char *fmt, ...)
{
struct manager *mgr = fi->userdata;
+ struct va_format vaf;
va_list va;
if (!(*debug & DEBUG_L2_TEIFSM))
return;
+
va_start(va, fmt);
- printk(KERN_DEBUG "mgr(%d): ", mgr->ch.st->dev->id);
- vprintk(fmt, va);
- printk("\n");
+
+ vaf.fmt = fmt;
+ vaf.va = &va;
+
+ printk(KERN_DEBUG "mgr(%d): %pV\n", mgr->ch.st->dev->id, &vaf);
+
va_end(va);
}
@@ -223,14 +228,20 @@ static void
tei_debug(struct FsmInst *fi, char *fmt, ...)
{
struct teimgr *tm = fi->userdata;
+ struct va_format vaf;
va_list va;
if (!(*debug & DEBUG_L2_TEIFSM))
return;
+
va_start(va, fmt);
- printk(KERN_DEBUG "sapi(%d) tei(%d): ", tm->l2->sapi, tm->l2->tei);
- vprintk(fmt, va);
- printk("\n");
+
+ vaf.fmt = fmt;
+ vaf.va = &va;
+
+ printk(KERN_DEBUG "sapi(%d) tei(%d): %pV\n",
+ tm->l2->sapi, tm->l2->tei, &vaf);
+
va_end(va);
}
--
1.7.3.1.g432b3.dirty
^ permalink raw reply related [flat|nested] 20+ messages in thread
* [PATCH 3/9] drivers/net/wireless/ath/debug.c: Use printf extension %pV
2010-11-10 0:35 [PATCH 0/9] treewide: convert vprintk uses to %pV Joe Perches
2010-11-10 0:35 ` [PATCH 1/9] drivers/gpu/drm/drm_stub.c: Use printf extension %pV Joe Perches
2010-11-10 0:35 ` [PATCH 2/9] drivers/isdn/mISDN: " Joe Perches
@ 2010-11-10 0:35 ` Joe Perches
2010-11-10 0:35 ` [PATCH 4/9] drivers/net/wireless/b43/main.c: " Joe Perches
` (6 subsequent siblings)
9 siblings, 0 replies; 20+ messages in thread
From: Joe Perches @ 2010-11-10 0:35 UTC (permalink / raw)
To: linux-kernel; +Cc: John W. Linville, linux-wireless, netdev
Using %pV reduces the number of printk calls and
eliminates any possible message interleaving from
other printk calls.
Signed-off-by: Joe Perches <joe@perches.com>
---
drivers/net/wireless/ath/debug.c | 9 +++++++--
1 files changed, 7 insertions(+), 2 deletions(-)
diff --git a/drivers/net/wireless/ath/debug.c b/drivers/net/wireless/ath/debug.c
index dacfb23..a9600ba 100644
--- a/drivers/net/wireless/ath/debug.c
+++ b/drivers/net/wireless/ath/debug.c
@@ -19,14 +19,19 @@
void ath_print(struct ath_common *common, int dbg_mask, const char *fmt, ...)
{
+ struct va_format vaf;
va_list args;
if (likely(!(common->debug_mask & dbg_mask)))
return;
va_start(args, fmt);
- printk(KERN_DEBUG "ath: ");
- vprintk(fmt, args);
+
+ vaf.fmt = fmt;
+ vaf.va = &args;
+
+ printk(KERN_DEBUG "ath: %pV", &vaf);
+
va_end(args);
}
EXPORT_SYMBOL(ath_print);
--
1.7.3.1.g432b3.dirty
^ permalink raw reply related [flat|nested] 20+ messages in thread
* [PATCH 4/9] drivers/net/wireless/b43/main.c: Use printf extension %pV
2010-11-10 0:35 [PATCH 0/9] treewide: convert vprintk uses to %pV Joe Perches
` (2 preceding siblings ...)
2010-11-10 0:35 ` [PATCH 3/9] drivers/net/wireless/ath/debug.c: " Joe Perches
@ 2010-11-10 0:35 ` Joe Perches
2010-11-10 0:35 ` [PATCH 5/9] drivers/net/wireless/b43legacy/main.c: " Joe Perches
` (5 subsequent siblings)
9 siblings, 0 replies; 20+ messages in thread
From: Joe Perches @ 2010-11-10 0:35 UTC (permalink / raw)
To: linux-kernel; +Cc: Stefano Brivio, John W. Linville, linux-wireless, netdev
Using %pV reduces the number of printk calls and
eliminates any possible message interleaving from
other printk calls.
Signed-off-by: Joe Perches <joe@perches.com>
---
drivers/net/wireless/b43/main.c | 48 +++++++++++++++++++++++++++++---------
1 files changed, 36 insertions(+), 12 deletions(-)
diff --git a/drivers/net/wireless/b43/main.c b/drivers/net/wireless/b43/main.c
index a118652..fa48803 100644
--- a/drivers/net/wireless/b43/main.c
+++ b/drivers/net/wireless/b43/main.c
@@ -322,59 +322,83 @@ static int b43_ratelimit(struct b43_wl *wl)
void b43info(struct b43_wl *wl, const char *fmt, ...)
{
+ struct va_format vaf;
va_list args;
if (b43_modparam_verbose < B43_VERBOSITY_INFO)
return;
if (!b43_ratelimit(wl))
return;
+
va_start(args, fmt);
- printk(KERN_INFO "b43-%s: ",
- (wl && wl->hw) ? wiphy_name(wl->hw->wiphy) : "wlan");
- vprintk(fmt, args);
+
+ vaf.fmt = fmt;
+ vaf.va = &args;
+
+ printk(KERN_INFO "b43-%s: %pV",
+ (wl && wl->hw) ? wiphy_name(wl->hw->wiphy) : "wlan", &vaf);
+
va_end(args);
}
void b43err(struct b43_wl *wl, const char *fmt, ...)
{
+ struct va_format vaf;
va_list args;
if (b43_modparam_verbose < B43_VERBOSITY_ERROR)
return;
if (!b43_ratelimit(wl))
return;
+
va_start(args, fmt);
- printk(KERN_ERR "b43-%s ERROR: ",
- (wl && wl->hw) ? wiphy_name(wl->hw->wiphy) : "wlan");
- vprintk(fmt, args);
+
+ vaf.fmt = fmt;
+ vaf.va = &args;
+
+ printk(KERN_ERR "b43-%s ERROR: %pV",
+ (wl && wl->hw) ? wiphy_name(wl->hw->wiphy) : "wlan", &vaf);
+
va_end(args);
}
void b43warn(struct b43_wl *wl, const char *fmt, ...)
{
+ struct va_format vaf;
va_list args;
if (b43_modparam_verbose < B43_VERBOSITY_WARN)
return;
if (!b43_ratelimit(wl))
return;
+
va_start(args, fmt);
- printk(KERN_WARNING "b43-%s warning: ",
- (wl && wl->hw) ? wiphy_name(wl->hw->wiphy) : "wlan");
- vprintk(fmt, args);
+
+ vaf.fmt = fmt;
+ vaf.va = &args;
+
+ printk(KERN_WARNING "b43-%s warning: %pV",
+ (wl && wl->hw) ? wiphy_name(wl->hw->wiphy) : "wlan", &vaf);
+
va_end(args);
}
void b43dbg(struct b43_wl *wl, const char *fmt, ...)
{
+ struct va_format vaf;
va_list args;
if (b43_modparam_verbose < B43_VERBOSITY_DEBUG)
return;
+
va_start(args, fmt);
- printk(KERN_DEBUG "b43-%s debug: ",
- (wl && wl->hw) ? wiphy_name(wl->hw->wiphy) : "wlan");
- vprintk(fmt, args);
+
+ vaf.fmt = fmt;
+ vaf.va = &args;
+
+ printk(KERN_DEBUG "b43-%s debug: %pV",
+ (wl && wl->hw) ? wiphy_name(wl->hw->wiphy) : "wlan", &vaf);
+
va_end(args);
}
--
1.7.3.1.g432b3.dirty
^ permalink raw reply related [flat|nested] 20+ messages in thread
* [PATCH 5/9] drivers/net/wireless/b43legacy/main.c: Use printf extension %pV
2010-11-10 0:35 [PATCH 0/9] treewide: convert vprintk uses to %pV Joe Perches
` (3 preceding siblings ...)
2010-11-10 0:35 ` [PATCH 4/9] drivers/net/wireless/b43/main.c: " Joe Perches
@ 2010-11-10 0:35 ` Joe Perches
2010-11-10 0:35 ` [PATCH 6/9] fs/gfs2/glock.c: " Joe Perches
` (4 subsequent siblings)
9 siblings, 0 replies; 20+ messages in thread
From: Joe Perches @ 2010-11-10 0:35 UTC (permalink / raw)
To: linux-kernel
Cc: Larry Finger, Stefano Brivio, John W. Linville, linux-wireless, netdev
Using %pV reduces the number of printk calls and
eliminates any possible message interleaving from
other printk calls.
Signed-off-by: Joe Perches <joe@perches.com>
---
drivers/net/wireless/b43legacy/main.c | 47 ++++++++++++++++++++++++--------
1 files changed, 35 insertions(+), 12 deletions(-)
diff --git a/drivers/net/wireless/b43legacy/main.c b/drivers/net/wireless/b43legacy/main.c
index 67f18ec..1f11e16 100644
--- a/drivers/net/wireless/b43legacy/main.c
+++ b/drivers/net/wireless/b43legacy/main.c
@@ -181,52 +181,75 @@ static int b43legacy_ratelimit(struct b43legacy_wl *wl)
void b43legacyinfo(struct b43legacy_wl *wl, const char *fmt, ...)
{
+ struct va_format vaf;
va_list args;
if (!b43legacy_ratelimit(wl))
return;
+
va_start(args, fmt);
- printk(KERN_INFO "b43legacy-%s: ",
- (wl && wl->hw) ? wiphy_name(wl->hw->wiphy) : "wlan");
- vprintk(fmt, args);
+
+ vaf.fmt = fmt;
+ vaf.va = &args;
+
+ printk(KERN_INFO "b43legacy-%s: %pV",
+ (wl && wl->hw) ? wiphy_name(wl->hw->wiphy) : "wlan", &vaf);
+
va_end(args);
}
void b43legacyerr(struct b43legacy_wl *wl, const char *fmt, ...)
{
+ struct va_format vaf;
va_list args;
if (!b43legacy_ratelimit(wl))
return;
+
va_start(args, fmt);
- printk(KERN_ERR "b43legacy-%s ERROR: ",
- (wl && wl->hw) ? wiphy_name(wl->hw->wiphy) : "wlan");
- vprintk(fmt, args);
+
+ vaf.fmt = fmt;
+ vaf.va = &args;
+
+ printk(KERN_ERR "b43legacy-%s ERROR: %pV",
+ (wl && wl->hw) ? wiphy_name(wl->hw->wiphy) : "wlan", &vaf);
+
va_end(args);
}
void b43legacywarn(struct b43legacy_wl *wl, const char *fmt, ...)
{
+ struct va_format vaf;
va_list args;
if (!b43legacy_ratelimit(wl))
return;
+
va_start(args, fmt);
- printk(KERN_WARNING "b43legacy-%s warning: ",
- (wl && wl->hw) ? wiphy_name(wl->hw->wiphy) : "wlan");
- vprintk(fmt, args);
+
+ vaf.fmt = fmt;
+ vaf.va = &args;
+
+ printk(KERN_WARNING "b43legacy-%s warning: %pV",
+ (wl && wl->hw) ? wiphy_name(wl->hw->wiphy) : "wlan", &vaf);
+
va_end(args);
}
#if B43legacy_DEBUG
void b43legacydbg(struct b43legacy_wl *wl, const char *fmt, ...)
{
+ struct va_format vaf;
va_list args;
va_start(args, fmt);
- printk(KERN_DEBUG "b43legacy-%s debug: ",
- (wl && wl->hw) ? wiphy_name(wl->hw->wiphy) : "wlan");
- vprintk(fmt, args);
+
+ vaf.fmt = fmt;
+ vaf.va = &args;
+
+ printk(KERN_DEBUG "b43legacy-%s debug: %pV",
+ (wl && wl->hw) ? wiphy_name(wl->hw->wiphy) : "wlan", &vaf);
+
va_end(args);
}
#endif /* DEBUG */
--
1.7.3.1.g432b3.dirty
^ permalink raw reply related [flat|nested] 20+ messages in thread
* [PATCH 6/9] fs/gfs2/glock.c: Use printf extension %pV
2010-11-10 0:35 [PATCH 0/9] treewide: convert vprintk uses to %pV Joe Perches
` (4 preceding siblings ...)
2010-11-10 0:35 ` [PATCH 5/9] drivers/net/wireless/b43legacy/main.c: " Joe Perches
@ 2010-11-10 0:35 ` Joe Perches
2010-11-10 20:55 ` Steven Whitehouse
2010-11-10 0:35 ` [PATCH 7/9] fs/nilfs2/super.c: Use printf extension %pV Joe Perches
` (3 subsequent siblings)
9 siblings, 1 reply; 20+ messages in thread
From: Joe Perches @ 2010-11-10 0:35 UTC (permalink / raw)
To: linux-kernel; +Cc: Steven Whitehouse, cluster-devel
Using %pV reduces the number of printk calls and
eliminates any possible message interleaving from
other printk calls.
Signed-off-by: Joe Perches <joe@perches.com>
---
fs/gfs2/glock.c | 9 +++++++--
1 files changed, 7 insertions(+), 2 deletions(-)
diff --git a/fs/gfs2/glock.c b/fs/gfs2/glock.c
index 8777885..d30b39c 100644
--- a/fs/gfs2/glock.c
+++ b/fs/gfs2/glock.c
@@ -952,17 +952,22 @@ int gfs2_glock_wait(struct gfs2_holder *gh)
void gfs2_print_dbg(struct seq_file *seq, const char *fmt, ...)
{
+ struct va_format vaf;
va_list args;
va_start(args, fmt);
+
if (seq) {
struct gfs2_glock_iter *gi = seq->private;
vsprintf(gi->string, fmt, args);
seq_printf(seq, gi->string);
} else {
- printk(KERN_ERR " ");
- vprintk(fmt, args);
+ vaf.fmt = fmt;
+ vaf.va = &args;
+
+ printk(KERN_ERR " %pV", &vaf);
}
+
va_end(args);
}
--
1.7.3.1.g432b3.dirty
^ permalink raw reply related [flat|nested] 20+ messages in thread
* [PATCH 7/9] fs/nilfs2/super.c: Use printf extension %pV
2010-11-10 0:35 [PATCH 0/9] treewide: convert vprintk uses to %pV Joe Perches
` (5 preceding siblings ...)
2010-11-10 0:35 ` [PATCH 6/9] fs/gfs2/glock.c: " Joe Perches
@ 2010-11-10 0:35 ` Joe Perches
2010-11-11 2:38 ` Ryusuke Konishi
2010-11-10 0:35 ` [PATCH 8/9] fs/quota/dquot.c: " Joe Perches
` (2 subsequent siblings)
9 siblings, 1 reply; 20+ messages in thread
From: Joe Perches @ 2010-11-10 0:35 UTC (permalink / raw)
To: linux-kernel; +Cc: KONISHI Ryusuke, linux-nilfs
Using %pV reduces the number of printk calls and
eliminates any possible message interleaving from
other printk calls.
Signed-off-by: Joe Perches <joe@perches.com>
---
fs/nilfs2/super.c | 23 ++++++++++++++++-------
1 files changed, 16 insertions(+), 7 deletions(-)
diff --git a/fs/nilfs2/super.c b/fs/nilfs2/super.c
index f804d41..bef8cc6 100644
--- a/fs/nilfs2/super.c
+++ b/fs/nilfs2/super.c
@@ -111,12 +111,17 @@ void nilfs_error(struct super_block *sb, const char *function,
const char *fmt, ...)
{
struct nilfs_sb_info *sbi = NILFS_SB(sb);
+ struct va_format vaf;
va_list args;
va_start(args, fmt);
- printk(KERN_CRIT "NILFS error (device %s): %s: ", sb->s_id, function);
- vprintk(fmt, args);
- printk("\n");
+
+ vaf.fmt = fmt;
+ vaf.va = &args;
+
+ printk(KERN_CRIT "NILFS error (device %s): %s: %pV\n",
+ sb->s_id, function, &vaf);
+
va_end(args);
if (!(sb->s_flags & MS_RDONLY)) {
@@ -136,13 +141,17 @@ void nilfs_error(struct super_block *sb, const char *function,
void nilfs_warning(struct super_block *sb, const char *function,
const char *fmt, ...)
{
+ struct va_format vaf;
va_list args;
va_start(args, fmt);
- printk(KERN_WARNING "NILFS warning (device %s): %s: ",
- sb->s_id, function);
- vprintk(fmt, args);
- printk("\n");
+
+ vaf.fmt = fmt;
+ vaf.va = &args;
+
+ printk(KERN_WARNING "NILFS warning (device %s): %s: %pV\n",
+ sb->s_id, function, &vaf);
+
va_end(args);
}
--
1.7.3.1.g432b3.dirty
^ permalink raw reply related [flat|nested] 20+ messages in thread
* [PATCH 8/9] fs/quota/dquot.c: Use printf extension %pV
2010-11-10 0:35 [PATCH 0/9] treewide: convert vprintk uses to %pV Joe Perches
` (6 preceding siblings ...)
2010-11-10 0:35 ` [PATCH 7/9] fs/nilfs2/super.c: Use printf extension %pV Joe Perches
@ 2010-11-10 0:35 ` Joe Perches
2010-11-10 1:01 ` Jan Kara
2010-11-10 0:35 ` [PATCH 9/9] net/sunrpc/svc.c: " Joe Perches
2010-11-10 22:48 ` [PATCH 0/9] treewide: convert vprintk uses to %pV Luis R. Rodriguez
9 siblings, 1 reply; 20+ messages in thread
From: Joe Perches @ 2010-11-10 0:35 UTC (permalink / raw)
To: linux-kernel; +Cc: Jan Kara
Using %pV reduces the number of printk calls and
eliminates any possible message interleaving from
other printk calls.
Signed-off-by: Joe Perches <joe@perches.com>
---
fs/quota/dquot.c | 12 ++++++++----
1 files changed, 8 insertions(+), 4 deletions(-)
diff --git a/fs/quota/dquot.c b/fs/quota/dquot.c
index 0fed41e..aad97ef 100644
--- a/fs/quota/dquot.c
+++ b/fs/quota/dquot.c
@@ -135,14 +135,18 @@ EXPORT_SYMBOL(dq_data_lock);
void __quota_error(struct super_block *sb, const char *func,
const char *fmt, ...)
{
+ struct va_format vaf;
va_list args;
if (printk_ratelimit()) {
va_start(args, fmt);
- printk(KERN_ERR "Quota error (device %s): %s: ",
- sb->s_id, func);
- vprintk(fmt, args);
- printk("\n");
+
+ vaf.fmt = fmt;
+ vaf.va = &args;
+
+ printk(KERN_ERR "Quota error (device %s): %s: %pV\n",
+ sb->s_id, func, &vaf);
+
va_end(args);
}
}
--
1.7.3.1.g432b3.dirty
^ permalink raw reply related [flat|nested] 20+ messages in thread
* [PATCH 9/9] net/sunrpc/svc.c: Use printf extension %pV
2010-11-10 0:35 [PATCH 0/9] treewide: convert vprintk uses to %pV Joe Perches
` (7 preceding siblings ...)
2010-11-10 0:35 ` [PATCH 8/9] fs/quota/dquot.c: " Joe Perches
@ 2010-11-10 0:35 ` Joe Perches
2010-11-10 22:48 ` [PATCH 0/9] treewide: convert vprintk uses to %pV Luis R. Rodriguez
9 siblings, 0 replies; 20+ messages in thread
From: Joe Perches @ 2010-11-10 0:35 UTC (permalink / raw)
To: linux-kernel
Cc: J. Bruce Fields, Neil Brown, Trond Myklebust, David S. Miller,
linux-nfs, netdev
Using %pV reduces the number of printk calls and
eliminates any possible message interleaving from
other printk calls.
Signed-off-by: Joe Perches <joe@perches.com>
---
net/sunrpc/svc.c | 12 ++++++++----
1 files changed, 8 insertions(+), 4 deletions(-)
diff --git a/net/sunrpc/svc.c b/net/sunrpc/svc.c
index 6359c42..e28ddb3 100644
--- a/net/sunrpc/svc.c
+++ b/net/sunrpc/svc.c
@@ -962,6 +962,7 @@ static int
__attribute__ ((format (printf, 2, 3)))
svc_printk(struct svc_rqst *rqstp, const char *fmt, ...)
{
+ struct va_format vaf;
va_list args;
int r;
char buf[RPC_MAX_ADDRBUFLEN];
@@ -969,11 +970,14 @@ svc_printk(struct svc_rqst *rqstp, const char *fmt, ...)
if (!net_ratelimit())
return 0;
- printk(KERN_WARNING "svc: %s: ",
- svc_print_addr(rqstp, buf, sizeof(buf)));
-
va_start(args, fmt);
- r = vprintk(fmt, args);
+
+ vaf.fmt = fmt;
+ vaf.va = &args;
+
+ r = printk(KERN_WARNING "svc: %s: %pV",
+ svc_print_addr(rqstp, buf, sizeof(buf)), &vaf);
+
va_end(args);
return r;
--
1.7.3.1.g432b3.dirty
^ permalink raw reply related [flat|nested] 20+ messages in thread
* Re: [PATCH 8/9] fs/quota/dquot.c: Use printf extension %pV
2010-11-10 0:35 ` [PATCH 8/9] fs/quota/dquot.c: " Joe Perches
@ 2010-11-10 1:01 ` Jan Kara
0 siblings, 0 replies; 20+ messages in thread
From: Jan Kara @ 2010-11-10 1:01 UTC (permalink / raw)
To: Joe Perches; +Cc: linux-kernel, Jan Kara
On Tue 09-11-10 16:35:22, Joe Perches wrote:
> Using %pV reduces the number of printk calls and
> eliminates any possible message interleaving from
> other printk calls.
Thanks. Merged.
Honza
>
> Signed-off-by: Joe Perches <joe@perches.com>
> ---
> fs/quota/dquot.c | 12 ++++++++----
> 1 files changed, 8 insertions(+), 4 deletions(-)
>
> diff --git a/fs/quota/dquot.c b/fs/quota/dquot.c
> index 0fed41e..aad97ef 100644
> --- a/fs/quota/dquot.c
> +++ b/fs/quota/dquot.c
> @@ -135,14 +135,18 @@ EXPORT_SYMBOL(dq_data_lock);
> void __quota_error(struct super_block *sb, const char *func,
> const char *fmt, ...)
> {
> + struct va_format vaf;
> va_list args;
>
> if (printk_ratelimit()) {
> va_start(args, fmt);
> - printk(KERN_ERR "Quota error (device %s): %s: ",
> - sb->s_id, func);
> - vprintk(fmt, args);
> - printk("\n");
> +
> + vaf.fmt = fmt;
> + vaf.va = &args;
> +
> + printk(KERN_ERR "Quota error (device %s): %s: %pV\n",
> + sb->s_id, func, &vaf);
> +
> va_end(args);
> }
> }
> --
> 1.7.3.1.g432b3.dirty
>
--
Jan Kara <jack@suse.cz>
SUSE Labs, CR
^ permalink raw reply [flat|nested] 20+ messages in thread
* Re: [PATCH 1/9] drivers/gpu/drm/drm_stub.c: Use printf extension %pV
2010-11-10 0:35 ` [PATCH 1/9] drivers/gpu/drm/drm_stub.c: Use printf extension %pV Joe Perches
@ 2010-11-10 2:16 ` Kristian Høgsberg
2010-11-10 2:31 ` Joe Perches
0 siblings, 1 reply; 20+ messages in thread
From: Kristian Høgsberg @ 2010-11-10 2:16 UTC (permalink / raw)
To: Joe Perches; +Cc: linux-kernel, dri-devel
On Tue, Nov 9, 2010 at 7:35 PM, Joe Perches <joe@perches.com> wrote:
> Using %pV reduces the number of printk calls and
> eliminates any possible message interleaving from
> other printk calls.
>
> Signed-off-by: Joe Perches <joe@perches.com>
> ---
> drivers/gpu/drm/drm_stub.c | 14 +++++++++++---
> 1 files changed, 11 insertions(+), 3 deletions(-)
>
> diff --git a/drivers/gpu/drm/drm_stub.c b/drivers/gpu/drm/drm_stub.c
> index cdc89ee..e632527 100644
> --- a/drivers/gpu/drm/drm_stub.c
> +++ b/drivers/gpu/drm/drm_stub.c
> @@ -57,13 +57,21 @@ void drm_ut_debug_printk(unsigned int request_level,
> const char *function_name,
> const char *format, ...)
> {
> + struct va_format vaf;
> va_list args;
>
> if (drm_debug & request_level) {
> - if (function_name)
> - printk(KERN_DEBUG "[%s:%s], ", prefix, function_name);
> va_start(args, format);
> - vprintk(format, args);
> +
> + vaf.fmt = format;
> + vaf.va = &args;
> +
> + if (function_name)
> + printk(KERN_DEBUG "[%s:%s], %pV",
> + prefix, function_name, &vaf);
> + else
> + printk(KERN_DEBUG "%pV", &vaf);
Wouldn't it be easier and more convenient to just make the %pV format
specifier just expect a format string and the va_arg list? Like this
printk(KERN_DEBUG "%pV", format, &args);
I mean, the %pV is kernel specific and we can just change how it works.
Kristian
^ permalink raw reply [flat|nested] 20+ messages in thread
* Re: [PATCH 1/9] drivers/gpu/drm/drm_stub.c: Use printf extension %pV
2010-11-10 2:16 ` Kristian Høgsberg
@ 2010-11-10 2:31 ` Joe Perches
0 siblings, 0 replies; 20+ messages in thread
From: Joe Perches @ 2010-11-10 2:31 UTC (permalink / raw)
To: Kristian Høgsberg; +Cc: linux-kernel, dri-devel
On Tue, 2010-11-09 at 21:16 -0500, Kristian Høgsberg wrote:
> On Tue, Nov 9, 2010 at 7:35 PM, Joe Perches <joe@perches.com> wrote:
> > Using %pV reduces the number of printk calls and
> > eliminates any possible message interleaving from
> > other printk calls.
> Wouldn't it be easier and more convenient to just make the %pV format
> specifier just expect a format string and the va_arg list? Like this
> printk(KERN_DEBUG "%pV", format, &args);
> I mean, the %pV is kernel specific and we can just change how it works.
No it wouldn't.
gcc would now warn about a mismatch between format and arguments.
^ permalink raw reply [flat|nested] 20+ messages in thread
* Re: [PATCH 6/9] fs/gfs2/glock.c: Use printf extension %pV
2010-11-10 0:35 ` [PATCH 6/9] fs/gfs2/glock.c: " Joe Perches
@ 2010-11-10 20:55 ` Steven Whitehouse
2010-11-10 21:19 ` [PATCH] fs/gfs2/glock.h: Add __attribute__((format(printf,2,3)) to gfs2_print_dbg Joe Perches
0 siblings, 1 reply; 20+ messages in thread
From: Steven Whitehouse @ 2010-11-10 20:55 UTC (permalink / raw)
To: Joe Perches; +Cc: linux-kernel, cluster-devel
Hi,
Now in my -nmw GFS2 git tree along with the previous patch. Thanks,
Steve.
On Tue, 2010-11-09 at 16:35 -0800, Joe Perches wrote:
> Using %pV reduces the number of printk calls and
> eliminates any possible message interleaving from
> other printk calls.
>
> Signed-off-by: Joe Perches <joe@perches.com>
> ---
> fs/gfs2/glock.c | 9 +++++++--
> 1 files changed, 7 insertions(+), 2 deletions(-)
>
> diff --git a/fs/gfs2/glock.c b/fs/gfs2/glock.c
> index 8777885..d30b39c 100644
> --- a/fs/gfs2/glock.c
> +++ b/fs/gfs2/glock.c
> @@ -952,17 +952,22 @@ int gfs2_glock_wait(struct gfs2_holder *gh)
>
> void gfs2_print_dbg(struct seq_file *seq, const char *fmt, ...)
> {
> + struct va_format vaf;
> va_list args;
>
> va_start(args, fmt);
> +
> if (seq) {
> struct gfs2_glock_iter *gi = seq->private;
> vsprintf(gi->string, fmt, args);
> seq_printf(seq, gi->string);
> } else {
> - printk(KERN_ERR " ");
> - vprintk(fmt, args);
> + vaf.fmt = fmt;
> + vaf.va = &args;
> +
> + printk(KERN_ERR " %pV", &vaf);
> }
> +
> va_end(args);
> }
>
^ permalink raw reply [flat|nested] 20+ messages in thread
* [PATCH] fs/gfs2/glock.h: Add __attribute__((format(printf,2,3)) to gfs2_print_dbg
2010-11-10 20:55 ` Steven Whitehouse
@ 2010-11-10 21:19 ` Joe Perches
2010-11-10 21:35 ` Steven Whitehouse
0 siblings, 1 reply; 20+ messages in thread
From: Joe Perches @ 2010-11-10 21:19 UTC (permalink / raw)
To: Steven Whitehouse; +Cc: linux-kernel, cluster-devel
Functions that use printf formatting, especially
those that use %pV, should have their uses of
printf format and arguments checked by the compiler.
Signed-off-by: Joe Perches <joe@perches.com>
---
No current uses report any error in an allyesconfig build.
fs/gfs2/glock.h | 2 ++
1 files changed, 2 insertions(+), 0 deletions(-)
diff --git a/fs/gfs2/glock.h b/fs/gfs2/glock.h
index db1c26d..a12d117 100644
--- a/fs/gfs2/glock.h
+++ b/fs/gfs2/glock.h
@@ -212,6 +212,8 @@ int gfs2_glock_nq_num(struct gfs2_sbd *sdp,
int gfs2_glock_nq_m(unsigned int num_gh, struct gfs2_holder *ghs);
void gfs2_glock_dq_m(unsigned int num_gh, struct gfs2_holder *ghs);
void gfs2_glock_dq_uninit_m(unsigned int num_gh, struct gfs2_holder *ghs);
+
+__attribute__ ((format(printf, 2, 3)))
void gfs2_print_dbg(struct seq_file *seq, const char *fmt, ...);
/**
^ permalink raw reply related [flat|nested] 20+ messages in thread
* Re: [PATCH] fs/gfs2/glock.h: Add __attribute__((format(printf,2,3)) to gfs2_print_dbg
2010-11-10 21:19 ` [PATCH] fs/gfs2/glock.h: Add __attribute__((format(printf,2,3)) to gfs2_print_dbg Joe Perches
@ 2010-11-10 21:35 ` Steven Whitehouse
0 siblings, 0 replies; 20+ messages in thread
From: Steven Whitehouse @ 2010-11-10 21:35 UTC (permalink / raw)
To: Joe Perches; +Cc: linux-kernel, cluster-devel
Hi,
Now in the GFS2 -nmw git tree. Thanks,
Steve.
On Wed, 2010-11-10 at 13:19 -0800, Joe Perches wrote:
> Functions that use printf formatting, especially
> those that use %pV, should have their uses of
> printf format and arguments checked by the compiler.
>
> Signed-off-by: Joe Perches <joe@perches.com>
> ---
> No current uses report any error in an allyesconfig build.
>
> fs/gfs2/glock.h | 2 ++
> 1 files changed, 2 insertions(+), 0 deletions(-)
>
> diff --git a/fs/gfs2/glock.h b/fs/gfs2/glock.h
> index db1c26d..a12d117 100644
> --- a/fs/gfs2/glock.h
> +++ b/fs/gfs2/glock.h
> @@ -212,6 +212,8 @@ int gfs2_glock_nq_num(struct gfs2_sbd *sdp,
> int gfs2_glock_nq_m(unsigned int num_gh, struct gfs2_holder *ghs);
> void gfs2_glock_dq_m(unsigned int num_gh, struct gfs2_holder *ghs);
> void gfs2_glock_dq_uninit_m(unsigned int num_gh, struct gfs2_holder *ghs);
> +
> +__attribute__ ((format(printf, 2, 3)))
> void gfs2_print_dbg(struct seq_file *seq, const char *fmt, ...);
>
> /**
>
>
^ permalink raw reply [flat|nested] 20+ messages in thread
* Re: [PATCH 0/9] treewide: convert vprintk uses to %pV
2010-11-10 0:35 [PATCH 0/9] treewide: convert vprintk uses to %pV Joe Perches
` (8 preceding siblings ...)
2010-11-10 0:35 ` [PATCH 9/9] net/sunrpc/svc.c: " Joe Perches
@ 2010-11-10 22:48 ` Luis R. Rodriguez
2010-11-10 23:01 ` Joe Perches
9 siblings, 1 reply; 20+ messages in thread
From: Luis R. Rodriguez @ 2010-11-10 22:48 UTC (permalink / raw)
To: Joe Perches
Cc: linux-kernel, dri-devel, netdev, linux-wireless, cluster-devel,
linux-nilfs, linux-nfs
On Tue, Nov 9, 2010 at 4:35 PM, Joe Perches <joe@perches.com> wrote:
> Multiple secessive calls to printk can be interleaved.
> Avoid this possible interleaving by using %pV
>
> Joe Perches (9):
> drivers/gpu/drm/drm_stub.c: Use printf extension %pV
> drivers/isdn/mISDN: Use printf extension %pV
> drivers/net/wireless/ath/debug.c: Use printf extension %pV
> drivers/net/wireless/b43/main.c: Use printf extension %pV
> drivers/net/wireless/b43legacy/main.c: Use printf extension %pV
> fs/gfs2/glock.c: Use printf extension %pV
> fs/nilfs2/super.c: Use printf extension %pV
> fs/quota/dquot.c: Use printf extension %pV
> net/sunrpc/svc.c: Use printf extension %pV
>
> drivers/gpu/drm/drm_stub.c | 14 +++++++--
> drivers/isdn/mISDN/layer1.c | 10 +++++--
> drivers/isdn/mISDN/layer2.c | 12 ++++++--
> drivers/isdn/mISDN/tei.c | 23 +++++++++++----
> drivers/net/wireless/ath/debug.c | 9 +++++-
> drivers/net/wireless/b43/main.c | 48 ++++++++++++++++++++++++--------
> drivers/net/wireless/b43legacy/main.c | 47 ++++++++++++++++++++++++--------
> fs/gfs2/glock.c | 9 +++++-
> fs/nilfs2/super.c | 23 +++++++++++-----
> fs/quota/dquot.c | 12 +++++---
> net/sunrpc/svc.c | 12 +++++---
> 11 files changed, 161 insertions(+), 58 deletions(-)
When was this added upstream BTW? I ask for backport considerations.
Luis
^ permalink raw reply [flat|nested] 20+ messages in thread
* Re: [PATCH 0/9] treewide: convert vprintk uses to %pV
2010-11-10 22:48 ` [PATCH 0/9] treewide: convert vprintk uses to %pV Luis R. Rodriguez
@ 2010-11-10 23:01 ` Joe Perches
0 siblings, 0 replies; 20+ messages in thread
From: Joe Perches @ 2010-11-10 23:01 UTC (permalink / raw)
To: Luis R. Rodriguez
Cc: linux-kernel, dri-devel, netdev, linux-wireless, cluster-devel,
linux-nilfs, linux-nfs
On Wed, 2010-11-10 at 14:48 -0800, Luis R. Rodriguez wrote:
> When was this added upstream BTW? I ask for backport considerations.
commit 7db6f5fb65a82af03229eef104dc9899c5eecf33
Author: Joe Perches <joe@perches.com>
Date: Sun Jun 27 01:02:33 2010 +0000
vsprintf: Recursive vsnprintf: Add "%pV", struct va_format
Add the ability to print a format and va_list from a structure pointer
Allows __dev_printk to be implemented as a single printk while
minimizing string space duplication.
%pV should not be used without some mechanism to verify the
format and argument use ala __attribute__(format (printf(...))).
Signed-off-by: Joe Perches <joe@perches.com>
Acked-by: Greg Kroah-Hartman <gregkh@suse.de>
Signed-off-by: David S. Miller <davem@davemloft.net>
^ permalink raw reply [flat|nested] 20+ messages in thread
* Re: [PATCH 7/9] fs/nilfs2/super.c: Use printf extension %pV
2010-11-10 0:35 ` [PATCH 7/9] fs/nilfs2/super.c: Use printf extension %pV Joe Perches
@ 2010-11-11 2:38 ` Ryusuke Konishi
0 siblings, 0 replies; 20+ messages in thread
From: Ryusuke Konishi @ 2010-11-11 2:38 UTC (permalink / raw)
To: joe; +Cc: linux-kernel, konishi.ryusuke, linux-nilfs
On Tue, 9 Nov 2010 16:35:21 -0800, Joe Perches wrote:
> Using %pV reduces the number of printk calls and
> eliminates any possible message interleaving from
> other printk calls.
>
> Signed-off-by: Joe Perches <joe@perches.com>
> ---
> fs/nilfs2/super.c | 23 ++++++++++++++++-------
> 1 files changed, 16 insertions(+), 7 deletions(-)
Applied to the nilfs tree.
Thank you.
Ryusuke Konishi
> diff --git a/fs/nilfs2/super.c b/fs/nilfs2/super.c
> index f804d41..bef8cc6 100644
> --- a/fs/nilfs2/super.c
> +++ b/fs/nilfs2/super.c
> @@ -111,12 +111,17 @@ void nilfs_error(struct super_block *sb, const char *function,
> const char *fmt, ...)
> {
> struct nilfs_sb_info *sbi = NILFS_SB(sb);
> + struct va_format vaf;
> va_list args;
>
> va_start(args, fmt);
> - printk(KERN_CRIT "NILFS error (device %s): %s: ", sb->s_id, function);
> - vprintk(fmt, args);
> - printk("\n");
> +
> + vaf.fmt = fmt;
> + vaf.va = &args;
> +
> + printk(KERN_CRIT "NILFS error (device %s): %s: %pV\n",
> + sb->s_id, function, &vaf);
> +
> va_end(args);
>
> if (!(sb->s_flags & MS_RDONLY)) {
> @@ -136,13 +141,17 @@ void nilfs_error(struct super_block *sb, const char *function,
> void nilfs_warning(struct super_block *sb, const char *function,
> const char *fmt, ...)
> {
> + struct va_format vaf;
> va_list args;
>
> va_start(args, fmt);
> - printk(KERN_WARNING "NILFS warning (device %s): %s: ",
> - sb->s_id, function);
> - vprintk(fmt, args);
> - printk("\n");
> +
> + vaf.fmt = fmt;
> + vaf.va = &args;
> +
> + printk(KERN_WARNING "NILFS warning (device %s): %s: %pV\n",
> + sb->s_id, function, &vaf);
> +
> va_end(args);
> }
>
> --
> 1.7.3.1.g432b3.dirty
>
> --
> To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at http://vger.kernel.org/majordomo-info.html
> Please read the FAQ at http://www.tux.org/lkml/
^ permalink raw reply [flat|nested] 20+ messages in thread
* Re: [PATCH 2/9] drivers/isdn/mISDN: Use printf extension %pV
2010-11-10 0:35 ` [PATCH 2/9] drivers/isdn/mISDN: " Joe Perches
@ 2010-11-16 18:23 ` David Miller
0 siblings, 0 replies; 20+ messages in thread
From: David Miller @ 2010-11-16 18:23 UTC (permalink / raw)
To: joe; +Cc: linux-kernel, isdn, netdev
From: Joe Perches <joe@perches.com>
Date: Tue, 9 Nov 2010 16:35:16 -0800
> Using %pV reduces the number of printk calls and
> eliminates any possible message interleaving from
> other printk calls.
>
> Signed-off-by: Joe Perches <joe@perches.com>
Applied, thanks.
^ permalink raw reply [flat|nested] 20+ messages in thread
end of thread, other threads:[~2010-11-16 18:22 UTC | newest]
Thread overview: 20+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2010-11-10 0:35 [PATCH 0/9] treewide: convert vprintk uses to %pV Joe Perches
2010-11-10 0:35 ` [PATCH 1/9] drivers/gpu/drm/drm_stub.c: Use printf extension %pV Joe Perches
2010-11-10 2:16 ` Kristian Høgsberg
2010-11-10 2:31 ` Joe Perches
2010-11-10 0:35 ` [PATCH 2/9] drivers/isdn/mISDN: " Joe Perches
2010-11-16 18:23 ` David Miller
2010-11-10 0:35 ` [PATCH 3/9] drivers/net/wireless/ath/debug.c: " Joe Perches
2010-11-10 0:35 ` [PATCH 4/9] drivers/net/wireless/b43/main.c: " Joe Perches
2010-11-10 0:35 ` [PATCH 5/9] drivers/net/wireless/b43legacy/main.c: " Joe Perches
2010-11-10 0:35 ` [PATCH 6/9] fs/gfs2/glock.c: " Joe Perches
2010-11-10 20:55 ` Steven Whitehouse
2010-11-10 21:19 ` [PATCH] fs/gfs2/glock.h: Add __attribute__((format(printf,2,3)) to gfs2_print_dbg Joe Perches
2010-11-10 21:35 ` Steven Whitehouse
2010-11-10 0:35 ` [PATCH 7/9] fs/nilfs2/super.c: Use printf extension %pV Joe Perches
2010-11-11 2:38 ` Ryusuke Konishi
2010-11-10 0:35 ` [PATCH 8/9] fs/quota/dquot.c: " Joe Perches
2010-11-10 1:01 ` Jan Kara
2010-11-10 0:35 ` [PATCH 9/9] net/sunrpc/svc.c: " Joe Perches
2010-11-10 22:48 ` [PATCH 0/9] treewide: convert vprintk uses to %pV Luis R. Rodriguez
2010-11-10 23:01 ` Joe Perches
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).