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 |
[?] 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 | |
26 | static struct rte_intr_handle intr_handle = {.fd = -1 }; |
27 | static bool_Bool monitor_started; |
28 | static 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 | */ |
39 | static rte_spinlock_t failure_handle_lock = RTE_SPINLOCK_INITIALIZER{ 0 }; |
40 | |
41 | static struct sigaction sigbus_action_old; |
42 | |
43 | static int sigbus_need_recover; |
44 | |
45 | static void dev_uev_handler(__rte_unused__attribute__((__unused__)) void *param); |
46 | |
47 | /* identify the system layer which reports this event. */ |
48 | enum 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 | |
55 | static void |
56 | sigbus_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 | |
64 | static 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 | |
96 | static 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 | |
104 | static int |
105 | dev_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; |
130 | err: |
131 | close(intr_handle.fd); |
132 | intr_handle.fd = -1; |
133 | return ret; |
134 | } |
135 | |
136 | static int |
137 | dev_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 | |
204 | static void |
205 | dev_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 | |
212 | static void |
213 | dev_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 | |
284 | failure_handle_err: |
285 | rte_spinlock_unlock(&failure_handle_lock); |
286 | } |
287 | |
288 | int __rte_experimental__attribute__((section(".text.experimental"))) |
289 | rte_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 | |
315 | int __rte_experimental__attribute__((section(".text.experimental"))) |
316 | rte_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 | |
337 | int |
338 | dev_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 | |
358 | int |
359 | dev_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 | |
368 | int __rte_experimental__attribute__((section(".text.experimental"))) |
369 | rte_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 | |
383 | int __rte_experimental__attribute__((section(".text.experimental"))) |
384 | rte_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 | } |