Bug Summary

File:home/bhubbard/working/src/ceph/src/spdk/dpdk/lib/librte_eal/linux/eal/eal_dev.c
Warning:line 159, column 4
Value stored to 'buf' is never read

Annotated Source Code

[?] Use j/k keys for keyboard navigation

1/* SPDX-License-Identifier: BSD-3-Clause
2 * Copyright(c) 2018 Intel Corporation
3 */
4
5#include <string.h>
6#include <unistd.h>
7#include <fcntl.h>
8#include <signal.h>
9#include <sys/socket.h>
10#include <linux1/netlink.h>
11
12#include <rte_string_fns.h>
13#include <rte_log.h>
14#include <rte_compat.h>
15#include <rte_dev.h>
16#include <rte_malloc.h>
17#include <rte_interrupts.h>
18#include <rte_alarm.h>
19#include <rte_bus.h>
20#include <rte_eal.h>
21#include <rte_spinlock.h>
22#include <rte_errno(per_lcore__rte_errno).h>
23
24#include "eal_private.h"
25
26static struct rte_intr_handle intr_handle = {.fd = -1 };
27static bool_Bool monitor_started;
28static bool_Bool hotplug_handle;
29
30#define EAL_UEV_MSG_LEN4096 4096
31#define EAL_UEV_MSG_ELEM_LEN128 128
32
33/*
34 * spinlock for device hot-unplug failure handling. If it try to access bus or
35 * device, such as handle sigbus on bus or handle memory failure for device
36 * just need to use this lock. It could protect the bus and the device to avoid
37 * race condition.
38 */
39static rte_spinlock_t failure_handle_lock = RTE_SPINLOCK_INITIALIZER{ 0 };
40
41static struct sigaction sigbus_action_old;
42
43static int sigbus_need_recover;
44
45static void dev_uev_handler(__rte_unused__attribute__((__unused__)) void *param);
46
47/* identify the system layer which reports this event. */
48enum eal_dev_event_subsystem {
49 EAL_DEV_EVENT_SUBSYSTEM_PCI, /* PCI bus device event */
50 EAL_DEV_EVENT_SUBSYSTEM_UIO, /* UIO driver device event */
51 EAL_DEV_EVENT_SUBSYSTEM_VFIO, /* VFIO driver device event */
52 EAL_DEV_EVENT_SUBSYSTEM_MAX
53};
54
55static void
56sigbus_action_recover(void)
57{
58 if (sigbus_need_recover) {
59 sigaction(SIGBUS7, &sigbus_action_old, NULL((void*)0));
60 sigbus_need_recover = 0;
61 }
62}
63
64static void sigbus_handler(int signum, siginfo_t *info,
65 void *ctx __rte_unused__attribute__((__unused__)))
66{
67 int ret;
68
69 RTE_LOG(DEBUG, EAL, "Thread catch SIGBUS, fault address:%p\n",rte_log(8U, 0, "EAL" ": " "Thread catch SIGBUS, fault address:%p\n"
, info->_sifields._sigfault.si_addr)
70 info->si_addr)rte_log(8U, 0, "EAL" ": " "Thread catch SIGBUS, fault address:%p\n"
, info->_sifields._sigfault.si_addr)
;
71
72 rte_spinlock_lock(&failure_handle_lock);
73 ret = rte_bus_sigbus_handler(info->si_addr_sifields._sigfault.si_addr);
74 rte_spinlock_unlock(&failure_handle_lock);
75 if (ret == -1) {
76 rte_exit(EXIT_FAILURE1,
77 "Failed to handle SIGBUS for hot-unplug, "
78 "(rte_errno: %s)!", strerror(rte_errno(per_lcore__rte_errno)));
79 } else if (ret == 1) {
80 if (sigbus_action_old.sa_flags == SA_SIGINFO4
81 && sigbus_action_old.sa_sigaction__sigaction_handler.sa_sigaction) {
82 (*(sigbus_action_old.sa_sigaction__sigaction_handler.sa_sigaction))(signum,
83 info, ctx);
84 } else if (sigbus_action_old.sa_flags != SA_SIGINFO4
85 && sigbus_action_old.sa_handler__sigaction_handler.sa_handler) {
86 (*(sigbus_action_old.sa_handler__sigaction_handler.sa_handler))(signum);
87 } else {
88 rte_exit(EXIT_FAILURE1,
89 "Failed to handle generic SIGBUS!");
90 }
91 }
92
93 RTE_LOG(DEBUG, EAL, "Success to handle SIGBUS for hot-unplug!\n")rte_log(8U, 0, "EAL" ": " "Success to handle SIGBUS for hot-unplug!\n"
)
;
94}
95
96static int cmp_dev_name(const struct rte_device *dev,
97 const void *_name)
98{
99 const char *name = _name;
100
101 return strcmp(dev->name, name)__extension__ ({ size_t __s1_len, __s2_len; (__builtin_constant_p
(dev->name) && __builtin_constant_p (name) &&
(__s1_len = __builtin_strlen (dev->name), __s2_len = __builtin_strlen
(name), (!((size_t)(const void *)((dev->name) + 1) - (size_t
)(const void *)(dev->name) == 1) || __s1_len >= 4) &&
(!((size_t)(const void *)((name) + 1) - (size_t)(const void *
)(name) == 1) || __s2_len >= 4)) ? __builtin_strcmp (dev->
name, name) : (__builtin_constant_p (dev->name) &&
((size_t)(const void *)((dev->name) + 1) - (size_t)(const
void *)(dev->name) == 1) && (__s1_len = __builtin_strlen
(dev->name), __s1_len < 4) ? (__builtin_constant_p (name
) && ((size_t)(const void *)((name) + 1) - (size_t)(const
void *)(name) == 1) ? __builtin_strcmp (dev->name, name) :
(__extension__ ({ const unsigned char *__s2 = (const unsigned
char *) (const char *) (name); int __result = (((const unsigned
char *) (const char *) (dev->name))[0] - __s2[0]); if (__s1_len
> 0 && __result == 0) { __result = (((const unsigned
char *) (const char *) (dev->name))[1] - __s2[1]); if (__s1_len
> 1 && __result == 0) { __result = (((const unsigned
char *) (const char *) (dev->name))[2] - __s2[2]); if (__s1_len
> 2 && __result == 0) __result = (((const unsigned
char *) (const char *) (dev->name))[3] - __s2[3]); } } __result
; }))) : (__builtin_constant_p (name) && ((size_t)(const
void *)((name) + 1) - (size_t)(const void *)(name) == 1) &&
(__s2_len = __builtin_strlen (name), __s2_len < 4) ? (__builtin_constant_p
(dev->name) && ((size_t)(const void *)((dev->name
) + 1) - (size_t)(const void *)(dev->name) == 1) ? __builtin_strcmp
(dev->name, name) : (- (__extension__ ({ const unsigned char
*__s2 = (const unsigned char *) (const char *) (dev->name
); int __result = (((const unsigned char *) (const char *) (name
))[0] - __s2[0]); if (__s2_len > 0 && __result == 0
) { __result = (((const unsigned char *) (const char *) (name
))[1] - __s2[1]); if (__s2_len > 1 && __result == 0
) { __result = (((const unsigned char *) (const char *) (name
))[2] - __s2[2]); if (__s2_len > 2 && __result == 0
) __result = (((const unsigned char *) (const char *) (name))
[3] - __s2[3]); } } __result; })))) : __builtin_strcmp (dev->
name, name)))); })
;
102}
103
104static int
105dev_uev_socket_fd_create(void)
106{
107 struct sockaddr_nl addr;
108 int ret;
109
110 intr_handle.fd = socket(PF_NETLINK16, SOCK_RAWSOCK_RAW | SOCK_CLOEXECSOCK_CLOEXEC |
111 SOCK_NONBLOCKSOCK_NONBLOCK,
112 NETLINK_KOBJECT_UEVENT15);
113 if (intr_handle.fd < 0) {
114 RTE_LOG(ERR, EAL, "create uevent fd failed.\n")rte_log(4U, 0, "EAL" ": " "create uevent fd failed.\n");
115 return -1;
116 }
117
118 memset(&addr, 0, sizeof(addr));
119 addr.nl_family = AF_NETLINK16;
120 addr.nl_pid = 0;
121 addr.nl_groups = 0xffffffff;
122
123 ret = bind(intr_handle.fd, (struct sockaddr *) &addr, sizeof(addr));
124 if (ret < 0) {
125 RTE_LOG(ERR, EAL, "Failed to bind uevent socket.\n")rte_log(4U, 0, "EAL" ": " "Failed to bind uevent socket.\n");
126 goto err;
127 }
128
129 return 0;
130err:
131 close(intr_handle.fd);
132 intr_handle.fd = -1;
133 return ret;
134}
135
136static int
137dev_uev_parse(const char *buf, struct rte_dev_event *event, int length)
138{
139 char action[EAL_UEV_MSG_ELEM_LEN128];
140 char subsystem[EAL_UEV_MSG_ELEM_LEN128];
141 char pci_slot_name[EAL_UEV_MSG_ELEM_LEN128];
142 int i = 0;
143
144 memset(action, 0, EAL_UEV_MSG_ELEM_LEN128);
145 memset(subsystem, 0, EAL_UEV_MSG_ELEM_LEN128);
146 memset(pci_slot_name, 0, EAL_UEV_MSG_ELEM_LEN128);
147
148 while (i < length) {
149 for (; i < length; i++) {
150 if (*buf)
151 break;
152 buf++;
153 }
154 /**
155 * check device uevent from kernel side, no need to check
156 * uevent from udev.
157 */
158 if (!strncmp(buf, "libudev", 7)(__extension__ (__builtin_constant_p (7) && ((__builtin_constant_p
(buf) && strlen (buf) < ((size_t) (7))) || (__builtin_constant_p
("libudev") && strlen ("libudev") < ((size_t) (7)
))) ? __extension__ ({ size_t __s1_len, __s2_len; (__builtin_constant_p
(buf) && __builtin_constant_p ("libudev") &&
(__s1_len = __builtin_strlen (buf), __s2_len = __builtin_strlen
("libudev"), (!((size_t)(const void *)((buf) + 1) - (size_t)
(const void *)(buf) == 1) || __s1_len >= 4) && (!(
(size_t)(const void *)(("libudev") + 1) - (size_t)(const void
*)("libudev") == 1) || __s2_len >= 4)) ? __builtin_strcmp
(buf, "libudev") : (__builtin_constant_p (buf) && ((
size_t)(const void *)((buf) + 1) - (size_t)(const void *)(buf
) == 1) && (__s1_len = __builtin_strlen (buf), __s1_len
< 4) ? (__builtin_constant_p ("libudev") && ((size_t
)(const void *)(("libudev") + 1) - (size_t)(const void *)("libudev"
) == 1) ? __builtin_strcmp (buf, "libudev") : (__extension__ (
{ const unsigned char *__s2 = (const unsigned char *) (const char
*) ("libudev"); int __result = (((const unsigned char *) (const
char *) (buf))[0] - __s2[0]); if (__s1_len > 0 &&
__result == 0) { __result = (((const unsigned char *) (const
char *) (buf))[1] - __s2[1]); if (__s1_len > 1 &&
__result == 0) { __result = (((const unsigned char *) (const
char *) (buf))[2] - __s2[2]); if (__s1_len > 2 &&
__result == 0) __result = (((const unsigned char *) (const char
*) (buf))[3] - __s2[3]); } } __result; }))) : (__builtin_constant_p
("libudev") && ((size_t)(const void *)(("libudev") +
1) - (size_t)(const void *)("libudev") == 1) && (__s2_len
= __builtin_strlen ("libudev"), __s2_len < 4) ? (__builtin_constant_p
(buf) && ((size_t)(const void *)((buf) + 1) - (size_t
)(const void *)(buf) == 1) ? __builtin_strcmp (buf, "libudev"
) : (- (__extension__ ({ const unsigned char *__s2 = (const unsigned
char *) (const char *) (buf); int __result = (((const unsigned
char *) (const char *) ("libudev"))[0] - __s2[0]); if (__s2_len
> 0 && __result == 0) { __result = (((const unsigned
char *) (const char *) ("libudev"))[1] - __s2[1]); if (__s2_len
> 1 && __result == 0) { __result = (((const unsigned
char *) (const char *) ("libudev"))[2] - __s2[2]); if (__s2_len
> 2 && __result == 0) __result = (((const unsigned
char *) (const char *) ("libudev"))[3] - __s2[3]); } } __result
; })))) : __builtin_strcmp (buf, "libudev")))); }) : strncmp (
buf, "libudev", 7)))
) {
159 buf += 7;
Value stored to 'buf' is never read
160 i += 7;
161 return -1;
162 }
163 if (!strncmp(buf, "ACTION=", 7)(__extension__ (__builtin_constant_p (7) && ((__builtin_constant_p
(buf) && strlen (buf) < ((size_t) (7))) || (__builtin_constant_p
("ACTION=") && strlen ("ACTION=") < ((size_t) (7)
))) ? __extension__ ({ size_t __s1_len, __s2_len; (__builtin_constant_p
(buf) && __builtin_constant_p ("ACTION=") &&
(__s1_len = __builtin_strlen (buf), __s2_len = __builtin_strlen
("ACTION="), (!((size_t)(const void *)((buf) + 1) - (size_t)
(const void *)(buf) == 1) || __s1_len >= 4) && (!(
(size_t)(const void *)(("ACTION=") + 1) - (size_t)(const void
*)("ACTION=") == 1) || __s2_len >= 4)) ? __builtin_strcmp
(buf, "ACTION=") : (__builtin_constant_p (buf) && ((
size_t)(const void *)((buf) + 1) - (size_t)(const void *)(buf
) == 1) && (__s1_len = __builtin_strlen (buf), __s1_len
< 4) ? (__builtin_constant_p ("ACTION=") && ((size_t
)(const void *)(("ACTION=") + 1) - (size_t)(const void *)("ACTION="
) == 1) ? __builtin_strcmp (buf, "ACTION=") : (__extension__ (
{ const unsigned char *__s2 = (const unsigned char *) (const char
*) ("ACTION="); int __result = (((const unsigned char *) (const
char *) (buf))[0] - __s2[0]); if (__s1_len > 0 &&
__result == 0) { __result = (((const unsigned char *) (const
char *) (buf))[1] - __s2[1]); if (__s1_len > 1 &&
__result == 0) { __result = (((const unsigned char *) (const
char *) (buf))[2] - __s2[2]); if (__s1_len > 2 &&
__result == 0) __result = (((const unsigned char *) (const char
*) (buf))[3] - __s2[3]); } } __result; }))) : (__builtin_constant_p
("ACTION=") && ((size_t)(const void *)(("ACTION=") +
1) - (size_t)(const void *)("ACTION=") == 1) && (__s2_len
= __builtin_strlen ("ACTION="), __s2_len < 4) ? (__builtin_constant_p
(buf) && ((size_t)(const void *)((buf) + 1) - (size_t
)(const void *)(buf) == 1) ? __builtin_strcmp (buf, "ACTION="
) : (- (__extension__ ({ const unsigned char *__s2 = (const unsigned
char *) (const char *) (buf); int __result = (((const unsigned
char *) (const char *) ("ACTION="))[0] - __s2[0]); if (__s2_len
> 0 && __result == 0) { __result = (((const unsigned
char *) (const char *) ("ACTION="))[1] - __s2[1]); if (__s2_len
> 1 && __result == 0) { __result = (((const unsigned
char *) (const char *) ("ACTION="))[2] - __s2[2]); if (__s2_len
> 2 && __result == 0) __result = (((const unsigned
char *) (const char *) ("ACTION="))[3] - __s2[3]); } } __result
; })))) : __builtin_strcmp (buf, "ACTION=")))); }) : strncmp (
buf, "ACTION=", 7)))
) {
164 buf += 7;
165 i += 7;
166 strlcpy(action, buf, sizeof(action))rte_strlcpy(action, buf, sizeof(action));
167 } else if (!strncmp(buf, "SUBSYSTEM=", 10)(__extension__ (__builtin_constant_p (10) && ((__builtin_constant_p
(buf) && strlen (buf) < ((size_t) (10))) || (__builtin_constant_p
("SUBSYSTEM=") && strlen ("SUBSYSTEM=") < ((size_t
) (10)))) ? __extension__ ({ size_t __s1_len, __s2_len; (__builtin_constant_p
(buf) && __builtin_constant_p ("SUBSYSTEM=") &&
(__s1_len = __builtin_strlen (buf), __s2_len = __builtin_strlen
("SUBSYSTEM="), (!((size_t)(const void *)((buf) + 1) - (size_t
)(const void *)(buf) == 1) || __s1_len >= 4) && (!
((size_t)(const void *)(("SUBSYSTEM=") + 1) - (size_t)(const void
*)("SUBSYSTEM=") == 1) || __s2_len >= 4)) ? __builtin_strcmp
(buf, "SUBSYSTEM=") : (__builtin_constant_p (buf) &&
((size_t)(const void *)((buf) + 1) - (size_t)(const void *)(
buf) == 1) && (__s1_len = __builtin_strlen (buf), __s1_len
< 4) ? (__builtin_constant_p ("SUBSYSTEM=") && ((
size_t)(const void *)(("SUBSYSTEM=") + 1) - (size_t)(const void
*)("SUBSYSTEM=") == 1) ? __builtin_strcmp (buf, "SUBSYSTEM="
) : (__extension__ ({ const unsigned char *__s2 = (const unsigned
char *) (const char *) ("SUBSYSTEM="); int __result = (((const
unsigned char *) (const char *) (buf))[0] - __s2[0]); if (__s1_len
> 0 && __result == 0) { __result = (((const unsigned
char *) (const char *) (buf))[1] - __s2[1]); if (__s1_len >
1 && __result == 0) { __result = (((const unsigned char
*) (const char *) (buf))[2] - __s2[2]); if (__s1_len > 2 &&
__result == 0) __result = (((const unsigned char *) (const char
*) (buf))[3] - __s2[3]); } } __result; }))) : (__builtin_constant_p
("SUBSYSTEM=") && ((size_t)(const void *)(("SUBSYSTEM="
) + 1) - (size_t)(const void *)("SUBSYSTEM=") == 1) &&
(__s2_len = __builtin_strlen ("SUBSYSTEM="), __s2_len < 4
) ? (__builtin_constant_p (buf) && ((size_t)(const void
*)((buf) + 1) - (size_t)(const void *)(buf) == 1) ? __builtin_strcmp
(buf, "SUBSYSTEM=") : (- (__extension__ ({ const unsigned char
*__s2 = (const unsigned char *) (const char *) (buf); int __result
= (((const unsigned char *) (const char *) ("SUBSYSTEM="))[0
] - __s2[0]); if (__s2_len > 0 && __result == 0) {
__result = (((const unsigned char *) (const char *) ("SUBSYSTEM="
))[1] - __s2[1]); if (__s2_len > 1 && __result == 0
) { __result = (((const unsigned char *) (const char *) ("SUBSYSTEM="
))[2] - __s2[2]); if (__s2_len > 2 && __result == 0
) __result = (((const unsigned char *) (const char *) ("SUBSYSTEM="
))[3] - __s2[3]); } } __result; })))) : __builtin_strcmp (buf
, "SUBSYSTEM=")))); }) : strncmp (buf, "SUBSYSTEM=", 10)))
) {
168 buf += 10;
169 i += 10;
170 strlcpy(subsystem, buf, sizeof(subsystem))rte_strlcpy(subsystem, buf, sizeof(subsystem));
171 } else if (!strncmp(buf, "PCI_SLOT_NAME=", 14)(__extension__ (__builtin_constant_p (14) && ((__builtin_constant_p
(buf) && strlen (buf) < ((size_t) (14))) || (__builtin_constant_p
("PCI_SLOT_NAME=") && strlen ("PCI_SLOT_NAME=") <
((size_t) (14)))) ? __extension__ ({ size_t __s1_len, __s2_len
; (__builtin_constant_p (buf) && __builtin_constant_p
("PCI_SLOT_NAME=") && (__s1_len = __builtin_strlen (
buf), __s2_len = __builtin_strlen ("PCI_SLOT_NAME="), (!((size_t
)(const void *)((buf) + 1) - (size_t)(const void *)(buf) == 1
) || __s1_len >= 4) && (!((size_t)(const void *)((
"PCI_SLOT_NAME=") + 1) - (size_t)(const void *)("PCI_SLOT_NAME="
) == 1) || __s2_len >= 4)) ? __builtin_strcmp (buf, "PCI_SLOT_NAME="
) : (__builtin_constant_p (buf) && ((size_t)(const void
*)((buf) + 1) - (size_t)(const void *)(buf) == 1) &&
(__s1_len = __builtin_strlen (buf), __s1_len < 4) ? (__builtin_constant_p
("PCI_SLOT_NAME=") && ((size_t)(const void *)(("PCI_SLOT_NAME="
) + 1) - (size_t)(const void *)("PCI_SLOT_NAME=") == 1) ? __builtin_strcmp
(buf, "PCI_SLOT_NAME=") : (__extension__ ({ const unsigned char
*__s2 = (const unsigned char *) (const char *) ("PCI_SLOT_NAME="
); int __result = (((const unsigned char *) (const char *) (buf
))[0] - __s2[0]); if (__s1_len > 0 && __result == 0
) { __result = (((const unsigned char *) (const char *) (buf)
)[1] - __s2[1]); if (__s1_len > 1 && __result == 0
) { __result = (((const unsigned char *) (const char *) (buf)
)[2] - __s2[2]); if (__s1_len > 2 && __result == 0
) __result = (((const unsigned char *) (const char *) (buf))[
3] - __s2[3]); } } __result; }))) : (__builtin_constant_p ("PCI_SLOT_NAME="
) && ((size_t)(const void *)(("PCI_SLOT_NAME=") + 1) -
(size_t)(const void *)("PCI_SLOT_NAME=") == 1) && (__s2_len
= __builtin_strlen ("PCI_SLOT_NAME="), __s2_len < 4) ? (__builtin_constant_p
(buf) && ((size_t)(const void *)((buf) + 1) - (size_t
)(const void *)(buf) == 1) ? __builtin_strcmp (buf, "PCI_SLOT_NAME="
) : (- (__extension__ ({ const unsigned char *__s2 = (const unsigned
char *) (const char *) (buf); int __result = (((const unsigned
char *) (const char *) ("PCI_SLOT_NAME="))[0] - __s2[0]); if
(__s2_len > 0 && __result == 0) { __result = (((const
unsigned char *) (const char *) ("PCI_SLOT_NAME="))[1] - __s2
[1]); if (__s2_len > 1 && __result == 0) { __result
= (((const unsigned char *) (const char *) ("PCI_SLOT_NAME="
))[2] - __s2[2]); if (__s2_len > 2 && __result == 0
) __result = (((const unsigned char *) (const char *) ("PCI_SLOT_NAME="
))[3] - __s2[3]); } } __result; })))) : __builtin_strcmp (buf
, "PCI_SLOT_NAME=")))); }) : strncmp (buf, "PCI_SLOT_NAME=", 14
)))
) {
172 buf += 14;
173 i += 14;
174 strlcpy(pci_slot_name, buf, sizeof(subsystem))rte_strlcpy(pci_slot_name, buf, sizeof(subsystem));
175 event->devname = strdup(pci_slot_name)(__extension__ (__builtin_constant_p (pci_slot_name) &&
((size_t)(const void *)((pci_slot_name) + 1) - (size_t)(const
void *)(pci_slot_name) == 1) ? (((const char *) (pci_slot_name
))[0] == '\0' ? (char *) calloc ((size_t) 1, (size_t) 1) : ({
size_t __len = strlen (pci_slot_name) + 1; char *__retval = (
char *) malloc (__len); if (__retval != ((void*)0)) __retval =
(char *) memcpy (__retval, pci_slot_name, __len); __retval; }
)) : __strdup (pci_slot_name)))
;
176 }
177 for (; i < length; i++) {
178 if (*buf == '\0')
179 break;
180 buf++;
181 }
182 }
183
184 /* parse the subsystem layer */
185 if (!strncmp(subsystem, "uio", 3)(__extension__ (__builtin_constant_p (3) && ((__builtin_constant_p
(subsystem) && strlen (subsystem) < ((size_t) (3)
)) || (__builtin_constant_p ("uio") && strlen ("uio")
< ((size_t) (3)))) ? __extension__ ({ size_t __s1_len, __s2_len
; (__builtin_constant_p (subsystem) && __builtin_constant_p
("uio") && (__s1_len = __builtin_strlen (subsystem),
__s2_len = __builtin_strlen ("uio"), (!((size_t)(const void *
)((subsystem) + 1) - (size_t)(const void *)(subsystem) == 1) ||
__s1_len >= 4) && (!((size_t)(const void *)(("uio"
) + 1) - (size_t)(const void *)("uio") == 1) || __s2_len >=
4)) ? __builtin_strcmp (subsystem, "uio") : (__builtin_constant_p
(subsystem) && ((size_t)(const void *)((subsystem) +
1) - (size_t)(const void *)(subsystem) == 1) && (__s1_len
= __builtin_strlen (subsystem), __s1_len < 4) ? (__builtin_constant_p
("uio") && ((size_t)(const void *)(("uio") + 1) - (size_t
)(const void *)("uio") == 1) ? __builtin_strcmp (subsystem, "uio"
) : (__extension__ ({ const unsigned char *__s2 = (const unsigned
char *) (const char *) ("uio"); int __result = (((const unsigned
char *) (const char *) (subsystem))[0] - __s2[0]); if (__s1_len
> 0 && __result == 0) { __result = (((const unsigned
char *) (const char *) (subsystem))[1] - __s2[1]); if (__s1_len
> 1 && __result == 0) { __result = (((const unsigned
char *) (const char *) (subsystem))[2] - __s2[2]); if (__s1_len
> 2 && __result == 0) __result = (((const unsigned
char *) (const char *) (subsystem))[3] - __s2[3]); } } __result
; }))) : (__builtin_constant_p ("uio") && ((size_t)(const
void *)(("uio") + 1) - (size_t)(const void *)("uio") == 1) &&
(__s2_len = __builtin_strlen ("uio"), __s2_len < 4) ? (__builtin_constant_p
(subsystem) && ((size_t)(const void *)((subsystem) +
1) - (size_t)(const void *)(subsystem) == 1) ? __builtin_strcmp
(subsystem, "uio") : (- (__extension__ ({ const unsigned char
*__s2 = (const unsigned char *) (const char *) (subsystem); int
__result = (((const unsigned char *) (const char *) ("uio"))
[0] - __s2[0]); if (__s2_len > 0 && __result == 0)
{ __result = (((const unsigned char *) (const char *) ("uio"
))[1] - __s2[1]); if (__s2_len > 1 && __result == 0
) { __result = (((const unsigned char *) (const char *) ("uio"
))[2] - __s2[2]); if (__s2_len > 2 && __result == 0
) __result = (((const unsigned char *) (const char *) ("uio")
)[3] - __s2[3]); } } __result; })))) : __builtin_strcmp (subsystem
, "uio")))); }) : strncmp (subsystem, "uio", 3)))
)
186 event->subsystem = EAL_DEV_EVENT_SUBSYSTEM_UIO;
187 else if (!strncmp(subsystem, "pci", 3)(__extension__ (__builtin_constant_p (3) && ((__builtin_constant_p
(subsystem) && strlen (subsystem) < ((size_t) (3)
)) || (__builtin_constant_p ("pci") && strlen ("pci")
< ((size_t) (3)))) ? __extension__ ({ size_t __s1_len, __s2_len
; (__builtin_constant_p (subsystem) && __builtin_constant_p
("pci") && (__s1_len = __builtin_strlen (subsystem),
__s2_len = __builtin_strlen ("pci"), (!((size_t)(const void *
)((subsystem) + 1) - (size_t)(const void *)(subsystem) == 1) ||
__s1_len >= 4) && (!((size_t)(const void *)(("pci"
) + 1) - (size_t)(const void *)("pci") == 1) || __s2_len >=
4)) ? __builtin_strcmp (subsystem, "pci") : (__builtin_constant_p
(subsystem) && ((size_t)(const void *)((subsystem) +
1) - (size_t)(const void *)(subsystem) == 1) && (__s1_len
= __builtin_strlen (subsystem), __s1_len < 4) ? (__builtin_constant_p
("pci") && ((size_t)(const void *)(("pci") + 1) - (size_t
)(const void *)("pci") == 1) ? __builtin_strcmp (subsystem, "pci"
) : (__extension__ ({ const unsigned char *__s2 = (const unsigned
char *) (const char *) ("pci"); int __result = (((const unsigned
char *) (const char *) (subsystem))[0] - __s2[0]); if (__s1_len
> 0 && __result == 0) { __result = (((const unsigned
char *) (const char *) (subsystem))[1] - __s2[1]); if (__s1_len
> 1 && __result == 0) { __result = (((const unsigned
char *) (const char *) (subsystem))[2] - __s2[2]); if (__s1_len
> 2 && __result == 0) __result = (((const unsigned
char *) (const char *) (subsystem))[3] - __s2[3]); } } __result
; }))) : (__builtin_constant_p ("pci") && ((size_t)(const
void *)(("pci") + 1) - (size_t)(const void *)("pci") == 1) &&
(__s2_len = __builtin_strlen ("pci"), __s2_len < 4) ? (__builtin_constant_p
(subsystem) && ((size_t)(const void *)((subsystem) +
1) - (size_t)(const void *)(subsystem) == 1) ? __builtin_strcmp
(subsystem, "pci") : (- (__extension__ ({ const unsigned char
*__s2 = (const unsigned char *) (const char *) (subsystem); int
__result = (((const unsigned char *) (const char *) ("pci"))
[0] - __s2[0]); if (__s2_len > 0 && __result == 0)
{ __result = (((const unsigned char *) (const char *) ("pci"
))[1] - __s2[1]); if (__s2_len > 1 && __result == 0
) { __result = (((const unsigned char *) (const char *) ("pci"
))[2] - __s2[2]); if (__s2_len > 2 && __result == 0
) __result = (((const unsigned char *) (const char *) ("pci")
)[3] - __s2[3]); } } __result; })))) : __builtin_strcmp (subsystem
, "pci")))); }) : strncmp (subsystem, "pci", 3)))
)
188 event->subsystem = EAL_DEV_EVENT_SUBSYSTEM_PCI;
189 else if (!strncmp(subsystem, "vfio", 4)(__extension__ (__builtin_constant_p (4) && ((__builtin_constant_p
(subsystem) && strlen (subsystem) < ((size_t) (4)
)) || (__builtin_constant_p ("vfio") && strlen ("vfio"
) < ((size_t) (4)))) ? __extension__ ({ size_t __s1_len, __s2_len
; (__builtin_constant_p (subsystem) && __builtin_constant_p
("vfio") && (__s1_len = __builtin_strlen (subsystem)
, __s2_len = __builtin_strlen ("vfio"), (!((size_t)(const void
*)((subsystem) + 1) - (size_t)(const void *)(subsystem) == 1
) || __s1_len >= 4) && (!((size_t)(const void *)((
"vfio") + 1) - (size_t)(const void *)("vfio") == 1) || __s2_len
>= 4)) ? __builtin_strcmp (subsystem, "vfio") : (__builtin_constant_p
(subsystem) && ((size_t)(const void *)((subsystem) +
1) - (size_t)(const void *)(subsystem) == 1) && (__s1_len
= __builtin_strlen (subsystem), __s1_len < 4) ? (__builtin_constant_p
("vfio") && ((size_t)(const void *)(("vfio") + 1) - (
size_t)(const void *)("vfio") == 1) ? __builtin_strcmp (subsystem
, "vfio") : (__extension__ ({ const unsigned char *__s2 = (const
unsigned char *) (const char *) ("vfio"); int __result = (((
const unsigned char *) (const char *) (subsystem))[0] - __s2[
0]); if (__s1_len > 0 && __result == 0) { __result
= (((const unsigned char *) (const char *) (subsystem))[1] -
__s2[1]); if (__s1_len > 1 && __result == 0) { __result
= (((const unsigned char *) (const char *) (subsystem))[2] -
__s2[2]); if (__s1_len > 2 && __result == 0) __result
= (((const unsigned char *) (const char *) (subsystem))[3] -
__s2[3]); } } __result; }))) : (__builtin_constant_p ("vfio"
) && ((size_t)(const void *)(("vfio") + 1) - (size_t)
(const void *)("vfio") == 1) && (__s2_len = __builtin_strlen
("vfio"), __s2_len < 4) ? (__builtin_constant_p (subsystem
) && ((size_t)(const void *)((subsystem) + 1) - (size_t
)(const void *)(subsystem) == 1) ? __builtin_strcmp (subsystem
, "vfio") : (- (__extension__ ({ const unsigned char *__s2 = (
const unsigned char *) (const char *) (subsystem); int __result
= (((const unsigned char *) (const char *) ("vfio"))[0] - __s2
[0]); if (__s2_len > 0 && __result == 0) { __result
= (((const unsigned char *) (const char *) ("vfio"))[1] - __s2
[1]); if (__s2_len > 1 && __result == 0) { __result
= (((const unsigned char *) (const char *) ("vfio"))[2] - __s2
[2]); if (__s2_len > 2 && __result == 0) __result =
(((const unsigned char *) (const char *) ("vfio"))[3] - __s2
[3]); } } __result; })))) : __builtin_strcmp (subsystem, "vfio"
)))); }) : strncmp (subsystem, "vfio", 4)))
)
190 event->subsystem = EAL_DEV_EVENT_SUBSYSTEM_VFIO;
191 else
192 return -1;
193
194 /* parse the action type */
195 if (!strncmp(action, "add", 3)(__extension__ (__builtin_constant_p (3) && ((__builtin_constant_p
(action) && strlen (action) < ((size_t) (3))) || (
__builtin_constant_p ("add") && strlen ("add") < (
(size_t) (3)))) ? __extension__ ({ size_t __s1_len, __s2_len;
(__builtin_constant_p (action) && __builtin_constant_p
("add") && (__s1_len = __builtin_strlen (action), __s2_len
= __builtin_strlen ("add"), (!((size_t)(const void *)((action
) + 1) - (size_t)(const void *)(action) == 1) || __s1_len >=
4) && (!((size_t)(const void *)(("add") + 1) - (size_t
)(const void *)("add") == 1) || __s2_len >= 4)) ? __builtin_strcmp
(action, "add") : (__builtin_constant_p (action) && (
(size_t)(const void *)((action) + 1) - (size_t)(const void *)
(action) == 1) && (__s1_len = __builtin_strlen (action
), __s1_len < 4) ? (__builtin_constant_p ("add") &&
((size_t)(const void *)(("add") + 1) - (size_t)(const void *
)("add") == 1) ? __builtin_strcmp (action, "add") : (__extension__
({ const unsigned char *__s2 = (const unsigned char *) (const
char *) ("add"); int __result = (((const unsigned char *) (const
char *) (action))[0] - __s2[0]); if (__s1_len > 0 &&
__result == 0) { __result = (((const unsigned char *) (const
char *) (action))[1] - __s2[1]); if (__s1_len > 1 &&
__result == 0) { __result = (((const unsigned char *) (const
char *) (action))[2] - __s2[2]); if (__s1_len > 2 &&
__result == 0) __result = (((const unsigned char *) (const char
*) (action))[3] - __s2[3]); } } __result; }))) : (__builtin_constant_p
("add") && ((size_t)(const void *)(("add") + 1) - (size_t
)(const void *)("add") == 1) && (__s2_len = __builtin_strlen
("add"), __s2_len < 4) ? (__builtin_constant_p (action) &&
((size_t)(const void *)((action) + 1) - (size_t)(const void *
)(action) == 1) ? __builtin_strcmp (action, "add") : (- (__extension__
({ const unsigned char *__s2 = (const unsigned char *) (const
char *) (action); int __result = (((const unsigned char *) (
const char *) ("add"))[0] - __s2[0]); if (__s2_len > 0 &&
__result == 0) { __result = (((const unsigned char *) (const
char *) ("add"))[1] - __s2[1]); if (__s2_len > 1 &&
__result == 0) { __result = (((const unsigned char *) (const
char *) ("add"))[2] - __s2[2]); if (__s2_len > 2 &&
__result == 0) __result = (((const unsigned char *) (const char
*) ("add"))[3] - __s2[3]); } } __result; })))) : __builtin_strcmp
(action, "add")))); }) : strncmp (action, "add", 3)))
)
196 event->type = RTE_DEV_EVENT_ADD;
197 else if (!strncmp(action, "remove", 6)(__extension__ (__builtin_constant_p (6) && ((__builtin_constant_p
(action) && strlen (action) < ((size_t) (6))) || (
__builtin_constant_p ("remove") && strlen ("remove") <
((size_t) (6)))) ? __extension__ ({ size_t __s1_len, __s2_len
; (__builtin_constant_p (action) && __builtin_constant_p
("remove") && (__s1_len = __builtin_strlen (action),
__s2_len = __builtin_strlen ("remove"), (!((size_t)(const void
*)((action) + 1) - (size_t)(const void *)(action) == 1) || __s1_len
>= 4) && (!((size_t)(const void *)(("remove") + 1
) - (size_t)(const void *)("remove") == 1) || __s2_len >= 4
)) ? __builtin_strcmp (action, "remove") : (__builtin_constant_p
(action) && ((size_t)(const void *)((action) + 1) - (
size_t)(const void *)(action) == 1) && (__s1_len = __builtin_strlen
(action), __s1_len < 4) ? (__builtin_constant_p ("remove"
) && ((size_t)(const void *)(("remove") + 1) - (size_t
)(const void *)("remove") == 1) ? __builtin_strcmp (action, "remove"
) : (__extension__ ({ const unsigned char *__s2 = (const unsigned
char *) (const char *) ("remove"); int __result = (((const unsigned
char *) (const char *) (action))[0] - __s2[0]); if (__s1_len
> 0 && __result == 0) { __result = (((const unsigned
char *) (const char *) (action))[1] - __s2[1]); if (__s1_len
> 1 && __result == 0) { __result = (((const unsigned
char *) (const char *) (action))[2] - __s2[2]); if (__s1_len
> 2 && __result == 0) __result = (((const unsigned
char *) (const char *) (action))[3] - __s2[3]); } } __result
; }))) : (__builtin_constant_p ("remove") && ((size_t
)(const void *)(("remove") + 1) - (size_t)(const void *)("remove"
) == 1) && (__s2_len = __builtin_strlen ("remove"), __s2_len
< 4) ? (__builtin_constant_p (action) && ((size_t
)(const void *)((action) + 1) - (size_t)(const void *)(action
) == 1) ? __builtin_strcmp (action, "remove") : (- (__extension__
({ const unsigned char *__s2 = (const unsigned char *) (const
char *) (action); int __result = (((const unsigned char *) (
const char *) ("remove"))[0] - __s2[0]); if (__s2_len > 0 &&
__result == 0) { __result = (((const unsigned char *) (const
char *) ("remove"))[1] - __s2[1]); if (__s2_len > 1 &&
__result == 0) { __result = (((const unsigned char *) (const
char *) ("remove"))[2] - __s2[2]); if (__s2_len > 2 &&
__result == 0) __result = (((const unsigned char *) (const char
*) ("remove"))[3] - __s2[3]); } } __result; })))) : __builtin_strcmp
(action, "remove")))); }) : strncmp (action, "remove", 6)))
)
198 event->type = RTE_DEV_EVENT_REMOVE;
199 else
200 return -1;
201 return 0;
202}
203
204static void
205dev_delayed_unregister(void *param)
206{
207 rte_intr_callback_unregister(&intr_handle, dev_uev_handler, param);
208 close(intr_handle.fd);
209 intr_handle.fd = -1;
210}
211
212static void
213dev_uev_handler(__rte_unused__attribute__((__unused__)) void *param)
214{
215 struct rte_dev_event uevent;
216 int ret;
217 char buf[EAL_UEV_MSG_LEN4096];
218 struct rte_bus *bus;
219 struct rte_device *dev;
220 const char *busname = "";
221
222 memset(&uevent, 0, sizeof(struct rte_dev_event));
223 memset(buf, 0, EAL_UEV_MSG_LEN4096);
224
225 ret = recv(intr_handle.fd, buf, EAL_UEV_MSG_LEN4096, MSG_DONTWAITMSG_DONTWAIT);
226 if (ret < 0 && errno(*__errno_location ()) == EAGAIN11)
227 return;
228 else if (ret <= 0) {
229 /* connection is closed or broken, can not up again. */
230 RTE_LOG(ERR, EAL, "uevent socket connection is broken.\n")rte_log(4U, 0, "EAL" ": " "uevent socket connection is broken.\n"
)
;
231 rte_eal_alarm_set(1, dev_delayed_unregister, NULL((void*)0));
232 return;
233 }
234
235 ret = dev_uev_parse(buf, &uevent, EAL_UEV_MSG_LEN4096);
236 if (ret < 0) {
237 RTE_LOG(DEBUG, EAL, "It is not an valid event "rte_log(8U, 0, "EAL" ": " "It is not an valid event " "that need to be handle.\n"
)
238 "that need to be handle.\n")rte_log(8U, 0, "EAL" ": " "It is not an valid event " "that need to be handle.\n"
)
;
239 return;
240 }
241
242 RTE_LOG(DEBUG, EAL, "receive uevent(name:%s, type:%d, subsystem:%d)\n",rte_log(8U, 0, "EAL" ": " "receive uevent(name:%s, type:%d, subsystem:%d)\n"
, uevent.devname, uevent.type, uevent.subsystem)
243 uevent.devname, uevent.type, uevent.subsystem)rte_log(8U, 0, "EAL" ": " "receive uevent(name:%s, type:%d, subsystem:%d)\n"
, uevent.devname, uevent.type, uevent.subsystem)
;
244
245 switch (uevent.subsystem) {
246 case EAL_DEV_EVENT_SUBSYSTEM_PCI:
247 case EAL_DEV_EVENT_SUBSYSTEM_UIO:
248 busname = "pci";
249 break;
250 default:
251 break;
252 }
253
254 if (uevent.devname) {
255 if (uevent.type == RTE_DEV_EVENT_REMOVE && hotplug_handle) {
256 rte_spinlock_lock(&failure_handle_lock);
257 bus = rte_bus_find_by_name(busname);
258 if (bus == NULL((void*)0)) {
259 RTE_LOG(ERR, EAL, "Cannot find bus (%s)\n",rte_log(4U, 0, "EAL" ": " "Cannot find bus (%s)\n", busname)
260 busname)rte_log(4U, 0, "EAL" ": " "Cannot find bus (%s)\n", busname);
261 goto failure_handle_err;
262 }
263
264 dev = bus->find_device(NULL((void*)0), cmp_dev_name,
265 uevent.devname);
266 if (dev == NULL((void*)0)) {
267 RTE_LOG(ERR, EAL, "Cannot find device (%s) on "rte_log(4U, 0, "EAL" ": " "Cannot find device (%s) on " "bus (%s)\n"
, uevent.devname, busname)
268 "bus (%s)\n", uevent.devname, busname)rte_log(4U, 0, "EAL" ": " "Cannot find device (%s) on " "bus (%s)\n"
, uevent.devname, busname)
;
269 goto failure_handle_err;
270 }
271
272 ret = bus->hot_unplug_handler(dev);
273 if (ret) {
274 RTE_LOG(ERR, EAL, "Can not handle hot-unplug "rte_log(4U, 0, "EAL" ": " "Can not handle hot-unplug " "for device (%s)\n"
, dev->name)
275 "for device (%s)\n", dev->name)rte_log(4U, 0, "EAL" ": " "Can not handle hot-unplug " "for device (%s)\n"
, dev->name)
;
276 }
277 rte_spinlock_unlock(&failure_handle_lock);
278 }
279 rte_dev_event_callback_process(uevent.devname, uevent.type);
280 }
281
282 return;
283
284failure_handle_err:
285 rte_spinlock_unlock(&failure_handle_lock);
286}
287
288int __rte_experimental__attribute__((section(".text.experimental")))
289rte_dev_event_monitor_start(void)
290{
291 int ret;
292
293 if (monitor_started)
294 return 0;
295
296 ret = dev_uev_socket_fd_create();
297 if (ret) {
298 RTE_LOG(ERR, EAL, "error create device event fd.\n")rte_log(4U, 0, "EAL" ": " "error create device event fd.\n");
299 return -1;
300 }
301
302 intr_handle.type = RTE_INTR_HANDLE_DEV_EVENT;
303 ret = rte_intr_callback_register(&intr_handle, dev_uev_handler, NULL((void*)0));
304
305 if (ret) {
306 RTE_LOG(ERR, EAL, "fail to register uevent callback.\n")rte_log(4U, 0, "EAL" ": " "fail to register uevent callback.\n"
)
;
307 return -1;
308 }
309
310 monitor_started = true1;
311
312 return 0;
313}
314
315int __rte_experimental__attribute__((section(".text.experimental")))
316rte_dev_event_monitor_stop(void)
317{
318 int ret;
319
320 if (!monitor_started)
321 return 0;
322
323 ret = rte_intr_callback_unregister(&intr_handle, dev_uev_handler,
324 (void *)-1);
325 if (ret < 0) {
326 RTE_LOG(ERR, EAL, "fail to unregister uevent callback.\n")rte_log(4U, 0, "EAL" ": " "fail to unregister uevent callback.\n"
)
;
327 return ret;
328 }
329
330 close(intr_handle.fd);
331 intr_handle.fd = -1;
332 monitor_started = false0;
333
334 return 0;
335}
336
337int
338dev_sigbus_handler_register(void)
339{
340 sigset_t mask;
341 struct sigaction action;
342
343 rte_errno(per_lcore__rte_errno) = 0;
344
345 if (sigbus_need_recover)
346 return 0;
347
348 sigemptyset(&mask);
349 sigaddset(&mask, SIGBUS7);
350 action.sa_flags = SA_SIGINFO4;
351 action.sa_mask = mask;
352 action.sa_sigaction__sigaction_handler.sa_sigaction = sigbus_handler;
353 sigbus_need_recover = !sigaction(SIGBUS7, &action, &sigbus_action_old);
354
355 return rte_errno(per_lcore__rte_errno);
356}
357
358int
359dev_sigbus_handler_unregister(void)
360{
361 rte_errno(per_lcore__rte_errno) = 0;
362
363 sigbus_action_recover();
364
365 return rte_errno(per_lcore__rte_errno);
366}
367
368int __rte_experimental__attribute__((section(".text.experimental")))
369rte_dev_hotplug_handle_enable(void)
370{
371 int ret = 0;
372
373 ret = dev_sigbus_handler_register();
374 if (ret < 0)
375 RTE_LOG(ERR, EAL,rte_log(4U, 0, "EAL" ": " "fail to register sigbus handler for devices.\n"
)
376 "fail to register sigbus handler for devices.\n")rte_log(4U, 0, "EAL" ": " "fail to register sigbus handler for devices.\n"
)
;
377
378 hotplug_handle = true1;
379
380 return ret;
381}
382
383int __rte_experimental__attribute__((section(".text.experimental")))
384rte_dev_hotplug_handle_disable(void)
385{
386 int ret = 0;
387
388 ret = dev_sigbus_handler_unregister();
389 if (ret < 0)
390 RTE_LOG(ERR, EAL,rte_log(4U, 0, "EAL" ": " "fail to unregister sigbus handler for devices.\n"
)
391 "fail to unregister sigbus handler for devices.\n")rte_log(4U, 0, "EAL" ": " "fail to unregister sigbus handler for devices.\n"
)
;
392
393 hotplug_handle = false0;
394
395 return ret;
396}