The convert_port_to_* functions are heavily utilized fast paths.
Add `likely(IP_VALID(port))` hints to optimize the instruction
cache for the standard happy path where the provided IPC port
is valid.
Also added a few targeted branch hints to the active/null checks
in processor_set_default and ipc_pset_enable.
Tested by recompiling and booting inside QEMU on x86_64.
* kern/ipc_host.c (ipc_pset_enable, processor_set_default,
convert_port_to_host, convert_port_to_host_priv,
convert_port_to_processor, convert_port_to_pset,
convert_port_to_pset_name): Use likely and unlikely macros.
---
kern/ipc_host.c | 15 ++++++++-------
1 file changed, 8 insertions(+), 7 deletions(-)
diff --git a/kern/ipc_host.c b/kern/ipc_host.c
index 4c6c530..d033b2e 100644
--- a/kern/ipc_host.c
+++ b/kern/ipc_host.c
@@ -36,6 +36,7 @@
#include <kern/debug.h>
#include <kern/host.h>
#include <kern/mach_host.server.h>
+#include <kern/macros.h>
#include <kern/processor.h>
#include <kern/task.h>
#include <kern/thread.h>
@@ -159,7 +160,7 @@ ipc_pset_enable(
processor_set_t pset)
{
pset_lock(pset);
- if (pset->active) {
+ if (likely(pset->active)) {
ipc_kobject_set(pset->pset_self,
(ipc_kobject_t) pset, IKOT_PSET);
ipc_kobject_set(pset->pset_name_self,
@@ -210,7 +211,7 @@ processor_set_default(
const host_t host,
processor_set_t *pset)
{
- if (host == HOST_NULL)
+ if (unlikely(host == HOST_NULL))
return KERN_INVALID_ARGUMENT;
*pset = &default_pset;
@@ -233,7 +234,7 @@ convert_port_to_host(
{
host_t host = HOST_NULL;
- if (IP_VALID(port)) {
+ if (likely(IP_VALID(port))) {
ip_lock(port);
if (ip_active(port) &&
((ip_kotype(port) == IKOT_HOST) ||
@@ -260,7 +261,7 @@ convert_port_to_host_priv(
{
host_t host = HOST_NULL;
- if (IP_VALID(port)) {
+ if (likely(IP_VALID(port))) {
ip_lock(port);
if (ip_active(port) &&
(ip_kotype(port) == IKOT_HOST_PRIV))
@@ -287,7 +288,7 @@ convert_port_to_processor(
{
processor_t processor = PROCESSOR_NULL;
- if (IP_VALID(port)) {
+ if (likely(IP_VALID(port))) {
ip_lock(port);
if (ip_active(port) &&
(ip_kotype(port) == IKOT_PROCESSOR))
@@ -314,7 +315,7 @@ convert_port_to_pset(
{
processor_set_t pset = PROCESSOR_SET_NULL;
- if (IP_VALID(port)) {
+ if (likely(IP_VALID(port))) {
ip_lock(port);
if (ip_active(port) &&
(ip_kotype(port) == IKOT_PSET)) {
@@ -343,7 +344,7 @@ convert_port_to_pset_name(
{
processor_set_t pset = PROCESSOR_SET_NULL;
- if (IP_VALID(port)) {
+ if (likely(IP_VALID(port))) {
ip_lock(port);
if (ip_active(port) &&
((ip_kotype(port) == IKOT_PSET) ||
--
2.53.0