Sebastian Andrzej Siewior <bigeasy@xxxxxxxxxxxxx> writes: > On 2022-03-03 14:59:47 [+0100], Toke Høiland-Jørgensen wrote: >> Sebastian Andrzej Siewior <bigeasy@xxxxxxxxxxxxx> writes: >> >> > Since the commit mentioned below __xdp_reg_mem_model() can return a NULL >> > pointer. This pointer is dereferenced in trace_mem_connect() which leads >> > to segfault. It can be reproduced with enabled trace events during ifup. >> > >> > Only assign the arguments in the trace-event macro if `xa' is set. >> > Otherwise set the parameters to 0. >> > >> > Fixes: 4a48ef70b93b8 ("xdp: Allow registering memory model without rxq reference") >> > Signed-off-by: Sebastian Andrzej Siewior <bigeasy@xxxxxxxxxxxxx> >> >> Hmm, so before the commit you mention, the tracepoint wasn't triggered >> at all in the code path that now sets xdp_alloc is NULL. So I'm >> wondering if we should just do the same here? Is the trace event useful >> in all cases? > > Correct. It says: > | ip-1230 [003] ..... 3.053473: mem_connect: mem_id=0 mem_type=PAGE_SHARED allocator=0000000000000000 ifindex=2 > >> Alternatively, if we keep it, I think the mem.id and mem.type should be >> available from rxq->mem, right? > > Yes, if these are the same things. In my case they are also 0: > > | ip-1245 [000] ..... 3.045684: mem_connect: mem_id=0 mem_type=PAGE_SHARED allocator=0000000000000000 ifindex=2 > | ifconfig-1332 [003] ..... 21.030879: mem_connect: mem_id=0 mem_type=PAGE_SHARED allocator=0000000000000000 ifindex=3 > > So depends on what makes sense that tp can be skipped for xa == NULL or > remain with > __entry->mem_id = rxq->mem.id; > __entry->mem_type = rxq->mem.type; > __entry->allocator = xa ? xa->allocator : NULL; > > if it makes sense. Right, looking at the code again, the id is only assigned in the path that doesn't return NULL from __xdp_reg_mem_model(). Given that the trace points were put in specifically to be able to pair connect/disconnect using the IDs, I don't think there's any use to creating the events if there's no ID, so I think we should fix it by skipping the trace event entirely if xdp_alloc is NULL. -Toke