All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH 1/2] tracing/uprobes: Fix documentation of uprobe registration syntax
@ 2013-11-18  4:40 Namhyung Kim
  2013-11-18  4:40 ` [PATCH 2/2] tracing/probes: Fix basic print type functions Namhyung Kim
  2013-11-20 15:19 ` [PATCH 1/2] tracing/uprobes: Fix documentation of uprobe registration syntax Oleg Nesterov
  0 siblings, 2 replies; 6+ messages in thread
From: Namhyung Kim @ 2013-11-18  4:40 UTC (permalink / raw)
  To: Steven Rostedt
  Cc: Frederic Weisbecker, Ingo Molnar, Masami Hiramatsu, LKML,
	Namhyung Kim, Srikar Dronamraju, Oleg Nesterov, zhangwei(Jovi),
	Arnaldo Carvalho de Melo

From: Namhyung Kim <namhyung.kim@lge.com>

The uprobe syntax requires an offset after a file path not a symbol.

Reviewed-by: Masami Hiramatsu <masami.hiramatsu.pt@hitachi.com>
Cc: Srikar Dronamraju <srikar@linux.vnet.ibm.com>
Cc: Oleg Nesterov <oleg@redhat.com>
Cc: zhangwei(Jovi) <jovi.zhangwei@huawei.com>
Cc: Arnaldo Carvalho de Melo <acme@ghostprotocols.net>
Signed-off-by: Namhyung Kim <namhyung@kernel.org>
---
 Documentation/trace/uprobetracer.txt | 10 +++++-----
 kernel/trace/trace_uprobe.c          |  2 +-
 2 files changed, 6 insertions(+), 6 deletions(-)

diff --git a/Documentation/trace/uprobetracer.txt b/Documentation/trace/uprobetracer.txt
index d9c3e682312c..8f1a8b8956fc 100644
--- a/Documentation/trace/uprobetracer.txt
+++ b/Documentation/trace/uprobetracer.txt
@@ -19,15 +19,15 @@ user to calculate the offset of the probepoint in the object.
 
 Synopsis of uprobe_tracer
 -------------------------
-  p[:[GRP/]EVENT] PATH:SYMBOL[+offs] [FETCHARGS] : Set a uprobe
-  r[:[GRP/]EVENT] PATH:SYMBOL[+offs] [FETCHARGS] : Set a return uprobe (uretprobe)
-  -:[GRP/]EVENT                                  : Clear uprobe or uretprobe event
+  p[:[GRP/]EVENT] PATH:OFFSET [FETCHARGS] : Set a uprobe
+  r[:[GRP/]EVENT] PATH:OFFSET [FETCHARGS] : Set a return uprobe (uretprobe)
+  -:[GRP/]EVENT                           : Clear uprobe or uretprobe event
 
   GRP           : Group name. If omitted, "uprobes" is the default value.
   EVENT         : Event name. If omitted, the event name is generated based
-                  on SYMBOL+offs.
+                  on PATH+OFFSET.
   PATH          : Path to an executable or a library.
-  SYMBOL[+offs] : Symbol+offset where the probe is inserted.
+  OFFSET        : Offset where the probe is inserted.
 
   FETCHARGS     : Arguments. Each probe can have up to 128 args.
    %REG         : Fetch register REG
diff --git a/kernel/trace/trace_uprobe.c b/kernel/trace/trace_uprobe.c
index 272261b5f94f..a415c5867ec5 100644
--- a/kernel/trace/trace_uprobe.c
+++ b/kernel/trace/trace_uprobe.c
@@ -210,7 +210,7 @@ end:
 
 /*
  * Argument syntax:
- *  - Add uprobe: p|r[:[GRP/]EVENT] PATH:SYMBOL [FETCHARGS]
+ *  - Add uprobe: p|r[:[GRP/]EVENT] PATH:OFFSET [FETCHARGS]
  *
  *  - Remove uprobe: -:[GRP/]EVENT
  */
-- 
1.7.11.7


^ permalink raw reply related	[flat|nested] 6+ messages in thread

* [PATCH 2/2] tracing/probes: Fix basic print type functions
  2013-11-18  4:40 [PATCH 1/2] tracing/uprobes: Fix documentation of uprobe registration syntax Namhyung Kim
@ 2013-11-18  4:40 ` Namhyung Kim
  2013-11-20 15:22   ` Oleg Nesterov
  2013-11-20 15:19 ` [PATCH 1/2] tracing/uprobes: Fix documentation of uprobe registration syntax Oleg Nesterov
  1 sibling, 1 reply; 6+ messages in thread
From: Namhyung Kim @ 2013-11-18  4:40 UTC (permalink / raw)
  To: Steven Rostedt
  Cc: Frederic Weisbecker, Ingo Molnar, Masami Hiramatsu, LKML,
	Namhyung Kim, Srikar Dronamraju, Oleg Nesterov, zhangwei(Jovi),
	Arnaldo Carvalho de Melo

From: Namhyung Kim <namhyung.kim@lge.com>

The print format of s32 type was "ld" and it's casted to "long".  So
it turned out to print 4294967295 for "-1" on 64-bit systems.  Not
sure whether it worked well on 32-bit systems.

Anyway, it'd be better if we have exact format and type cast for each
types on both of 32- and 64-bit systems.  In fact, the only difference
is on s64/u64 types.

Acked-by: Masami Hiramatsu <masami.hiramatsu.pt@hitachi.com>
Cc: Srikar Dronamraju <srikar@linux.vnet.ibm.com>
Cc: Oleg Nesterov <oleg@redhat.com>
Cc: zhangwei(Jovi) <jovi.zhangwei@huawei.com>
Cc: Arnaldo Carvalho de Melo <acme@ghostprotocols.net>
Signed-off-by: Namhyung Kim <namhyung@kernel.org>
---
 kernel/trace/trace_probe.c | 17 +++++++++++------
 1 file changed, 11 insertions(+), 6 deletions(-)

diff --git a/kernel/trace/trace_probe.c b/kernel/trace/trace_probe.c
index 412e959709b4..b571e4de0769 100644
--- a/kernel/trace/trace_probe.c
+++ b/kernel/trace/trace_probe.c
@@ -49,14 +49,19 @@ static __kprobes int PRINT_TYPE_FUNC_NAME(type)(struct trace_seq *s,	\
 }									\
 static const char PRINT_TYPE_FMT_NAME(type)[] = fmt;
 
-DEFINE_BASIC_PRINT_TYPE_FUNC(u8, "%x", unsigned int)
-DEFINE_BASIC_PRINT_TYPE_FUNC(u16, "%x", unsigned int)
-DEFINE_BASIC_PRINT_TYPE_FUNC(u32, "%lx", unsigned long)
+DEFINE_BASIC_PRINT_TYPE_FUNC(u8 , "%x", unsigned char)
+DEFINE_BASIC_PRINT_TYPE_FUNC(u16, "%x", unsigned short)
+DEFINE_BASIC_PRINT_TYPE_FUNC(u32, "%x", unsigned int)
+DEFINE_BASIC_PRINT_TYPE_FUNC(s8,  "%d", signed char)
+DEFINE_BASIC_PRINT_TYPE_FUNC(s16, "%d", short)
+DEFINE_BASIC_PRINT_TYPE_FUNC(s32, "%d", int)
+#if BITS_PER_LONG == 32
 DEFINE_BASIC_PRINT_TYPE_FUNC(u64, "%llx", unsigned long long)
-DEFINE_BASIC_PRINT_TYPE_FUNC(s8, "%d", int)
-DEFINE_BASIC_PRINT_TYPE_FUNC(s16, "%d", int)
-DEFINE_BASIC_PRINT_TYPE_FUNC(s32, "%ld", long)
 DEFINE_BASIC_PRINT_TYPE_FUNC(s64, "%lld", long long)
+#else /* BITS_PER_LONG == 64 */
+DEFINE_BASIC_PRINT_TYPE_FUNC(u64, "%lx", unsigned long)
+DEFINE_BASIC_PRINT_TYPE_FUNC(s64, "%ld", long)
+#endif
 
 static inline void *get_rloc_data(u32 *dl)
 {
-- 
1.7.11.7


^ permalink raw reply related	[flat|nested] 6+ messages in thread

* Re: [PATCH 1/2] tracing/uprobes: Fix documentation of uprobe registration syntax
  2013-11-18  4:40 [PATCH 1/2] tracing/uprobes: Fix documentation of uprobe registration syntax Namhyung Kim
  2013-11-18  4:40 ` [PATCH 2/2] tracing/probes: Fix basic print type functions Namhyung Kim
@ 2013-11-20 15:19 ` Oleg Nesterov
  1 sibling, 0 replies; 6+ messages in thread
From: Oleg Nesterov @ 2013-11-20 15:19 UTC (permalink / raw)
  To: Namhyung Kim
  Cc: Steven Rostedt, Frederic Weisbecker, Ingo Molnar,
	Masami Hiramatsu, LKML, Namhyung Kim, Srikar Dronamraju,
	zhangwei(Jovi), Arnaldo Carvalho de Melo

On 11/18, Namhyung Kim wrote:
>
> From: Namhyung Kim <namhyung.kim@lge.com>
>
> The uprobe syntax requires an offset after a file path not a symbol.
>
> Reviewed-by: Masami Hiramatsu <masami.hiramatsu.pt@hitachi.com>
> Cc: Srikar Dronamraju <srikar@linux.vnet.ibm.com>
> Cc: Oleg Nesterov <oleg@redhat.com>
> Cc: zhangwei(Jovi) <jovi.zhangwei@huawei.com>
> Cc: Arnaldo Carvalho de Melo <acme@ghostprotocols.net>
> Signed-off-by: Namhyung Kim <namhyung@kernel.org>

Acked-by: Oleg Nesterov <oleg@redhat.com>


^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [PATCH 2/2] tracing/probes: Fix basic print type functions
  2013-11-18  4:40 ` [PATCH 2/2] tracing/probes: Fix basic print type functions Namhyung Kim
@ 2013-11-20 15:22   ` Oleg Nesterov
  2013-11-22  6:05     ` Namhyung Kim
  0 siblings, 1 reply; 6+ messages in thread
From: Oleg Nesterov @ 2013-11-20 15:22 UTC (permalink / raw)
  To: Namhyung Kim
  Cc: Steven Rostedt, Frederic Weisbecker, Ingo Molnar,
	Masami Hiramatsu, LKML, Namhyung Kim, Srikar Dronamraju,
	zhangwei(Jovi), Arnaldo Carvalho de Melo

On 11/18, Namhyung Kim wrote:
>
> -DEFINE_BASIC_PRINT_TYPE_FUNC(u8, "%x", unsigned int)
> -DEFINE_BASIC_PRINT_TYPE_FUNC(u16, "%x", unsigned int)
> -DEFINE_BASIC_PRINT_TYPE_FUNC(u32, "%lx", unsigned long)
> +DEFINE_BASIC_PRINT_TYPE_FUNC(u8 , "%x", unsigned char)
> +DEFINE_BASIC_PRINT_TYPE_FUNC(u16, "%x", unsigned short)
> +DEFINE_BASIC_PRINT_TYPE_FUNC(u32, "%x", unsigned int)
> +DEFINE_BASIC_PRINT_TYPE_FUNC(s8,  "%d", signed char)
> +DEFINE_BASIC_PRINT_TYPE_FUNC(s16, "%d", short)
> +DEFINE_BASIC_PRINT_TYPE_FUNC(s32, "%d", int)
> +#if BITS_PER_LONG == 32
>  DEFINE_BASIC_PRINT_TYPE_FUNC(u64, "%llx", unsigned long long)
> -DEFINE_BASIC_PRINT_TYPE_FUNC(s8, "%d", int)
> -DEFINE_BASIC_PRINT_TYPE_FUNC(s16, "%d", int)
> -DEFINE_BASIC_PRINT_TYPE_FUNC(s32, "%ld", long)
>  DEFINE_BASIC_PRINT_TYPE_FUNC(s64, "%lld", long long)
> +#else /* BITS_PER_LONG == 64 */
> +DEFINE_BASIC_PRINT_TYPE_FUNC(u64, "%lx", unsigned long)
> +DEFINE_BASIC_PRINT_TYPE_FUNC(s64, "%ld", long)
> +#endif

I must have missed something... Not only I do not understand why
do we need "#if BITS_PER_LONG", I can't understand why
DEFINE_BASIC_PRINT_TYPE_FUNC() needs "cast" argument.

IOW, how about the patch below instead?

Oleg.

--- x/kernel/trace/trace_probe.c
+++ x/kernel/trace/trace_probe.c
@@ -40,23 +40,23 @@ const char *reserved_field_names[] = {
 #define PRINT_TYPE_FMT_NAME(type)	print_type_format_##type
 
 /* Printing  in basic type function template */
-#define DEFINE_BASIC_PRINT_TYPE_FUNC(type, fmt, cast)			\
+#define DEFINE_BASIC_PRINT_TYPE_FUNC(type, fmt)				\
 static __kprobes int PRINT_TYPE_FUNC_NAME(type)(struct trace_seq *s,	\
 						const char *name,	\
-						void *data, void *ent)\
+						void *data, void *ent)	\
 {									\
-	return trace_seq_printf(s, " %s=" fmt, name, (cast)*(type *)data);\
+	return trace_seq_printf(s, " %s=" fmt, name, *(type *)data);	\
 }									\
 static const char PRINT_TYPE_FMT_NAME(type)[] = fmt;
 
-DEFINE_BASIC_PRINT_TYPE_FUNC(u8, "%x", unsigned int)
-DEFINE_BASIC_PRINT_TYPE_FUNC(u16, "%x", unsigned int)
-DEFINE_BASIC_PRINT_TYPE_FUNC(u32, "%lx", unsigned long)
-DEFINE_BASIC_PRINT_TYPE_FUNC(u64, "%llx", unsigned long long)
-DEFINE_BASIC_PRINT_TYPE_FUNC(s8, "%d", int)
-DEFINE_BASIC_PRINT_TYPE_FUNC(s16, "%d", int)
-DEFINE_BASIC_PRINT_TYPE_FUNC(s32, "%ld", long)
-DEFINE_BASIC_PRINT_TYPE_FUNC(s64, "%lld", long long)
+DEFINE_BASIC_PRINT_TYPE_FUNC(u8, "%x")
+DEFINE_BASIC_PRINT_TYPE_FUNC(u16, "%x")
+DEFINE_BASIC_PRINT_TYPE_FUNC(u32, "%x")
+DEFINE_BASIC_PRINT_TYPE_FUNC(u64, "%Lx")
+DEFINE_BASIC_PRINT_TYPE_FUNC(s8, "%d")
+DEFINE_BASIC_PRINT_TYPE_FUNC(s16, "%d")
+DEFINE_BASIC_PRINT_TYPE_FUNC(s32, "%d")
+DEFINE_BASIC_PRINT_TYPE_FUNC(s64, "%Ld")
 
 static inline void *get_rloc_data(u32 *dl)
 {


^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [PATCH 2/2] tracing/probes: Fix basic print type functions
  2013-11-20 15:22   ` Oleg Nesterov
@ 2013-11-22  6:05     ` Namhyung Kim
  2013-11-22  8:10       ` Masami Hiramatsu
  0 siblings, 1 reply; 6+ messages in thread
From: Namhyung Kim @ 2013-11-22  6:05 UTC (permalink / raw)
  To: Oleg Nesterov
  Cc: Steven Rostedt, Frederic Weisbecker, Ingo Molnar,
	Masami Hiramatsu, LKML, Namhyung Kim, Srikar Dronamraju,
	zhangwei(Jovi), Arnaldo Carvalho de Melo

Hi Oleg,

On Wed, 20 Nov 2013 16:22:45 +0100, Oleg Nesterov wrote:
> On 11/18, Namhyung Kim wrote:
>>
>> -DEFINE_BASIC_PRINT_TYPE_FUNC(u8, "%x", unsigned int)
>> -DEFINE_BASIC_PRINT_TYPE_FUNC(u16, "%x", unsigned int)
>> -DEFINE_BASIC_PRINT_TYPE_FUNC(u32, "%lx", unsigned long)
>> +DEFINE_BASIC_PRINT_TYPE_FUNC(u8 , "%x", unsigned char)
>> +DEFINE_BASIC_PRINT_TYPE_FUNC(u16, "%x", unsigned short)
>> +DEFINE_BASIC_PRINT_TYPE_FUNC(u32, "%x", unsigned int)
>> +DEFINE_BASIC_PRINT_TYPE_FUNC(s8,  "%d", signed char)
>> +DEFINE_BASIC_PRINT_TYPE_FUNC(s16, "%d", short)
>> +DEFINE_BASIC_PRINT_TYPE_FUNC(s32, "%d", int)
>> +#if BITS_PER_LONG == 32
>>  DEFINE_BASIC_PRINT_TYPE_FUNC(u64, "%llx", unsigned long long)
>> -DEFINE_BASIC_PRINT_TYPE_FUNC(s8, "%d", int)
>> -DEFINE_BASIC_PRINT_TYPE_FUNC(s16, "%d", int)
>> -DEFINE_BASIC_PRINT_TYPE_FUNC(s32, "%ld", long)
>>  DEFINE_BASIC_PRINT_TYPE_FUNC(s64, "%lld", long long)
>> +#else /* BITS_PER_LONG == 64 */
>> +DEFINE_BASIC_PRINT_TYPE_FUNC(u64, "%lx", unsigned long)
>> +DEFINE_BASIC_PRINT_TYPE_FUNC(s64, "%ld", long)
>> +#endif
>
> I must have missed something... Not only I do not understand why
> do we need "#if BITS_PER_LONG", I can't understand why
> DEFINE_BASIC_PRINT_TYPE_FUNC() needs "cast" argument.
>
> IOW, how about the patch below instead?

Looks good to me.

Masami, did you have any issue regarding the casts?

Thanks,
Namhyung

>
> --- x/kernel/trace/trace_probe.c
> +++ x/kernel/trace/trace_probe.c
> @@ -40,23 +40,23 @@ const char *reserved_field_names[] = {
>  #define PRINT_TYPE_FMT_NAME(type)	print_type_format_##type
>  
>  /* Printing  in basic type function template */
> -#define DEFINE_BASIC_PRINT_TYPE_FUNC(type, fmt, cast)			\
> +#define DEFINE_BASIC_PRINT_TYPE_FUNC(type, fmt)				\
>  static __kprobes int PRINT_TYPE_FUNC_NAME(type)(struct trace_seq *s,	\
>  						const char *name,	\
> -						void *data, void *ent)\
> +						void *data, void *ent)	\
>  {									\
> -	return trace_seq_printf(s, " %s=" fmt, name, (cast)*(type *)data);\
> +	return trace_seq_printf(s, " %s=" fmt, name, *(type *)data);	\
>  }									\
>  static const char PRINT_TYPE_FMT_NAME(type)[] = fmt;
>  
> -DEFINE_BASIC_PRINT_TYPE_FUNC(u8, "%x", unsigned int)
> -DEFINE_BASIC_PRINT_TYPE_FUNC(u16, "%x", unsigned int)
> -DEFINE_BASIC_PRINT_TYPE_FUNC(u32, "%lx", unsigned long)
> -DEFINE_BASIC_PRINT_TYPE_FUNC(u64, "%llx", unsigned long long)
> -DEFINE_BASIC_PRINT_TYPE_FUNC(s8, "%d", int)
> -DEFINE_BASIC_PRINT_TYPE_FUNC(s16, "%d", int)
> -DEFINE_BASIC_PRINT_TYPE_FUNC(s32, "%ld", long)
> -DEFINE_BASIC_PRINT_TYPE_FUNC(s64, "%lld", long long)
> +DEFINE_BASIC_PRINT_TYPE_FUNC(u8, "%x")
> +DEFINE_BASIC_PRINT_TYPE_FUNC(u16, "%x")
> +DEFINE_BASIC_PRINT_TYPE_FUNC(u32, "%x")
> +DEFINE_BASIC_PRINT_TYPE_FUNC(u64, "%Lx")
> +DEFINE_BASIC_PRINT_TYPE_FUNC(s8, "%d")
> +DEFINE_BASIC_PRINT_TYPE_FUNC(s16, "%d")
> +DEFINE_BASIC_PRINT_TYPE_FUNC(s32, "%d")
> +DEFINE_BASIC_PRINT_TYPE_FUNC(s64, "%Ld")
>  
>  static inline void *get_rloc_data(u32 *dl)
>  {

^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: Re: [PATCH 2/2] tracing/probes: Fix basic print type functions
  2013-11-22  6:05     ` Namhyung Kim
@ 2013-11-22  8:10       ` Masami Hiramatsu
  0 siblings, 0 replies; 6+ messages in thread
From: Masami Hiramatsu @ 2013-11-22  8:10 UTC (permalink / raw)
  To: Namhyung Kim
  Cc: Oleg Nesterov, Steven Rostedt, Frederic Weisbecker, Ingo Molnar,
	LKML, Namhyung Kim, Srikar Dronamraju, zhangwei(Jovi),
	Arnaldo Carvalho de Melo

(2013/11/22 15:05), Namhyung Kim wrote:
> Hi Oleg,
> 
> On Wed, 20 Nov 2013 16:22:45 +0100, Oleg Nesterov wrote:
>> On 11/18, Namhyung Kim wrote:
>>>
>>> -DEFINE_BASIC_PRINT_TYPE_FUNC(u8, "%x", unsigned int)
>>> -DEFINE_BASIC_PRINT_TYPE_FUNC(u16, "%x", unsigned int)
>>> -DEFINE_BASIC_PRINT_TYPE_FUNC(u32, "%lx", unsigned long)
>>> +DEFINE_BASIC_PRINT_TYPE_FUNC(u8 , "%x", unsigned char)
>>> +DEFINE_BASIC_PRINT_TYPE_FUNC(u16, "%x", unsigned short)
>>> +DEFINE_BASIC_PRINT_TYPE_FUNC(u32, "%x", unsigned int)
>>> +DEFINE_BASIC_PRINT_TYPE_FUNC(s8,  "%d", signed char)
>>> +DEFINE_BASIC_PRINT_TYPE_FUNC(s16, "%d", short)
>>> +DEFINE_BASIC_PRINT_TYPE_FUNC(s32, "%d", int)
>>> +#if BITS_PER_LONG == 32
>>>  DEFINE_BASIC_PRINT_TYPE_FUNC(u64, "%llx", unsigned long long)
>>> -DEFINE_BASIC_PRINT_TYPE_FUNC(s8, "%d", int)
>>> -DEFINE_BASIC_PRINT_TYPE_FUNC(s16, "%d", int)
>>> -DEFINE_BASIC_PRINT_TYPE_FUNC(s32, "%ld", long)
>>>  DEFINE_BASIC_PRINT_TYPE_FUNC(s64, "%lld", long long)
>>> +#else /* BITS_PER_LONG == 64 */
>>> +DEFINE_BASIC_PRINT_TYPE_FUNC(u64, "%lx", unsigned long)
>>> +DEFINE_BASIC_PRINT_TYPE_FUNC(s64, "%ld", long)
>>> +#endif
>>
>> I must have missed something... Not only I do not understand why
>> do we need "#if BITS_PER_LONG", I can't understand why
>> DEFINE_BASIC_PRINT_TYPE_FUNC() needs "cast" argument.
>>
>> IOW, how about the patch below instead?
> 
> Looks good to me.
> 
> Masami, did you have any issue regarding the casts?

Hm, unless compiler doesn't complain about it,I'm OK for that.
And as far as I tested on x86/x86-64/arm(32), this has no problem. :)

Acked-by: Masami Hiramatsu <masami.hiramatsu.pt@hitachi.com>

Thank you!

-- 
Masami HIRAMATSU
IT Management Research Dept. Linux Technology Center
Hitachi, Ltd., Yokohama Research Laboratory
E-mail: masami.hiramatsu.pt@hitachi.com



^ permalink raw reply	[flat|nested] 6+ messages in thread

end of thread, other threads:[~2013-11-22  8:10 UTC | newest]

Thread overview: 6+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2013-11-18  4:40 [PATCH 1/2] tracing/uprobes: Fix documentation of uprobe registration syntax Namhyung Kim
2013-11-18  4:40 ` [PATCH 2/2] tracing/probes: Fix basic print type functions Namhyung Kim
2013-11-20 15:22   ` Oleg Nesterov
2013-11-22  6:05     ` Namhyung Kim
2013-11-22  8:10       ` Masami Hiramatsu
2013-11-20 15:19 ` [PATCH 1/2] tracing/uprobes: Fix documentation of uprobe registration syntax Oleg Nesterov

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.