af_packet: worker thread call vlib_log coredump 83/42083/2
authorfenglei <[email protected]>
Tue, 31 Dec 2024 07:20:16 +0000 (15:20 +0800)
committerBenoit Ganne <[email protected]>
Mon, 20 Jan 2025 10:47:21 +0000 (10:47 +0000)
Type: fix

-When deleting a veth pair interface in linux, vpp's call to af_packet_fd_error will cause it to hang because it's a worker thread.

Change-Id: I3dc9018e7e492ccbdf0f59381f9bbbfd5c1c88a5
Signed-off-by: fenglei <[email protected]>
src/plugins/af_packet/af_packet.c

index 6924542..8cb2af2 100644 (file)
@@ -189,7 +189,6 @@ af_packet_fd_read_ready (clib_file_t * uf)
 static clib_error_t *
 af_packet_fd_error (clib_file_t *uf)
 {
-  af_packet_main_t *apm = &af_packet_main;
   clib_error_t *err = 0;
   u64 u64;
 
@@ -198,8 +197,20 @@ af_packet_fd_error (clib_file_t *uf)
   if (ret < 0)
     {
       err = clib_error_return_unix (0, "");
-      vlib_log_notice (apm->log_class, "fd %u %U", uf->file_descriptor,
-                      format_clib_error, err);
+      ELOG_TYPE_DECLARE (e) = {
+       .format = "af-packet-msg: fd %u reason %s",
+       .format_args = "i4T4",
+      };
+      struct
+      {
+       u32 fd;
+       u32 reason;
+      } *ed;
+      ed = ELOG_DATA (&vlib_global_main.elog_main, e);
+      ed->fd = uf->file_descriptor;
+      ed->reason =
+       elog_string (vlib_get_elog_main (), "%U", format_clib_error, err);
+
       clib_error_free (err);
     }