* [PATCH v2 0/2] make POSIX timers optional
@ 2016-09-20 19:56 Nicolas Pitre
2016-09-20 19:56 ` [PATCH 1/2] ptp_clock: allow for it to be optional Nicolas Pitre
` (3 more replies)
0 siblings, 4 replies; 14+ messages in thread
From: Nicolas Pitre @ 2016-09-20 19:56 UTC (permalink / raw)
To: John Stultz
Cc: Thomas Gleixner, Richard Cochran, Josh Triplett, netdev, linux-kernel
Many embedded systems don't need the full POSIX timer support.
Configuring them out provides a nice kernel image size reduction.
When POSIX timers are configured out, the PTP clock subsystem should be
left out as well. However a bunch of ethernet drivers currently *select*
it in their Kconfig entries. Therefore some more tweaks were needed to
break that hard dependency for those drivers to still be configured in
if desired.
It was agreed that the best path upstream for those patches is via
John Stultz's timer tree.
Previous itterations of those patches and the discussion threads can be
found here:
https://lkml.org/lkml/2016/9/14/992
https://lkml.org/lkml/2016/9/14/803
https://lkml.org/lkml/2016/9/8/793
Changes from v1:
- Add a warning for the case where PTP clock subsystem is modular and a
driver providing a clock is built-in rather than silently ignoring it.
Suggested by Jiri Benc.
- Added Eugenia Emantayev's reviewed-by tag.
diffstat:
drivers/Makefile | 2 +-
drivers/net/ethernet/adi/Kconfig | 8 +-
drivers/net/ethernet/amd/Kconfig | 2 +-
drivers/net/ethernet/amd/xgbe/xgbe-main.c | 6 +-
drivers/net/ethernet/broadcom/Kconfig | 4 +-
drivers/net/ethernet/cavium/Kconfig | 2 +-
drivers/net/ethernet/freescale/Kconfig | 2 +-
drivers/net/ethernet/intel/Kconfig | 10 +-
drivers/net/ethernet/intel/e1000e/ptp.c | 2 +-
drivers/net/ethernet/intel/i40e/i40e_ptp.c | 2 +-
drivers/net/ethernet/intel/igb/igb_ptp.c | 2 +-
drivers/net/ethernet/intel/ixgbe/ixgbe_ptp.c | 2 +-
drivers/net/ethernet/mellanox/mlx4/Kconfig | 2 +-
drivers/net/ethernet/mellanox/mlx4/en_clock.c | 2 +-
drivers/net/ethernet/mellanox/mlx5/core/Kconfig | 2 +-
.../net/ethernet/mellanox/mlx5/core/en_clock.c | 2 +-
drivers/net/ethernet/renesas/Kconfig | 2 +-
drivers/net/ethernet/samsung/Kconfig | 2 +-
drivers/net/ethernet/sfc/Kconfig | 2 +-
drivers/net/ethernet/sfc/ptp.c | 14 +--
drivers/net/ethernet/stmicro/stmmac/Kconfig | 2 +-
.../net/ethernet/stmicro/stmmac/stmmac_ptp.c | 2 +-
drivers/net/ethernet/ti/Kconfig | 2 +-
drivers/net/ethernet/tile/Kconfig | 2 +-
drivers/ptp/Kconfig | 14 ++-
include/linux/posix-timers.h | 28 ++++-
include/linux/ptp_clock_kernel.h | 64 +++++++---
include/linux/sched.h | 10 ++
init/Kconfig | 17 +++
kernel/signal.c | 4 +
kernel/time/Kconfig | 1 +
kernel/time/Makefile | 10 +-
kernel/time/posix-stubs.c | 118 ++++++++++++++++++
33 files changed, 282 insertions(+), 64 deletions(-)
^ permalink raw reply [flat|nested] 14+ messages in thread
* [PATCH 1/2] ptp_clock: allow for it to be optional
2016-09-20 19:56 [PATCH v2 0/2] make POSIX timers optional Nicolas Pitre
@ 2016-09-20 19:56 ` Nicolas Pitre
2016-09-20 19:56 ` [PATCH 2/2] posix-timers: make it configurable Nicolas Pitre
` (2 subsequent siblings)
3 siblings, 0 replies; 14+ messages in thread
From: Nicolas Pitre @ 2016-09-20 19:56 UTC (permalink / raw)
To: John Stultz
Cc: Thomas Gleixner, Richard Cochran, Josh Triplett, netdev, linux-kernel
In order to break the hard dependency between the PTP clock subsystem and
ethernet drivers capable of being clock providers, this patch provides
simple PTP stub functions to allow linkage of those drivers into the
kernel even when the PTP subsystem is configured out.
And to make it possible for PTP to be configured out, the select statement
in the Kconfig entry for those ethernet drivers is changed from selecting
PTP_1588_CLOCK to PTP_1588_CLOCK_SELECTED whose purpose is to indicate the
default Kconfig value for the PTP subsystem.
This way the PTP subsystem may have Kconfig dependencies of its own, such
as POSIX_TIMERS, without making those ethernet drivers unavailable if
POSIX timers are cconfigured out. And when support for POSIX timers is
selected again then PTP clock support will also be selected accordingly.
Drivers must be ready to accept NULL from ptp_clock_register().
The pch_gbe driver is a bit special as it relies on extra code in
drivers/ptp/ptp_pch.c. Therefore we let the make process descend into
drivers/ptp/ even if PTP_1588_CLOCK is unselected.
Signed-off-by: Nicolas Pitre <nico@linaro.org>
Acked-by: Richard Cochran <richardcochran@gmail.com>
Reviewed-by: Eugenia Emantayev <eugenia@mellanox.com>
---
drivers/Makefile | 2 +-
drivers/net/ethernet/adi/Kconfig | 8 ++-
drivers/net/ethernet/amd/Kconfig | 2 +-
drivers/net/ethernet/amd/xgbe/xgbe-main.c | 6 +-
drivers/net/ethernet/broadcom/Kconfig | 4 +-
drivers/net/ethernet/cavium/Kconfig | 2 +-
drivers/net/ethernet/freescale/Kconfig | 2 +-
drivers/net/ethernet/intel/Kconfig | 10 ++--
drivers/net/ethernet/intel/e1000e/ptp.c | 2 +-
drivers/net/ethernet/intel/i40e/i40e_ptp.c | 2 +-
drivers/net/ethernet/intel/igb/igb_ptp.c | 2 +-
drivers/net/ethernet/intel/ixgbe/ixgbe_ptp.c | 2 +-
drivers/net/ethernet/mellanox/mlx4/Kconfig | 2 +-
drivers/net/ethernet/mellanox/mlx4/en_clock.c | 2 +-
drivers/net/ethernet/mellanox/mlx5/core/Kconfig | 2 +-
drivers/net/ethernet/mellanox/mlx5/core/en_clock.c | 2 +-
drivers/net/ethernet/renesas/Kconfig | 2 +-
drivers/net/ethernet/samsung/Kconfig | 2 +-
drivers/net/ethernet/sfc/Kconfig | 2 +-
drivers/net/ethernet/sfc/ptp.c | 14 ++---
drivers/net/ethernet/stmicro/stmmac/Kconfig | 2 +-
drivers/net/ethernet/stmicro/stmmac/stmmac_ptp.c | 2 +-
drivers/net/ethernet/ti/Kconfig | 2 +-
drivers/net/ethernet/tile/Kconfig | 2 +-
drivers/ptp/Kconfig | 12 ++--
include/linux/ptp_clock_kernel.h | 64 ++++++++++++++++------
26 files changed, 97 insertions(+), 59 deletions(-)
diff --git a/drivers/Makefile b/drivers/Makefile
index 53abb4a5f7..8a538d0856 100644
--- a/drivers/Makefile
+++ b/drivers/Makefile
@@ -105,7 +105,7 @@ obj-$(CONFIG_INPUT) += input/
obj-$(CONFIG_RTC_LIB) += rtc/
obj-y += i2c/ media/
obj-$(CONFIG_PPS) += pps/
-obj-$(CONFIG_PTP_1588_CLOCK) += ptp/
+obj-y += ptp/
obj-$(CONFIG_W1) += w1/
obj-y += power/
obj-$(CONFIG_HWMON) += hwmon/
diff --git a/drivers/net/ethernet/adi/Kconfig b/drivers/net/ethernet/adi/Kconfig
index 6b94ba6103..67094a9cfe 100644
--- a/drivers/net/ethernet/adi/Kconfig
+++ b/drivers/net/ethernet/adi/Kconfig
@@ -55,10 +55,14 @@ config BFIN_RX_DESC_NUM
---help---
Set the number of buffer packets used in driver.
+config BFIN_MAC_HAS_HWSTAMP
+ def_tristate BFIN_MAC
+ depends on BF518
+ select PTP_1588_CLOCK_SELECTED
+
config BFIN_MAC_USE_HWSTAMP
bool "Use IEEE 1588 hwstamp"
- depends on BFIN_MAC && BF518
- select PTP_1588_CLOCK
+ depends on BFIN_MAC_HAS_HWSTAMP && PTP_1588_CLOCK
default y
---help---
To support the IEEE 1588 Precision Time Protocol (PTP), select y here
diff --git a/drivers/net/ethernet/amd/Kconfig b/drivers/net/ethernet/amd/Kconfig
index 0038709fd3..327e71a554 100644
--- a/drivers/net/ethernet/amd/Kconfig
+++ b/drivers/net/ethernet/amd/Kconfig
@@ -177,7 +177,7 @@ config AMD_XGBE
depends on ARM64 || COMPILE_TEST
select BITREVERSE
select CRC32
- select PTP_1588_CLOCK
+ select PTP_1588_CLOCK_SELECTED
---help---
This driver supports the AMD 10GbE Ethernet device found on an
AMD SoC.
diff --git a/drivers/net/ethernet/amd/xgbe/xgbe-main.c b/drivers/net/ethernet/amd/xgbe/xgbe-main.c
index 3eee3201b5..4aeeb018b6 100644
--- a/drivers/net/ethernet/amd/xgbe/xgbe-main.c
+++ b/drivers/net/ethernet/amd/xgbe/xgbe-main.c
@@ -773,7 +773,8 @@ static int xgbe_probe(struct platform_device *pdev)
goto err_wq;
}
- xgbe_ptp_register(pdata);
+ if (IS_REACHABLE(CONFIG_PTP_1588_CLOCK))
+ xgbe_ptp_register(pdata);
xgbe_debugfs_init(pdata);
@@ -812,7 +813,8 @@ static int xgbe_remove(struct platform_device *pdev)
xgbe_debugfs_exit(pdata);
- xgbe_ptp_unregister(pdata);
+ if (IS_REACHABLE(CONFIG_PTP_1588_CLOCK))
+ xgbe_ptp_unregister(pdata);
flush_workqueue(pdata->an_workqueue);
destroy_workqueue(pdata->an_workqueue);
diff --git a/drivers/net/ethernet/broadcom/Kconfig b/drivers/net/ethernet/broadcom/Kconfig
index bd8c80c0b7..3db7eca92c 100644
--- a/drivers/net/ethernet/broadcom/Kconfig
+++ b/drivers/net/ethernet/broadcom/Kconfig
@@ -110,7 +110,7 @@ config TIGON3
depends on PCI
select PHYLIB
select HWMON
- select PTP_1588_CLOCK
+ select PTP_1588_CLOCK_SELECTED
---help---
This driver supports Broadcom Tigon3 based gigabit Ethernet cards.
@@ -120,7 +120,7 @@ config TIGON3
config BNX2X
tristate "Broadcom NetXtremeII 10Gb support"
depends on PCI
- select PTP_1588_CLOCK
+ select PTP_1588_CLOCK_SELECTED
select FW_LOADER
select ZLIB_INFLATE
select LIBCRC32C
diff --git a/drivers/net/ethernet/cavium/Kconfig b/drivers/net/ethernet/cavium/Kconfig
index e1b78b5003..5dd86cf683 100644
--- a/drivers/net/ethernet/cavium/Kconfig
+++ b/drivers/net/ethernet/cavium/Kconfig
@@ -53,7 +53,7 @@ config THUNDER_NIC_RGX
config LIQUIDIO
tristate "Cavium LiquidIO support"
depends on 64BIT
- select PTP_1588_CLOCK
+ select PTP_1588_CLOCK_SELECTED
select FW_LOADER
select LIBCRC32C
---help---
diff --git a/drivers/net/ethernet/freescale/Kconfig b/drivers/net/ethernet/freescale/Kconfig
index d1ca45fbb1..775dbfeb7b 100644
--- a/drivers/net/ethernet/freescale/Kconfig
+++ b/drivers/net/ethernet/freescale/Kconfig
@@ -25,7 +25,7 @@ config FEC
ARCH_MXC || SOC_IMX28)
default ARCH_MXC || SOC_IMX28 if ARM
select PHYLIB
- select PTP_1588_CLOCK
+ select PTP_1588_CLOCK_SELECTED
---help---
Say Y here if you want to use the built-in 10/100 Fast ethernet
controller on some Motorola ColdFire and Freescale i.MX processors.
diff --git a/drivers/net/ethernet/intel/Kconfig b/drivers/net/ethernet/intel/Kconfig
index c0e17433f6..8bbfb43f09 100644
--- a/drivers/net/ethernet/intel/Kconfig
+++ b/drivers/net/ethernet/intel/Kconfig
@@ -58,7 +58,7 @@ config E1000E
tristate "Intel(R) PRO/1000 PCI-Express Gigabit Ethernet support"
depends on PCI && (!SPARC32 || BROKEN)
select CRC32
- select PTP_1588_CLOCK
+ select PTP_1588_CLOCK_SELECTED
---help---
This driver supports the PCI-Express Intel(R) PRO/1000 gigabit
ethernet family of adapters. For PCI or PCI-X e1000 adapters,
@@ -83,7 +83,7 @@ config E1000E_HWTS
config IGB
tristate "Intel(R) 82575/82576 PCI-Express Gigabit Ethernet support"
depends on PCI
- select PTP_1588_CLOCK
+ select PTP_1588_CLOCK_SELECTED
select I2C
select I2C_ALGOBIT
---help---
@@ -156,7 +156,7 @@ config IXGBE
tristate "Intel(R) 10GbE PCI Express adapters support"
depends on PCI
select MDIO
- select PTP_1588_CLOCK
+ select PTP_1588_CLOCK_SELECTED
---help---
This driver supports Intel(R) 10GbE PCI Express family of
adapters. For more information on how to identify your adapter, go
@@ -213,7 +213,7 @@ config IXGBEVF
config I40E
tristate "Intel(R) Ethernet Controller XL710 Family support"
- select PTP_1588_CLOCK
+ select PTP_1588_CLOCK_SELECTED
depends on PCI
---help---
This driver supports Intel(R) Ethernet Controller XL710 Family of
@@ -264,7 +264,7 @@ config FM10K
tristate "Intel(R) FM10000 Ethernet Switch Host Interface Support"
default n
depends on PCI_MSI
- select PTP_1588_CLOCK
+ select PTP_1588_CLOCK_SELECTED
---help---
This driver supports Intel(R) FM10000 Ethernet Switch Host
Interface. For more information on how to identify your adapter,
diff --git a/drivers/net/ethernet/intel/e1000e/ptp.c b/drivers/net/ethernet/intel/e1000e/ptp.c
index 2e1b17ad52..ad03763e00 100644
--- a/drivers/net/ethernet/intel/e1000e/ptp.c
+++ b/drivers/net/ethernet/intel/e1000e/ptp.c
@@ -334,7 +334,7 @@ void e1000e_ptp_init(struct e1000_adapter *adapter)
if (IS_ERR(adapter->ptp_clock)) {
adapter->ptp_clock = NULL;
e_err("ptp_clock_register failed\n");
- } else {
+ } else if (adapter->ptp_clock) {
e_info("registered PHC clock\n");
}
}
diff --git a/drivers/net/ethernet/intel/i40e/i40e_ptp.c b/drivers/net/ethernet/intel/i40e/i40e_ptp.c
index ed39cbad24..f1feceab75 100644
--- a/drivers/net/ethernet/intel/i40e/i40e_ptp.c
+++ b/drivers/net/ethernet/intel/i40e/i40e_ptp.c
@@ -669,7 +669,7 @@ void i40e_ptp_init(struct i40e_pf *pf)
pf->ptp_clock = NULL;
dev_err(&pf->pdev->dev, "%s: ptp_clock_register failed\n",
__func__);
- } else {
+ } else if (pf->ptp_clock) {
struct timespec64 ts;
u32 regval;
diff --git a/drivers/net/ethernet/intel/igb/igb_ptp.c b/drivers/net/ethernet/intel/igb/igb_ptp.c
index 66dfa2085c..1dd14e166d 100644
--- a/drivers/net/ethernet/intel/igb/igb_ptp.c
+++ b/drivers/net/ethernet/intel/igb/igb_ptp.c
@@ -1159,7 +1159,7 @@ void igb_ptp_init(struct igb_adapter *adapter)
if (IS_ERR(adapter->ptp_clock)) {
adapter->ptp_clock = NULL;
dev_err(&adapter->pdev->dev, "ptp_clock_register failed\n");
- } else {
+ } else if (adapter->ptp_clock) {
dev_info(&adapter->pdev->dev, "added PHC on %s\n",
adapter->netdev->name);
adapter->ptp_flags |= IGB_PTP_ENABLED;
diff --git a/drivers/net/ethernet/intel/ixgbe/ixgbe_ptp.c b/drivers/net/ethernet/intel/ixgbe/ixgbe_ptp.c
index e5431bfe33..a92277683a 100644
--- a/drivers/net/ethernet/intel/ixgbe/ixgbe_ptp.c
+++ b/drivers/net/ethernet/intel/ixgbe/ixgbe_ptp.c
@@ -1254,7 +1254,7 @@ static long ixgbe_ptp_create_clock(struct ixgbe_adapter *adapter)
adapter->ptp_clock = NULL;
e_dev_err("ptp_clock_register failed\n");
return err;
- } else
+ } else if (adapter->ptp_clock)
e_dev_info("registered PHC device on %s\n", netdev->name);
/* set default timestamp mode to disabled here. We do this in
diff --git a/drivers/net/ethernet/mellanox/mlx4/Kconfig b/drivers/net/ethernet/mellanox/mlx4/Kconfig
index 5098e7f219..b2998bc5ab 100644
--- a/drivers/net/ethernet/mellanox/mlx4/Kconfig
+++ b/drivers/net/ethernet/mellanox/mlx4/Kconfig
@@ -7,7 +7,7 @@ config MLX4_EN
depends on MAY_USE_DEVLINK
depends on PCI
select MLX4_CORE
- select PTP_1588_CLOCK
+ select PTP_1588_CLOCK_SELECTED
---help---
This driver supports Mellanox Technologies ConnectX Ethernet
devices.
diff --git a/drivers/net/ethernet/mellanox/mlx4/en_clock.c b/drivers/net/ethernet/mellanox/mlx4/en_clock.c
index 1494997c4f..08fc5fc56d 100644
--- a/drivers/net/ethernet/mellanox/mlx4/en_clock.c
+++ b/drivers/net/ethernet/mellanox/mlx4/en_clock.c
@@ -298,7 +298,7 @@ void mlx4_en_init_timestamp(struct mlx4_en_dev *mdev)
if (IS_ERR(mdev->ptp_clock)) {
mdev->ptp_clock = NULL;
mlx4_err(mdev, "ptp_clock_register failed\n");
- } else {
+ } else if (mdev->ptp_clock) {
mlx4_info(mdev, "registered PHC clock\n");
}
diff --git a/drivers/net/ethernet/mellanox/mlx5/core/Kconfig b/drivers/net/ethernet/mellanox/mlx5/core/Kconfig
index aae46884bf..0d679346dc 100644
--- a/drivers/net/ethernet/mellanox/mlx5/core/Kconfig
+++ b/drivers/net/ethernet/mellanox/mlx5/core/Kconfig
@@ -14,7 +14,7 @@ config MLX5_CORE
config MLX5_CORE_EN
bool "Mellanox Technologies ConnectX-4 Ethernet support"
depends on NETDEVICES && ETHERNET && PCI && MLX5_CORE
- select PTP_1588_CLOCK
+ select PTP_1588_CLOCK_SELECTED
default n
---help---
Ethernet support in Mellanox Technologies ConnectX-4 NIC.
diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en_clock.c b/drivers/net/ethernet/mellanox/mlx5/core/en_clock.c
index 847a8f3ac2..13dc388667 100644
--- a/drivers/net/ethernet/mellanox/mlx5/core/en_clock.c
+++ b/drivers/net/ethernet/mellanox/mlx5/core/en_clock.c
@@ -273,7 +273,7 @@ void mlx5e_timestamp_init(struct mlx5e_priv *priv)
tstamp->ptp = ptp_clock_register(&tstamp->ptp_info,
&priv->mdev->pdev->dev);
- if (IS_ERR_OR_NULL(tstamp->ptp)) {
+ if (IS_ERR(tstamp->ptp)) {
mlx5_core_warn(priv->mdev, "ptp_clock_register failed %ld\n",
PTR_ERR(tstamp->ptp));
tstamp->ptp = NULL;
diff --git a/drivers/net/ethernet/renesas/Kconfig b/drivers/net/ethernet/renesas/Kconfig
index 4f132cf177..6862a9c1b6 100644
--- a/drivers/net/ethernet/renesas/Kconfig
+++ b/drivers/net/ethernet/renesas/Kconfig
@@ -37,7 +37,7 @@ config RAVB
select MII
select MDIO_BITBANG
select PHYLIB
- select PTP_1588_CLOCK
+ select PTP_1588_CLOCK_SELECTED
help
Renesas Ethernet AVB device driver.
This driver supports the following SoCs:
diff --git a/drivers/net/ethernet/samsung/Kconfig b/drivers/net/ethernet/samsung/Kconfig
index 2360d81507..121b7e4426 100644
--- a/drivers/net/ethernet/samsung/Kconfig
+++ b/drivers/net/ethernet/samsung/Kconfig
@@ -21,7 +21,7 @@ config SXGBE_ETH
depends on HAS_IOMEM && HAS_DMA
select PHYLIB
select CRC32
- select PTP_1588_CLOCK
+ select PTP_1588_CLOCK_SELECTED
---help---
This is the driver for the SXGBE 10G Ethernet IP block found on
Samsung platforms.
diff --git a/drivers/net/ethernet/sfc/Kconfig b/drivers/net/ethernet/sfc/Kconfig
index 4dd92b7b80..472152bd72 100644
--- a/drivers/net/ethernet/sfc/Kconfig
+++ b/drivers/net/ethernet/sfc/Kconfig
@@ -5,7 +5,7 @@ config SFC
select CRC32
select I2C
select I2C_ALGOBIT
- select PTP_1588_CLOCK
+ select PTP_1588_CLOCK_SELECTED
---help---
This driver supports 10/40-gigabit Ethernet cards based on
the Solarflare SFC4000, SFC9000-family and SFC9100-family
diff --git a/drivers/net/ethernet/sfc/ptp.c b/drivers/net/ethernet/sfc/ptp.c
index dd204d9704..77a5364f7a 100644
--- a/drivers/net/ethernet/sfc/ptp.c
+++ b/drivers/net/ethernet/sfc/ptp.c
@@ -1269,13 +1269,13 @@ int efx_ptp_probe(struct efx_nic *efx, struct efx_channel *channel)
if (IS_ERR(ptp->phc_clock)) {
rc = PTR_ERR(ptp->phc_clock);
goto fail3;
- }
-
- INIT_WORK(&ptp->pps_work, efx_ptp_pps_worker);
- ptp->pps_workwq = create_singlethread_workqueue("sfc_pps");
- if (!ptp->pps_workwq) {
- rc = -ENOMEM;
- goto fail4;
+ } else if (ptp->phc_clock) {
+ INIT_WORK(&ptp->pps_work, efx_ptp_pps_worker);
+ ptp->pps_workwq = create_singlethread_workqueue("sfc_pps");
+ if (!ptp->pps_workwq) {
+ rc = -ENOMEM;
+ goto fail4;
+ }
}
}
ptp->nic_ts_enabled = false;
diff --git a/drivers/net/ethernet/stmicro/stmmac/Kconfig b/drivers/net/ethernet/stmicro/stmmac/Kconfig
index 8f06a6621a..578e5a15cb 100644
--- a/drivers/net/ethernet/stmicro/stmmac/Kconfig
+++ b/drivers/net/ethernet/stmicro/stmmac/Kconfig
@@ -4,7 +4,7 @@ config STMMAC_ETH
select MII
select PHYLIB
select CRC32
- select PTP_1588_CLOCK
+ select PTP_1588_CLOCK_SELECTED
select RESET_CONTROLLER
---help---
This is the driver for the Ethernet IPs are built around a
diff --git a/drivers/net/ethernet/stmicro/stmmac/stmmac_ptp.c b/drivers/net/ethernet/stmicro/stmmac/stmmac_ptp.c
index 170a18b612..6e3b82972c 100644
--- a/drivers/net/ethernet/stmicro/stmmac/stmmac_ptp.c
+++ b/drivers/net/ethernet/stmicro/stmmac/stmmac_ptp.c
@@ -187,7 +187,7 @@ int stmmac_ptp_register(struct stmmac_priv *priv)
if (IS_ERR(priv->ptp_clock)) {
priv->ptp_clock = NULL;
pr_err("ptp_clock_register() failed on %s\n", priv->dev->name);
- } else
+ } else if (priv->ptp_clock)
pr_debug("Added PTP HW clock successfully on %s\n",
priv->dev->name);
diff --git a/drivers/net/ethernet/ti/Kconfig b/drivers/net/ethernet/ti/Kconfig
index 9904d740d5..bc895114c9 100644
--- a/drivers/net/ethernet/ti/Kconfig
+++ b/drivers/net/ethernet/ti/Kconfig
@@ -76,7 +76,7 @@ config TI_CPSW
config TI_CPTS
bool "TI Common Platform Time Sync (CPTS) Support"
depends on TI_CPSW
- select PTP_1588_CLOCK
+ select PTP_1588_CLOCK_SELECTED
---help---
This driver supports the Common Platform Time Sync unit of
the CPSW Ethernet Switch. The unit can time stamp PTP UDP/IPv4
diff --git a/drivers/net/ethernet/tile/Kconfig b/drivers/net/ethernet/tile/Kconfig
index f59a6c2653..b6ba43c78c 100644
--- a/drivers/net/ethernet/tile/Kconfig
+++ b/drivers/net/ethernet/tile/Kconfig
@@ -9,7 +9,7 @@ config TILE_NET
select CRC32
select TILE_GXIO_MPIPE if TILEGX
select HIGH_RES_TIMERS if TILEGX
- select PTP_1588_CLOCK if TILEGX
+ select PTP_1588_CLOCK_SELECTED if TILEGX
---help---
This is a standard Linux network device driver for the
on-chip Tilera Gigabit Ethernet and XAUI interfaces.
diff --git a/drivers/ptp/Kconfig b/drivers/ptp/Kconfig
index ee3de3421f..f34b3748c0 100644
--- a/drivers/ptp/Kconfig
+++ b/drivers/ptp/Kconfig
@@ -4,8 +4,12 @@
menu "PTP clock support"
+config PTP_1588_CLOCK_SELECTED
+ tristate
+
config PTP_1588_CLOCK
tristate "PTP clock support"
+ default PTP_1588_CLOCK_SELECTED
depends on NET
select PPS
select NET_PTP_CLASSIFY
@@ -28,7 +32,7 @@ config PTP_1588_CLOCK
config PTP_1588_CLOCK_GIANFAR
tristate "Freescale eTSEC as PTP clock"
depends on GIANFAR
- select PTP_1588_CLOCK
+ depends on PTP_1588_CLOCK
default y
help
This driver adds support for using the eTSEC as a PTP
@@ -42,7 +46,7 @@ config PTP_1588_CLOCK_GIANFAR
config PTP_1588_CLOCK_IXP46X
tristate "Intel IXP46x as PTP clock"
depends on IXP4XX_ETH
- select PTP_1588_CLOCK
+ depends on PTP_1588_CLOCK
default y
help
This driver adds support for using the IXP46X as a PTP
@@ -60,7 +64,7 @@ config DP83640_PHY
tristate "Driver for the National Semiconductor DP83640 PHYTER"
depends on NETWORK_PHY_TIMESTAMPING
depends on PHYLIB
- select PTP_1588_CLOCK
+ depends on PTP_1588_CLOCK
---help---
Supports the DP83640 PHYTER with IEEE 1588 features.
@@ -76,7 +80,7 @@ config PTP_1588_CLOCK_PCH
tristate "Intel PCH EG20T as PTP clock"
depends on X86_32 || COMPILE_TEST
depends on HAS_IOMEM && NET
- select PTP_1588_CLOCK
+ select PTP_1588_CLOCK_SELECTED
help
This driver adds support for using the PCH EG20T as a PTP
clock. The hardware supports time stamping of PTP packets
diff --git a/include/linux/ptp_clock_kernel.h b/include/linux/ptp_clock_kernel.h
index 6b15e16814..ee09206891 100644
--- a/include/linux/ptp_clock_kernel.h
+++ b/include/linux/ptp_clock_kernel.h
@@ -122,24 +122,6 @@ struct ptp_clock_info {
struct ptp_clock;
-/**
- * ptp_clock_register() - register a PTP hardware clock driver
- *
- * @info: Structure describing the new clock.
- * @parent: Pointer to the parent device of the new clock.
- */
-
-extern struct ptp_clock *ptp_clock_register(struct ptp_clock_info *info,
- struct device *parent);
-
-/**
- * ptp_clock_unregister() - unregister a PTP hardware clock driver
- *
- * @ptp: The clock to remove from service.
- */
-
-extern int ptp_clock_unregister(struct ptp_clock *ptp);
-
enum ptp_clock_events {
PTP_CLOCK_ALARM,
@@ -166,6 +148,31 @@ struct ptp_clock_event {
};
};
+#if IS_REACHABLE(CONFIG_PTP_1588_CLOCK)
+
+/**
+ * ptp_clock_register() - register a PTP hardware clock driver
+ *
+ * @info: Structure describing the new clock.
+ * @parent: Pointer to the parent device of the new clock.
+ *
+ * Returns a valid pointer on success or PTR_ERR on failure. If PHC
+ * support is missing at the configuration level, this function
+ * returns NULL, and drivers are expected to gracefully handle that
+ * case separately.
+ */
+
+extern struct ptp_clock *ptp_clock_register(struct ptp_clock_info *info,
+ struct device *parent);
+
+/**
+ * ptp_clock_unregister() - unregister a PTP hardware clock driver
+ *
+ * @ptp: The clock to remove from service.
+ */
+
+extern int ptp_clock_unregister(struct ptp_clock *ptp);
+
/**
* ptp_clock_event() - notify the PTP layer about an event
*
@@ -197,4 +204,25 @@ extern int ptp_clock_index(struct ptp_clock *ptp);
int ptp_find_pin(struct ptp_clock *ptp,
enum ptp_pin_function func, unsigned int chan);
+#else
+static inline struct ptp_clock *ptp_clock_register(struct ptp_clock_info *info,
+ struct device *parent)
+{
+ if (IS_MODULE(CONFIG_PTP_1588_CLOCK))
+ pr_warn("%s is built-in while PTP clock subsystem is modular, "
+ "PTP clock ignored\n", KBUILD_MODNAME);
+ return NULL;
+}
+static inline int ptp_clock_unregister(struct ptp_clock *ptp)
+{ return 0; }
+static inline void ptp_clock_event(struct ptp_clock *ptp,
+ struct ptp_clock_event *event)
+{ (void)event; }
+static inline int ptp_clock_index(struct ptp_clock *ptp)
+{ return -1; }
+static inline int ptp_find_pin(struct ptp_clock *ptp,
+ enum ptp_pin_function func, unsigned int chan)
+{ return -1; }
+#endif
+
#endif
--
2.7.4
^ permalink raw reply related [flat|nested] 14+ messages in thread
* [PATCH 2/2] posix-timers: make it configurable
2016-09-20 19:56 [PATCH v2 0/2] make POSIX timers optional Nicolas Pitre
2016-09-20 19:56 ` [PATCH 1/2] ptp_clock: allow for it to be optional Nicolas Pitre
@ 2016-09-20 19:56 ` Nicolas Pitre
2016-09-20 20:25 ` [PATCH v2 0/2] make POSIX timers optional Richard Cochran
2016-09-22 6:09 ` David Miller
3 siblings, 0 replies; 14+ messages in thread
From: Nicolas Pitre @ 2016-09-20 19:56 UTC (permalink / raw)
To: John Stultz
Cc: Thomas Gleixner, Richard Cochran, Josh Triplett, netdev, linux-kernel
Many embedded systems typically don't need them. This removes about
22KB from the kernel binary size on ARM when configured out.
Corresponding syscalls are routed to a stub logging the attempt to
use those syscalls which should be enough of a clue if they were
disabled without proper consideration. They are: timer_create,
timer_gettime: timer_getoverrun, timer_settime, timer_delete,
clock_adjtime.
The clock_settime, clock_gettime, clock_getres and clock_nanosleep syscalls
are replaced by simple wrappers compatible with CLOCK_REALTIME,
CLOCK_MONOTONIC and CLOCK_BOOTTIME only.
Signed-off-by: Nicolas Pitre <nico@linaro.org>
---
drivers/ptp/Kconfig | 2 +-
include/linux/posix-timers.h | 28 +++++++++-
include/linux/sched.h | 10 ++++
init/Kconfig | 17 +++++++
kernel/signal.c | 4 ++
kernel/time/Kconfig | 1 +
kernel/time/Makefile | 10 +++-
kernel/time/posix-stubs.c | 118 +++++++++++++++++++++++++++++++++++++++++++
8 files changed, 185 insertions(+), 5 deletions(-)
create mode 100644 kernel/time/posix-stubs.c
diff --git a/drivers/ptp/Kconfig b/drivers/ptp/Kconfig
index f34b3748c0..940fa10907 100644
--- a/drivers/ptp/Kconfig
+++ b/drivers/ptp/Kconfig
@@ -10,7 +10,7 @@ config PTP_1588_CLOCK_SELECTED
config PTP_1588_CLOCK
tristate "PTP clock support"
default PTP_1588_CLOCK_SELECTED
- depends on NET
+ depends on NET && POSIX_TIMERS
select PPS
select NET_PTP_CLASSIFY
help
diff --git a/include/linux/posix-timers.h b/include/linux/posix-timers.h
index 62d44c1760..2288c5c557 100644
--- a/include/linux/posix-timers.h
+++ b/include/linux/posix-timers.h
@@ -118,6 +118,8 @@ struct k_clock {
extern struct k_clock clock_posix_cpu;
extern struct k_clock clock_posix_dynamic;
+#ifdef CONFIG_POSIX_TIMERS
+
void posix_timers_register_clock(const clockid_t clock_id, struct k_clock *new_clock);
/* function to call to trigger timer event */
@@ -131,8 +133,30 @@ void posix_cpu_timers_exit_group(struct task_struct *task);
void set_process_cpu_timer(struct task_struct *task, unsigned int clock_idx,
cputime_t *newval, cputime_t *oldval);
-long clock_nanosleep_restart(struct restart_block *restart_block);
-
void update_rlimit_cpu(struct task_struct *task, unsigned long rlim_new);
+#else
+
+#include <linux/random.h>
+
+static inline void posix_timers_register_clock(const clockid_t clock_id,
+ struct k_clock *new_clock) {}
+static inline int posix_timer_event(struct k_itimer *timr, int si_private)
+{ return 0; }
+static inline void run_posix_cpu_timers(struct task_struct *task) {}
+static inline void posix_cpu_timers_exit(struct task_struct *task)
+{
+ add_device_randomness((const void*) &task->se.sum_exec_runtime,
+ sizeof(unsigned long long));
+}
+static inline void posix_cpu_timers_exit_group(struct task_struct *task) {}
+static inline void set_process_cpu_timer(struct task_struct *task,
+ unsigned int clock_idx, cputime_t *newval, cputime_t *oldval) {}
+static inline void update_rlimit_cpu(struct task_struct *task,
+ unsigned long rlim_new) {}
+
+#endif
+
+long clock_nanosleep_restart(struct restart_block *restart_block);
+
#endif
diff --git a/include/linux/sched.h b/include/linux/sched.h
index 54182d52a0..39a1d6d3f5 100644
--- a/include/linux/sched.h
+++ b/include/linux/sched.h
@@ -2924,8 +2924,13 @@ static inline void exit_thread(struct task_struct *tsk)
extern void exit_files(struct task_struct *);
extern void __cleanup_sighand(struct sighand_struct *);
+#ifdef CONFIG_POSIX_TIMERS
extern void exit_itimers(struct signal_struct *);
extern void flush_itimer_signals(void);
+#else
+static inline void exit_itimers(struct signal_struct *s) {}
+static inline void flush_itimer_signals(void) {}
+#endif
extern void do_group_exit(int);
@@ -3382,7 +3387,12 @@ static __always_inline bool need_resched(void)
* Thread group CPU time accounting.
*/
void thread_group_cputime(struct task_struct *tsk, struct task_cputime *times);
+#ifdef CONFIG_POSIX_TIMERS
void thread_group_cputimer(struct task_struct *tsk, struct task_cputime *times);
+#else
+static inline void thread_group_cputimer(struct task_struct *tsk,
+ struct task_cputime *times) {}
+#endif
/*
* Reevaluate whether the task has signals pending delivery.
diff --git a/init/Kconfig b/init/Kconfig
index a117738afd..3fdea723dd 100644
--- a/init/Kconfig
+++ b/init/Kconfig
@@ -1449,6 +1449,23 @@ config SYSCTL_SYSCALL
If unsure say N here.
+config POSIX_TIMERS
+ bool "Posix Clocks & timers" if EXPERT
+ default y
+ help
+ This includes native support for POSIX timers to the kernel.
+ Most embedded systems may have no use for them and therefore they
+ can be configured out to reduce the size of the kernel image.
+
+ When this option is disabled, the following syscalls won't be
+ available: timer_create, timer_gettime: timer_getoverrun,
+ timer_settime, timer_delete, clock_adjtime. Furthermore, the
+ clock_settime, clock_gettime, clock_getres and clock_nanosleep
+ syscalls will be limited to CLOCK_REALTIME and CLOCK_MONOTONIC
+ only.
+
+ If unsure say y.
+
config KALLSYMS
bool "Load all symbols for debugging/ksymoops" if EXPERT
default y
diff --git a/kernel/signal.c b/kernel/signal.c
index af21afc00d..ea75065e29 100644
--- a/kernel/signal.c
+++ b/kernel/signal.c
@@ -427,6 +427,7 @@ void flush_signals(struct task_struct *t)
spin_unlock_irqrestore(&t->sighand->siglock, flags);
}
+#ifdef CONFIG_POSIX_TIMERS
static void __flush_itimer_signals(struct sigpending *pending)
{
sigset_t signal, retain;
@@ -460,6 +461,7 @@ void flush_itimer_signals(void)
__flush_itimer_signals(&tsk->signal->shared_pending);
spin_unlock_irqrestore(&tsk->sighand->siglock, flags);
}
+#endif
void ignore_signals(struct task_struct *t)
{
@@ -611,6 +613,7 @@ int dequeue_signal(struct task_struct *tsk, sigset_t *mask, siginfo_t *info)
*/
current->jobctl |= JOBCTL_STOP_DEQUEUED;
}
+#ifdef CONFIG_POSIX_TIMERS
if ((info->si_code & __SI_MASK) == __SI_TIMER && info->si_sys_private) {
/*
* Release the siglock to ensure proper locking order
@@ -622,6 +625,7 @@ int dequeue_signal(struct task_struct *tsk, sigset_t *mask, siginfo_t *info)
do_schedule_next_timer(info);
spin_lock(&tsk->sighand->siglock);
}
+#endif
return signr;
}
diff --git a/kernel/time/Kconfig b/kernel/time/Kconfig
index 62824f2fe4..a3817ef652 100644
--- a/kernel/time/Kconfig
+++ b/kernel/time/Kconfig
@@ -195,3 +195,4 @@ config HIGH_RES_TIMERS
endmenu
endif
+
diff --git a/kernel/time/Makefile b/kernel/time/Makefile
index 49eca0beed..fc26c308f5 100644
--- a/kernel/time/Makefile
+++ b/kernel/time/Makefile
@@ -1,6 +1,12 @@
-obj-y += time.o timer.o hrtimer.o itimer.o posix-timers.o posix-cpu-timers.o
+obj-y += time.o timer.o hrtimer.o itimer.o
obj-y += timekeeping.o ntp.o clocksource.o jiffies.o timer_list.o
-obj-y += timeconv.o timecounter.o posix-clock.o alarmtimer.o
+obj-y += timeconv.o timecounter.o alarmtimer.o
+
+ifeq ($(CONFIG_POSIX_TIMERS),y)
+ obj-y += posix-timers.o posix-cpu-timers.o posix-clock.o
+else
+ obj-y += posix-stubs.o
+endif
obj-$(CONFIG_GENERIC_CLOCKEVENTS) += clockevents.o tick-common.o
ifeq ($(CONFIG_GENERIC_CLOCKEVENTS_BROADCAST),y)
diff --git a/kernel/time/posix-stubs.c b/kernel/time/posix-stubs.c
new file mode 100644
index 0000000000..fe857bd4a0
--- /dev/null
+++ b/kernel/time/posix-stubs.c
@@ -0,0 +1,118 @@
+/*
+ * Dummy stubs used when CONFIG_POSIX_TIMERS=n
+ *
+ * Created by: Nicolas Pitre, July 2016
+ * Copyright: (C) 2016 Linaro Limited
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ */
+
+#include <linux/linkage.h>
+#include <linux/kernel.h>
+#include <linux/sched.h>
+#include <linux/errno.h>
+#include <linux/syscalls.h>
+#include <linux/ktime.h>
+#include <linux/timekeeping.h>
+#include <linux/posix-timers.h>
+
+asmlinkage long sys_ni_posix_timers(void)
+{
+ pr_err_once("process %d (%s) attempted a POSIX timer syscall "
+ "while CONFIG_POSIX_TIMERS is not set\n",
+ current->pid, current->comm);
+ return -ENOSYS;
+}
+
+#define SYS_NI(name) SYSCALL_ALIAS(sys_##name, sys_ni_posix_timers)
+
+SYS_NI(timer_create);
+SYS_NI(timer_gettime);
+SYS_NI(timer_getoverrun);
+SYS_NI(timer_settime);
+SYS_NI(timer_delete);
+SYS_NI(clock_adjtime);
+
+/*
+ * We preserve minimal support for CLOCK_REALTIME and CLOCK_MONOTONIC
+ * as it is easy to remain compatible with little code. CLOCK_BOOTTIME
+ * is also included for convenience as at least systemd uses it.
+ */
+
+SYSCALL_DEFINE2(clock_settime, const clockid_t, which_clock,
+ const struct timespec __user *, tp)
+{
+ struct timespec new_tp;
+
+ if (which_clock != CLOCK_REALTIME)
+ return -EINVAL;
+ if (copy_from_user(&new_tp, tp, sizeof (*tp)))
+ return -EFAULT;
+ return do_sys_settimeofday(&new_tp, NULL);
+}
+
+SYSCALL_DEFINE2(clock_gettime, const clockid_t, which_clock,
+ struct timespec __user *,tp)
+{
+ struct timespec kernel_tp;
+
+ switch (which_clock) {
+ case CLOCK_REALTIME: ktime_get_real_ts(&kernel_tp); break;
+ case CLOCK_MONOTONIC: ktime_get_ts(&kernel_tp); break;
+ case CLOCK_BOOTTIME: get_monotonic_boottime(&kernel_tp); break;
+ default: return -EINVAL;
+ }
+ if (copy_to_user(tp, &kernel_tp, sizeof (kernel_tp)))
+ return -EFAULT;
+ return 0;
+}
+
+SYSCALL_DEFINE2(clock_getres, const clockid_t, which_clock, struct timespec __user *, tp)
+{
+ struct timespec rtn_tp = {
+ .tv_sec = 0,
+ .tv_nsec = hrtimer_resolution,
+ };
+
+ switch (which_clock) {
+ case CLOCK_REALTIME:
+ case CLOCK_MONOTONIC:
+ case CLOCK_BOOTTIME:
+ if (copy_to_user(tp, &rtn_tp, sizeof(rtn_tp)))
+ return -EFAULT;
+ return 0;
+ default:
+ return -EINVAL;
+ }
+}
+
+SYSCALL_DEFINE4(clock_nanosleep, const clockid_t, which_clock, int, flags,
+ const struct timespec __user *, rqtp,
+ struct timespec __user *, rmtp)
+{
+ struct timespec t;
+
+ switch (which_clock) {
+ case CLOCK_REALTIME:
+ case CLOCK_MONOTONIC:
+ case CLOCK_BOOTTIME:
+ if (copy_from_user(&t, rqtp, sizeof (struct timespec)))
+ return -EFAULT;
+ if (!timespec_valid(&t))
+ return -EINVAL;
+ return hrtimer_nanosleep(&t, rmtp, flags & TIMER_ABSTIME ?
+ HRTIMER_MODE_ABS : HRTIMER_MODE_REL,
+ which_clock);
+ default:
+ return -EINVAL;
+ }
+}
+
+#ifdef CONFIG_COMPAT
+long clock_nanosleep_restart(struct restart_block *restart_block)
+{
+ return hrtimer_nanosleep_restart(restart_block);
+}
+#endif
--
2.7.4
^ permalink raw reply related [flat|nested] 14+ messages in thread
* Re: [PATCH v2 0/2] make POSIX timers optional
2016-09-20 19:56 [PATCH v2 0/2] make POSIX timers optional Nicolas Pitre
2016-09-20 19:56 ` [PATCH 1/2] ptp_clock: allow for it to be optional Nicolas Pitre
2016-09-20 19:56 ` [PATCH 2/2] posix-timers: make it configurable Nicolas Pitre
@ 2016-09-20 20:25 ` Richard Cochran
2016-09-20 20:45 ` Richard Cochran
2016-09-20 20:52 ` Nicolas Pitre
2016-09-22 6:09 ` David Miller
3 siblings, 2 replies; 14+ messages in thread
From: Richard Cochran @ 2016-09-20 20:25 UTC (permalink / raw)
To: Nicolas Pitre
Cc: John Stultz, Thomas Gleixner, Josh Triplett, netdev, linux-kernel
On Tue, Sep 20, 2016 at 03:56:38PM -0400, Nicolas Pitre wrote:
> - Add a warning for the case where PTP clock subsystem is modular and a
> driver providing a clock is built-in rather than silently ignoring it.
> Suggested by Jiri Benc.
So I am really not happy with this. Here is a common embedded
workflow, at least for me:
1. take some given Kconfig and get it running on the target.
2. for the given HW, change the modules into built-ins, and forget
module loading
After this series, if I don't pay enough attention to dmesg, then I
have lost functionality that I had in step #1. That sucks, and it has
nothing to do with the tinification option at all. It will bite even
if I have no knowledge of it. That isn't acceptable to me.
Thanks,
Richard
^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: [PATCH v2 0/2] make POSIX timers optional
2016-09-20 20:25 ` [PATCH v2 0/2] make POSIX timers optional Richard Cochran
@ 2016-09-20 20:45 ` Richard Cochran
2016-09-20 20:58 ` Nicolas Pitre
2016-09-20 20:52 ` Nicolas Pitre
1 sibling, 1 reply; 14+ messages in thread
From: Richard Cochran @ 2016-09-20 20:45 UTC (permalink / raw)
To: Nicolas Pitre
Cc: John Stultz, Thomas Gleixner, Josh Triplett, netdev, linux-kernel
On Tue, Sep 20, 2016 at 10:25:56PM +0200, Richard Cochran wrote:
> After this series, if I don't pay enough attention to dmesg, then I
> have lost functionality that I had in step #1. That sucks, and it has
> nothing to do with the tinification option at all. It will bite even
> if I have no knowledge of it. That isn't acceptable to me.
Can't you leave all the "select PTP_1588_CLOCK" alone and simply add
#ifdef CONFIG_POSIX_TIMERS
// global declarations
#else
// static inlines
#endif
to ptp_clock_kernel.h, and then sandwich ptp_clock.c in
#ifdef CONFIG_POSIX_TIMERS ... #endif ?
Thanks,
Richard
^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: [PATCH v2 0/2] make POSIX timers optional
2016-09-20 20:25 ` [PATCH v2 0/2] make POSIX timers optional Richard Cochran
2016-09-20 20:45 ` Richard Cochran
@ 2016-09-20 20:52 ` Nicolas Pitre
1 sibling, 0 replies; 14+ messages in thread
From: Nicolas Pitre @ 2016-09-20 20:52 UTC (permalink / raw)
To: Richard Cochran
Cc: John Stultz, Thomas Gleixner, Josh Triplett, netdev, linux-kernel
On Tue, 20 Sep 2016, Richard Cochran wrote:
> On Tue, Sep 20, 2016 at 03:56:38PM -0400, Nicolas Pitre wrote:
> > - Add a warning for the case where PTP clock subsystem is modular and a
> > driver providing a clock is built-in rather than silently ignoring it.
> > Suggested by Jiri Benc.
>
> So I am really not happy with this. Here is a common embedded
> workflow, at least for me:
>
> 1. take some given Kconfig and get it running on the target.
>
> 2. for the given HW, change the modules into built-ins, and forget
> module loading
>
> After this series, if I don't pay enough attention to dmesg, then I
> have lost functionality that I had in step #1.
Would that given config from #1 typically have CONFIG_EXPERT actually
set?
Ultimately, do you know a way to restrict a tristate to y or n? A
tristate can be limited to m or n with "depends on m" but it doesn't
appear to be possible to exclude m with a promotion to y.
Nicolas
^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: [PATCH v2 0/2] make POSIX timers optional
2016-09-20 20:45 ` Richard Cochran
@ 2016-09-20 20:58 ` Nicolas Pitre
2016-09-20 21:09 ` Thomas Gleixner
0 siblings, 1 reply; 14+ messages in thread
From: Nicolas Pitre @ 2016-09-20 20:58 UTC (permalink / raw)
To: Richard Cochran
Cc: John Stultz, Thomas Gleixner, Josh Triplett, netdev, linux-kernel
On Tue, 20 Sep 2016, Richard Cochran wrote:
> On Tue, Sep 20, 2016 at 10:25:56PM +0200, Richard Cochran wrote:
> > After this series, if I don't pay enough attention to dmesg, then I
> > have lost functionality that I had in step #1. That sucks, and it has
> > nothing to do with the tinification option at all. It will bite even
> > if I have no knowledge of it. That isn't acceptable to me.
>
> Can't you leave all the "select PTP_1588_CLOCK" alone and simply add
>
> #ifdef CONFIG_POSIX_TIMERS
> // global declarations
> #else
> // static inlines
> #endif
>
> to ptp_clock_kernel.h, and then sandwich ptp_clock.c in
> #ifdef CONFIG_POSIX_TIMERS ... #endif ?
Sure I could... but I'm sure I'll be flamed by others for making things
even more obscure and hackish than they are right now.
Oh well... Let's go fix the Kconfig parser then.
Nicolas
^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: [PATCH v2 0/2] make POSIX timers optional
2016-09-20 20:58 ` Nicolas Pitre
@ 2016-09-20 21:09 ` Thomas Gleixner
2016-09-20 22:47 ` Nicolas Pitre
2016-09-21 10:20 ` Jiri Benc
0 siblings, 2 replies; 14+ messages in thread
From: Thomas Gleixner @ 2016-09-20 21:09 UTC (permalink / raw)
To: Nicolas Pitre
Cc: Richard Cochran, John Stultz, Josh Triplett, netdev, linux-kernel
On Tue, 20 Sep 2016, Nicolas Pitre wrote:
> On Tue, 20 Sep 2016, Richard Cochran wrote:
>
> > On Tue, Sep 20, 2016 at 10:25:56PM +0200, Richard Cochran wrote:
> > > After this series, if I don't pay enough attention to dmesg, then I
> > > have lost functionality that I had in step #1. That sucks, and it has
> > > nothing to do with the tinification option at all. It will bite even
> > > if I have no knowledge of it. That isn't acceptable to me.
> >
> > Can't you leave all the "select PTP_1588_CLOCK" alone and simply add
> >
> > #ifdef CONFIG_POSIX_TIMERS
> > // global declarations
> > #else
> > // static inlines
> > #endif
Eew. No! That's an even more blantant layering violation.
> > to ptp_clock_kernel.h, and then sandwich ptp_clock.c in
> > #ifdef CONFIG_POSIX_TIMERS ... #endif ?
>
> Sure I could... but I'm sure I'll be flamed by others for making things
> even more obscure and hackish than they are right now.
I think the whole approach is wrong because it makes the PTP split at the
wrong level.
Currently we have:
DRIVER_X
tristate "Driver X"
select PTP
In order to make POSIX_CLOCK configurable we should have
PTP
tristate "PTP"
select POSIX_CLOCK
Now if you want to distangle PTP from a driver then you split it at the
driver level and not at the PTP level:
DRIVER_X
tristate "Driver X"
DRIVER_X_PTP
bool "Enable PTP support"
default y if !MAKE_IT_TINY
depends on DRIVER_X
select PTP
We have already drivers following that scheme. That way you make the PTP
support in the driver conditional on DRIVER_X_PTP and have no hassle with
modules and dependencies.
Your tiny config can simply disable all the PTP extra bits and then you can
disable PTP and finally POSIX_TIMERS.
Thanks,
tglx
^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: [PATCH v2 0/2] make POSIX timers optional
2016-09-20 21:09 ` Thomas Gleixner
@ 2016-09-20 22:47 ` Nicolas Pitre
2016-09-21 8:38 ` Richard Cochran
2016-09-21 9:09 ` Thomas Gleixner
2016-09-21 10:20 ` Jiri Benc
1 sibling, 2 replies; 14+ messages in thread
From: Nicolas Pitre @ 2016-09-20 22:47 UTC (permalink / raw)
To: Thomas Gleixner
Cc: Richard Cochran, John Stultz, Josh Triplett, netdev, linux-kernel
On Tue, 20 Sep 2016, Thomas Gleixner wrote:
> I think the whole approach is wrong because it makes the PTP split at the
> wrong level.
>
> Currently we have:
>
> DRIVER_X
> tristate "Driver X"
> select PTP
>
> In order to make POSIX_CLOCK configurable we should have
>
> PTP
> tristate "PTP"
> select POSIX_CLOCK
>
> Now if you want to distangle PTP from a driver then you split it at the
> driver level and not at the PTP level:
>
> DRIVER_X
> tristate "Driver X"
>
> DRIVER_X_PTP
> bool "Enable PTP support"
> default y if !MAKE_IT_TINY
> depends on DRIVER_X
> select PTP
>
> We have already drivers following that scheme. That way you make the PTP
> support in the driver conditional on DRIVER_X_PTP and have no hassle with
> modules and dependencies.
I beg to disagree.
There are way more drivers than subsystems and if you had to go around
unselecting all NIC drivers for CONFIG_ETHERNET to be turned off, and
with CONFIG_ETHERNET=n you'd finally be able to turn networking off,
then this would be a nightmare.
IMHO it is much nicer for the poor user configuring the kernel to have a
single configuration prompt for PTP support, and then have whatever
driver that can provide a PTP clock just do it (or omit it) based on
that single prompt. Prompting for PTP support for each individual
ethernet driver is silly.
Nicolas
^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: [PATCH v2 0/2] make POSIX timers optional
2016-09-20 22:47 ` Nicolas Pitre
@ 2016-09-21 8:38 ` Richard Cochran
2016-09-21 10:27 ` Jiri Benc
2016-09-21 9:09 ` Thomas Gleixner
1 sibling, 1 reply; 14+ messages in thread
From: Richard Cochran @ 2016-09-21 8:38 UTC (permalink / raw)
To: Nicolas Pitre
Cc: Thomas Gleixner, John Stultz, Josh Triplett, netdev, linux-kernel
On Tue, Sep 20, 2016 at 06:47:02PM -0400, Nicolas Pitre wrote:
> IMHO it is much nicer for the poor user configuring the kernel to have a
> single configuration prompt for PTP support, and then have whatever
> driver that can provide a PTP clock just do it (or omit it) based on
> that single prompt. Prompting for PTP support for each individual
> ethernet driver is silly.
Embedded people like to optimize their systems. One pattern I have
more than once is that a multihomed design designates a special PTP
interface, often with a different HW than the other ports. PTP
support adds extra code into the hot path, and for that reason people
want to turn it off on interfaces that don't need it.
So Thomas' idea is a better solution. It reduces the tinification in
this area to a careful kernel configuration. Yes, that is more work
to configure than having one "big red button" to push. The burden is
on the tinification user to get this right, and that is the right way,
IMHO. After all, this can be scripted, and such users have to
configure very carefully in any case.
Thanks,
Richard
^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: [PATCH v2 0/2] make POSIX timers optional
2016-09-20 22:47 ` Nicolas Pitre
2016-09-21 8:38 ` Richard Cochran
@ 2016-09-21 9:09 ` Thomas Gleixner
1 sibling, 0 replies; 14+ messages in thread
From: Thomas Gleixner @ 2016-09-21 9:09 UTC (permalink / raw)
To: Nicolas Pitre
Cc: Richard Cochran, John Stultz, Josh Triplett, netdev, linux-kernel
On Tue, 20 Sep 2016, Nicolas Pitre wrote:
> There are way more drivers than subsystems and if you had to go around
> unselecting all NIC drivers for CONFIG_ETHERNET to be turned off, and
> with CONFIG_ETHERNET=n you'd finally be able to turn networking off,
> then this would be a nightmare.
It's also a nightmare to try to enable something which depends on a chain
of config dependencies. You search A and see that it depends on B. Now you
try to enable B and find out it depends on C. The deepest chain I found so
far was 5 levels deep. That's horrible.
> IMHO it is much nicer for the poor user configuring the kernel to have a
> single configuration prompt for PTP support, and then have whatever
> driver that can provide a PTP clock just do it (or omit it) based on
> that single prompt. Prompting for PTP support for each individual
> ethernet driver is silly.
No, it's not. PTP support in a NIC can require a substantial amount of code
and adds overhead in the hotpath. So if you have two NICs on your system
and only use PTP on one of them then configuring out PTP for the other is
desired.
And talking about nightmares. With your patch I can now end up with the
following configuration:
CONFIG_NETWORK_DRIVER=y
CONFIG_PTP_1588_CLOCK=m
which makes the network driver to use the stub functions due to
IS_REACHABLE(). That's going to be an utter nightmare for the poor user to
figure out why PTP suddenly does not work anymore. That's simply crap.
Thanks,
tglx
^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: [PATCH v2 0/2] make POSIX timers optional
2016-09-20 21:09 ` Thomas Gleixner
2016-09-20 22:47 ` Nicolas Pitre
@ 2016-09-21 10:20 ` Jiri Benc
1 sibling, 0 replies; 14+ messages in thread
From: Jiri Benc @ 2016-09-21 10:20 UTC (permalink / raw)
To: Thomas Gleixner
Cc: Nicolas Pitre, Richard Cochran, John Stultz, Josh Triplett,
netdev, linux-kernel
On Tue, 20 Sep 2016 23:09:52 +0200 (CEST), Thomas Gleixner wrote:
> Now if you want to distangle PTP from a driver then you split it at the
> driver level and not at the PTP level:
>
> DRIVER_X
> tristate "Driver X"
>
> DRIVER_X_PTP
> bool "Enable PTP support"
> default y if !MAKE_IT_TINY
> depends on DRIVER_X
> select PTP
Ouch. So, after the hassle to remove the VXLAN and GENEVE configs from
tons of drivers, we'll add another one instead? That's just silly. If
we did this for every thing we support in NICs, we would end up with
something completely unmanageable.
PTP should be really configured by a single switch.
Btw., your suggestion does not work, select is not recursive.
> We have already drivers following that scheme. That way you make the PTP
> support in the driver conditional on DRIVER_X_PTP and have no hassle with
> modules and dependencies.
We've recently got rid of some of those, thankfully. Caused more harm
than good.
Jiri
^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: [PATCH v2 0/2] make POSIX timers optional
2016-09-21 8:38 ` Richard Cochran
@ 2016-09-21 10:27 ` Jiri Benc
0 siblings, 0 replies; 14+ messages in thread
From: Jiri Benc @ 2016-09-21 10:27 UTC (permalink / raw)
To: Richard Cochran
Cc: Nicolas Pitre, Thomas Gleixner, John Stultz, Josh Triplett,
netdev, linux-kernel
On Wed, 21 Sep 2016 10:38:52 +0200, Richard Cochran wrote:
> Embedded people like to optimize their systems. One pattern I have
> more than once is that a multihomed design designates a special PTP
> interface, often with a different HW than the other ports. PTP
> support adds extra code into the hot path, and for that reason people
> want to turn it off on interfaces that don't need it.
We really need to find some middle way. It's impossible to support
every little corner case. As is not reasonable to have a single
configuration only kernel.
I think this scenario falls into the little corner case. If you need
PTP, you just enable it. The PTP core will be much larger than the
added code in the individual drivers anyway.
And if there's run time impact on the fast path with time stamping
switched off on an interface, it's a bug that has to be fixed.
Jiri
^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: [PATCH v2 0/2] make POSIX timers optional
2016-09-20 19:56 [PATCH v2 0/2] make POSIX timers optional Nicolas Pitre
` (2 preceding siblings ...)
2016-09-20 20:25 ` [PATCH v2 0/2] make POSIX timers optional Richard Cochran
@ 2016-09-22 6:09 ` David Miller
3 siblings, 0 replies; 14+ messages in thread
From: David Miller @ 2016-09-22 6:09 UTC (permalink / raw)
To: nicolas.pitre
Cc: john.stultz, tglx, richardcochran, josh, netdev, linux-kernel
From: Nicolas Pitre <nicolas.pitre@linaro.org>
Date: Tue, 20 Sep 2016 15:56:38 -0400
> Many embedded systems don't need the full POSIX timer support.
> Configuring them out provides a nice kernel image size reduction.
>
> When POSIX timers are configured out, the PTP clock subsystem should be
> left out as well. However a bunch of ethernet drivers currently *select*
> it in their Kconfig entries. Therefore some more tweaks were needed to
> break that hard dependency for those drivers to still be configured in
> if desired.
>
> It was agreed that the best path upstream for those patches is via
> John Stultz's timer tree.
Acked-by: David S. Miller <davem@davemloft.net>
^ permalink raw reply [flat|nested] 14+ messages in thread
end of thread, other threads:[~2016-09-22 6:09 UTC | newest]
Thread overview: 14+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2016-09-20 19:56 [PATCH v2 0/2] make POSIX timers optional Nicolas Pitre
2016-09-20 19:56 ` [PATCH 1/2] ptp_clock: allow for it to be optional Nicolas Pitre
2016-09-20 19:56 ` [PATCH 2/2] posix-timers: make it configurable Nicolas Pitre
2016-09-20 20:25 ` [PATCH v2 0/2] make POSIX timers optional Richard Cochran
2016-09-20 20:45 ` Richard Cochran
2016-09-20 20:58 ` Nicolas Pitre
2016-09-20 21:09 ` Thomas Gleixner
2016-09-20 22:47 ` Nicolas Pitre
2016-09-21 8:38 ` Richard Cochran
2016-09-21 10:27 ` Jiri Benc
2016-09-21 9:09 ` Thomas Gleixner
2016-09-21 10:20 ` Jiri Benc
2016-09-20 20:52 ` Nicolas Pitre
2016-09-22 6:09 ` David Miller
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.