* [PATCH v3 1/1] perf/kprobe: maxactive for fd-based kprobe
@ 2022-06-15 21:15 Dmitrii Dolgov
2022-06-18 16:31 ` Masami Hiramatsu
0 siblings, 1 reply; 5+ messages in thread
From: Dmitrii Dolgov @ 2022-06-15 21:15 UTC (permalink / raw)
To: linux-perf-users, bpf, songliubraving, rostedt, peterz, mingo,
mhiramat, alexei.starovoitov
Cc: Dmitrii Dolgov
From: Song Liu <songliubraving@fb.com>
Enable specifying maxactive for fd based kretprobe. This will be useful
for tracing tools like bcc and bpftrace (see for example discussion [1]).
Use highest 12 bit (bit 52-63) to allow maximal maxactive of 4095.
The original patch [2] seems to be fallen through the cracks and wasn't
applied. I've merely rebased the work done by Song Liu and verififed it
still works.
Note that changes in rethook implementation may render maxactive
obsolete.
[1]: https://github.com/iovisor/bpftrace/issues/835
[2]: https://lore.kernel.org/all/20191007223111.1142454-1-songliubraving@fb.com/
Signed-off-by: Song Liu <songliubraving@fb.com>
Signed-off-by: Dmitrii Dolgov <9erthalion6@gmail.com>
---
Changes in v3:
- Set correct author
Changes in v2:
- Fix comment about number bits for the offset
include/linux/trace_events.h | 3 ++-
kernel/events/core.c | 20 ++++++++++++++++----
kernel/trace/trace_event_perf.c | 5 +++--
kernel/trace/trace_kprobe.c | 4 ++--
kernel/trace/trace_probe.h | 2 +-
5 files changed, 24 insertions(+), 10 deletions(-)
diff --git a/include/linux/trace_events.h b/include/linux/trace_events.h
index e6e95a9f07a5..7ca453a73252 100644
--- a/include/linux/trace_events.h
+++ b/include/linux/trace_events.h
@@ -850,7 +850,8 @@ extern void perf_trace_destroy(struct perf_event *event);
extern int perf_trace_add(struct perf_event *event, int flags);
extern void perf_trace_del(struct perf_event *event, int flags);
#ifdef CONFIG_KPROBE_EVENTS
-extern int perf_kprobe_init(struct perf_event *event, bool is_retprobe);
+extern int perf_kprobe_init(struct perf_event *event, bool is_retprobe,
+ int max_active);
extern void perf_kprobe_destroy(struct perf_event *event);
extern int bpf_get_kprobe_info(const struct perf_event *event,
u32 *fd_type, const char **symbol,
diff --git a/kernel/events/core.c b/kernel/events/core.c
index 23bb19716ad3..e8127f9b4df5 100644
--- a/kernel/events/core.c
+++ b/kernel/events/core.c
@@ -9809,24 +9809,34 @@ static struct pmu perf_tracepoint = {
* PERF_PROBE_CONFIG_IS_RETPROBE if set, create kretprobe/uretprobe
* if not set, create kprobe/uprobe
*
- * The following values specify a reference counter (or semaphore in the
- * terminology of tools like dtrace, systemtap, etc.) Userspace Statically
- * Defined Tracepoints (USDT). Currently, we use 40 bit for the offset.
+ * PERF_UPROBE_REF_CTR_OFFSET_* specify a reference counter (or semaphore
+ * in the terminology of tools like dtrace, systemtap, etc.) Userspace
+ * Statically Defined Tracepoints (USDT). Currently, we use 32 bit for the
+ * offset.
*
* PERF_UPROBE_REF_CTR_OFFSET_BITS # of bits in config as th offset
* PERF_UPROBE_REF_CTR_OFFSET_SHIFT # of bits to shift left
+ *
+ * PERF_KPROBE_MAX_ACTIVE_* defines max_active for kretprobe.
+ * KRETPROBE_MAXACTIVE_MAX is 4096. We allow 4095 here to save a bit.
*/
enum perf_probe_config {
PERF_PROBE_CONFIG_IS_RETPROBE = 1U << 0, /* [k,u]retprobe */
PERF_UPROBE_REF_CTR_OFFSET_BITS = 32,
PERF_UPROBE_REF_CTR_OFFSET_SHIFT = 64 - PERF_UPROBE_REF_CTR_OFFSET_BITS,
+ PERF_KPROBE_MAX_ACTIVE_BITS = 12,
+ PERF_KPROBE_MAX_ACTIVE_SHIFT = 64 - PERF_KPROBE_MAX_ACTIVE_BITS,
};
PMU_FORMAT_ATTR(retprobe, "config:0");
#endif
#ifdef CONFIG_KPROBE_EVENTS
+/* KRETPROBE_MAXACTIVE_MAX is 4096, only allow 4095 here to save a bit */
+PMU_FORMAT_ATTR(max_active, "config:52-63");
+
static struct attribute *kprobe_attrs[] = {
+ &format_attr_max_active.attr,
&format_attr_retprobe.attr,
NULL,
};
@@ -9857,6 +9867,7 @@ static int perf_kprobe_event_init(struct perf_event *event)
{
int err;
bool is_retprobe;
+ int max_active;
if (event->attr.type != perf_kprobe.type)
return -ENOENT;
@@ -9871,7 +9882,8 @@ static int perf_kprobe_event_init(struct perf_event *event)
return -EOPNOTSUPP;
is_retprobe = event->attr.config & PERF_PROBE_CONFIG_IS_RETPROBE;
- err = perf_kprobe_init(event, is_retprobe);
+ max_active = event->attr.config >> PERF_KPROBE_MAX_ACTIVE_SHIFT;
+ err = perf_kprobe_init(event, is_retprobe, max_active);
if (err)
return err;
diff --git a/kernel/trace/trace_event_perf.c b/kernel/trace/trace_event_perf.c
index a114549720d6..129000327809 100644
--- a/kernel/trace/trace_event_perf.c
+++ b/kernel/trace/trace_event_perf.c
@@ -245,7 +245,8 @@ void perf_trace_destroy(struct perf_event *p_event)
}
#ifdef CONFIG_KPROBE_EVENTS
-int perf_kprobe_init(struct perf_event *p_event, bool is_retprobe)
+int perf_kprobe_init(struct perf_event *p_event, bool is_retprobe,
+ int max_active)
{
int ret;
char *func = NULL;
@@ -271,7 +272,7 @@ int perf_kprobe_init(struct perf_event *p_event, bool is_retprobe)
tp_event = create_local_trace_kprobe(
func, (void *)(unsigned long)(p_event->attr.kprobe_addr),
- p_event->attr.probe_offset, is_retprobe);
+ p_event->attr.probe_offset, is_retprobe, max_active);
if (IS_ERR(tp_event)) {
ret = PTR_ERR(tp_event);
goto out;
diff --git a/kernel/trace/trace_kprobe.c b/kernel/trace/trace_kprobe.c
index 47cebef78532..3ad30cfce9c3 100644
--- a/kernel/trace/trace_kprobe.c
+++ b/kernel/trace/trace_kprobe.c
@@ -1784,7 +1784,7 @@ static int unregister_kprobe_event(struct trace_kprobe *tk)
/* create a trace_kprobe, but don't add it to global lists */
struct trace_event_call *
create_local_trace_kprobe(char *func, void *addr, unsigned long offs,
- bool is_return)
+ bool is_return, int max_active)
{
enum probe_print_type ptype;
struct trace_kprobe *tk;
@@ -1799,7 +1799,7 @@ create_local_trace_kprobe(char *func, void *addr, unsigned long offs,
event = func ? func : "DUMMY_EVENT";
tk = alloc_trace_kprobe(KPROBE_EVENT_SYSTEM, event, (void *)addr, func,
- offs, 0 /* maxactive */, 0 /* nargs */,
+ offs, max_active, 0 /* nargs */,
is_return);
if (IS_ERR(tk)) {
diff --git a/kernel/trace/trace_probe.h b/kernel/trace/trace_probe.h
index 92cc149af0fd..26fe21980793 100644
--- a/kernel/trace/trace_probe.h
+++ b/kernel/trace/trace_probe.h
@@ -376,7 +376,7 @@ extern int traceprobe_set_print_fmt(struct trace_probe *tp, enum probe_print_typ
#ifdef CONFIG_PERF_EVENTS
extern struct trace_event_call *
create_local_trace_kprobe(char *func, void *addr, unsigned long offs,
- bool is_return);
+ bool is_return, int max_active);
extern void destroy_local_trace_kprobe(struct trace_event_call *event_call);
extern struct trace_event_call *
--
2.32.0
^ permalink raw reply related [flat|nested] 5+ messages in thread
* Re: [PATCH v3 1/1] perf/kprobe: maxactive for fd-based kprobe
2022-06-15 21:15 [PATCH v3 1/1] perf/kprobe: maxactive for fd-based kprobe Dmitrii Dolgov
@ 2022-06-18 16:31 ` Masami Hiramatsu
2022-06-22 8:54 ` Dmitry Dolgov
0 siblings, 1 reply; 5+ messages in thread
From: Masami Hiramatsu @ 2022-06-18 16:31 UTC (permalink / raw)
To: Dmitrii Dolgov
Cc: linux-perf-users, bpf, songliubraving, rostedt, peterz, mingo,
alexei.starovoitov
On Wed, 15 Jun 2022 23:15:59 +0200
Dmitrii Dolgov <9erthalion6@gmail.com> wrote:
> From: Song Liu <songliubraving@fb.com>
>
> Enable specifying maxactive for fd based kretprobe. This will be useful
> for tracing tools like bcc and bpftrace (see for example discussion [1]).
> Use highest 12 bit (bit 52-63) to allow maximal maxactive of 4095.
I'm not sure what environment you are considering to use this
feature, but is 4095 enough, and are you really need to specify
the maxactive by linear digit?
I mean you may need the logarithm of maxactive? In this case, you
only need 4 bits for 2 - 65546 (1 = 2^0 will be used for the default
value).
Thank you,
>
> The original patch [2] seems to be fallen through the cracks and wasn't
> applied. I've merely rebased the work done by Song Liu and verififed it
> still works.
>
> Note that changes in rethook implementation may render maxactive
> obsolete.
>
> [1]: https://github.com/iovisor/bpftrace/issues/835
> [2]: https://lore.kernel.org/all/20191007223111.1142454-1-songliubraving@fb.com/
>
> Signed-off-by: Song Liu <songliubraving@fb.com>
> Signed-off-by: Dmitrii Dolgov <9erthalion6@gmail.com>
> ---
> Changes in v3:
> - Set correct author
>
> Changes in v2:
> - Fix comment about number bits for the offset
>
> include/linux/trace_events.h | 3 ++-
> kernel/events/core.c | 20 ++++++++++++++++----
> kernel/trace/trace_event_perf.c | 5 +++--
> kernel/trace/trace_kprobe.c | 4 ++--
> kernel/trace/trace_probe.h | 2 +-
> 5 files changed, 24 insertions(+), 10 deletions(-)
>
> diff --git a/include/linux/trace_events.h b/include/linux/trace_events.h
> index e6e95a9f07a5..7ca453a73252 100644
> --- a/include/linux/trace_events.h
> +++ b/include/linux/trace_events.h
> @@ -850,7 +850,8 @@ extern void perf_trace_destroy(struct perf_event *event);
> extern int perf_trace_add(struct perf_event *event, int flags);
> extern void perf_trace_del(struct perf_event *event, int flags);
> #ifdef CONFIG_KPROBE_EVENTS
> -extern int perf_kprobe_init(struct perf_event *event, bool is_retprobe);
> +extern int perf_kprobe_init(struct perf_event *event, bool is_retprobe,
> + int max_active);
> extern void perf_kprobe_destroy(struct perf_event *event);
> extern int bpf_get_kprobe_info(const struct perf_event *event,
> u32 *fd_type, const char **symbol,
> diff --git a/kernel/events/core.c b/kernel/events/core.c
> index 23bb19716ad3..e8127f9b4df5 100644
> --- a/kernel/events/core.c
> +++ b/kernel/events/core.c
> @@ -9809,24 +9809,34 @@ static struct pmu perf_tracepoint = {
> * PERF_PROBE_CONFIG_IS_RETPROBE if set, create kretprobe/uretprobe
> * if not set, create kprobe/uprobe
> *
> - * The following values specify a reference counter (or semaphore in the
> - * terminology of tools like dtrace, systemtap, etc.) Userspace Statically
> - * Defined Tracepoints (USDT). Currently, we use 40 bit for the offset.
> + * PERF_UPROBE_REF_CTR_OFFSET_* specify a reference counter (or semaphore
> + * in the terminology of tools like dtrace, systemtap, etc.) Userspace
> + * Statically Defined Tracepoints (USDT). Currently, we use 32 bit for the
> + * offset.
> *
> * PERF_UPROBE_REF_CTR_OFFSET_BITS # of bits in config as th offset
> * PERF_UPROBE_REF_CTR_OFFSET_SHIFT # of bits to shift left
> + *
> + * PERF_KPROBE_MAX_ACTIVE_* defines max_active for kretprobe.
> + * KRETPROBE_MAXACTIVE_MAX is 4096. We allow 4095 here to save a bit.
> */
> enum perf_probe_config {
> PERF_PROBE_CONFIG_IS_RETPROBE = 1U << 0, /* [k,u]retprobe */
> PERF_UPROBE_REF_CTR_OFFSET_BITS = 32,
> PERF_UPROBE_REF_CTR_OFFSET_SHIFT = 64 - PERF_UPROBE_REF_CTR_OFFSET_BITS,
> + PERF_KPROBE_MAX_ACTIVE_BITS = 12,
> + PERF_KPROBE_MAX_ACTIVE_SHIFT = 64 - PERF_KPROBE_MAX_ACTIVE_BITS,
> };
>
> PMU_FORMAT_ATTR(retprobe, "config:0");
> #endif
>
> #ifdef CONFIG_KPROBE_EVENTS
> +/* KRETPROBE_MAXACTIVE_MAX is 4096, only allow 4095 here to save a bit */
> +PMU_FORMAT_ATTR(max_active, "config:52-63");
> +
> static struct attribute *kprobe_attrs[] = {
> + &format_attr_max_active.attr,
> &format_attr_retprobe.attr,
> NULL,
> };
> @@ -9857,6 +9867,7 @@ static int perf_kprobe_event_init(struct perf_event *event)
> {
> int err;
> bool is_retprobe;
> + int max_active;
>
> if (event->attr.type != perf_kprobe.type)
> return -ENOENT;
> @@ -9871,7 +9882,8 @@ static int perf_kprobe_event_init(struct perf_event *event)
> return -EOPNOTSUPP;
>
> is_retprobe = event->attr.config & PERF_PROBE_CONFIG_IS_RETPROBE;
> - err = perf_kprobe_init(event, is_retprobe);
> + max_active = event->attr.config >> PERF_KPROBE_MAX_ACTIVE_SHIFT;
> + err = perf_kprobe_init(event, is_retprobe, max_active);
> if (err)
> return err;
>
> diff --git a/kernel/trace/trace_event_perf.c b/kernel/trace/trace_event_perf.c
> index a114549720d6..129000327809 100644
> --- a/kernel/trace/trace_event_perf.c
> +++ b/kernel/trace/trace_event_perf.c
> @@ -245,7 +245,8 @@ void perf_trace_destroy(struct perf_event *p_event)
> }
>
> #ifdef CONFIG_KPROBE_EVENTS
> -int perf_kprobe_init(struct perf_event *p_event, bool is_retprobe)
> +int perf_kprobe_init(struct perf_event *p_event, bool is_retprobe,
> + int max_active)
> {
> int ret;
> char *func = NULL;
> @@ -271,7 +272,7 @@ int perf_kprobe_init(struct perf_event *p_event, bool is_retprobe)
>
> tp_event = create_local_trace_kprobe(
> func, (void *)(unsigned long)(p_event->attr.kprobe_addr),
> - p_event->attr.probe_offset, is_retprobe);
> + p_event->attr.probe_offset, is_retprobe, max_active);
> if (IS_ERR(tp_event)) {
> ret = PTR_ERR(tp_event);
> goto out;
> diff --git a/kernel/trace/trace_kprobe.c b/kernel/trace/trace_kprobe.c
> index 47cebef78532..3ad30cfce9c3 100644
> --- a/kernel/trace/trace_kprobe.c
> +++ b/kernel/trace/trace_kprobe.c
> @@ -1784,7 +1784,7 @@ static int unregister_kprobe_event(struct trace_kprobe *tk)
> /* create a trace_kprobe, but don't add it to global lists */
> struct trace_event_call *
> create_local_trace_kprobe(char *func, void *addr, unsigned long offs,
> - bool is_return)
> + bool is_return, int max_active)
> {
> enum probe_print_type ptype;
> struct trace_kprobe *tk;
> @@ -1799,7 +1799,7 @@ create_local_trace_kprobe(char *func, void *addr, unsigned long offs,
> event = func ? func : "DUMMY_EVENT";
>
> tk = alloc_trace_kprobe(KPROBE_EVENT_SYSTEM, event, (void *)addr, func,
> - offs, 0 /* maxactive */, 0 /* nargs */,
> + offs, max_active, 0 /* nargs */,
> is_return);
>
> if (IS_ERR(tk)) {
> diff --git a/kernel/trace/trace_probe.h b/kernel/trace/trace_probe.h
> index 92cc149af0fd..26fe21980793 100644
> --- a/kernel/trace/trace_probe.h
> +++ b/kernel/trace/trace_probe.h
> @@ -376,7 +376,7 @@ extern int traceprobe_set_print_fmt(struct trace_probe *tp, enum probe_print_typ
> #ifdef CONFIG_PERF_EVENTS
> extern struct trace_event_call *
> create_local_trace_kprobe(char *func, void *addr, unsigned long offs,
> - bool is_return);
> + bool is_return, int max_active);
> extern void destroy_local_trace_kprobe(struct trace_event_call *event_call);
>
> extern struct trace_event_call *
> --
> 2.32.0
>
--
Masami Hiramatsu (Google) <mhiramat@kernel.org>
^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [PATCH v3 1/1] perf/kprobe: maxactive for fd-based kprobe
2022-06-18 16:31 ` Masami Hiramatsu
@ 2022-06-22 8:54 ` Dmitry Dolgov
2022-06-23 14:47 ` Masami Hiramatsu
0 siblings, 1 reply; 5+ messages in thread
From: Dmitry Dolgov @ 2022-06-22 8:54 UTC (permalink / raw)
To: Masami Hiramatsu
Cc: linux-perf-users, bpf, songliubraving, rostedt, peterz, mingo,
alexei.starovoitov
> On Sun, Jun 19, 2022 at 01:31:37AM +0900, Masami Hiramatsu wrote:
> On Wed, 15 Jun 2022 23:15:59 +0200
> Dmitrii Dolgov <9erthalion6@gmail.com> wrote:
>
> > From: Song Liu <songliubraving@fb.com>
> >
> > Enable specifying maxactive for fd based kretprobe. This will be useful
> > for tracing tools like bcc and bpftrace (see for example discussion [1]).
> > Use highest 12 bit (bit 52-63) to allow maximal maxactive of 4095.
>
> I'm not sure what environment you are considering to use this
> feature, but is 4095 enough, and are you really need to specify
> the maxactive by linear digit?
> I mean you may need the logarithm of maxactive? In this case, you
> only need 4 bits for 2 - 65546 (1 = 2^0 will be used for the default
> value).
From what I see it's capped by KRETPROBE_MAXACTIVE_MAX anyway, which
value is 4096. Do I miss something, is it possible to use maxactive with
larger values down the line?
^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [PATCH v3 1/1] perf/kprobe: maxactive for fd-based kprobe
2022-06-22 8:54 ` Dmitry Dolgov
@ 2022-06-23 14:47 ` Masami Hiramatsu
2022-06-25 15:21 ` Dmitry Dolgov
0 siblings, 1 reply; 5+ messages in thread
From: Masami Hiramatsu @ 2022-06-23 14:47 UTC (permalink / raw)
To: Dmitry Dolgov
Cc: linux-perf-users, bpf, songliubraving, rostedt, peterz, mingo,
alexei.starovoitov
On Wed, 22 Jun 2022 10:54:21 +0200
Dmitry Dolgov <9erthalion6@gmail.com> wrote:
> > On Sun, Jun 19, 2022 at 01:31:37AM +0900, Masami Hiramatsu wrote:
> > On Wed, 15 Jun 2022 23:15:59 +0200
> > Dmitrii Dolgov <9erthalion6@gmail.com> wrote:
> >
> > > From: Song Liu <songliubraving@fb.com>
> > >
> > > Enable specifying maxactive for fd based kretprobe. This will be useful
> > > for tracing tools like bcc and bpftrace (see for example discussion [1]).
> > > Use highest 12 bit (bit 52-63) to allow maximal maxactive of 4095.
> >
> > I'm not sure what environment you are considering to use this
> > feature, but is 4095 enough, and are you really need to specify
> > the maxactive by linear digit?
> > I mean you may need the logarithm of maxactive? In this case, you
> > only need 4 bits for 2 - 65546 (1 = 2^0 will be used for the default
> > value).
>
> From what I see it's capped by KRETPROBE_MAXACTIVE_MAX anyway, which
> value is 4096. Do I miss something, is it possible to use maxactive with
> larger values down the line?
Ah, I forgot to cap the maxactive in trace_kprobe. Yes, kretprobe's
maxactive has no limitation check (it depends on how much memory you
can allocate in the kernel.) If you think that is not enough, you
can expand the maximum number. Unless a huge system which runs
a ten thoudsands of similar process/threads, 4096 will be a good
number. So, it up to you. But personally I think the maxactive
should be specified by log2.
Thank you,
--
Masami Hiramatsu (Google) <mhiramat@kernel.org>
^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [PATCH v3 1/1] perf/kprobe: maxactive for fd-based kprobe
2022-06-23 14:47 ` Masami Hiramatsu
@ 2022-06-25 15:21 ` Dmitry Dolgov
0 siblings, 0 replies; 5+ messages in thread
From: Dmitry Dolgov @ 2022-06-25 15:21 UTC (permalink / raw)
To: Masami Hiramatsu
Cc: linux-perf-users, bpf, songliubraving, rostedt, peterz, mingo,
alexei.starovoitov
> On Thu, Jun 23, 2022 at 11:47:27PM +0900, Masami Hiramatsu wrote:
> On Wed, 22 Jun 2022 10:54:21 +0200
> Dmitry Dolgov <9erthalion6@gmail.com> wrote:
>
> > > On Sun, Jun 19, 2022 at 01:31:37AM +0900, Masami Hiramatsu wrote:
> > > On Wed, 15 Jun 2022 23:15:59 +0200
> > > Dmitrii Dolgov <9erthalion6@gmail.com> wrote:
> > >
> > > > From: Song Liu <songliubraving@fb.com>
> > > >
> > > > Enable specifying maxactive for fd based kretprobe. This will be useful
> > > > for tracing tools like bcc and bpftrace (see for example discussion [1]).
> > > > Use highest 12 bit (bit 52-63) to allow maximal maxactive of 4095.
> > >
> > > I'm not sure what environment you are considering to use this
> > > feature, but is 4095 enough, and are you really need to specify
> > > the maxactive by linear digit?
> > > I mean you may need the logarithm of maxactive? In this case, you
> > > only need 4 bits for 2 - 65546 (1 = 2^0 will be used for the default
> > > value).
> >
> > From what I see it's capped by KRETPROBE_MAXACTIVE_MAX anyway, which
> > value is 4096. Do I miss something, is it possible to use maxactive with
> > larger values down the line?
>
> Ah, I forgot to cap the maxactive in trace_kprobe. Yes, kretprobe's
> maxactive has no limitation check (it depends on how much memory you
> can allocate in the kernel.) If you think that is not enough, you
> can expand the maximum number. Unless a huge system which runs
> a ten thoudsands of similar process/threads, 4096 will be a good
> number. So, it up to you. But personally I think the maxactive
> should be specified by log2.
Thanks for clarification. Yep, makes sense to me, I'll prepare a new
version soon.
^ permalink raw reply [flat|nested] 5+ messages in thread
end of thread, other threads:[~2022-06-25 15:22 UTC | newest]
Thread overview: 5+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2022-06-15 21:15 [PATCH v3 1/1] perf/kprobe: maxactive for fd-based kprobe Dmitrii Dolgov
2022-06-18 16:31 ` Masami Hiramatsu
2022-06-22 8:54 ` Dmitry Dolgov
2022-06-23 14:47 ` Masami Hiramatsu
2022-06-25 15:21 ` Dmitry Dolgov
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).