* [PATCH 1/2] init/main.c: execute lockdep_init as early as possible
@ 2011-11-17 5:34 tom.leiming
2011-11-17 5:34 ` [PATCH 2/2] lockdep: print lock name for lockdep_init_error tom.leiming
` (2 more replies)
0 siblings, 3 replies; 10+ messages in thread
From: tom.leiming @ 2011-11-17 5:34 UTC (permalink / raw)
To: mingo, a.p.zijlstra; +Cc: linux-kernel, Ming Lei
From: Ming Lei <tom.leiming@gmail.com>
This patch removes the lockdep warning[1] on ARM platform.
The warning is caused by printk inside smp_setup_processor_id.
It is safe to do this because lockdep_init doesn't depend on
smp_setup_processor_id, so make printk can be called as early
as possible without lockdep complainment.
[1], lockdep warning
[ 0.000000] WARNING: lockdep init error! Arch code didn't call
lockdep_init() early enough?
[ 0.000000] Call stack leading to lockdep invocation was:
[ 0.000000] [<c00164bc>] save_stack_trace_tsk+0x0/0x90
[ 0.000000] [<ffffffff>] 0xffffffff
Signed-off-by: Ming Lei <tom.leiming@gmail.com>
---
init/main.c | 3 +--
1 files changed, 1 insertions(+), 2 deletions(-)
diff --git a/init/main.c b/init/main.c
index 217ed23..2c76efb 100644
--- a/init/main.c
+++ b/init/main.c
@@ -469,13 +469,12 @@ asmlinkage void __init start_kernel(void)
char * command_line;
extern const struct kernel_param __start___param[], __stop___param[];
- smp_setup_processor_id();
-
/*
* Need to run as early as possible, to initialize the
* lockdep hash:
*/
lockdep_init();
+ smp_setup_processor_id();
debug_objects_early_init();
/*
--
1.7.5.4
^ permalink raw reply related [flat|nested] 10+ messages in thread
* [PATCH 2/2] lockdep: print lock name for lockdep_init_error
2011-11-17 5:34 [PATCH 1/2] init/main.c: execute lockdep_init as early as possible tom.leiming
@ 2011-11-17 5:34 ` tom.leiming
2011-11-17 6:02 ` Yong Zhang
` (2 more replies)
2011-11-17 5:59 ` [PATCH 1/2] init/main.c: execute lockdep_init as early as possible Yong Zhang
2011-12-06 9:40 ` [tip:core/locking] init/main.c: Execute lockdep_init() " tip-bot for Ming Lei
2 siblings, 3 replies; 10+ messages in thread
From: tom.leiming @ 2011-11-17 5:34 UTC (permalink / raw)
To: mingo, a.p.zijlstra; +Cc: linux-kernel, Ming Lei
From: Ming Lei <tom.leiming@gmail.com>
This patch prints the name of the lock which is acquired
before lockdep_init is called, so that user can easily find
which lock trigged the lockdep init error warning.
This patch also removes the lockdep_init_error message
of "Arch code didn't call lockdep_init() early enough?" since
lockdep_init is called in arch independent code now.
Signed-off-by: Ming Lei <tom.leiming@gmail.com>
---
kernel/lockdep.c | 5 ++++-
1 files changed, 4 insertions(+), 1 deletions(-)
diff --git a/kernel/lockdep.c b/kernel/lockdep.c
index 4e7e672..8141317 100644
--- a/kernel/lockdep.c
+++ b/kernel/lockdep.c
@@ -430,6 +430,7 @@ unsigned int max_lockdep_depth;
* about it later on, in lockdep_info().
*/
static int lockdep_init_error;
+static const char *lock_init_error;
static unsigned long lockdep_init_trace_data[20];
static struct stack_trace lockdep_init_trace = {
.max_entries = ARRAY_SIZE(lockdep_init_trace_data),
@@ -651,6 +652,7 @@ look_up_lock_class(struct lockdep_map *lock, unsigned int subclass)
if (unlikely(!lockdep_initialized)) {
lockdep_init();
lockdep_init_error = 1;
+ lock_init_error = lock->name;
save_stack_trace(&lockdep_init_trace);
}
#endif
@@ -3965,7 +3967,8 @@ void __init lockdep_info(void)
#ifdef CONFIG_DEBUG_LOCKDEP
if (lockdep_init_error) {
- printk("WARNING: lockdep init error! Arch code didn't call lockdep_init() early enough?\n");
+ printk("WARNING: lockdep init error! lock-%s was acquired"
+ "before lockdep_init\n", lock_init_error);
printk("Call stack leading to lockdep invocation was:\n");
print_stack_trace(&lockdep_init_trace, 0);
}
--
1.7.5.4
^ permalink raw reply related [flat|nested] 10+ messages in thread
* Re: [PATCH 1/2] init/main.c: execute lockdep_init as early as possible
2011-11-17 5:34 [PATCH 1/2] init/main.c: execute lockdep_init as early as possible tom.leiming
2011-11-17 5:34 ` [PATCH 2/2] lockdep: print lock name for lockdep_init_error tom.leiming
@ 2011-11-17 5:59 ` Yong Zhang
2011-12-06 9:40 ` [tip:core/locking] init/main.c: Execute lockdep_init() " tip-bot for Ming Lei
2 siblings, 0 replies; 10+ messages in thread
From: Yong Zhang @ 2011-11-17 5:59 UTC (permalink / raw)
To: tom.leiming; +Cc: mingo, a.p.zijlstra, linux-kernel
On Thu, Nov 17, 2011 at 01:34:31PM +0800, tom.leiming@gmail.com wrote:
> From: Ming Lei <tom.leiming@gmail.com>
>
> This patch removes the lockdep warning[1] on ARM platform.
> The warning is caused by printk inside smp_setup_processor_id.
>
> It is safe to do this because lockdep_init doesn't depend on
> smp_setup_processor_id, so make printk can be called as early
> as possible without lockdep complainment.
>
> [1], lockdep warning
> [ 0.000000] WARNING: lockdep init error! Arch code didn't call
> lockdep_init() early enough?
> [ 0.000000] Call stack leading to lockdep invocation was:
> [ 0.000000] [<c00164bc>] save_stack_trace_tsk+0x0/0x90
> [ 0.000000] [<ffffffff>] 0xffffffff
>
> Signed-off-by: Ming Lei <tom.leiming@gmail.com>
Seems start_kernel() is the first C function called in arm.
IOW, this may be the simplest way for your issue.
Reviewed-by: Yong Zhang <yong.zhang0@gmail.com>
> ---
> init/main.c | 3 +--
> 1 files changed, 1 insertions(+), 2 deletions(-)
>
> diff --git a/init/main.c b/init/main.c
> index 217ed23..2c76efb 100644
> --- a/init/main.c
> +++ b/init/main.c
> @@ -469,13 +469,12 @@ asmlinkage void __init start_kernel(void)
> char * command_line;
> extern const struct kernel_param __start___param[], __stop___param[];
>
> - smp_setup_processor_id();
> -
> /*
> * Need to run as early as possible, to initialize the
> * lockdep hash:
> */
> lockdep_init();
> + smp_setup_processor_id();
> debug_objects_early_init();
>
> /*
> --
> 1.7.5.4
>
> --
> 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/
--
Only stand for myself
^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [PATCH 2/2] lockdep: print lock name for lockdep_init_error
2011-11-17 5:34 ` [PATCH 2/2] lockdep: print lock name for lockdep_init_error tom.leiming
@ 2011-11-17 6:02 ` Yong Zhang
2011-11-17 8:01 ` Ming Lei
2011-11-17 21:50 ` Ryan Mallon
2011-12-06 9:41 ` [tip:core/locking] lockdep: Print lock name in lockdep_init_error() tip-bot for Ming Lei
2 siblings, 1 reply; 10+ messages in thread
From: Yong Zhang @ 2011-11-17 6:02 UTC (permalink / raw)
To: tom.leiming; +Cc: mingo, a.p.zijlstra, linux-kernel
On Thu, Nov 17, 2011 at 01:34:32PM +0800, tom.leiming@gmail.com wrote:
> From: Ming Lei <tom.leiming@gmail.com>
>
> This patch prints the name of the lock which is acquired
> before lockdep_init is called, so that user can easily find
> which lock trigged the lockdep init error warning.
Should we care about that?
I think lockdep_init() called early enough give more hint.
Such as be the first C function called by arch.
Thanks,
Yong
>
> This patch also removes the lockdep_init_error message
> of "Arch code didn't call lockdep_init() early enough?" since
> lockdep_init is called in arch independent code now.
>
> Signed-off-by: Ming Lei <tom.leiming@gmail.com>
> ---
> kernel/lockdep.c | 5 ++++-
> 1 files changed, 4 insertions(+), 1 deletions(-)
>
> diff --git a/kernel/lockdep.c b/kernel/lockdep.c
> index 4e7e672..8141317 100644
> --- a/kernel/lockdep.c
> +++ b/kernel/lockdep.c
> @@ -430,6 +430,7 @@ unsigned int max_lockdep_depth;
> * about it later on, in lockdep_info().
> */
> static int lockdep_init_error;
> +static const char *lock_init_error;
> static unsigned long lockdep_init_trace_data[20];
> static struct stack_trace lockdep_init_trace = {
> .max_entries = ARRAY_SIZE(lockdep_init_trace_data),
> @@ -651,6 +652,7 @@ look_up_lock_class(struct lockdep_map *lock, unsigned int subclass)
> if (unlikely(!lockdep_initialized)) {
> lockdep_init();
> lockdep_init_error = 1;
> + lock_init_error = lock->name;
> save_stack_trace(&lockdep_init_trace);
> }
> #endif
> @@ -3965,7 +3967,8 @@ void __init lockdep_info(void)
>
> #ifdef CONFIG_DEBUG_LOCKDEP
> if (lockdep_init_error) {
> - printk("WARNING: lockdep init error! Arch code didn't call lockdep_init() early enough?\n");
> + printk("WARNING: lockdep init error! lock-%s was acquired"
> + "before lockdep_init\n", lock_init_error);
> printk("Call stack leading to lockdep invocation was:\n");
> print_stack_trace(&lockdep_init_trace, 0);
> }
> --
> 1.7.5.4
>
> --
> 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/
--
Only stand for myself
^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [PATCH 2/2] lockdep: print lock name for lockdep_init_error
2011-11-17 6:02 ` Yong Zhang
@ 2011-11-17 8:01 ` Ming Lei
2011-11-17 8:44 ` Yong Zhang
0 siblings, 1 reply; 10+ messages in thread
From: Ming Lei @ 2011-11-17 8:01 UTC (permalink / raw)
To: Yong Zhang; +Cc: mingo, a.p.zijlstra, linux-kernel
Hi,
Thanks for your review.
On Thu, Nov 17, 2011 at 2:02 PM, Yong Zhang <yong.zhang0@gmail.com> wrote:
> On Thu, Nov 17, 2011 at 01:34:32PM +0800, tom.leiming@gmail.com wrote:
>> From: Ming Lei <tom.leiming@gmail.com>
>>
>> This patch prints the name of the lock which is acquired
>> before lockdep_init is called, so that user can easily find
>> which lock trigged the lockdep init error warning.
>
> Should we care about that?
Yes, we should, see below.
>
> I think lockdep_init() called early enough give more hint.
> Such as be the first C function called by arch.
Maybe not early enough, before start_kernel is executed, arch
asm code still can call some C function, can't it?
The patch is just an improvement on original lockdep_init_error
detect, plus fix on incorrect debug message.
thanks,
--
Ming Lei
^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [PATCH 2/2] lockdep: print lock name for lockdep_init_error
2011-11-17 8:01 ` Ming Lei
@ 2011-11-17 8:44 ` Yong Zhang
2011-11-17 9:01 ` Peter Zijlstra
0 siblings, 1 reply; 10+ messages in thread
From: Yong Zhang @ 2011-11-17 8:44 UTC (permalink / raw)
To: Ming Lei; +Cc: mingo, a.p.zijlstra, linux-kernel
On Thu, Nov 17, 2011 at 04:01:16PM +0800, Ming Lei wrote:
> Hi,
>
> Thanks for your review.
>
> On Thu, Nov 17, 2011 at 2:02 PM, Yong Zhang <yong.zhang0@gmail.com> wrote:
> > On Thu, Nov 17, 2011 at 01:34:32PM +0800, tom.leiming@gmail.com wrote:
> >> From: Ming Lei <tom.leiming@gmail.com>
> >>
> >> This patch prints the name of the lock which is acquired
> >> before lockdep_init is called, so that user can easily find
> >> which lock trigged the lockdep init error warning.
> >
> > Should we care about that?
>
> Yes, we should, see below.
>
> >
> > I think lockdep_init() called early enough give more hint.
> > Such as be the first C function called by arch.
>
> Maybe not early enough, before start_kernel is executed, arch
> asm code still can call some C function, can't it?
To me that still means 'Arch code didn't call lockdep_init()
early enough'.
But anyway, let Peter/Ingo decide it.
Thanks,
Yong
^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [PATCH 2/2] lockdep: print lock name for lockdep_init_error
2011-11-17 8:44 ` Yong Zhang
@ 2011-11-17 9:01 ` Peter Zijlstra
0 siblings, 0 replies; 10+ messages in thread
From: Peter Zijlstra @ 2011-11-17 9:01 UTC (permalink / raw)
To: Yong Zhang; +Cc: Ming Lei, mingo, linux-kernel
On Thu, 2011-11-17 at 16:44 +0800, Yong Zhang wrote:
> On Thu, Nov 17, 2011 at 04:01:16PM +0800, Ming Lei wrote:
> To me that still means 'Arch code didn't call lockdep_init()
> early enough'.
>
> But anyway, let Peter/Ingo decide it.
I kinda like the hint as to what might have ran too early, so I've
queued it.
^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [PATCH 2/2] lockdep: print lock name for lockdep_init_error
2011-11-17 5:34 ` [PATCH 2/2] lockdep: print lock name for lockdep_init_error tom.leiming
2011-11-17 6:02 ` Yong Zhang
@ 2011-11-17 21:50 ` Ryan Mallon
2011-12-06 9:41 ` [tip:core/locking] lockdep: Print lock name in lockdep_init_error() tip-bot for Ming Lei
2 siblings, 0 replies; 10+ messages in thread
From: Ryan Mallon @ 2011-11-17 21:50 UTC (permalink / raw)
To: tom.leiming; +Cc: mingo, a.p.zijlstra, linux-kernel
On 17/11/11 16:34, tom.leiming@gmail.com wrote:
> From: Ming Lei <tom.leiming@gmail.com>
>
> This patch prints the name of the lock which is acquired
> before lockdep_init is called, so that user can easily find
> which lock trigged the lockdep init error warning.
>
> This patch also removes the lockdep_init_error message
> of "Arch code didn't call lockdep_init() early enough?" since
> lockdep_init is called in arch independent code now.
>
> Signed-off-by: Ming Lei <tom.leiming@gmail.com>
> ---
> kernel/lockdep.c | 5 ++++-
> 1 files changed, 4 insertions(+), 1 deletions(-)
>
> diff --git a/kernel/lockdep.c b/kernel/lockdep.c
> index 4e7e672..8141317 100644
> --- a/kernel/lockdep.c
> +++ b/kernel/lockdep.c
> @@ -430,6 +430,7 @@ unsigned int max_lockdep_depth;
> * about it later on, in lockdep_info().
> */
> static int lockdep_init_error;
> +static const char *lock_init_error;
You can now remove lockdep_init_error and just test against
lock_init_error below instead.
~Ryan
> static unsigned long lockdep_init_trace_data[20];
> static struct stack_trace lockdep_init_trace = {
> .max_entries = ARRAY_SIZE(lockdep_init_trace_data),
> @@ -651,6 +652,7 @@ look_up_lock_class(struct lockdep_map *lock, unsigned int subclass)
> if (unlikely(!lockdep_initialized)) {
> lockdep_init();
> lockdep_init_error = 1;
> + lock_init_error = lock->name;
> save_stack_trace(&lockdep_init_trace);
> }
> #endif
> @@ -3965,7 +3967,8 @@ void __init lockdep_info(void)
>
> #ifdef CONFIG_DEBUG_LOCKDEP
> if (lockdep_init_error) {
> - printk("WARNING: lockdep init error! Arch code didn't call lockdep_init() early enough?\n");
> + printk("WARNING: lockdep init error! lock-%s was acquired"
> + "before lockdep_init\n", lock_init_error);
> printk("Call stack leading to lockdep invocation was:\n");
> print_stack_trace(&lockdep_init_trace, 0);
> }
^ permalink raw reply [flat|nested] 10+ messages in thread
* [tip:core/locking] init/main.c: Execute lockdep_init() as early as possible
2011-11-17 5:34 [PATCH 1/2] init/main.c: execute lockdep_init as early as possible tom.leiming
2011-11-17 5:34 ` [PATCH 2/2] lockdep: print lock name for lockdep_init_error tom.leiming
2011-11-17 5:59 ` [PATCH 1/2] init/main.c: execute lockdep_init as early as possible Yong Zhang
@ 2011-12-06 9:40 ` tip-bot for Ming Lei
2 siblings, 0 replies; 10+ messages in thread
From: tip-bot for Ming Lei @ 2011-12-06 9:40 UTC (permalink / raw)
To: linux-tip-commits
Cc: linux-kernel, hpa, mingo, torvalds, a.p.zijlstra, akpm, tglx,
yong.zhang0, tom.leiming, mingo
Commit-ID: 73839c5b2eacc15cb0aa79c69b285fc659fa8851
Gitweb: http://git.kernel.org/tip/73839c5b2eacc15cb0aa79c69b285fc659fa8851
Author: Ming Lei <tom.leiming@gmail.com>
AuthorDate: Thu, 17 Nov 2011 13:34:31 +0800
Committer: Ingo Molnar <mingo@elte.hu>
CommitDate: Tue, 6 Dec 2011 08:16:53 +0100
init/main.c: Execute lockdep_init() as early as possible
This patch fixes a lockdep warning on ARM platforms:
[ 0.000000] WARNING: lockdep init error! Arch code didn't call lockdep_init() early enough?
[ 0.000000] Call stack leading to lockdep invocation was:
[ 0.000000] [<c00164bc>] save_stack_trace_tsk+0x0/0x90
[ 0.000000] [<ffffffff>] 0xffffffff
The warning is caused by printk inside smp_setup_processor_id().
It is safe to do this because lockdep_init() doesn't depend on
smp_setup_processor_id(), so improve things that printk can be
called as early as possible without lockdep complaint.
Signed-off-by: Ming Lei <tom.leiming@gmail.com>
Reviewed-by: Yong Zhang <yong.zhang0@gmail.com>
Signed-off-by: Peter Zijlstra <a.p.zijlstra@chello.nl>
Cc: Linus Torvalds <torvalds@linux-foundation.org>
Cc: Andrew Morton <akpm@linux-foundation.org>
Link: http://lkml.kernel.org/r/1321508072-23853-1-git-send-email-tom.leiming@gmail.com
Signed-off-by: Ingo Molnar <mingo@elte.hu>
---
init/main.c | 3 +--
1 files changed, 1 insertions(+), 2 deletions(-)
diff --git a/init/main.c b/init/main.c
index 217ed23..2c76efb 100644
--- a/init/main.c
+++ b/init/main.c
@@ -469,13 +469,12 @@ asmlinkage void __init start_kernel(void)
char * command_line;
extern const struct kernel_param __start___param[], __stop___param[];
- smp_setup_processor_id();
-
/*
* Need to run as early as possible, to initialize the
* lockdep hash:
*/
lockdep_init();
+ smp_setup_processor_id();
debug_objects_early_init();
/*
^ permalink raw reply related [flat|nested] 10+ messages in thread
* [tip:core/locking] lockdep: Print lock name in lockdep_init_error()
2011-11-17 5:34 ` [PATCH 2/2] lockdep: print lock name for lockdep_init_error tom.leiming
2011-11-17 6:02 ` Yong Zhang
2011-11-17 21:50 ` Ryan Mallon
@ 2011-12-06 9:41 ` tip-bot for Ming Lei
2 siblings, 0 replies; 10+ messages in thread
From: tip-bot for Ming Lei @ 2011-12-06 9:41 UTC (permalink / raw)
To: linux-tip-commits
Cc: linux-kernel, hpa, mingo, a.p.zijlstra, tglx, tom.leiming, mingo
Commit-ID: 81140acc66322dcde8346dabdf1ab4c229fce8d4
Gitweb: http://git.kernel.org/tip/81140acc66322dcde8346dabdf1ab4c229fce8d4
Author: Ming Lei <tom.leiming@gmail.com>
AuthorDate: Thu, 17 Nov 2011 13:34:32 +0800
Committer: Ingo Molnar <mingo@elte.hu>
CommitDate: Tue, 6 Dec 2011 08:16:55 +0100
lockdep: Print lock name in lockdep_init_error()
This patch prints the name of the lock which is acquired
before lockdep_init() is called, so that users can easily
find which lock triggered the lockdep init error warning.
This patch also removes the lockdep_init_error() message
of "Arch code didn't call lockdep_init() early enough?"
since lockdep_init() is called in arch independent code now.
Signed-off-by: Ming Lei <tom.leiming@gmail.com>
Signed-off-by: Peter Zijlstra <a.p.zijlstra@chello.nl>
Link: http://lkml.kernel.org/r/1321508072-23853-2-git-send-email-tom.leiming@gmail.com
Signed-off-by: Ingo Molnar <mingo@elte.hu>
---
kernel/lockdep.c | 5 ++++-
1 files changed, 4 insertions(+), 1 deletions(-)
diff --git a/kernel/lockdep.c b/kernel/lockdep.c
index 54cc0dc..e69d633 100644
--- a/kernel/lockdep.c
+++ b/kernel/lockdep.c
@@ -431,6 +431,7 @@ unsigned int max_lockdep_depth;
* about it later on, in lockdep_info().
*/
static int lockdep_init_error;
+static const char *lock_init_error;
static unsigned long lockdep_init_trace_data[20];
static struct stack_trace lockdep_init_trace = {
.max_entries = ARRAY_SIZE(lockdep_init_trace_data),
@@ -657,6 +658,7 @@ look_up_lock_class(struct lockdep_map *lock, unsigned int subclass)
if (unlikely(!lockdep_initialized)) {
lockdep_init();
lockdep_init_error = 1;
+ lock_init_error = lock->name;
save_stack_trace(&lockdep_init_trace);
}
#endif
@@ -3978,7 +3980,8 @@ void __init lockdep_info(void)
#ifdef CONFIG_DEBUG_LOCKDEP
if (lockdep_init_error) {
- printk("WARNING: lockdep init error! Arch code didn't call lockdep_init() early enough?\n");
+ printk("WARNING: lockdep init error! lock-%s was acquired"
+ "before lockdep_init\n", lock_init_error);
printk("Call stack leading to lockdep invocation was:\n");
print_stack_trace(&lockdep_init_trace, 0);
}
^ permalink raw reply related [flat|nested] 10+ messages in thread
end of thread, other threads:[~2011-12-06 9:41 UTC | newest]
Thread overview: 10+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2011-11-17 5:34 [PATCH 1/2] init/main.c: execute lockdep_init as early as possible tom.leiming
2011-11-17 5:34 ` [PATCH 2/2] lockdep: print lock name for lockdep_init_error tom.leiming
2011-11-17 6:02 ` Yong Zhang
2011-11-17 8:01 ` Ming Lei
2011-11-17 8:44 ` Yong Zhang
2011-11-17 9:01 ` Peter Zijlstra
2011-11-17 21:50 ` Ryan Mallon
2011-12-06 9:41 ` [tip:core/locking] lockdep: Print lock name in lockdep_init_error() tip-bot for Ming Lei
2011-11-17 5:59 ` [PATCH 1/2] init/main.c: execute lockdep_init as early as possible Yong Zhang
2011-12-06 9:40 ` [tip:core/locking] init/main.c: Execute lockdep_init() " tip-bot for Ming Lei
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).