net/core/dev.c: enable timestamp static key if CPU isolation is configured
Subsystems (2)
PATCH 1/1 net/core/dev.c: enable timestamp static key if CPU isolation is configured
For systems that use CPU isolation (via nohz_full), creating or destroying a socket with timestamping (SOF_TIMESTAMPING_OPT_TX_SWHW) might cause a static key to be enabled/disabled. This in turn causes undesired IPIs to isolated CPUs.
So enable the static key unconditionally, if CPU isolation is enabled, thus avoiding the IPIs.
net/core/dev.c +12 -0
@@ -153,6 +153,7 @@#include <linux/prandom.h> #include <linux/once_lite.h> #include <net/netdev_rx_queue.h> +#include <linux/sched/isolation.h> #include "dev.h" #include "net-sysfs.h"
@@ -11601,3 +11602,14 @@ static int __init net_dev_init(void) }subsys_initcall (net_dev_init); + +static int __init net_dev_late_init (void ) +{ +/* avoid static key IPIs to isolated CPUs */ +if (housekeeping_enabled (HK_TYPE_MISC )) +net_enable_timestamp (); + +return 0 ; +} + +late_initcall (net_dev_late_init);
Paolo Abeni
maintainerQuoted 9 lines · Marcelo Tosatti
For systems that use CPU isolation (via
nohz_full), creating or destroying a socket with timestamping (SOF_TIMESTAMPING_OPT_TX_SWHW) might cause a static key to be enabled/disabled. This in turn causes undesired IPIs to isolated CPUs.So enable the static key unconditionally, if CPU isolation is enabled, thus avoiding the IPIs.
Signed-off-by Marcelo Tosatti <[email protected]>
This looks like net-next material, but it does not apply cleanly to the net-next tree. Could you please rebase and repost including the 'net- next' tag into the patch prefix?
Thanks!
Paolo
Quoted 4 lines · Marcelo Tosatti
For systems that use CPU isolation (via
nohz_full), creating or destroying a socket with timestamping (SOF_TIMESTAMPING_OPT_TX_SWHW) might cause a static key to be enabled/disabled. This in turn causes undesired IPIs to isolated CPUs.
This refers to SOF_TIMESTAMPING_RX_SOFTWARE, not SOF_TIMESTAMPING_OPT_TX_SWHW. See also sock_set_timestamping.
Quoted 34 lines
So enable the static key unconditionally, if CPU isolation is enabled, thus avoiding the IPIs.
Signed-off-by Marcelo Tosatti <[email protected]>net/core/dev.c +12
-0@@ -153,6 +153,7 @@#include <linux/prandom.h> #include <linux/once_lite.h> #include <net/netdev_rx_queue.h> +#include <linux/sched/isolation.h> #include "dev.h" #include "net-sysfs.h" @@ -11601,3 +11602,14 @@ static int __init net_dev_init(void) }subsys_initcall (net_dev_init); + +static int __init net_dev_late_init (void ) +{ +/* avoid static key IPIs to isolated CPUs */ +if (housekeeping_enabled (HK_TYPE_MISC )) +net_enable_timestamp (); + +return 0 ; +} + +late_initcall (net_dev_late_init);
Quoted 8 lines · Willem de Bruijn
Quoted 4 lines · Marcelo Tosatti
For systems that use CPU isolation (via
nohz_full), creating or destroying a socket with timestamping (SOF_TIMESTAMPING_OPT_TX_SWHW) might cause a static key to be enabled/disabled. This in turn causes undesired IPIs to isolated CPUs.This refers to
SOF_TIMESTAMPING_RX_SOFTWARE, notSOF_TIMESTAMPING_OPT_TX_SWHW. See alsosock_set_timestamping.
Willem,
This test program does trigger the static key change:
int main (void)
{
int option = SOF_TIMESTAMPING_OPT_TX_SWHW;
int sock_fd;
int ret;
int pid_fd;
pid_t pid;
char buf[50];...
/* set the timestamping option
* this is to trigger the IPIs that notify all cpus of the change
*/
if (setsockopt(sock_fd, SOL_SOCKET, SO_TIMESTAMP, &option, sizeof (option)) < 0) {
printf("Could not enable timestamping option %x", (unsigned int)option);
close(sock_fd);
return 0;
}...
Quoted 33 lines · Marcelo Tosatti
Quoted 8 lines · Willem de Bruijn
Quoted 4 lines · Marcelo Tosatti
For systems that use CPU isolation (via
nohz_full), creating or destroying a socket with timestamping (SOF_TIMESTAMPING_OPT_TX_SWHW) might cause a static key to be enabled/disabled. This in turn causes undesired IPIs to isolated CPUs.This refers to
SOF_TIMESTAMPING_RX_SOFTWARE, notSOF_TIMESTAMPING_OPT_TX_SWHW. See alsosock_set_timestamping.Willem,
This test program does trigger the static key change:
int main (void)
{ int option = SOF_TIMESTAMPING_OPT_TX_SWHW; int sock_fd; int ret; int pid_fd; pid_t pid; char buf[50];...
/* set the timestamping option * this is to trigger the IPIs that notify all cpus of the change */ if (setsockopt(sock_fd, SOL_SOCKET, SO_TIMESTAMP, &option, sizeof (option)) < 0) { printf("Could not enable timestamping option %x", (unsigned int)option); close(sock_fd); return 0; }
Quoted 2 lines
...
That is because you call SO_TIMESTAMP, which interprets option as a boolean. The SOF_ flags apply to setsockopt SO_TIMESTAMPING.