* [PATCH] drm/i915: New vfunc prepare_request
@ 2017-04-28 17:26 ` Oscar Mateo
2017-04-29 0:46 ` ✓ Fi.CI.BAT: success for " Patchwork
` (2 more replies)
0 siblings, 3 replies; 8+ messages in thread
From: Oscar Mateo @ 2017-04-28 17:26 UTC (permalink / raw)
To: intel-gfx
This will be more useful later to support platforms that need to emit
HW commands at the beginning of every request (more general than emitting
things at the beginning of every batchbuffer, which is already covered by
emit_bb_start).
Cc: Chris Wilson <chris@chris-wilson.co.uk>
Cc: Joonas Lahtinen <joonas.lahtinen@linux.intel.com>
Signed-off-by: Oscar Mateo <oscar.mateo@intel.com>
---
drivers/gpu/drm/i915/intel_lrc.c | 17 ++++++++++++-----
drivers/gpu/drm/i915/intel_ringbuffer.h | 1 +
2 files changed, 13 insertions(+), 5 deletions(-)
diff --git a/drivers/gpu/drm/i915/intel_lrc.c b/drivers/gpu/drm/i915/intel_lrc.c
index 9488578..a5c055a 100644
--- a/drivers/gpu/drm/i915/intel_lrc.c
+++ b/drivers/gpu/drm/i915/intel_lrc.c
@@ -687,6 +687,15 @@ static bool insert_request(struct i915_priotree *pt, struct rb_root *root)
return first;
}
+static int execlists_prepare_request(struct drm_i915_gem_request *request)
+{
+ u32 *cs = intel_ring_begin(request, 0);
+ if (IS_ERR(cs))
+ return PTR_ERR(cs);
+
+ return 0;
+}
+
static void execlists_submit_request(struct drm_i915_gem_request *request)
{
struct intel_engine_cs *engine = request->engine;
@@ -879,7 +888,6 @@ static int execlists_request_alloc(struct drm_i915_gem_request *request)
{
struct intel_engine_cs *engine = request->engine;
struct intel_context *ce = &request->ctx->engine[engine->id];
- u32 *cs;
int ret;
GEM_BUG_ON(!ce->pin_count);
@@ -904,11 +912,9 @@ static int execlists_request_alloc(struct drm_i915_gem_request *request)
goto err;
}
- cs = intel_ring_begin(request, 0);
- if (IS_ERR(cs)) {
- ret = PTR_ERR(cs);
+ ret = engine->prepare_request(request);
+ if (ret)
goto err_unreserve;
- }
if (!ce->initialised) {
ret = engine->init_context(request);
@@ -1650,6 +1656,7 @@ void intel_logical_ring_cleanup(struct intel_engine_cs *engine)
static void execlists_set_default_submission(struct intel_engine_cs *engine)
{
+ engine->prepare_request = execlists_prepare_request;
engine->submit_request = execlists_submit_request;
engine->schedule = execlists_schedule;
engine->irq_tasklet.func = intel_lrc_irq_handler;
diff --git a/drivers/gpu/drm/i915/intel_ringbuffer.h b/drivers/gpu/drm/i915/intel_ringbuffer.h
index d901831..67de978 100644
--- a/drivers/gpu/drm/i915/intel_ringbuffer.h
+++ b/drivers/gpu/drm/i915/intel_ringbuffer.h
@@ -303,6 +303,7 @@ struct intel_engine_cs {
void (*emit_breadcrumb)(struct drm_i915_gem_request *req,
u32 *cs);
int emit_breadcrumb_sz;
+ int (*prepare_request)(struct drm_i915_gem_request *req);
/* Pass the request to the hardware queue (e.g. directly into
* the legacy ringbuffer or to the end of an execlist).
--
1.9.1
_______________________________________________
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/intel-gfx
^ permalink raw reply related [flat|nested] 8+ messages in thread
* ✓ Fi.CI.BAT: success for drm/i915: New vfunc prepare_request
2017-04-28 17:26 ` Oscar Mateo
@ 2017-04-29 0:46 ` Patchwork
2017-04-29 8:31 ` [PATCH] " Chris Wilson
2017-04-29 22:01 ` [PATCH] drm/i915: fix ptr_ret.cocci warnings kbuild test robot
2 siblings, 0 replies; 8+ messages in thread
From: Patchwork @ 2017-04-29 0:46 UTC (permalink / raw)
To: Oscar Mateo; +Cc: intel-gfx
== Series Details ==
Series: drm/i915: New vfunc prepare_request
URL : https://patchwork.freedesktop.org/series/23727/
State : success
== Summary ==
Series 23727v1 drm/i915: New vfunc prepare_request
https://patchwork.freedesktop.org/api/1.0/series/23727/revisions/1/mbox/
fi-bdw-5557u total:278 pass:267 dwarn:0 dfail:0 fail:0 skip:11 time:432s
fi-bdw-gvtdvm total:278 pass:256 dwarn:8 dfail:0 fail:0 skip:14 time:425s
fi-bsw-n3050 total:278 pass:242 dwarn:0 dfail:0 fail:0 skip:36 time:572s
fi-bxt-j4205 total:278 pass:259 dwarn:0 dfail:0 fail:0 skip:19 time:507s
fi-bxt-t5700 total:278 pass:258 dwarn:0 dfail:0 fail:0 skip:20 time:553s
fi-byt-j1900 total:278 pass:254 dwarn:0 dfail:0 fail:0 skip:24 time:485s
fi-byt-n2820 total:278 pass:250 dwarn:0 dfail:0 fail:0 skip:28 time:483s
fi-hsw-4770 total:278 pass:262 dwarn:0 dfail:0 fail:0 skip:16 time:411s
fi-hsw-4770r total:278 pass:262 dwarn:0 dfail:0 fail:0 skip:16 time:401s
fi-ilk-650 total:278 pass:228 dwarn:0 dfail:0 fail:0 skip:50 time:409s
fi-ivb-3520m total:278 pass:260 dwarn:0 dfail:0 fail:0 skip:18 time:489s
fi-ivb-3770 total:278 pass:260 dwarn:0 dfail:0 fail:0 skip:18 time:469s
fi-kbl-7500u total:278 pass:260 dwarn:0 dfail:0 fail:0 skip:18 time:462s
fi-kbl-7560u total:278 pass:268 dwarn:0 dfail:0 fail:0 skip:10 time:573s
fi-skl-6260u total:278 pass:268 dwarn:0 dfail:0 fail:0 skip:10 time:447s
fi-skl-6700hq total:278 pass:261 dwarn:0 dfail:0 fail:0 skip:17 time:567s
fi-skl-6700k total:278 pass:256 dwarn:4 dfail:0 fail:0 skip:18 time:461s
fi-skl-6770hq total:278 pass:268 dwarn:0 dfail:0 fail:0 skip:10 time:493s
fi-skl-gvtdvm total:278 pass:265 dwarn:0 dfail:0 fail:0 skip:13 time:435s
fi-snb-2520m total:278 pass:250 dwarn:0 dfail:0 fail:0 skip:28 time:535s
fi-snb-2600 total:278 pass:249 dwarn:0 dfail:0 fail:0 skip:29 time:401s
1d490e4b6d5324cfbf8dc800cf4a99471252802c drm-tip: 2017y-04m-28d-14h-14m-47s UTC integration manifest
338839e drm/i915: New vfunc prepare_request
== Logs ==
For more details see: https://intel-gfx-ci.01.org/CI/Patchwork_4585/
_______________________________________________
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/intel-gfx
^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [PATCH] drm/i915: New vfunc prepare_request
2017-04-28 17:26 ` Oscar Mateo
2017-04-29 0:46 ` ✓ Fi.CI.BAT: success for " Patchwork
@ 2017-04-29 8:31 ` Chris Wilson
2017-05-01 7:28 ` Oscar Mateo
2017-04-29 22:01 ` [PATCH] drm/i915: fix ptr_ret.cocci warnings kbuild test robot
2 siblings, 1 reply; 8+ messages in thread
From: Chris Wilson @ 2017-04-29 8:31 UTC (permalink / raw)
To: Oscar Mateo; +Cc: intel-gfx
On Fri, Apr 28, 2017 at 05:26:09PM +0000, Oscar Mateo wrote:
> This will be more useful later to support platforms that need to emit
> HW commands at the beginning of every request (more general than emitting
> things at the beginning of every batchbuffer, which is already covered by
> emit_bb_start).
We already have one... You are presenting this without a good reason and
failing to transform similar code, which indicates to me that this vfunc
isn't that general.
> Cc: Chris Wilson <chris@chris-wilson.co.uk>
> Cc: Joonas Lahtinen <joonas.lahtinen@linux.intel.com>
> Signed-off-by: Oscar Mateo <oscar.mateo@intel.com>
> ---
> drivers/gpu/drm/i915/intel_lrc.c | 17 ++++++++++++-----
> drivers/gpu/drm/i915/intel_ringbuffer.h | 1 +
> 2 files changed, 13 insertions(+), 5 deletions(-)
>
> diff --git a/drivers/gpu/drm/i915/intel_lrc.c b/drivers/gpu/drm/i915/intel_lrc.c
> index 9488578..a5c055a 100644
> --- a/drivers/gpu/drm/i915/intel_lrc.c
> +++ b/drivers/gpu/drm/i915/intel_lrc.c
> @@ -687,6 +687,15 @@ static bool insert_request(struct i915_priotree *pt, struct rb_root *root)
> return first;
> }
>
> +static int execlists_prepare_request(struct drm_i915_gem_request *request)
> +{
> + u32 *cs = intel_ring_begin(request, 0);
> + if (IS_ERR(cs))
> + return PTR_ERR(cs);
> +
> + return 0;
> +}
> +
> static void execlists_submit_request(struct drm_i915_gem_request *request)
> {
> struct intel_engine_cs *engine = request->engine;
> @@ -879,7 +888,6 @@ static int execlists_request_alloc(struct drm_i915_gem_request *request)
> {
> struct intel_engine_cs *engine = request->engine;
> struct intel_context *ce = &request->ctx->engine[engine->id];
> - u32 *cs;
> int ret;
>
> GEM_BUG_ON(!ce->pin_count);
> @@ -904,11 +912,9 @@ static int execlists_request_alloc(struct drm_i915_gem_request *request)
> goto err;
> }
>
> - cs = intel_ring_begin(request, 0);
> - if (IS_ERR(cs)) {
> - ret = PTR_ERR(cs);
> + ret = engine->prepare_request(request);
> + if (ret)
> goto err_unreserve;
> - }
>
> if (!ce->initialised) {
> ret = engine->init_context(request);
> @@ -1650,6 +1656,7 @@ void intel_logical_ring_cleanup(struct intel_engine_cs *engine)
>
> static void execlists_set_default_submission(struct intel_engine_cs *engine)
> {
> + engine->prepare_request = execlists_prepare_request;
> engine->submit_request = execlists_submit_request;
> engine->schedule = execlists_schedule;
> engine->irq_tasklet.func = intel_lrc_irq_handler;
> diff --git a/drivers/gpu/drm/i915/intel_ringbuffer.h b/drivers/gpu/drm/i915/intel_ringbuffer.h
> index d901831..67de978 100644
> --- a/drivers/gpu/drm/i915/intel_ringbuffer.h
> +++ b/drivers/gpu/drm/i915/intel_ringbuffer.h
> @@ -303,6 +303,7 @@ struct intel_engine_cs {
> void (*emit_breadcrumb)(struct drm_i915_gem_request *req,
> u32 *cs);
> int emit_breadcrumb_sz;
> + int (*prepare_request)(struct drm_i915_gem_request *req);
Why in the emit group?
-Chris
--
Chris Wilson, Intel Open Source Technology Centre
_______________________________________________
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/intel-gfx
^ permalink raw reply [flat|nested] 8+ messages in thread
* [PATCH] drm/i915: fix ptr_ret.cocci warnings
2017-04-28 17:26 ` Oscar Mateo
2017-04-29 0:46 ` ✓ Fi.CI.BAT: success for " Patchwork
2017-04-29 8:31 ` [PATCH] " Chris Wilson
@ 2017-04-29 22:01 ` kbuild test robot
2 siblings, 0 replies; 8+ messages in thread
From: kbuild test robot @ 2017-04-29 22:01 UTC (permalink / raw)
To: Oscar Mateo; +Cc: intel-gfx, kbuild-all
drivers/gpu/drm/i915/intel_lrc.c:632:1-3: WARNING: PTR_ERR_OR_ZERO can be used
Use PTR_ERR_OR_ZERO rather than if(IS_ERR(...)) + PTR_ERR
Generated by: scripts/coccinelle/api/ptr_ret.cocci
CC: Oscar Mateo <oscar.mateo@intel.com>
Signed-off-by: Fengguang Wu <fengguang.wu@intel.com>
---
intel_lrc.c | 5 +----
1 file changed, 1 insertion(+), 4 deletions(-)
--- a/drivers/gpu/drm/i915/intel_lrc.c
+++ b/drivers/gpu/drm/i915/intel_lrc.c
@@ -629,10 +629,7 @@ static bool insert_request(struct i915_p
static int execlists_prepare_request(struct drm_i915_gem_request *request)
{
u32 *cs = intel_ring_begin(request, 0);
- if (IS_ERR(cs))
- return PTR_ERR(cs);
-
- return 0;
+ return PTR_ERR_OR_ZERO(cs);
}
static void execlists_submit_request(struct drm_i915_gem_request *request)
_______________________________________________
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/intel-gfx
^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [PATCH] drm/i915: New vfunc prepare_request
2017-04-28 17:26 ` Oscar Mateo
@ 2017-04-29 22:01 kbuild test robot
2017-04-28 17:26 ` Oscar Mateo
2 siblings, 1 reply; 8+ messages in thread
From: kbuild test robot @ 2017-04-29 22:01 UTC (permalink / raw)
To: Oscar Mateo; +Cc: intel-gfx, kbuild-all
Hi Oscar,
[auto build test WARNING on drm-intel/for-linux-next]
[also build test WARNING on next-20170428]
[cannot apply to v4.11-rc8]
[if your patch is applied to the wrong git tree, please drop us a note to help improve the system]
url: https://github.com/0day-ci/linux/commits/Oscar-Mateo/drm-i915-New-vfunc-prepare_request/20170430-041411
base: git://anongit.freedesktop.org/drm-intel for-linux-next
coccinelle warnings: (new ones prefixed by >>)
>> drivers/gpu/drm/i915/intel_lrc.c:632:1-3: WARNING: PTR_ERR_OR_ZERO can be used
Please review and possibly fold the followup patch.
---
0-DAY kernel test infrastructure Open Source Technology Center
https://lists.01.org/pipermail/kbuild-all Intel Corporation
_______________________________________________
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/intel-gfx
^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [PATCH] drm/i915: New vfunc prepare_request
2017-04-29 8:31 ` [PATCH] " Chris Wilson
@ 2017-05-01 7:28 ` Oscar Mateo
2017-05-02 8:59 ` Chris Wilson
0 siblings, 1 reply; 8+ messages in thread
From: Oscar Mateo @ 2017-05-01 7:28 UTC (permalink / raw)
To: Chris Wilson, intel-gfx, Joonas Lahtinen
On 04/29/2017 08:31 AM, Chris Wilson wrote:
> On Fri, Apr 28, 2017 at 05:26:09PM +0000, Oscar Mateo wrote:
>> This will be more useful later to support platforms that need to emit
>> HW commands at the beginning of every request (more general than emitting
>> things at the beginning of every batchbuffer, which is already covered by
>> emit_bb_start).
> We already have one... You are presenting this without a good reason and
> failing to transform similar code, which indicates to me that this vfunc
> isn't that general.
It looks like I've missed that. What function are you talking about?
>> Cc: Chris Wilson <chris@chris-wilson.co.uk>
>> Cc: Joonas Lahtinen <joonas.lahtinen@linux.intel.com>
>> Signed-off-by: Oscar Mateo <oscar.mateo@intel.com>
>> ---
>> drivers/gpu/drm/i915/intel_lrc.c | 17 ++++++++++++-----
>> drivers/gpu/drm/i915/intel_ringbuffer.h | 1 +
>> 2 files changed, 13 insertions(+), 5 deletions(-)
>>
>> diff --git a/drivers/gpu/drm/i915/intel_lrc.c b/drivers/gpu/drm/i915/intel_lrc.c
>> index 9488578..a5c055a 100644
>> --- a/drivers/gpu/drm/i915/intel_lrc.c
>> +++ b/drivers/gpu/drm/i915/intel_lrc.c
>> @@ -687,6 +687,15 @@ static bool insert_request(struct i915_priotree *pt, struct rb_root *root)
>> return first;
>> }
>>
>> +static int execlists_prepare_request(struct drm_i915_gem_request *request)
>> +{
>> + u32 *cs = intel_ring_begin(request, 0);
>> + if (IS_ERR(cs))
>> + return PTR_ERR(cs);
>> +
>> + return 0;
>> +}
>> +
>> static void execlists_submit_request(struct drm_i915_gem_request *request)
>> {
>> struct intel_engine_cs *engine = request->engine;
>> @@ -879,7 +888,6 @@ static int execlists_request_alloc(struct drm_i915_gem_request *request)
>> {
>> struct intel_engine_cs *engine = request->engine;
>> struct intel_context *ce = &request->ctx->engine[engine->id];
>> - u32 *cs;
>> int ret;
>>
>> GEM_BUG_ON(!ce->pin_count);
>> @@ -904,11 +912,9 @@ static int execlists_request_alloc(struct drm_i915_gem_request *request)
>> goto err;
>> }
>>
>> - cs = intel_ring_begin(request, 0);
>> - if (IS_ERR(cs)) {
>> - ret = PTR_ERR(cs);
>> + ret = engine->prepare_request(request);
>> + if (ret)
>> goto err_unreserve;
>> - }
>>
>> if (!ce->initialised) {
>> ret = engine->init_context(request);
>> @@ -1650,6 +1656,7 @@ void intel_logical_ring_cleanup(struct intel_engine_cs *engine)
>>
>> static void execlists_set_default_submission(struct intel_engine_cs *engine)
>> {
>> + engine->prepare_request = execlists_prepare_request;
>> engine->submit_request = execlists_submit_request;
>> engine->schedule = execlists_schedule;
>> engine->irq_tasklet.func = intel_lrc_irq_handler;
>> diff --git a/drivers/gpu/drm/i915/intel_ringbuffer.h b/drivers/gpu/drm/i915/intel_ringbuffer.h
>> index d901831..67de978 100644
>> --- a/drivers/gpu/drm/i915/intel_ringbuffer.h
>> +++ b/drivers/gpu/drm/i915/intel_ringbuffer.h
>> @@ -303,6 +303,7 @@ struct intel_engine_cs {
>> void (*emit_breadcrumb)(struct drm_i915_gem_request *req,
>> u32 *cs);
>> int emit_breadcrumb_sz;
>> + int (*prepare_request)(struct drm_i915_gem_request *req);
> Why in the emit group?
> -Chris
>
Missing newline.
-- Oscar
_______________________________________________
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/intel-gfx
^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [PATCH] drm/i915: New vfunc prepare_request
2017-05-01 7:28 ` Oscar Mateo
@ 2017-05-02 8:59 ` Chris Wilson
2017-05-02 15:17 ` Oscar Mateo
0 siblings, 1 reply; 8+ messages in thread
From: Chris Wilson @ 2017-05-02 8:59 UTC (permalink / raw)
To: Oscar Mateo; +Cc: intel-gfx
On Mon, May 01, 2017 at 07:28:12AM +0000, Oscar Mateo wrote:
>
>
> On 04/29/2017 08:31 AM, Chris Wilson wrote:
> >On Fri, Apr 28, 2017 at 05:26:09PM +0000, Oscar Mateo wrote:
> >>This will be more useful later to support platforms that need to emit
> >>HW commands at the beginning of every request (more general than emitting
> >>things at the beginning of every batchbuffer, which is already covered by
> >>emit_bb_start).
> >We already have one... You are presenting this without a good reason and
> >failing to transform similar code, which indicates to me that this vfunc
> >isn't that general.
>
> It looks like I've missed that. What function are you talking about?
For example, you can argue that both legacy ring submission and
execlists share the same sequence of request_alloc:
request->ring = ce->ring (this is now common so can be moved
out, thanks to unifying context pin)
[guc_wq_reserve we have ideas how to eliminate]
some rudimentary reserving of ring space
context initialisation <- time to unify the legacy code
The choice for adding a new callback here, is we either take more common
code out of the request_alloc callback such that we reduce it to you new
vfunc -- and so we may end up with 2 common vfuncs called by the core.
Or you refactor the current code so that you can specialise request
alloc and use some execlist helpers for the common portion.
-Chris
--
Chris Wilson, Intel Open Source Technology Centre
_______________________________________________
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/intel-gfx
^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [PATCH] drm/i915: New vfunc prepare_request
2017-05-02 8:59 ` Chris Wilson
@ 2017-05-02 15:17 ` Oscar Mateo
0 siblings, 0 replies; 8+ messages in thread
From: Oscar Mateo @ 2017-05-02 15:17 UTC (permalink / raw)
To: Chris Wilson, intel-gfx, Joonas Lahtinen
On 05/02/2017 08:59 AM, Chris Wilson wrote:
> On Mon, May 01, 2017 at 07:28:12AM +0000, Oscar Mateo wrote:
>>
>> On 04/29/2017 08:31 AM, Chris Wilson wrote:
>>> On Fri, Apr 28, 2017 at 05:26:09PM +0000, Oscar Mateo wrote:
>>>> This will be more useful later to support platforms that need to emit
>>>> HW commands at the beginning of every request (more general than emitting
>>>> things at the beginning of every batchbuffer, which is already covered by
>>>> emit_bb_start).
>>> We already have one... You are presenting this without a good reason and
>>> failing to transform similar code, which indicates to me that this vfunc
>>> isn't that general.
>> It looks like I've missed that. What function are you talking about?
> For example, you can argue that both legacy ring submission and
> execlists share the same sequence of request_alloc:
>
> request->ring = ce->ring (this is now common so can be moved
> out, thanks to unifying context pin)
OK
> [guc_wq_reserve we have ideas how to eliminate]
Can I simply create a guc_request_alloc for now? This will actually work
out nicely for me, because I only need to emit extra stuff in the GuC
case anyway.
> some rudimentary reserving of ring space
>
> context initialisation <- time to unify the legacy code
OK (or, at least, I'll try)
> The choice for adding a new callback here, is we either take more common
> code out of the request_alloc callback such that we reduce it to you new
> vfunc -- and so we may end up with 2 common vfuncs called by the core.
> Or you refactor the current code so that you can specialise request
> alloc and use some execlist helpers for the common portion.
> -Chris
>
Sounds reasonable, thanks!
_______________________________________________
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/intel-gfx
^ permalink raw reply [flat|nested] 8+ messages in thread
end of thread, other threads:[~2017-05-02 22:17 UTC | newest]
Thread overview: 8+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2017-04-29 22:01 [PATCH] drm/i915: New vfunc prepare_request kbuild test robot
2017-04-28 17:26 ` Oscar Mateo
2017-04-29 0:46 ` ✓ Fi.CI.BAT: success for " Patchwork
2017-04-29 8:31 ` [PATCH] " Chris Wilson
2017-05-01 7:28 ` Oscar Mateo
2017-05-02 8:59 ` Chris Wilson
2017-05-02 15:17 ` Oscar Mateo
2017-04-29 22:01 ` [PATCH] drm/i915: fix ptr_ret.cocci warnings kbuild test robot
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox