1
0
mirror of https://github.com/systemd/systemd synced 2026-04-11 01:24:50 +02:00

Compare commits

...

10 Commits

Author SHA1 Message Date
Frantisek Sumsal
c0a2e0cc24 network: a couple of tweaks suggested by Coccinelle 2021-12-18 08:36:07 +09:00
Yu Watanabe
14dd873b88 network: dhcp4: pass IPServiceType=none to dhcp client
Follow-up for b55093ce8884ee4fc72f28c6fd5e39897e921e21.
2021-12-18 08:35:42 +09:00
Frantisek Sumsal
b5c946d3b8 man: fix machine-id(5) man page reference
Spotted whilst debugging:
```
[763/2094] Generating man/machine-info.html with a custom command
Element cite in namespace '' encountered in para, but no template matches.
[765/2094] Generating man/machine-info.5 with a custom command
Element cite in namespace '' encountered in para, but no template matches.
```

Follow-up to 357376d0bb5.
2021-12-18 08:35:24 +09:00
Yu Watanabe
a00fd2a553
Merge pull request #21800 from keszybz/net-id-debugging
Add more debugging info to udev builtin net_id
2021-12-18 08:35:08 +09:00
Zbigniew Jędrzejewski-Szmek
edee65a6a4 udev/net_id: add debug logging for construction of device names
I think this makes it much easier to figure out what information sources
were used to generate the names, and why certain names were not generated.

On my laptop:

Using default interface naming scheme 'v250'.
ID_NET_NAMING_SCHEME=v250
wwp0s20f0u2i12: addr_assign_type=3, MAC address is not permanent.
wwp0s20f0u2i12: Parsing slot information from sysname "0000:00:14.0": success
wwp0s20f0u2i12: dev_port=0
wwp0s20f0u2i12: PCI path identifier: domain=0 bus=0 slot=20 func=0 phys_port= dev_port=0 → p0s20f0
wwp0s20f0u2i12: USB name identifier: ports=2 config=1 interface=12 → u2i12
ID_NET_NAME_PATH=wwp0s20f0u2i12

Using default interface naming scheme 'v250'.
ID_NET_NAMING_SCHEME=v250
ID_NET_NAME_MAC=en54ee75cb1dc0
enp0s31f6: MAC address identifier: hw_addr=54:ee:75:cb:1d:c0 → 54ee75cb1dc0
ID_OUI_FROM_DATABASE=Wistron InfoComm(Kunshan)Co.,Ltd.
enp0s31f6: Parsing slot information from sysname "0000:00:1f.6": success
enp0s31f6: dev_port=0
enp0s31f6: PCI path identifier: domain=0 bus=0 slot=31 func=6 phys_port= dev_port=0 → p0s31f6
ID_NET_NAME_PATH=enp0s31f6

Using default interface naming scheme 'v250'.
ID_NET_NAMING_SCHEME=v250
ID_NET_NAME_MAC=en0050b6856d36
hub0: MAC address identifier: hw_addr=00:50:b6:85:6d:36 → 0050b6856d36
ID_OUI_FROM_DATABASE=GOOD WAY IND. CO., LTD.
hub0: Parsing slot information from sysname "0000:00:14.0": success
hub0: dev_port=0
hub0: PCI path identifier: domain=0 bus=0 slot=20 func=0 phys_port= dev_port=0 → p0s20f0
hub0: USB name identifier: ports=4.1.3 config=2 interface=0 → u4u1u3c2
ID_NET_NAME_PATH=enp0s20f0u4u1u3c2

Using default interface naming scheme 'v250'.
ID_NET_NAMING_SCHEME=v250
wlp4s0: addr_assign_type=3, MAC address is not permanent.
wlp4s0: Parsing slot information from sysname "0000:04:00.0": success
wlp4s0: dev_port=0
wlp4s0: PCI path identifier: domain=0 bus=4 slot=0 func=0 phys_port= dev_port=0 → p4s0
ID_NET_NAME_PATH=wlp4s0
2021-12-17 19:07:42 +01:00
Anita Zhang
415d7d774a test: adjust MemoryHigh= on oomd extended test units
On some runs `sleep infinity` run by the user manager uses over 3M of
memory, which is higher than the MemoryHigh= set on testbloat and
testmunch. If no pgscan is generated, then systemd-oomd sorts by memory
usage which leads to a situation where testchill (using 3M) could be
targeted over testbloat (1M-2M).

Fix this by setting reasonable MemoryHigh= values for all of these test
units. Even if somehow testchill throttles a bit at 3M, testbloat and
testmunch should still be trying to use over 100M at memory and will
throttle down to 5M and 6M with the new values. This should reflect
the desired state in pgscan and memory usage during the test run.

Fixes #21684
2021-12-17 16:27:58 +00:00
Zbigniew Jędrzejewski-Szmek
3c1af24182 udev/net_id: use STRLEN() to make code clearer
The code was correct, but looked suspicious: we were comparing
strlen(x) with sizeof(y), with looks like an off-by-one. But we actually
want x to be one longer than y, so that's fine. Let's use STRLEN() to
make this more obvious.

While at it, drop unnecessary "_" prefix.
2021-12-17 11:45:55 +01:00
Zbigniew Jędrzejewski-Szmek
be0586610e udev/net_id: fix signedness in format string
Both variables are unsigned. In practice those numbers cannot be large
enough to become negative, but let's use the correct type anyway.
2021-12-17 11:45:55 +01:00
Zbigniew Jędrzejewski-Szmek
a2968e8366 man: use unicode superscripts to indicate the exponent 2021-12-17 11:45:55 +01:00
Zbigniew Jędrzejewski-Szmek
56f9ce31b9 man: fix two typos 2021-12-17 11:45:55 +01:00
12 changed files with 144 additions and 73 deletions

View File

@ -136,7 +136,8 @@
<command>kernel-install</command> should use. The value must be a valid machine ID (32 hexadecimal
characters). This would generally be the original machine-id that was used when the boot loader
entries for this installation were first added. When not set, the current value of
<cite>machine-id(5)</cite> will be used.</para></listitem>
<citerefentry><refentrytitle>machine-id</refentrytitle><manvolnum>5</manvolnum></citerefentry>
will be used.</para></listitem>
</varlistentry>
</variablelist>
</refsect1>

View File

@ -80,7 +80,7 @@
<para><function>sd_journal_next_skip()</function> and
<function>sd_journal_previous_skip()</function> advance/set back the read pointer by multiple
entries at once, as specified in the <varname>skip</varname> parameter. The <varname>skip</varname>
parameter must be less than or equal to 2147483647 (2^31-1).</para>
parameter must be less than or equal to 2147483647 (2³¹-1).</para>
<para>The journal is strictly ordered by reception time, and hence
advancing to the next entry guarantees that the entry then

View File

@ -71,7 +71,7 @@
</para>
<para>Log data collected by the journal is primarily text-based but can also include binary data where
necessary. Individual fields making up a log record stored in the journal may be up to 2^64-1 bytes in size.</para>
necessary. Individual fields making up a log record stored in the journal may be up to 2⁶⁴-1 bytes in size.</para>
<para>The journal service stores log data either persistently below <filename>/var/log/journal</filename> or in a
volatile way below <filename>/run/log/journal/</filename> (in the latter case it is lost at reboot). By default, log

View File

@ -384,10 +384,10 @@
numbers, which could either result in an incorrect value of the <varname>ID_NET_NAME_SLOT</varname>
property or none at all.</para>
<para>Some firmware and hypervisor implementations report unreasonable high numbers for the onboard
<para>Some firmware and hypervisor implementations report unreasonably high numbers for the onboard
index. To prevent the generation of bogus onbard interface names, index numbers greater than 16381
(2^14-1) were ignored. For s390 PCI devices index values up to 65535 (2^16-1) are valid. To account
for that, the limit is increased to now 65535.</para>
(2¹⁴-1) were ignored. For s390 PCI devices index values up to 65535 (2¹⁶-1) are valid. To account
for that, the limit was increased to 65535.</para>
<para>The udev rule <varname>NAME=</varname> replaces <literal>:</literal>,
<literal>/</literal>, and <literal>%</literal> with an underscore (<literal>_</literal>), and

View File

@ -60,6 +60,10 @@ static inline const char *empty_to_null(const char *p) {
return isempty(p) ? NULL : p;
}
static inline const char *empty_to_na(const char *p) {
return isempty(p) ? "n/a" : p;
}
static inline const char *empty_to_dash(const char *str) {
return isempty(str) ? "-" : str;
}

View File

@ -139,7 +139,7 @@ int config_parse_ipoib_pkey(
rvalue);
return 0;
}
if (u == 0 || u == 0x8000) {
if (IN_SET(u, 0, 0x8000)) {
log_syntax(unit, LOG_WARNING, filename, line, 0,
"IPoIB pkey cannot be 0 nor 0x8000, ignoring assignment: %s",
rvalue);

View File

@ -358,10 +358,9 @@ int config_parse_address_generation_type(
addr = addr_alloc;
}
} else if (*addr == ',') {
comma = addr;
addr = NULL;
} else if (*addr == '\0') {
} else if (*addr == ',')
comma = TAKE_PTR(addr);
else if (*addr == '\0') {
comma = NULL;
addr = NULL;
} else {

View File

@ -1528,7 +1528,7 @@ static int dhcp4_configure(Link *link) {
return log_link_debug_errno(link, r, "DHCPv4 CLIENT: Failed to set max attempts: %m");
}
if (link->network->dhcp_ip_service_type > 0) {
if (link->network->dhcp_ip_service_type >= 0) {
r = sd_dhcp_client_set_service_type(link->dhcp_client, link->network->dhcp_ip_service_type);
if (r < 0)
return log_link_debug_errno(link, r, "DHCPv4 CLIENT: Failed to set IP service type: %m");

View File

@ -176,27 +176,33 @@ static int dev_pci_onboard(sd_device *dev, const LinkInfo *info, NetNames *names
assert(names);
/* ACPI _DSM — device specific method for naming a PCI or PCI Express device */
if (sd_device_get_sysattr_value(names->pcidev, "acpi_index", &attr) < 0) {
if (sd_device_get_sysattr_value(names->pcidev, "acpi_index", &attr) >= 0)
log_device_debug(names->pcidev, "acpi_index=%s", attr);
else {
/* SMBIOS type 41 — Onboard Devices Extended Information */
r = sd_device_get_sysattr_value(names->pcidev, "index", &attr);
if (r < 0)
return r;
log_device_debug(names->pcidev, "index=%s", attr);
}
r = safe_atolu(attr, &idx);
if (r < 0)
return r;
return log_device_debug_errno(names->pcidev, r,
"Failed to parse onboard index \"%s\": %m", attr);
if (idx == 0 && !naming_scheme_has(NAMING_ZERO_ACPI_INDEX))
return -EINVAL;
return log_device_debug_errno(names->pcidev, SYNTHETIC_ERRNO(EINVAL),
"Naming scheme does not allow onboard index==0.");
if (!is_valid_onboard_index(idx))
return -ENOENT;
return log_device_debug_errno(names->pcidev, SYNTHETIC_ERRNO(ENOENT),
"Not a valid onboard index: %lu", idx);
/* kernel provided port index for multiple ports on a single PCI function */
if (sd_device_get_sysattr_value(dev, "dev_port", &attr) >= 0) {
r = safe_atolu_full(attr, 10, &dev_port);
if (r < 0)
log_device_debug_errno(dev, r, "Failed to parse dev_port, ignoring: %m");
log_device_debug(dev, "dev_port=%lu", dev_port);
}
s = names->pci_onboard;
@ -209,8 +215,13 @@ static int dev_pci_onboard(sd_device *dev, const LinkInfo *info, NetNames *names
l = strpcpyf(&s, l, "d%lu", dev_port);
if (l == 0)
names->pci_onboard[0] = '\0';
log_device_debug(dev, "Onboard index identifier: index=%lu phys_port=%s dev_port=%lu → %s",
idx, strempty(info->phys_port_name), dev_port,
empty_to_na(names->pci_slot));
if (sd_device_get_sysattr_value(names->pcidev, "label", &names->pci_onboard_label) < 0)
if (sd_device_get_sysattr_value(names->pcidev, "label", &names->pci_onboard_label) >= 0)
log_device_debug(dev, "Onboard label from PCI device: %s", names->pci_onboard_label);
else
names->pci_onboard_label = NULL;
return 0;
@ -261,7 +272,10 @@ static bool is_pci_bridge(sd_device *dev) {
return false;
/* PCI device subclass 04 corresponds to PCI bridge */
return strneq(p + 2, "04", 2);
bool b = strneq(p + 2, "04", 2);
if (b)
log_device_debug(dev, "Device is a PCI bridge.");
return b;
}
static int parse_hotplug_slot_from_function_id(sd_device *dev, const char *slots, uint32_t *ret) {
@ -326,9 +340,12 @@ static int dev_pci_slot(sd_device *dev, const LinkInfo *info, NetNames *names) {
r = sd_device_get_sysname(names->pcidev, &sysname);
if (r < 0)
return r;
return log_device_debug_errno(names->pcidev, r, "Failed to get sysname: %m");
if (sscanf(sysname, "%x:%x:%x.%u", &domain, &bus, &slot, &func) != 4)
r = sscanf(sysname, "%x:%x:%x.%u", &domain, &bus, &slot, &func);
log_device_debug(dev, "Parsing slot information from PCI device sysname \"%s\": %s",
sysname, r == 4 ? "success" : "failure");
if (r != 4)
return -ENOENT;
if (naming_scheme_has(NAMING_NPAR_ARI) &&
@ -340,6 +357,8 @@ static int dev_pci_slot(sd_device *dev, const LinkInfo *info, NetNames *names) {
/* kernel provided port index for multiple ports on a single PCI function */
if (sd_device_get_sysattr_value(dev, "dev_port", &attr) >= 0) {
log_device_debug(dev, "dev_port=%s", attr);
r = safe_atolu_full(attr, 10, &dev_port);
if (r < 0)
log_device_debug_errno(dev, r, "Failed to parse attribute dev_port, ignoring: %m");
@ -350,6 +369,8 @@ static int dev_pci_slot(sd_device *dev, const LinkInfo *info, NetNames *names) {
if (dev_port == 0 &&
info->iftype == ARPHRD_INFINIBAND &&
sd_device_get_sysattr_value(dev, "dev_id", &attr) >= 0) {
log_device_debug(dev, "dev_id=%s", attr);
r = safe_atolu_full(attr, 10, &dev_port);
if (r < 0)
log_device_debug_errno(dev, r, "Failed to parse attribute dev_id, ignoring: %m");
@ -372,20 +393,26 @@ static int dev_pci_slot(sd_device *dev, const LinkInfo *info, NetNames *names) {
if (l == 0)
names->pci_path[0] = '\0';
log_device_debug(dev, "PCI path identifier: domain=%u bus=%u slot=%u func=%u phys_port=%s dev_port=%lu → %s",
domain, bus, slot, func, strempty(info->phys_port_name), dev_port,
empty_to_na(names->pci_path));
/* ACPI _SUN — slot user number */
r = sd_device_new_from_subsystem_sysname(&pci, "subsystem", "pci");
if (r < 0)
return r;
return log_debug_errno(r, "sd_device_new_from_subsystem_sysname failed: %m");
r = sd_device_get_syspath(pci, &syspath);
if (r < 0)
return r;
return log_device_debug_errno(pci, r, "sd_device_get_syspath failed: %m");
if (!snprintf_ok(slots, sizeof slots, "%s/slots", syspath))
return -ENAMETOOLONG;
return log_device_debug_errno(dev, SYNTHETIC_ERRNO(ENAMETOOLONG),
"Cannot access %s/slots: %m", syspath);
dir = opendir(slots);
if (!dir)
return -errno;
return log_device_debug_errno(dev, errno, "Cannot access %s: %m", slots);
hotplug_slot_dev = names->pcidev;
while (hotplug_slot_dev) {
@ -423,8 +450,10 @@ static int dev_pci_slot(sd_device *dev, const LinkInfo *info, NetNames *names) {
* slot index if the device is a PCI bridge, because it can have other child
* devices that will try to claim the same index and that would create name
* collision. */
if (naming_scheme_has(NAMING_BRIDGE_NO_SLOT) && is_pci_bridge(hotplug_slot_dev))
if (naming_scheme_has(NAMING_BRIDGE_NO_SLOT) && is_pci_bridge(hotplug_slot_dev)) {
log_device_debug(dev, "Not using slot information because the PCI device is a bridge.");
return 0;
}
break;
}
@ -440,16 +469,20 @@ static int dev_pci_slot(sd_device *dev, const LinkInfo *info, NetNames *names) {
s = names->pci_slot;
l = sizeof(names->pci_slot);
if (domain > 0)
l = strpcpyf(&s, l, "P%d", domain);
l = strpcpyf(&s, l, "P%u", domain);
l = strpcpyf(&s, l, "s%"PRIu32, hotplug_slot);
if (func > 0 || is_pci_multifunction(names->pcidev))
l = strpcpyf(&s, l, "f%d", func);
l = strpcpyf(&s, l, "f%u", func);
if (!isempty(info->phys_port_name))
l = strpcpyf(&s, l, "n%s", info->phys_port_name);
else if (dev_port > 0)
l = strpcpyf(&s, l, "d%lu", dev_port);
if (l == 0)
names->pci_slot[0] = '\0';
log_device_debug(dev, "Slot identifier: domain=%u slot=%"PRIu32" func=%u phys_port=%s dev_port=%lu → %s",
domain, hotplug_slot, func, strempty(info->phys_port_name), dev_port,
empty_to_na(names->pci_slot));
}
return 0;
@ -464,13 +497,14 @@ static int names_vio(sd_device *dev, NetNames *names) {
/* check if our direct parent is a VIO device with no other bus in-between */
r = sd_device_get_parent(dev, &parent);
if (r < 0)
return r;
return log_device_debug_errno(dev, r, "sd_device_get_parent failed: %m");
r = sd_device_get_subsystem(parent, &subsystem);
if (r < 0)
return r;
return log_device_debug_errno(parent, r, "sd_device_get_subsystem failed: %m");
if (!streq("vio", subsystem))
return -ENOENT;
log_device_debug(dev, "Parent device is in the vio subsystem.");
/* The devices' $DEVPATH number is tied to (virtual) hardware (slot id
* selected in the HMC), thus this provides a reliable naming (e.g.
@ -478,19 +512,23 @@ static int names_vio(sd_device *dev, NetNames *names) {
* there should only ever be one bus, and then remove leading zeros. */
r = sd_device_get_syspath(dev, &syspath);
if (r < 0)
return r;
return log_device_debug_errno(dev, r, "sd_device_get_syspath failed: %m");
if (sscanf(syspath, "/sys/devices/vio/%4x%4x/net/eth%u", &busid, &slotid, &ethid) != 3)
r = sscanf(syspath, "/sys/devices/vio/%4x%4x/net/eth%u", &busid, &slotid, &ethid);
log_device_debug(dev, "Parsing vio slot information from syspath \"%s\": %s",
syspath, r == 3 ? "success" : "failure");
if (r != 3)
return -EINVAL;
xsprintf(names->vio_slot, "v%u", slotid);
names->type = NET_VIO;
log_device_debug(dev, "Vio slot identifier: slotid=%u → %s", slotid, names->vio_slot);
return 0;
}
#define _PLATFORM_TEST "/sys/devices/platform/vvvvPPPP"
#define _PLATFORM_PATTERN4 "/sys/devices/platform/%4s%4x:%2x/net/eth%u"
#define _PLATFORM_PATTERN3 "/sys/devices/platform/%3s%4x:%2x/net/eth%u"
#define PLATFORM_TEST "/sys/devices/platform/vvvvPPPP"
#define PLATFORM_PATTERN4 "/sys/devices/platform/%4s%4x:%2x/net/eth%u"
#define PLATFORM_PATTERN3 "/sys/devices/platform/%3s%4x:%2x/net/eth%u"
static int names_platform(sd_device *dev, NetNames *names, bool test) {
sd_device *parent;
@ -502,29 +540,32 @@ static int names_platform(sd_device *dev, NetNames *names, bool test) {
/* check if our direct parent is a platform device with no other bus in-between */
r = sd_device_get_parent(dev, &parent);
if (r < 0)
return r;
return log_device_debug_errno(dev, r, "sd_device_get_parent failed: %m");
r = sd_device_get_subsystem(parent, &subsystem);
if (r < 0)
return r;
return log_device_debug_errno(parent, r, "sd_device_get_subsystem failed: %m");
if (!streq("platform", subsystem))
return -ENOENT;
log_device_debug(dev, "Parent device is in the platform subsystem.");
r = sd_device_get_syspath(dev, &syspath);
if (r < 0)
return r;
return log_device_debug_errno(dev, r, "sd_device_get_syspath failed: %m");
/* syspath is too short, to have a valid ACPI instance */
if (strlen(syspath) < sizeof _PLATFORM_TEST)
return -EINVAL;
if (strlen(syspath) < STRLEN(PLATFORM_TEST) + 1)
return log_device_debug_errno(dev, SYNTHETIC_ERRNO(EINVAL),
"Syspath \"%s\" is too short for a valid ACPI instance.",
syspath);
/* Vendor ID can be either PNP ID (3 chars A-Z) or ACPI ID (4 chars A-Z and numerals) */
if (syspath[sizeof _PLATFORM_TEST - 1] == ':') {
pattern = _PLATFORM_PATTERN4;
if (syspath[STRLEN(PLATFORM_TEST)] == ':') {
pattern = PLATFORM_PATTERN4;
validchars = UPPERCASE_LETTERS DIGITS;
} else {
pattern = _PLATFORM_PATTERN3;
pattern = PLATFORM_PATTERN3;
validchars = UPPERCASE_LETTERS;
}
@ -533,17 +574,23 @@ static int names_platform(sd_device *dev, NetNames *names, bool test) {
* The Vendor (3 or 4 char), followed by hexadecimal model number : instance id. */
DISABLE_WARNING_FORMAT_NONLITERAL;
if (sscanf(syspath, pattern, vendor, &model, &instance, &ethid) != 4)
return -EINVAL;
r = sscanf(syspath, pattern, vendor, &model, &instance, &ethid);
REENABLE_WARNING;
log_device_debug(dev, "Parsing platform device information from syspath \"%s\": %s",
syspath, r == 4 ? "success" : "failure");
if (r != 4)
return -EINVAL;
if (!in_charset(vendor, validchars))
return -ENOENT;
return log_device_debug_errno(dev, SYNTHETIC_ERRNO(ENOENT),
"Platform vendor contains invalid characters: %s", vendor);
ascii_strlower(vendor);
xsprintf(names->platform_path, "a%s%xi%u", vendor, model, instance);
names->type = NET_PLATFORM;
log_device_debug(dev, "Platform identifier: vendor=%s model=%u instance=%u → %s",
vendor, model, instance, names->platform_path);
return 0;
}
@ -619,28 +666,31 @@ static int names_usb(sd_device *dev, NetNames *names) {
r = sd_device_get_parent_with_subsystem_devtype(dev, "usb", "usb_interface", &usbdev);
if (r < 0)
return r;
return log_device_debug_errno(dev, r, "sd_device_get_parent_with_subsystem_devtype() failed: %m");
r = sd_device_get_sysname(usbdev, &sysname);
if (r < 0)
return r;
return log_device_debug_errno(usbdev, r, "sd_device_get_sysname() failed: %m");
/* get USB port number chain, configuration, interface */
strscpy(name, sizeof(name), sysname);
s = strchr(name, '-');
if (!s)
return -EINVAL;
return log_device_debug_errno(usbdev, SYNTHETIC_ERRNO(EINVAL),
"sysname \"%s\" does not have '-' in the expected place.", sysname);
ports = s+1;
s = strchr(ports, ':');
if (!s)
return -EINVAL;
return log_device_debug_errno(usbdev, SYNTHETIC_ERRNO(EINVAL),
"sysname \"%s\" does not have ':' in the expected place.", sysname);
s[0] = '\0';
config = s+1;
s = strchr(config, '.');
if (!s)
return -EINVAL;
return log_device_debug_errno(usbdev, SYNTHETIC_ERRNO(EINVAL),
"sysname \"%s\" does not have '.' in the expected place.", sysname);
s[0] = '\0';
interf = s+1;
@ -659,8 +709,10 @@ static int names_usb(sd_device *dev, NetNames *names) {
if (!streq(interf, "0"))
l = strpcpyl(&s, sizeof(names->usb_ports), "i", interf, NULL);
if (l == 0)
return -ENAMETOOLONG;
return log_device_debug_errno(dev, SYNTHETIC_ERRNO(ENAMETOOLONG),
"Generated USB name would be too long.");
log_device_debug(dev, "USB name identifier: ports=%.*s config=%s interface=%s → %s",
(int) strlen(ports), sysname + (ports - name), config, interf, names->usb_ports);
names->type = NET_USB;
return 0;
}
@ -676,28 +728,31 @@ static int names_bcma(sd_device *dev, NetNames *names) {
r = sd_device_get_parent_with_subsystem_devtype(dev, "bcma", NULL, &bcmadev);
if (r < 0)
return r;
return log_device_debug_errno(dev, r, "sd_device_get_parent_with_subsystem_devtype() failed: %m");
r = sd_device_get_sysname(bcmadev, &sysname);
if (r < 0)
return r;
return log_device_debug_errno(dev, r, "sd_device_get_sysname() failed: %m");
/* bus num:core num */
if (sscanf(sysname, "bcma%*u:%u", &core) != 1)
r = sscanf(sysname, "bcma%*u:%u", &core);
log_device_debug(dev, "Parsing bcma device information from sysname \"%s\": %s",
sysname, r == 1 ? "success" : "failure");
if (r != 1)
return -EINVAL;
/* suppress the common core == 0 */
if (core > 0)
xsprintf(names->bcma_core, "b%u", core);
names->type = NET_BCMA;
log_device_debug(dev, "BCMA core identifier: core=%u → \"%s\"", core, names->bcma_core);
return 0;
}
static int names_ccw(sd_device *dev, NetNames *names) {
sd_device *cdev;
const char *bus_id, *subsys;
size_t bus_id_len;
size_t bus_id_start;
size_t bus_id_start, bus_id_len;
int r;
assert(dev);
@ -706,7 +761,7 @@ static int names_ccw(sd_device *dev, NetNames *names) {
/* Retrieve the associated CCW device */
r = sd_device_get_parent(dev, &cdev);
if (r < 0)
return r;
return log_device_debug_errno(dev, r, "sd_device_get_parent() failed: %m");
/* skip virtio subsystem if present */
cdev = skip_virtio(cdev);
@ -715,11 +770,12 @@ static int names_ccw(sd_device *dev, NetNames *names) {
r = sd_device_get_subsystem(cdev, &subsys);
if (r < 0)
return r;
return log_device_debug_errno(cdev, r, "sd_device_get_subsystem() failed: %m");
/* Network devices are either single or grouped CCW devices */
if (!STR_IN_SET(subsys, "ccwgroup", "ccw"))
return -ENOENT;
log_device_debug(dev, "Device is CCW.");
/* Retrieve bus-ID of the CCW device. The bus-ID uniquely
* identifies the network device on the Linux on System z channel
@ -727,14 +783,15 @@ static int names_ccw(sd_device *dev, NetNames *names) {
*/
r = sd_device_get_sysname(cdev, &bus_id);
if (r < 0)
return r;
return log_device_debug_errno(cdev, r, "Failed to get sysname: %m");
/* Check the length of the bus-ID. Rely on the fact that the kernel provides a correct bus-ID;
* alternatively, improve this check and parse and verify each bus-ID part...
*/
bus_id_len = strlen(bus_id);
if (!IN_SET(bus_id_len, 8, 9))
return -EINVAL;
return log_device_debug_errno(cdev, SYNTHETIC_ERRNO(EINVAL),
"Invalid bus_id: %s", bus_id);
/* Strip leading zeros from the bus id for aesthetic purposes. This
* keeps the ccw names stable, yet much shorter in general case of
@ -745,9 +802,11 @@ static int names_ccw(sd_device *dev, NetNames *names) {
bus_id += bus_id_start < bus_id_len ? bus_id_start : bus_id_len - 1;
/* Store the CCW bus-ID for use as network device name */
if (snprintf_ok(names->ccw_busid, sizeof(names->ccw_busid), "c%s", bus_id))
if (!snprintf_ok(names->ccw_busid, sizeof(names->ccw_busid), "c%s", bus_id))
return log_device_debug_errno(dev, SYNTHETIC_ERRNO(ENAMETOOLONG),
"Generated CCW name would be too long.");
names->type = NET_CCW;
log_device_debug(dev, "CCW identifier: ccw_busid=%s → \"%s\"", bus_id, names->ccw_busid);
return 0;
}
@ -762,19 +821,24 @@ static int names_mac(sd_device *dev, const LinkInfo *info) {
/* The persistent part of a hardware address of an InfiniBand NIC is 8 bytes long. We cannot
* fit this much in an iface name.
* TODO: but it can be used as alternative names?? */
if (info->iftype == ARPHRD_INFINIBAND || info->hw_addr.length != 6)
return -EOPNOTSUPP;
if (info->iftype == ARPHRD_INFINIBAND)
return log_device_debug_errno(dev, SYNTHETIC_ERRNO(EOPNOTSUPP),
"Not generating MAC name for infiniband device.");
if (info->hw_addr.length != 6)
return log_device_debug_errno(dev, SYNTHETIC_ERRNO(EOPNOTSUPP),
"Not generating MAC name for device with MAC address of length %zu.",
info->hw_addr.length);
/* check for NET_ADDR_PERM, skip random MAC addresses */
r = sd_device_get_sysattr_value(dev, "addr_assign_type", &s);
if (r < 0)
return r;
return log_device_debug_errno(dev, r, "Failed to read addr_assign_type: %m");
r = safe_atou(s, &i);
if (r < 0)
return r;
return log_device_debug_errno(dev, r, "Failed to parse addr_assign_type: %m");
if (i != NET_ADDR_PERM)
return -EINVAL;
return log_device_debug_errno(dev, SYNTHETIC_ERRNO(EINVAL),
"addr_assign_type=%d, MAC address is not permanent.", i);
return 0;
}
@ -956,6 +1020,8 @@ static int builtin_net_id(sd_device *dev, sd_netlink **rtnl, int argc, char *arg
xsprintf(str, "%s%s", prefix, HW_ADDR_TO_STR_FULL(&info.hw_addr, HW_ADDR_TO_STRING_NO_COLON));
udev_builtin_add_property(dev, test, "ID_NET_NAME_MAC", str);
log_device_debug(dev, "MAC address identifier: hw_addr=%s → %s",
HW_ADDR_TO_STR(&info.hw_addr), str + strlen(prefix));
ieee_oui(dev, &info, test);
}

View File

@ -5,6 +5,6 @@ Description=Create a lot of memory pressure
[Service]
# A VERY small memory.high will cause the script (trying to use a lot of memory)
# to throttle and be put under heavy pressure.
MemoryHigh=1M
MemoryHigh=5M
Slice=testsuite-55-workload.slice
ExecStart=/usr/lib/systemd/tests/testdata/units/testsuite-55-slowgrowth.sh

View File

@ -3,5 +3,6 @@
Description=No memory pressure
[Service]
MemoryHigh=3M
Slice=testsuite-55-workload.slice
ExecStart=sleep infinity

View File

@ -3,6 +3,6 @@
Description=Create some memory pressure
[Service]
MemoryHigh=2M
MemoryHigh=6M
Slice=testsuite-55-workload.slice
ExecStart=/usr/lib/systemd/tests/testdata/units/testsuite-55-slowgrowth.sh