Re: Push kernel lock into pru_control()

2022-11-14 Thread Vitaliy Makkoveev
> On 10 Nov 2022, at 13:54, Klemens Nanni  wrote:
> 
> Purely mechanical, then in6_control() and in_control() can be pushed
> further individually.
> 
> Feedback? OK?

SS_PRIV is immutable, no reason to check it with kernel lock held.

> ---
> sys/kern/sys_socket.c | 2 --
> sys/netinet/in.c  | 4 
> sys/netinet6/in6.c| 4 
> 3 files changed, 8 insertions(+), 2 deletions(-)
> 
> diff --git a/sys/kern/sys_socket.c b/sys/kern/sys_socket.c
> index b07119b71cd..e42dd948006 100644
> --- a/sys/kern/sys_socket.c
> +++ b/sys/kern/sys_socket.c
> @@ -134,9 +134,7 @@ soo_ioctl(struct file *fp, u_long cmd, caddr_t data, 
> struct proc *p)
>   }
>   if (IOCGROUP(cmd) == 'r')
>   return (EOPNOTSUPP);
> - KERNEL_LOCK();
>   error = pru_control(so, cmd, data, NULL);
> - KERNEL_UNLOCK();
>   break;
>   }
> 
> diff --git a/sys/netinet/in.c b/sys/netinet/in.c
> index cd8289d2e89..990aaf84c8a 100644
> --- a/sys/netinet/in.c
> +++ b/sys/netinet/in.c
> @@ -202,6 +202,8 @@ in_control(struct socket *so, u_long cmd, caddr_t data, 
> struct ifnet *ifp)
>   int privileged;
>   int error;
> 
> + KERNEL_LOCK();
> +
>   privileged = 0;
>   if ((so->so_state & SS_PRIV) != 0)
>   privileged++;
> @@ -218,6 +220,8 @@ in_control(struct socket *so, u_long cmd, caddr_t data, 
> struct ifnet *ifp)
>   break;
>   }
> 
> + KERNEL_UNLOCK();
> +
>   return error;
> }
> 
> diff --git a/sys/netinet6/in6.c b/sys/netinet6/in6.c
> index 900456fff1a..a51ca2fa5a4 100644
> --- a/sys/netinet6/in6.c
> +++ b/sys/netinet6/in6.c
> @@ -199,6 +199,8 @@ in6_control(struct socket *so, u_long cmd, caddr_t data, 
> struct ifnet *ifp)
>   int privileged;
>   int error;
> 
> + KERNEL_LOCK();
> +
>   privileged = 0;
>   if ((so->so_state & SS_PRIV) != 0)
>   privileged++;
> @@ -215,6 +217,8 @@ in6_control(struct socket *so, u_long cmd, caddr_t data, 
> struct ifnet *ifp)
>   break;
>   }
> 
> + KERNEL_UNLOCK();
> +
>   return error;
> }
> 
> -- 
> 2.38.1
> 



Push kernel lock into pru_control()

2022-11-10 Thread Klemens Nanni
Purely mechanical, then in6_control() and in_control() can be pushed
further individually.

Feedback? OK?
---
 sys/kern/sys_socket.c | 2 --
 sys/netinet/in.c  | 4 
 sys/netinet6/in6.c| 4 
 3 files changed, 8 insertions(+), 2 deletions(-)

diff --git a/sys/kern/sys_socket.c b/sys/kern/sys_socket.c
index b07119b71cd..e42dd948006 100644
--- a/sys/kern/sys_socket.c
+++ b/sys/kern/sys_socket.c
@@ -134,9 +134,7 @@ soo_ioctl(struct file *fp, u_long cmd, caddr_t data, struct 
proc *p)
}
if (IOCGROUP(cmd) == 'r')
return (EOPNOTSUPP);
-   KERNEL_LOCK();
error = pru_control(so, cmd, data, NULL);
-   KERNEL_UNLOCK();
break;
}
 
diff --git a/sys/netinet/in.c b/sys/netinet/in.c
index cd8289d2e89..990aaf84c8a 100644
--- a/sys/netinet/in.c
+++ b/sys/netinet/in.c
@@ -202,6 +202,8 @@ in_control(struct socket *so, u_long cmd, caddr_t data, 
struct ifnet *ifp)
int privileged;
int error;
 
+   KERNEL_LOCK();
+
privileged = 0;
if ((so->so_state & SS_PRIV) != 0)
privileged++;
@@ -218,6 +220,8 @@ in_control(struct socket *so, u_long cmd, caddr_t data, 
struct ifnet *ifp)
break;
}
 
+   KERNEL_UNLOCK();
+
return error;
 }
 
diff --git a/sys/netinet6/in6.c b/sys/netinet6/in6.c
index 900456fff1a..a51ca2fa5a4 100644
--- a/sys/netinet6/in6.c
+++ b/sys/netinet6/in6.c
@@ -199,6 +199,8 @@ in6_control(struct socket *so, u_long cmd, caddr_t data, 
struct ifnet *ifp)
int privileged;
int error;
 
+   KERNEL_LOCK();
+
privileged = 0;
if ((so->so_state & SS_PRIV) != 0)
privileged++;
@@ -215,6 +217,8 @@ in6_control(struct socket *so, u_long cmd, caddr_t data, 
struct ifnet *ifp)
break;
}
 
+   KERNEL_UNLOCK();
+
return error;
 }
 
-- 
2.38.1