Tarantool development patches archive
 help / color / mirror / Atom feed
* [Tarantool-patches] [PATCH luajit] memprof: report stack resizing as internal event
@ 2021-03-09 17:54 Sergey Kaplun via Tarantool-patches
  2021-03-10 14:59 ` Sergey Ostanevich via Tarantool-patches
                   ` (2 more replies)
  0 siblings, 3 replies; 13+ messages in thread
From: Sergey Kaplun via Tarantool-patches @ 2021-03-09 17:54 UTC (permalink / raw)
  To: Sergey Ostanevich, Igor Munkin; +Cc: tarantool-patches

Resizing of the Lua stack is not reported as internal allocation.
Moreover, it may lead to crash inside Lua or FF frames.

Profiler performs reallocation first and after reports corresponding
event. When the stack is resized for local function arguments, the link
to previous frame is invalid in the cause of reallocation. Therefore,
assertion in `debug_framepc()` failes, because of invalid function
reference at previous frame.

Resolves tarantool/tarantool#5842
Follows up tarantool/tarantool#5442
---
Branch: https://github.com/tarantool/luajit/tree/skaplun/gh-5842-memprof-core-on-resizestack
Tarantool branch: https://github.com/tarantool/tarantool/tree/skaplun/gh-5842-memprof-core-on-resizestack
Issue: https://github.com/tarantool/tarantool/issues/5842


 src/lj_state.c                                 |  6 ++++++
 .../misclib-memprof-lapi.test.lua              | 18 ++++++++++++++++++
 2 files changed, 24 insertions(+)

diff --git a/src/lj_state.c b/src/lj_state.c
index 1ed79a5..ea9abd4 100644
--- a/src/lj_state.c
+++ b/src/lj_state.c
@@ -64,7 +64,11 @@ static void resizestack(lua_State *L, MSize n)
   MSize oldsize = L->stacksize;
   MSize realsize = n + 1 + LJ_STACK_EXTRA;
   GCobj *up;
+  int32_t old_vmstate = G(L)->vmstate;
+
   lua_assert((MSize)(tvref(L->maxstack)-oldst)==L->stacksize-LJ_STACK_EXTRA-1);
+
+  setvmstate(G(L), INTERP);
   st = (TValue *)lj_mem_realloc(L, tvref(L->stack),
 				(MSize)(oldsize*sizeof(TValue)),
 				(MSize)(realsize*sizeof(TValue)));
@@ -80,6 +84,8 @@ static void resizestack(lua_State *L, MSize n)
   L->top = (TValue *)((char *)L->top + delta);
   for (up = gcref(L->openupval); up != NULL; up = gcnext(up))
     setmref(gco2uv(up)->v, (TValue *)((char *)uvval(gco2uv(up)) + delta));
+
+  G(L)->vmstate = old_vmstate;
 }
 
 /* Relimit stack after error, in case the limit was overdrawn. */
diff --git a/test/tarantool-tests/misclib-memprof-lapi.test.lua b/test/tarantool-tests/misclib-memprof-lapi.test.lua
index 1c36c8a..93cc348 100644
--- a/test/tarantool-tests/misclib-memprof-lapi.test.lua
+++ b/test/tarantool-tests/misclib-memprof-lapi.test.lua
@@ -125,5 +125,23 @@ test:ok(check_alloc_report(alloc, 25, 18, 100))
 -- Collect all previous allocated objects.
 test:ok(free.INTERNAL.num == 102)
 
+-- Test for https://github.com/tarantool/tarantool/issues/5842.
+-- We do not interested in report itself.
+misc.memprof.start("/dev/null")
+-- We need to cause stack resize for local variables at function
+-- call. Let's create a new coroutine (all slots are free).
+-- It has 1 slot for dummy frame + 39 free slots + 5 extra slots
+-- (so-called red zone) + 2 * LJ_FR2 slots. So 50 local variables
+-- is enough.
+local payload_str = ""
+for i = 1, 50 do
+  payload_str = payload_str..("local v%d = %d\n"):format(i, i)
+end
+local f, errmsg = loadstring(payload_str)
+assert(f, errmsg)
+local co = coroutine.create(f)
+coroutine.resume(co)
+misc.memprof.stop()
+
 jit.on()
 os.exit(test:check() and 0 or 1)
-- 
2.28.0


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

* Re: [Tarantool-patches] [PATCH luajit] memprof: report stack resizing as internal event
  2021-03-09 17:54 [Tarantool-patches] [PATCH luajit] memprof: report stack resizing as internal event Sergey Kaplun via Tarantool-patches
@ 2021-03-10 14:59 ` Sergey Ostanevich via Tarantool-patches
  2021-03-10 17:37   ` Sergey Kaplun via Tarantool-patches
  2021-03-25 20:14 ` Igor Munkin via Tarantool-patches
  2021-03-29 20:48 ` Igor Munkin via Tarantool-patches
  2 siblings, 1 reply; 13+ messages in thread
From: Sergey Ostanevich via Tarantool-patches @ 2021-03-10 14:59 UTC (permalink / raw)
  To: Sergey Kaplun; +Cc: tarantool-patches

Hi!

Thanks for the patch!

> On 9 Mar 2021, at 20:54, Sergey Kaplun <skaplun@tarantool.org> wrote:
> 
> Resizing of the Lua stack is not reported as internal allocation.
> Moreover, it may lead to crash inside Lua or FF frames.
> 
> Profiler performs reallocation first and after reports corresponding
> event. When the stack is resized for local function arguments, the link
> to previous frame is invalid in the cause of reallocation. Therefore,
				  ^^^^^^^^ case
> assertion in `debug_framepc()` failes, because of invalid function
				fails.   ^^^ is it just dubbing the link 
					     is invalid? Then just remove.

> reference at previous frame.
> 
> Resolves tarantool/tarantool#5842
> Follows up tarantool/tarantool#5442
> ---
> Branch: https://github.com/tarantool/luajit/tree/skaplun/gh-5842-memprof-core-on-resizestack
> Tarantool branch: https://github.com/tarantool/tarantool/tree/skaplun/gh-5842-memprof-core-on-resizestack
> Issue: https://github.com/tarantool/tarantool/issues/5842
> 
> 
> src/lj_state.c                                 |  6 ++++++
> .../misclib-memprof-lapi.test.lua              | 18 ++++++++++++++++++
> 2 files changed, 24 insertions(+)
> 
> diff --git a/src/lj_state.c b/src/lj_state.c
> index 1ed79a5..ea9abd4 100644
> --- a/src/lj_state.c
> +++ b/src/lj_state.c
> @@ -64,7 +64,11 @@ static void resizestack(lua_State *L, MSize n)
>   MSize oldsize = L->stacksize;
>   MSize realsize = n + 1 + LJ_STACK_EXTRA;
>   GCobj *up;
> +  int32_t old_vmstate = G(L)->vmstate;
> +
>   lua_assert((MSize)(tvref(L->maxstack)-oldst)==L->stacksize-LJ_STACK_EXTRA-1);
> +
> +  setvmstate(G(L), INTERP);

This looks like a hack. But even so - why not to return it back right after the
realloc, where you supposedly use lua_getinfo? 

The righteous way would be to fix the debug machinery anyhow.

>   st = (TValue *)lj_mem_realloc(L, tvref(L->stack),
> 				(MSize)(oldsize*sizeof(TValue)),
> 				(MSize)(realsize*sizeof(TValue)));
> @@ -80,6 +84,8 @@ static void resizestack(lua_State *L, MSize n)
>   L->top = (TValue *)((char *)L->top + delta);
>   for (up = gcref(L->openupval); up != NULL; up = gcnext(up))
>     setmref(gco2uv(up)->v, (TValue *)((char *)uvval(gco2uv(up)) + delta));
> +
> +  G(L)->vmstate = old_vmstate;
> }
> 
> /* Relimit stack after error, in case the limit was overdrawn. */
> diff --git a/test/tarantool-tests/misclib-memprof-lapi.test.lua b/test/tarantool-tests/misclib-memprof-lapi.test.lua
> index 1c36c8a..93cc348 100644
> --- a/test/tarantool-tests/misclib-memprof-lapi.test.lua
> +++ b/test/tarantool-tests/misclib-memprof-lapi.test.lua
> @@ -125,5 +125,23 @@ test:ok(check_alloc_report(alloc, 25, 18, 100))
> -- Collect all previous allocated objects.
> test:ok(free.INTERNAL.num == 102)
> 
> +-- Test for https://github.com/tarantool/tarantool/issues/5842.
> +-- We do not interested in report itself.
     We ->			     ourselves?
> +misc.memprof.start("/dev/null")
> +-- We need to cause stack resize for local variables at function
> +-- call. Let's create a new coroutine (all slots are free).
> +-- It has 1 slot for dummy frame + 39 free slots + 5 extra slots
> +-- (so-called red zone) + 2 * LJ_FR2 slots. So 50 local variables
> +-- is enough.
> +local payload_str = ""
> +for i = 1, 50 do
> +  payload_str = payload_str..("local v%d = %d\n"):format(i, i)
> +end
> +local f, errmsg = loadstring(payload_str)
> +assert(f, errmsg)
> +local co = coroutine.create(f)
> +coroutine.resume(co)
> +misc.memprof.stop()
> +
> jit.on()
> os.exit(test:check() and 0 or 1)
> — 
> 2.28.0
> 


Regards,
Sergos



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

* Re: [Tarantool-patches] [PATCH luajit] memprof: report stack resizing as internal event
  2021-03-10 14:59 ` Sergey Ostanevich via Tarantool-patches
@ 2021-03-10 17:37   ` Sergey Kaplun via Tarantool-patches
  0 siblings, 0 replies; 13+ messages in thread
From: Sergey Kaplun via Tarantool-patches @ 2021-03-10 17:37 UTC (permalink / raw)
  To: Sergey Ostanevich; +Cc: tarantool-patches

Hi, Sergos!

Thanks for the review!

On 10.03.21, Sergey Ostanevich wrote:
> Hi!
> 
> Thanks for the patch!
> 
> > On 9 Mar 2021, at 20:54, Sergey Kaplun <skaplun@tarantool.org> wrote:
> > 
> > Resizing of the Lua stack is not reported as internal allocation.
> > Moreover, it may lead to crash inside Lua or FF frames.
> > 
> > Profiler performs reallocation first and after reports corresponding
> > event. When the stack is resized for local function arguments, the link
> > to previous frame is invalid in the cause of reallocation. Therefore,
> 				  ^^^^^^^^ case
> > assertion in `debug_framepc()` failes, because of invalid function
> 				fails.   ^^^ is it just dubbing the link 
> 					     is invalid? Then just remove.

Fixed and force-pushed to the branch. The commit message now is the
following:

===================================================================
memprof: report stack resizing as internal event

Resizing of the Lua stack is not reported as internal allocation.
Moreover, it may lead to crash inside Lua or FF frames.

Profiler performs reallocation first and after reports corresponding
event. When the stack is resized for local function arguments, the link
to previous frame is invalid in case of reallocation. Therefore,
assertion in `debug_framepc()` fails.

Resolves tarantool/tarantool#5842
Follows up tarantool/tarantool#5442
===================================================================

> 
> > reference at previous frame.
> > 
> > Resolves tarantool/tarantool#5842
> > Follows up tarantool/tarantool#5442
> > ---
> > Branch: https://github.com/tarantool/luajit/tree/skaplun/gh-5842-memprof-core-on-resizestack
> > Tarantool branch: https://github.com/tarantool/tarantool/tree/skaplun/gh-5842-memprof-core-on-resizestack
> > Issue: https://github.com/tarantool/tarantool/issues/5842
> > 
> > 
> > src/lj_state.c                                 |  6 ++++++
> > .../misclib-memprof-lapi.test.lua              | 18 ++++++++++++++++++
> > 2 files changed, 24 insertions(+)
> > 
> > diff --git a/src/lj_state.c b/src/lj_state.c
> > index 1ed79a5..ea9abd4 100644
> > --- a/src/lj_state.c
> > +++ b/src/lj_state.c
> > @@ -64,7 +64,11 @@ static void resizestack(lua_State *L, MSize n)
> >   MSize oldsize = L->stacksize;
> >   MSize realsize = n + 1 + LJ_STACK_EXTRA;
> >   GCobj *up;
> > +  int32_t old_vmstate = G(L)->vmstate;
> > +
> >   lua_assert((MSize)(tvref(L->maxstack)-oldst)==L->stacksize-LJ_STACK_EXTRA-1);
> > +
> > +  setvmstate(G(L), INTERP);
> 
> This looks like a hack. But even so - why not to return it back right after the
> realloc, where you supposedly use lua_getinfo? 

The Lua state L is inconsistent during stack resizing, so it can't be
interpreted in any way, until reallocation and corresponding converting
are finished.

> 
> The righteous way would be to fix the debug machinery anyhow.

Don't get your point here. Lua state is invalid, debug machinery works
correct, as I understand.

> 
> >   st = (TValue *)lj_mem_realloc(L, tvref(L->stack),
> > 				(MSize)(oldsize*sizeof(TValue)),
> > 				(MSize)(realsize*sizeof(TValue)));
> > @@ -80,6 +84,8 @@ static void resizestack(lua_State *L, MSize n)
> >   L->top = (TValue *)((char *)L->top + delta);
> >   for (up = gcref(L->openupval); up != NULL; up = gcnext(up))
> >     setmref(gco2uv(up)->v, (TValue *)((char *)uvval(gco2uv(up)) + delta));
> > +
> > +  G(L)->vmstate = old_vmstate;
> > }
> > 
> > /* Relimit stack after error, in case the limit was overdrawn. */
> > diff --git a/test/tarantool-tests/misclib-memprof-lapi.test.lua b/test/tarantool-tests/misclib-memprof-lapi.test.lua
> > index 1c36c8a..93cc348 100644
> > --- a/test/tarantool-tests/misclib-memprof-lapi.test.lua
> > +++ b/test/tarantool-tests/misclib-memprof-lapi.test.lua
> > @@ -125,5 +125,23 @@ test:ok(check_alloc_report(alloc, 25, 18, 100))
> > -- Collect all previous allocated objects.
> > test:ok(free.INTERNAL.num == 102)
> > 
> > +-- Test for https://github.com/tarantool/tarantool/issues/5842.
> > +-- We do not interested in report itself.
>      We ->			     ourselves?

I've removed confusing "itself". See the iterative patch below,
branch is force-pushed.

===================================================================
diff --git a/test/tarantool-tests/misclib-memprof-lapi.test.lua b/test/tarantool-tests/misclib-memprof-lapi.test.lua
index 93cc348..9b9fb76 100644
--- a/test/tarantool-tests/misclib-memprof-lapi.test.lua
+++ b/test/tarantool-tests/misclib-memprof-lapi.test.lua
@@ -126,7 +126,7 @@ test:ok(check_alloc_report(alloc, 25, 18, 100))
 test:ok(free.INTERNAL.num == 102)
 
 -- Test for https://github.com/tarantool/tarantool/issues/5842.
--- We do not interested in report itself.
+-- We do not interested in this report.
 misc.memprof.start("/dev/null")
 -- We need to cause stack resize for local variables at function
 -- call. Let's create a new coroutine (all slots are free).
===================================================================

> > +misc.memprof.start("/dev/null")
> > +-- We need to cause stack resize for local variables at function
> > +-- call. Let's create a new coroutine (all slots are free).
> > +-- It has 1 slot for dummy frame + 39 free slots + 5 extra slots
> > +-- (so-called red zone) + 2 * LJ_FR2 slots. So 50 local variables
> > +-- is enough.
> > +local payload_str = ""
> > +for i = 1, 50 do
> > +  payload_str = payload_str..("local v%d = %d\n"):format(i, i)
> > +end
> > +local f, errmsg = loadstring(payload_str)
> > +assert(f, errmsg)
> > +local co = coroutine.create(f)
> > +coroutine.resume(co)
> > +misc.memprof.stop()
> > +
> > jit.on()
> > os.exit(test:check() and 0 or 1)
> > — 
> > 2.28.0
> > 
> 
> 
> Regards,
> Sergos
> 
> 

-- 
Best regards,
Sergey Kaplun

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

* Re: [Tarantool-patches] [PATCH luajit] memprof: report stack resizing as internal event
  2021-03-09 17:54 [Tarantool-patches] [PATCH luajit] memprof: report stack resizing as internal event Sergey Kaplun via Tarantool-patches
  2021-03-10 14:59 ` Sergey Ostanevich via Tarantool-patches
@ 2021-03-25 20:14 ` Igor Munkin via Tarantool-patches
  2021-03-26  8:54   ` Sergey Kaplun via Tarantool-patches
  2021-03-29 20:48 ` Igor Munkin via Tarantool-patches
  2 siblings, 1 reply; 13+ messages in thread
From: Igor Munkin via Tarantool-patches @ 2021-03-25 20:14 UTC (permalink / raw)
  To: Sergey Kaplun; +Cc: tarantool-patches

Sergey,

Thanks for the patch! Please consider my comments below.

On 09.03.21, Sergey Kaplun wrote:
> Resizing of the Lua stack is not reported as internal allocation.

Was it done intentionally? You claim this as a plain fact with no
rationale. If this is a bug (by design) then mention it explicitly here.
Otherwise, you need to provide a reason why you change the semantics of
Lua stack reallocations in terms of memprof. For me it looks like a bug
we missed in the previous release: user has nothing to do with guest
stack reallocations (like with JIT related ones), hence these memory
manipulations are totally internal. Maybe you have another vision
regarding this.

> Moreover, it may lead to crash inside Lua or FF frames.

This is a symptom, not another reason. So "As a result" fits better than
"Moreover" here.

> 
> Profiler performs reallocation first and after reports corresponding

Profiler makes no allocations. I believe you would like to say that
reallocation occurs at first and after memprof reports the event.

Typo: s/reports corresponding/reports the corresponding/.

> event. When the stack is resized for local function arguments, the link
> to previous frame is invalid in the cause of reallocation. Therefore,
> assertion in `debug_framepc()` failes, because of invalid function
> reference at previous frame.

Typo: s/at previous/at the previous/.

> 
> Resolves tarantool/tarantool#5842
> Follows up tarantool/tarantool#5442
> ---
> Branch: https://github.com/tarantool/luajit/tree/skaplun/gh-5842-memprof-core-on-resizestack
> Tarantool branch: https://github.com/tarantool/tarantool/tree/skaplun/gh-5842-memprof-core-on-resizestack
> Issue: https://github.com/tarantool/tarantool/issues/5842
> 
> 
>  src/lj_state.c                                 |  6 ++++++
>  .../misclib-memprof-lapi.test.lua              | 18 ++++++++++++++++++
>  2 files changed, 24 insertions(+)
> 
> diff --git a/src/lj_state.c b/src/lj_state.c
> index 1ed79a5..ea9abd4 100644
> --- a/src/lj_state.c
> +++ b/src/lj_state.c
> @@ -64,7 +64,11 @@ static void resizestack(lua_State *L, MSize n)
>    MSize oldsize = L->stacksize;
>    MSize realsize = n + 1 + LJ_STACK_EXTRA;
>    GCobj *up;
> +  int32_t old_vmstate = G(L)->vmstate;

Please consider the naming and the workflow in lj_gc.c for such
situations: G(L) is stored into a separate variable and <old_vmstate> is
named <ostate>. It makes grep for such spots much easier, doesn't it?

> +
>    lua_assert((MSize)(tvref(L->maxstack)-oldst)==L->stacksize-LJ_STACK_EXTRA-1);
> +
> +  setvmstate(G(L), INTERP);

We didn't notice this before. Now you leave not a single word regarding
this hack. How come?

>    st = (TValue *)lj_mem_realloc(L, tvref(L->stack),
>  				(MSize)(oldsize*sizeof(TValue)),
>  				(MSize)(realsize*sizeof(TValue)));
> @@ -80,6 +84,8 @@ static void resizestack(lua_State *L, MSize n)
>    L->top = (TValue *)((char *)L->top + delta);
>    for (up = gcref(L->openupval); up != NULL; up = gcnext(up))
>      setmref(gco2uv(up)->v, (TValue *)((char *)uvval(gco2uv(up)) + delta));
> +
> +  G(L)->vmstate = old_vmstate;
>  }
>  
>  /* Relimit stack after error, in case the limit was overdrawn. */
> diff --git a/test/tarantool-tests/misclib-memprof-lapi.test.lua b/test/tarantool-tests/misclib-memprof-lapi.test.lua
> index 1c36c8a..93cc348 100644
> --- a/test/tarantool-tests/misclib-memprof-lapi.test.lua
> +++ b/test/tarantool-tests/misclib-memprof-lapi.test.lua
> @@ -125,5 +125,23 @@ test:ok(check_alloc_report(alloc, 25, 18, 100))
>  -- Collect all previous allocated objects.
>  test:ok(free.INTERNAL.num == 102)
>  
> +-- Test for https://github.com/tarantool/tarantool/issues/5842.
> +-- We do not interested in report itself.
> +misc.memprof.start("/dev/null")
> +-- We need to cause stack resize for local variables at function
> +-- call. Let's create a new coroutine (all slots are free).
> +-- It has 1 slot for dummy frame + 39 free slots + 5 extra slots
> +-- (so-called red zone) + 2 * LJ_FR2 slots. So 50 local variables
> +-- is enough.
> +local payload_str = ""
> +for i = 1, 50 do
> +  payload_str = payload_str..("local v%d = %d\n"):format(i, i)
> +end
> +local f, errmsg = loadstring(payload_str)
> +assert(f, errmsg)

Minor: you can use a TAP check here, but feel free to leave a plain
assert, since you expect <loadstring> works fine always.

> +local co = coroutine.create(f)
> +coroutine.resume(co)
> +misc.memprof.stop()
> +
>  jit.on()
>  os.exit(test:check() and 0 or 1)
> -- 
> 2.28.0
> 

-- 
Best regards,
IM

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

* Re: [Tarantool-patches] [PATCH luajit] memprof: report stack resizing as internal event
  2021-03-25 20:14 ` Igor Munkin via Tarantool-patches
@ 2021-03-26  8:54   ` Sergey Kaplun via Tarantool-patches
  2021-03-26 10:10     ` Igor Munkin via Tarantool-patches
  0 siblings, 1 reply; 13+ messages in thread
From: Sergey Kaplun via Tarantool-patches @ 2021-03-26  8:54 UTC (permalink / raw)
  To: Igor Munkin; +Cc: tarantool-patches

Igor,

Thanks for the review!

On 25.03.21, Igor Munkin wrote:
> Sergey,
> 
> Thanks for the patch! Please consider my comments below.
> 
> On 09.03.21, Sergey Kaplun wrote:
> > Resizing of the Lua stack is not reported as internal allocation.
> 
> Was it done intentionally? You claim this as a plain fact with no
> rationale. If this is a bug (by design) then mention it explicitly here.

It is obviously a bug.

> Otherwise, you need to provide a reason why you change the semantics of
> Lua stack reallocations in terms of memprof. For me it looks like a bug
> we missed in the previous release: user has nothing to do with guest
> stack reallocations (like with JIT related ones), hence these memory
> manipulations are totally internal. Maybe you have another vision
> regarding this.
> 
> > Moreover, it may lead to crash inside Lua or FF frames.
> 
> This is a symptom, not another reason. So "As a result" fits better than
> "Moreover" here.

Reworded.

> 
> > 
> > Profiler performs reallocation first and after reports corresponding
> 
> Profiler makes no allocations. I believe you would like to say that
> reallocation occurs at first and after memprof reports the event.
> 
> Typo: s/reports corresponding/reports the corresponding/.

Fixed.

> 
> > event. When the stack is resized for local function arguments, the link
> > to previous frame is invalid in the cause of reallocation. Therefore,
> > assertion in `debug_framepc()` failes, because of invalid function
> > reference at previous frame.
> 
> Typo: s/at previous/at the previous/.

Fixed.

> 

See the new commit message below, branch is force-pushed:

===================================================================
memprof: report stack resizing as internal event

Resizing of the Lua stack is not reported as internal allocation
as it should. As a result, it may lead to crash inside Lua or FF
frames.

When the memory profiler runs, reallocation occurs first, and after
profiler reports the corresponding event. When the stack is resized for
local function arguments, the link to previous the frame is invalid in
the case of reallocation. Therefore, the assertion in `debug_framepc()`
fails.

Resolves tarantool/tarantool#5842
Follows up tarantool/tarantool#5442
===================================================================

> > 
> > Resolves tarantool/tarantool#5842
> > Follows up tarantool/tarantool#5442
> > ---
> > Branch: https://github.com/tarantool/luajit/tree/skaplun/gh-5842-memprof-core-on-resizestack
> > Tarantool branch: https://github.com/tarantool/tarantool/tree/skaplun/gh-5842-memprof-core-on-resizestack
> > Issue: https://github.com/tarantool/tarantool/issues/5842
> > 
> > 
> >  src/lj_state.c                                 |  6 ++++++
> >  .../misclib-memprof-lapi.test.lua              | 18 ++++++++++++++++++
> >  2 files changed, 24 insertions(+)
> > 
> > diff --git a/src/lj_state.c b/src/lj_state.c
> > index 1ed79a5..ea9abd4 100644
> > --- a/src/lj_state.c
> > +++ b/src/lj_state.c
> > @@ -64,7 +64,11 @@ static void resizestack(lua_State *L, MSize n)
> >    MSize oldsize = L->stacksize;
> >    MSize realsize = n + 1 + LJ_STACK_EXTRA;
> >    GCobj *up;
> > +  int32_t old_vmstate = G(L)->vmstate;
> 
> Please consider the naming and the workflow in lj_gc.c for such
> situations: G(L) is stored into a separate variable and <old_vmstate> is
> named <ostate>. It makes grep for such spots much easier, doesn't it?

You can see more by grepping vmstate. Made naming more consistent
with the <lj_state.c>. s/old_vmstate/oldvmstate/g

See the iterative patch below.

> 
> > +
> >    lua_assert((MSize)(tvref(L->maxstack)-oldst)==L->stacksize-LJ_STACK_EXTRA-1);
> > +
> > +  setvmstate(G(L), INTERP);
> 
> We didn't notice this before. Now you leave not a single word regarding
> this hack. How come?

Added the comment. But I don't get how it is connected to our notice.
May be it should be mentioned in docs?

See the iterative patch below. Branch is force-pushed.
===================================================================
diff --git a/src/lj_state.c b/src/lj_state.c
index ea9abd4..c86e098 100644
--- a/src/lj_state.c
+++ b/src/lj_state.c
@@ -64,10 +64,15 @@ static void resizestack(lua_State *L, MSize n)
   MSize oldsize = L->stacksize;
   MSize realsize = n + 1 + LJ_STACK_EXTRA;
   GCobj *up;
-  int32_t old_vmstate = G(L)->vmstate;
+  int32_t oldvmstate = G(L)->vmstate;
 
   lua_assert((MSize)(tvref(L->maxstack)-oldst)==L->stacksize-LJ_STACK_EXTRA-1);
 
+  /*
+  ** Lua stack is inconsistent durent reallocation, profilers
+  ** depends on vmstate during reports, so set vmstate to INTERP
+  ** to avoid inconsistent behaviour.
+  */
   setvmstate(G(L), INTERP);
   st = (TValue *)lj_mem_realloc(L, tvref(L->stack),
                                 (MSize)(oldsize*sizeof(TValue)),
@@ -85,7 +90,7 @@ static void resizestack(lua_State *L, MSize n)
   for (up = gcref(L->openupval); up != NULL; up = gcnext(up))
     setmref(gco2uv(up)->v, (TValue *)((char *)uvval(gco2uv(up)) + delta));
 
-  G(L)->vmstate = old_vmstate;
+  G(L)->vmstate = oldvmstate;
 }
 
 /* Relimit stack after error, in case the limit was overdrawn. */
===================================================================

> 
> >    st = (TValue *)lj_mem_realloc(L, tvref(L->stack),
> >  				(MSize)(oldsize*sizeof(TValue)),
> >  				(MSize)(realsize*sizeof(TValue)));
> > @@ -80,6 +84,8 @@ static void resizestack(lua_State *L, MSize n)
> >    L->top = (TValue *)((char *)L->top + delta);
> >    for (up = gcref(L->openupval); up != NULL; up = gcnext(up))
> >      setmref(gco2uv(up)->v, (TValue *)((char *)uvval(gco2uv(up)) + delta));
> > +
> > +  G(L)->vmstate = old_vmstate;
> >  }
> >  
> >  /* Relimit stack after error, in case the limit was overdrawn. */
> > diff --git a/test/tarantool-tests/misclib-memprof-lapi.test.lua b/test/tarantool-tests/misclib-memprof-lapi.test.lua
> > index 1c36c8a..93cc348 100644
> > --- a/test/tarantool-tests/misclib-memprof-lapi.test.lua
> > +++ b/test/tarantool-tests/misclib-memprof-lapi.test.lua
> > @@ -125,5 +125,23 @@ test:ok(check_alloc_report(alloc, 25, 18, 100))
> >  -- Collect all previous allocated objects.
> >  test:ok(free.INTERNAL.num == 102)
> >  
> > +-- Test for https://github.com/tarantool/tarantool/issues/5842.
> > +-- We do not interested in report itself.
> > +misc.memprof.start("/dev/null")
> > +-- We need to cause stack resize for local variables at function
> > +-- call. Let's create a new coroutine (all slots are free).
> > +-- It has 1 slot for dummy frame + 39 free slots + 5 extra slots
> > +-- (so-called red zone) + 2 * LJ_FR2 slots. So 50 local variables
> > +-- is enough.
> > +local payload_str = ""
> > +for i = 1, 50 do
> > +  payload_str = payload_str..("local v%d = %d\n"):format(i, i)
> > +end
> > +local f, errmsg = loadstring(payload_str)
> > +assert(f, errmsg)
> 
> Minor: you can use a TAP check here, but feel free to leave a plain
> assert, since you expect <loadstring> works fine always.

We test not `loadstring()` here, assert is for sure that there is no
syntax error in the generated chunk.
Ignoring.

> 
> > +local co = coroutine.create(f)
> > +coroutine.resume(co)
> > +misc.memprof.stop()
> > +
> >  jit.on()
> >  os.exit(test:check() and 0 or 1)
> > -- 
> > 2.28.0
> > 
> 
> -- 
> Best regards,
> IM

-- 
Best regards,
Sergey Kaplun

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

* Re: [Tarantool-patches] [PATCH luajit] memprof: report stack resizing as internal event
  2021-03-26  8:54   ` Sergey Kaplun via Tarantool-patches
@ 2021-03-26 10:10     ` Igor Munkin via Tarantool-patches
  2021-03-26 14:09       ` Sergey Kaplun via Tarantool-patches
  0 siblings, 1 reply; 13+ messages in thread
From: Igor Munkin via Tarantool-patches @ 2021-03-26 10:10 UTC (permalink / raw)
  To: Sergey Kaplun; +Cc: tarantool-patches

Sergey,

On 26.03.21, Sergey Kaplun wrote:
> Igor,
> 
> Thanks for the review!
> 
> On 25.03.21, Igor Munkin wrote:
> > Sergey,
> > 
> > Thanks for the patch! Please consider my comments below.
> > 

<snipped>

> 
> See the new commit message below, branch is force-pushed:
> 
> ===================================================================
> memprof: report stack resizing as internal event
> 
> Resizing of the Lua stack is not reported as internal allocation
> as it should. As a result, it may lead to crash inside Lua or FF
> frames.
> 
> When the memory profiler runs, reallocation occurs first, and after
> profiler reports the corresponding event. When the stack is resized for
> local function arguments, the link to previous the frame is invalid in

Typo: s/to previous the frame/to the previous frame/.

> the case of reallocation. Therefore, the assertion in `debug_framepc()`
> fails.
> 
> Resolves tarantool/tarantool#5842
> Follows up tarantool/tarantool#5442
> ===================================================================
> 
> > > 
> > > Resolves tarantool/tarantool#5842
> > > Follows up tarantool/tarantool#5442
> > > ---
> > > Branch: https://github.com/tarantool/luajit/tree/skaplun/gh-5842-memprof-core-on-resizestack
> > > Tarantool branch: https://github.com/tarantool/tarantool/tree/skaplun/gh-5842-memprof-core-on-resizestack
> > > Issue: https://github.com/tarantool/tarantool/issues/5842
> > > 
> > > 
> > >  src/lj_state.c                                 |  6 ++++++
> > >  .../misclib-memprof-lapi.test.lua              | 18 ++++++++++++++++++
> > >  2 files changed, 24 insertions(+)
> > > 
> > > diff --git a/src/lj_state.c b/src/lj_state.c
> > > index 1ed79a5..ea9abd4 100644
> > > --- a/src/lj_state.c
> > > +++ b/src/lj_state.c
> > > @@ -64,7 +64,11 @@ static void resizestack(lua_State *L, MSize n)
> > >    MSize oldsize = L->stacksize;
> > >    MSize realsize = n + 1 + LJ_STACK_EXTRA;
> > >    GCobj *up;
> > > +  int32_t old_vmstate = G(L)->vmstate;
> > 
> > Please consider the naming and the workflow in lj_gc.c for such
> > situations: G(L) is stored into a separate variable and <old_vmstate> is
> > named <ostate>. It makes grep for such spots much easier, doesn't it?
> 
> You can see more by grepping vmstate. Made naming more consistent

I did it before sending the review. I did it again now. My opinion is
not changed. This is "idiomatic" approach to "push" and "pop" vmstate
used only in lj_gc.c since this is not required elsewhere. If you move
that approach "intact", it shows that the semantics of your code are the
same. Otherwise, every other occurrence of such vmstate "pushing" and
"popping" allows to introduce own naming: pstate, prevstate,
prev_vmstate, sstate, save_state, savevmstate -- there are lots of
combinations. And nobody can stop contributor from this, since it is
"more consistent for the current TU".

"Feel free to prove the opposite"(c) :)

The current naming is much better than the previous one, but I still
propose to save the original on and save G(L) into a new variable.

> with the <lj_state.c>. s/old_vmstate/oldvmstate/g
> 
> See the iterative patch below.
> 
> > 
> > > +
> > >    lua_assert((MSize)(tvref(L->maxstack)-oldst)==L->stacksize-LJ_STACK_EXTRA-1);
> > > +
> > > +  setvmstate(G(L), INTERP);
> > 
> > We didn't notice this before. Now you leave not a single word regarding
> > this hack. How come?
> 
> Added the comment. But I don't get how it is connected to our notice.
> May be it should be mentioned in docs?

I meant that we pushed this bug into the trunk and didn't notice it.
Comment is totally enough, thanks!

> 
> See the iterative patch below. Branch is force-pushed.
> ===================================================================
> diff --git a/src/lj_state.c b/src/lj_state.c
> index ea9abd4..c86e098 100644
> --- a/src/lj_state.c
> +++ b/src/lj_state.c
> @@ -64,10 +64,15 @@ static void resizestack(lua_State *L, MSize n)
>    MSize oldsize = L->stacksize;
>    MSize realsize = n + 1 + LJ_STACK_EXTRA;
>    GCobj *up;
> -  int32_t old_vmstate = G(L)->vmstate;
> +  int32_t oldvmstate = G(L)->vmstate;
>  
>    lua_assert((MSize)(tvref(L->maxstack)-oldst)==L->stacksize-LJ_STACK_EXTRA-1);
>  
> +  /*
> +  ** Lua stack is inconsistent durent reallocation, profilers

Typo: s/profilers/profiler/ or s/depends/depend/.

> +  ** depends on vmstate during reports, so set vmstate to INTERP
> +  ** to avoid inconsistent behaviour.
> +  */
>    setvmstate(G(L), INTERP);
>    st = (TValue *)lj_mem_realloc(L, tvref(L->stack),
>                                  (MSize)(oldsize*sizeof(TValue)),
> @@ -85,7 +90,7 @@ static void resizestack(lua_State *L, MSize n)
>    for (up = gcref(L->openupval); up != NULL; up = gcnext(up))
>      setmref(gco2uv(up)->v, (TValue *)((char *)uvval(gco2uv(up)) + delta));
>  
> -  G(L)->vmstate = old_vmstate;
> +  G(L)->vmstate = oldvmstate;
>  }
>  
>  /* Relimit stack after error, in case the limit was overdrawn. */
> ===================================================================
> 
> > 
> > >    st = (TValue *)lj_mem_realloc(L, tvref(L->stack),
> > >  				(MSize)(oldsize*sizeof(TValue)),
> > >  				(MSize)(realsize*sizeof(TValue)));
> > > @@ -80,6 +84,8 @@ static void resizestack(lua_State *L, MSize n)
> > >    L->top = (TValue *)((char *)L->top + delta);
> > >    for (up = gcref(L->openupval); up != NULL; up = gcnext(up))
> > >      setmref(gco2uv(up)->v, (TValue *)((char *)uvval(gco2uv(up)) + delta));
> > > +
> > > +  G(L)->vmstate = old_vmstate;
> > >  }
> > >  
> > >  /* Relimit stack after error, in case the limit was overdrawn. */

<snipped>

> > > -- 
> > > 2.28.0
> > > 
> > 
> > -- 
> > Best regards,
> > IM
> 
> -- 
> Best regards,
> Sergey Kaplun

-- 
Best regards,
IM

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

* Re: [Tarantool-patches] [PATCH luajit] memprof: report stack resizing as internal event
  2021-03-26 10:10     ` Igor Munkin via Tarantool-patches
@ 2021-03-26 14:09       ` Sergey Kaplun via Tarantool-patches
  2021-03-26 18:38         ` Igor Munkin via Tarantool-patches
  0 siblings, 1 reply; 13+ messages in thread
From: Sergey Kaplun via Tarantool-patches @ 2021-03-26 14:09 UTC (permalink / raw)
  To: Igor Munkin; +Cc: tarantool-patches

Igor,

I've fixed typos in the commit message and the comment.

On 26.03.21, Igor Munkin wrote:
> Sergey,
> 
> On 26.03.21, Sergey Kaplun wrote:
> > Igor,
> > 
> > Thanks for the review!
> > 
> > On 25.03.21, Igor Munkin wrote:
> > > Sergey,
> > > 
> > > Thanks for the patch! Please consider my comments below.
> > > 
> 
> <snipped>
> 
> > 
> > See the new commit message below, branch is force-pushed:
> > 
> > ===================================================================
> > memprof: report stack resizing as internal event
> > 
> > Resizing of the Lua stack is not reported as internal allocation
> > as it should. As a result, it may lead to crash inside Lua or FF
> > frames.
> > 
> > When the memory profiler runs, reallocation occurs first, and after
> > profiler reports the corresponding event. When the stack is resized for
> > local function arguments, the link to previous the frame is invalid in
> 
> Typo: s/to previous the frame/to the previous frame/.

Fixed.

> 
> > the case of reallocation. Therefore, the assertion in `debug_framepc()`
> > fails.
> > 
> > Resolves tarantool/tarantool#5842
> > Follows up tarantool/tarantool#5442
> > ===================================================================

The new commit message is the following:
===================================================================
memprof: report stack resizing as internal event

Resizing of the Lua stack is not reported as internal allocation
as it should. As a result, it may lead to crash inside Lua or FF
frames.

When the memory profiler runs, reallocation occurs first, and after
profiler reports the corresponding event. When the stack is resized for
local function arguments, the link to the previous frame is invalid in
the case of reallocation. Therefore, the assertion in `debug_framepc()`
fails.

Resolves tarantool/tarantool#5842
Follows up tarantool/tarantool#5442
===================================================================

> > 
> > > > 
> > > > Resolves tarantool/tarantool#5842
> > > > Follows up tarantool/tarantool#5442
> > > > ---
> > > > Branch: https://github.com/tarantool/luajit/tree/skaplun/gh-5842-memprof-core-on-resizestack
> > > > Tarantool branch: https://github.com/tarantool/tarantool/tree/skaplun/gh-5842-memprof-core-on-resizestack
> > > > Issue: https://github.com/tarantool/tarantool/issues/5842
> > > > 
> > > > 
> > > >  src/lj_state.c                                 |  6 ++++++
> > > >  .../misclib-memprof-lapi.test.lua              | 18 ++++++++++++++++++
> > > >  2 files changed, 24 insertions(+)
> > > > 
> > > > diff --git a/src/lj_state.c b/src/lj_state.c
> > > > index 1ed79a5..ea9abd4 100644
> > > > --- a/src/lj_state.c
> > > > +++ b/src/lj_state.c
> > > > @@ -64,7 +64,11 @@ static void resizestack(lua_State *L, MSize n)
> > > >    MSize oldsize = L->stacksize;
> > > >    MSize realsize = n + 1 + LJ_STACK_EXTRA;
> > > >    GCobj *up;
> > > > +  int32_t old_vmstate = G(L)->vmstate;
> > > 
> > > Please consider the naming and the workflow in lj_gc.c for such
> > > situations: G(L) is stored into a separate variable and <old_vmstate> is
> > > named <ostate>. It makes grep for such spots much easier, doesn't it?
> > 
> > You can see more by grepping vmstate. Made naming more consistent
> 
> I did it before sending the review. I did it again now. My opinion is
> not changed. This is "idiomatic" approach to "push" and "pop" vmstate
> used only in lj_gc.c since this is not required elsewhere. If you move

But not only in <lj_gc.c> some old value is saved to be reused later:

| $ grep -rn -P '\Wold[A-Za-z]' src/l*.c | grep -v -e define -e "\*\*" -e "\*/" -e "\*/" | wc -l
| 123

Instead one-letter abbreviation (grep out comments and most frequently
used constructions):

| $ grep -rn -P '\Wo[^l]' src/l*.c | grep -v -e "\Wo\W" -e "\Wo[12]" | grep -v \
|   -e obj -e open -e op -e opt -e octet -e out -e on \
|   -e ofs -e offs -e ok -e oddspill -e os -e orign \
|   -e define -e overhead -e or \
|   -e "\*/" -e "\*\*" -e "/\*" | wc -l
| 25

The huge part of them was introduced via memory profiler by us.

So, looks like your codestyle suggestion contradicts to codestyle
of LuaJIT as it is. It is not described anywhere else, so looks like
that source of true is the sources by themseles.

> that approach "intact", it shows that the semantics of your code are the

It's already the same, it is obvious by reading, plus comment describes
the behaviour.

> same. Otherwise, every other occurrence of such vmstate "pushing" and
> "popping" allows to introduce own naming: pstate, prevstate,
> prev_vmstate, sstate, save_state, savevmstate -- there are lots of

None of them is usual in use for LuaJIT's C codebase, so they can't be
used.

> combinations. And nobody can stop contributor from this, since it is
> "more consistent for the current TU".

But with your approach naming will be choosed not like the most usual,
but "same in the other file". I think that it will lead to the code
inconsistency even in one TU.

> 
> "Feel free to prove the opposite"(c) :)
> 
> The current naming is much better than the previous one, but I still
> propose to save the original on and save G(L) into a new variable.

Ignoring for now.

> 
> > with the <lj_state.c>. s/old_vmstate/oldvmstate/g
> > 
> > See the iterative patch below.
> > 
> > > 
> > > > +
> > > >    lua_assert((MSize)(tvref(L->maxstack)-oldst)==L->stacksize-LJ_STACK_EXTRA-1);
> > > > +
> > > > +  setvmstate(G(L), INTERP);
> > > 
> > > We didn't notice this before. Now you leave not a single word regarding
> > > this hack. How come?
> > 
> > Added the comment. But I don't get how it is connected to our notice.
> > May be it should be mentioned in docs?
> 
> I meant that we pushed this bug into the trunk and didn't notice it.
> Comment is totally enough, thanks!
> 
> > 
> > See the iterative patch below. Branch is force-pushed.
> > ===================================================================
> > diff --git a/src/lj_state.c b/src/lj_state.c
> > index ea9abd4..c86e098 100644
> > --- a/src/lj_state.c
> > +++ b/src/lj_state.c
> > @@ -64,10 +64,15 @@ static void resizestack(lua_State *L, MSize n)
> >    MSize oldsize = L->stacksize;
> >    MSize realsize = n + 1 + LJ_STACK_EXTRA;
> >    GCobj *up;
> > -  int32_t old_vmstate = G(L)->vmstate;
> > +  int32_t oldvmstate = G(L)->vmstate;
> >  
> >    lua_assert((MSize)(tvref(L->maxstack)-oldst)==L->stacksize-LJ_STACK_EXTRA-1);
> >  
> > +  /*
> > +  ** Lua stack is inconsistent durent reallocation, profilers
> 
> Typo: s/profilers/profiler/ or s/depends/depend/.

Fixed, force-pushed.

===================================================================
diff --git a/src/lj_state.c b/src/lj_state.c
index c86e098..5701572 100644
--- a/src/lj_state.c
+++ b/src/lj_state.c
@@ -70,7 +70,7 @@ static void resizestack(lua_State *L, MSize n)
 
   /*
   ** Lua stack is inconsistent durent reallocation, profilers
-  ** depends on vmstate during reports, so set vmstate to INTERP
+  ** depend on vmstate during reports, so set vmstate to INTERP
   ** to avoid inconsistent behaviour.
   */
   setvmstate(G(L), INTERP);
===================================================================

> 
> > +  ** depends on vmstate during reports, so set vmstate to INTERP
> > +  ** to avoid inconsistent behaviour.
> > +  */
> >    setvmstate(G(L), INTERP);
> >    st = (TValue *)lj_mem_realloc(L, tvref(L->stack),
> >                                  (MSize)(oldsize*sizeof(TValue)),
> > @@ -85,7 +90,7 @@ static void resizestack(lua_State *L, MSize n)
> >    for (up = gcref(L->openupval); up != NULL; up = gcnext(up))
> >      setmref(gco2uv(up)->v, (TValue *)((char *)uvval(gco2uv(up)) + delta));
> >  
> > -  G(L)->vmstate = old_vmstate;
> > +  G(L)->vmstate = oldvmstate;
> >  }
> >  
> >  /* Relimit stack after error, in case the limit was overdrawn. */
> > ===================================================================
> > 
> > > 
> > > >    st = (TValue *)lj_mem_realloc(L, tvref(L->stack),
> > > >  				(MSize)(oldsize*sizeof(TValue)),
> > > >  				(MSize)(realsize*sizeof(TValue)));
> > > > @@ -80,6 +84,8 @@ static void resizestack(lua_State *L, MSize n)
> > > >    L->top = (TValue *)((char *)L->top + delta);
> > > >    for (up = gcref(L->openupval); up != NULL; up = gcnext(up))
> > > >      setmref(gco2uv(up)->v, (TValue *)((char *)uvval(gco2uv(up)) + delta));
> > > > +
> > > > +  G(L)->vmstate = old_vmstate;
> > > >  }
> > > >  
> > > >  /* Relimit stack after error, in case the limit was overdrawn. */
> 
> <snipped>
> 
> > > > -- 
> > > > 2.28.0
> > > > 
> > > 
> > > -- 
> > > Best regards,
> > > IM
> > 
> > -- 
> > Best regards,
> > Sergey Kaplun
> 
> -- 
> Best regards,
> IM

-- 
Best regards,
Sergey Kaplun

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

* Re: [Tarantool-patches] [PATCH luajit] memprof: report stack resizing as internal event
  2021-03-26 14:09       ` Sergey Kaplun via Tarantool-patches
@ 2021-03-26 18:38         ` Igor Munkin via Tarantool-patches
  2021-03-29  8:09           ` Sergey Kaplun via Tarantool-patches
  0 siblings, 1 reply; 13+ messages in thread
From: Igor Munkin via Tarantool-patches @ 2021-03-26 18:38 UTC (permalink / raw)
  To: Sergey Kaplun; +Cc: tarantool-patches

Sergey,

On 26.03.21, Sergey Kaplun wrote:
> Igor,
> 

<snipped>

> > > > >  src/lj_state.c                                 |  6 ++++++
> > > > >  .../misclib-memprof-lapi.test.lua              | 18 ++++++++++++++++++
> > > > >  2 files changed, 24 insertions(+)
> > > > > 
> > > > > diff --git a/src/lj_state.c b/src/lj_state.c
> > > > > index 1ed79a5..ea9abd4 100644
> > > > > --- a/src/lj_state.c
> > > > > +++ b/src/lj_state.c
> > > > > @@ -64,7 +64,11 @@ static void resizestack(lua_State *L, MSize n)
> > > > >    MSize oldsize = L->stacksize;
> > > > >    MSize realsize = n + 1 + LJ_STACK_EXTRA;
> > > > >    GCobj *up;
> > > > > +  int32_t old_vmstate = G(L)->vmstate;
> > > > 
> > > > Please consider the naming and the workflow in lj_gc.c for such
> > > > situations: G(L) is stored into a separate variable and <old_vmstate> is
> > > > named <ostate>. It makes grep for such spots much easier, doesn't it?
> > > 
> > > You can see more by grepping vmstate. Made naming more consistent
> > 
> > I did it before sending the review. I did it again now. My opinion is
> > not changed. This is "idiomatic" approach to "push" and "pop" vmstate
> > used only in lj_gc.c since this is not required elsewhere. If you move
> 
> But not only in <lj_gc.c> some old value is saved to be reused later:
> 
> | $ grep -rn -P '\Wold[A-Za-z]' src/l*.c | grep -v -e define -e "\*\*" -e "\*/" -e "\*/" | wc -l
> | 123

It's worth to notice that almost half of the entries are related to
lj_alloc.c containing dlmalloc sources. Hence, you're cheating a bit ;)

> 
> Instead one-letter abbreviation (grep out comments and most frequently
> used constructions):
> 
> | $ grep -rn -P '\Wo[^l]' src/l*.c | grep -v -e "\Wo\W" -e "\Wo[12]" | grep -v \
> |   -e obj -e open -e op -e opt -e octet -e out -e on \
> |   -e ofs -e offs -e ok -e oddspill -e os -e orign \
> |   -e define -e overhead -e or \
> |   -e "\*/" -e "\*\*" -e "/\*" | wc -l
> | 25

It's also worth to mention that you've excluded several valid entries
too, e.g. <osz>. Cheating again, but I don't mind :)

> 
> The huge part of them was introduced via memory profiler by us.

That's why I so concerned about naming now: <orig_alloc> field doesn't
fit the current naming practice. It should be <origalloc> (consider
<orignins> in ASMState structure).

Omitting the sophistry above, you said nothing regarding the examples
related to <vmstate> (that you've asked me to grep before). Consider the
following: <oldh> stands for "old hook" *source-wide*, so it's quite
clear what is stored in <oldh> if you see this variable in the sources.
You introduce another identifier for "old vmstate", thereby introduce
ambiguity for this entity name. And then you argue about unrelevant
statistics about "old<smth>" vs "o<smth>" naming.

> 
> So, looks like your codestyle suggestion contradicts to codestyle
> of LuaJIT as it is. It is not described anywhere else, so looks like
> that source of true is the sources by themseles.

That's what I'm talking about: just use the same names as Mike does.

Re G(L) explicit usage: there is other code around using G(L), so I'm
OK. Introducing a new variable will enlarge the diff, since you'd need
to adjust the old code too. Disregard this proposal.

> 
> > that approach "intact", it shows that the semantics of your code are the
> 
> It's already the same, it is obvious by reading, plus comment describes
> the behaviour.
> 
> > same. Otherwise, every other occurrence of such vmstate "pushing" and
> > "popping" allows to introduce own naming: pstate, prevstate,
> > prev_vmstate, sstate, save_state, savevmstate -- there are lots of
> 
> None of them is usual in use for LuaJIT's C codebase, so they can't be
> used.

OK, then origstate, origvmstate. They are fine and used in LuaJIT
sources, since you've grepped out <orignins> entries.

> 
> > combinations. And nobody can stop contributor from this, since it is
> > "more consistent for the current TU".
> 
> But with your approach naming will be choosed not like the most usual,
> but "same in the other file". I think that it will lead to the code
> inconsistency even in one TU.

It's not about "most usual", it's about "fitting this particular case",
but you continue talking about your vision. I've heard you, but you
haven't heard me, unfortunately.

> 
> > 
> > "Feel free to prove the opposite"(c) :)
> > 
> > The current naming is much better than the previous one, but I still
> > propose to save the original on and save G(L) into a new variable.
> 
> Ignoring for now.

Well, if you just need my LGTM, you got it. I'll even push this patch by
myself. But try to hear my arguments even if they look like "bred deda".

> 
> > 
> > > with the <lj_state.c>. s/old_vmstate/oldvmstate/g
> > > 

<snipped>

> 
> -- 
> Best regards,
> Sergey Kaplun

-- 
Best regards,
IM

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

* Re: [Tarantool-patches] [PATCH luajit] memprof: report stack resizing as internal event
  2021-03-26 18:38         ` Igor Munkin via Tarantool-patches
@ 2021-03-29  8:09           ` Sergey Kaplun via Tarantool-patches
  2021-03-29  8:32             ` Igor Munkin via Tarantool-patches
  0 siblings, 1 reply; 13+ messages in thread
From: Sergey Kaplun via Tarantool-patches @ 2021-03-29  8:09 UTC (permalink / raw)
  To: Igor Munkin; +Cc: tarantool-patches

Igor,

On 26.03.21, Igor Munkin wrote:
> Sergey,
> 
> On 26.03.21, Sergey Kaplun wrote:
> > Igor,
> > 
> 
> <snipped>
> 
> > > > > >  src/lj_state.c                                 |  6 ++++++
> > > > > >  .../misclib-memprof-lapi.test.lua              | 18 ++++++++++++++++++
> > > > > >  2 files changed, 24 insertions(+)
> > > > > > 
> > > > > > diff --git a/src/lj_state.c b/src/lj_state.c
> > > > > > index 1ed79a5..ea9abd4 100644
> > > > > > --- a/src/lj_state.c
> > > > > > +++ b/src/lj_state.c
> > > > > > @@ -64,7 +64,11 @@ static void resizestack(lua_State *L, MSize n)
> > > > > >    MSize oldsize = L->stacksize;
> > > > > >    MSize realsize = n + 1 + LJ_STACK_EXTRA;
> > > > > >    GCobj *up;
> > > > > > +  int32_t old_vmstate = G(L)->vmstate;
> > > > > 
> > > > > Please consider the naming and the workflow in lj_gc.c for such
> > > > > situations: G(L) is stored into a separate variable and <old_vmstate> is
> > > > > named <ostate>. It makes grep for such spots much easier, doesn't it?
> > > > 
> > > > You can see more by grepping vmstate. Made naming more consistent
> > > 
> > > I did it before sending the review. I did it again now. My opinion is
> > > not changed. This is "idiomatic" approach to "push" and "pop" vmstate
> > > used only in lj_gc.c since this is not required elsewhere. If you move
> > 
> > But not only in <lj_gc.c> some old value is saved to be reused later:
> > 
> > | $ grep -rn -P '\Wold[A-Za-z]' src/l*.c | grep -v -e define -e "\*\*" -e "\*/" -e "\*/" | wc -l
> > | 123
> 
> It's worth to notice that almost half of the entries are related to
> lj_alloc.c containing dlmalloc sources. Hence, you're cheating a bit ;)

I wanted to demonstrate the order of the differences, not counting exactly :).

> 
> > 
> > Instead one-letter abbreviation (grep out comments and most frequently
> > used constructions):
> > 
> > | $ grep -rn -P '\Wo[^l]' src/l*.c | grep -v -e "\Wo\W" -e "\Wo[12]" | grep -v \
> > |   -e obj -e open -e op -e opt -e octet -e out -e on \
> > |   -e ofs -e offs -e ok -e oddspill -e os -e orign \
> > |   -e define -e overhead -e or \
> > |   -e "\*/" -e "\*\*" -e "/\*" | wc -l
> > | 25
> 
> It's also worth to mention that you've excluded several valid entries
> too, e.g. <osz>. Cheating again, but I don't mind :)

Ditto.

> 
> > 
> > The huge part of them was introduced via memory profiler by us.
> 
> That's why I so concerned about naming now: <orig_alloc> field doesn't
> fit the current naming practice. It should be <origalloc> (consider
> <orignins> in ASMState structure).
> 
> Omitting the sophistry above, you said nothing regarding the examples
> related to <vmstate> (that you've asked me to grep before). Consider the
> following: <oldh> stands for "old hook" *source-wide*, so it's quite
> clear what is stored in <oldh> if you see this variable in the sources.
> You introduce another identifier for "old vmstate", thereby introduce
> ambiguity for this entity name. And then you argue about unrelevant
> statistics about "old<smth>" vs "o<smth>" naming.

You misunderstand my point of view, which I am trying to explain. In my
world, the code should be consistent in one translation unit first time,
and with the whole product code second. But when the code is consistent
with the naming of the entire program, then, in particular, it will be
consistent inside TU by transitive property. If we are homogeneous
throughout the program, then there will be no need for a dispute in
naming as such. The most common naming right now is using `old<smth>`
LuaJIT-wide.

`orignins` looks like an exception too -- there is only `orign` used in
<lj_asm.c>, there is no old<smth> or <osmth>, AFAICS. So there can be
used `orign` form of naming only (and only in this TU), in my opinion,
since it will not be refactored.

I fully understand your point, but, in my opinion, the benefits received
from it are less than from my proposal, because this is an exception,
but not a rule, and the code may become more variegated -- it is hard to
tell from which chunk of the code this particular name usage came from;
why the variable names two lines above have different naming style, and
so on.

> 
> > 
> > So, looks like your codestyle suggestion contradicts to codestyle
> > of LuaJIT as it is. It is not described anywhere else, so looks like
> > that source of true is the sources by themseles.
> 
> That's what I'm talking about: just use the same names as Mike does.
> 
> Re G(L) explicit usage: there is other code around using G(L), so I'm
> OK. Introducing a new variable will enlarge the diff, since you'd need
> to adjust the old code too. Disregard this proposal.

Personally, I see no difference between these 2 proposals -- neither in
readability of the code (it's too common to use `G(L)` macro
LuaJIT-wide, but there is nothing bad in creating an additional
variable), nor in its performance.
We can use an additional variable, if you think that it looks better.

> 
> > 
> > > that approach "intact", it shows that the semantics of your code are the
> > 
> > It's already the same, it is obvious by reading, plus comment describes
> > the behaviour.
> > 
> > > same. Otherwise, every other occurrence of such vmstate "pushing" and
> > > "popping" allows to introduce own naming: pstate, prevstate,
> > > prev_vmstate, sstate, save_state, savevmstate -- there are lots of
> > 
> > None of them is usual in use for LuaJIT's C codebase, so they can't be
> > used.
> 
> OK, then origstate, origvmstate. They are fine and used in LuaJIT
> sources, since you've grepped out <orignins> entries.

Answered above.

> 
> > 
> > > combinations. And nobody can stop contributor from this, since it is
> > > "more consistent for the current TU".
> > 
> > But with your approach naming will be choosed not like the most usual,
> > but "same in the other file". I think that it will lead to the code
> > inconsistency even in one TU.
> 
> It's not about "most usual", it's about "fitting this particular case",
> but you continue talking about your vision. I've heard you, but you
> haven't heard me, unfortunately.

I feel just the reverse :). Tried to explain my point of view above.

> 
> > 
> > > 
> > > "Feel free to prove the opposite"(c) :)
> > > 
> > > The current naming is much better than the previous one, but I still
> > > propose to save the original on and save G(L) into a new variable.
> > 
> > Ignoring for now.
> 
> Well, if you just need my LGTM, you got it. I'll even push this patch by
> myself. But try to hear my arguments even if they look like "bred deda".

This is not about LGTM, but about a miscommunication, I hope we will
understand each other's point of view and come to a consensus.

> 
> > 
> > > 
> > > > with the <lj_state.c>. s/old_vmstate/oldvmstate/g
> > > > 
> 
> <snipped>
> 
> > 
> > -- 
> > Best regards,
> > Sergey Kaplun
> 
> -- 
> Best regards,
> IM

-- 
Best regards,
Sergey Kaplun

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

* Re: [Tarantool-patches] [PATCH luajit] memprof: report stack resizing as internal event
  2021-03-29  8:09           ` Sergey Kaplun via Tarantool-patches
@ 2021-03-29  8:32             ` Igor Munkin via Tarantool-patches
  2021-03-29  8:35               ` Igor Munkin via Tarantool-patches
  0 siblings, 1 reply; 13+ messages in thread
From: Igor Munkin via Tarantool-patches @ 2021-03-29  8:32 UTC (permalink / raw)
  To: Sergey Kaplun; +Cc: tarantool-patches

Sergey,

On 29.03.21, Sergey Kaplun wrote:
> Igor,
> 

<snipped>

> > > > 
> > > > "Feel free to prove the opposite"(c) :)
> > > > 
> > > > The current naming is much better than the previous one, but I still
> > > > propose to save the original on and save G(L) into a new variable.
> > > 
> > > Ignoring for now.
> > 
> > Well, if you just need my LGTM, you got it. I'll even push this patch by
> > myself. But try to hear my arguments even if they look like "bred deda".
> 
> This is not about LGTM, but about a miscommunication, I hope we will
> understand each other's point of view and come to a consensus.

I see no changes on the branch, hence we won't. Anyway, you have the
necessary amount of LGTMs, so I'll push your patch to the trunk later.

> 

<snipped>

> 
> -- 
> Best regards,
> Sergey Kaplun

-- 
Best regards,
IM

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

* Re: [Tarantool-patches] [PATCH luajit] memprof: report stack resizing as internal event
  2021-03-29  8:32             ` Igor Munkin via Tarantool-patches
@ 2021-03-29  8:35               ` Igor Munkin via Tarantool-patches
  2021-03-29 16:01                 ` Sergey Ostanevich via Tarantool-patches
  0 siblings, 1 reply; 13+ messages in thread
From: Igor Munkin via Tarantool-patches @ 2021-03-29  8:35 UTC (permalink / raw)
  To: Sergey Kaplun; +Cc: tarantool-patches

On 29.03.21, Igor Munkin wrote:
> Sergey,
> 
> On 29.03.21, Sergey Kaplun wrote:
> > Igor,
> > 
> 
> <snipped>
> 
> > > > > 
> > > > > "Feel free to prove the opposite"(c) :)
> > > > > 
> > > > > The current naming is much better than the previous one, but I still
> > > > > propose to save the original on and save G(L) into a new variable.
> > > > 
> > > > Ignoring for now.
> > > 
> > > Well, if you just need my LGTM, you got it. I'll even push this patch by
> > > myself. But try to hear my arguments even if they look like "bred deda".
> > 
> > This is not about LGTM, but about a miscommunication, I hope we will
> > understand each other's point of view and come to a consensus.
> 
> I see no changes on the branch, hence we won't. Anyway, you have the
> necessary amount of LGTMs, so I'll push your patch to the trunk later.

Oops, seems you have only mine (at least I see no explicit LGTM from
Sergos in the thread). Will not rush then.

> 
> > 
> 
> <snipped>
> 
> > 
> > -- 
> > Best regards,
> > Sergey Kaplun
> 
> -- 
> Best regards,
> IM

-- 
Best regards,
IM

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

* Re: [Tarantool-patches] [PATCH luajit] memprof: report stack resizing as internal event
  2021-03-29  8:35               ` Igor Munkin via Tarantool-patches
@ 2021-03-29 16:01                 ` Sergey Ostanevich via Tarantool-patches
  0 siblings, 0 replies; 13+ messages in thread
From: Sergey Ostanevich via Tarantool-patches @ 2021-03-29 16:01 UTC (permalink / raw)
  To: Igor Munkin; +Cc: tarantool-patches

[-- Attachment #1: Type: text/plain, Size: 1399 bytes --]

Hi!

Had a good time reading all your comments, thanks!

As for the reason I still not blessed this - I got good 
explanation why stack resizing should be guarded for the whole
part of the code it was in original patch, so

LGTM.

Sergos

> On 29 Mar 2021, at 11:35, Igor Munkin <imun@tarantool.org> wrote:
> 
> On 29.03.21, Igor Munkin wrote:
>> Sergey,
>> 
>> On 29.03.21, Sergey Kaplun wrote:
>>> Igor,
>>> 
>> 
>> <snipped>
>> 
>>>>>> 
>>>>>> "Feel free to prove the opposite"(c) :)
>>>>>> 
>>>>>> The current naming is much better than the previous one, but I still
>>>>>> propose to save the original on and save G(L) into a new variable.
>>>>> 
>>>>> Ignoring for now.
>>>> 
>>>> Well, if you just need my LGTM, you got it. I'll even push this patch by
>>>> myself. But try to hear my arguments even if they look like "bred deda".
>>> 
>>> This is not about LGTM, but about a miscommunication, I hope we will
>>> understand each other's point of view and come to a consensus.
>> 
>> I see no changes on the branch, hence we won't. Anyway, you have the
>> necessary amount of LGTMs, so I'll push your patch to the trunk later.
> 
> Oops, seems you have only mine (at least I see no explicit LGTM from
> Sergos in the thread). Will not rush then.
> 
>> 
>>> 
>> 
>> <snipped>
>> 
>>> 
>>> -- 
>>> Best regards,
>>> Sergey Kaplun
>> 
>> -- 
>> Best regards,
>> IM
> 
> -- 
> Best regards,
> IM


[-- Attachment #2: Type: text/html, Size: 8703 bytes --]

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

* Re: [Tarantool-patches] [PATCH luajit] memprof: report stack resizing as internal event
  2021-03-09 17:54 [Tarantool-patches] [PATCH luajit] memprof: report stack resizing as internal event Sergey Kaplun via Tarantool-patches
  2021-03-10 14:59 ` Sergey Ostanevich via Tarantool-patches
  2021-03-25 20:14 ` Igor Munkin via Tarantool-patches
@ 2021-03-29 20:48 ` Igor Munkin via Tarantool-patches
  2 siblings, 0 replies; 13+ messages in thread
From: Igor Munkin via Tarantool-patches @ 2021-03-29 20:48 UTC (permalink / raw)
  To: Sergey Kaplun; +Cc: tarantool-patches

Sergey,

I've checked the series into tarantool-2.7 and tarantool branches in
tarantool/luajit and bumped a new version in 2.7 and master.

On 09.03.21, Sergey Kaplun wrote:
> Resizing of the Lua stack is not reported as internal allocation.
> Moreover, it may lead to crash inside Lua or FF frames.
> 
> Profiler performs reallocation first and after reports corresponding
> event. When the stack is resized for local function arguments, the link
> to previous frame is invalid in the cause of reallocation. Therefore,
> assertion in `debug_framepc()` failes, because of invalid function
> reference at previous frame.
> 
> Resolves tarantool/tarantool#5842
> Follows up tarantool/tarantool#5442
> ---
> Branch: https://github.com/tarantool/luajit/tree/skaplun/gh-5842-memprof-core-on-resizestack
> Tarantool branch: https://github.com/tarantool/tarantool/tree/skaplun/gh-5842-memprof-core-on-resizestack
> Issue: https://github.com/tarantool/tarantool/issues/5842
> 
> 
>  src/lj_state.c                                 |  6 ++++++
>  .../misclib-memprof-lapi.test.lua              | 18 ++++++++++++++++++
>  2 files changed, 24 insertions(+)
> 

<snipped>

> -- 
> 2.28.0
> 

-- 
Best regards,
IM

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

end of thread, other threads:[~2021-03-29 20:48 UTC | newest]

Thread overview: 13+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2021-03-09 17:54 [Tarantool-patches] [PATCH luajit] memprof: report stack resizing as internal event Sergey Kaplun via Tarantool-patches
2021-03-10 14:59 ` Sergey Ostanevich via Tarantool-patches
2021-03-10 17:37   ` Sergey Kaplun via Tarantool-patches
2021-03-25 20:14 ` Igor Munkin via Tarantool-patches
2021-03-26  8:54   ` Sergey Kaplun via Tarantool-patches
2021-03-26 10:10     ` Igor Munkin via Tarantool-patches
2021-03-26 14:09       ` Sergey Kaplun via Tarantool-patches
2021-03-26 18:38         ` Igor Munkin via Tarantool-patches
2021-03-29  8:09           ` Sergey Kaplun via Tarantool-patches
2021-03-29  8:32             ` Igor Munkin via Tarantool-patches
2021-03-29  8:35               ` Igor Munkin via Tarantool-patches
2021-03-29 16:01                 ` Sergey Ostanevich via Tarantool-patches
2021-03-29 20:48 ` Igor Munkin via Tarantool-patches

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox