[PATCH 1/2] drivers/net: drop socket-specific module refcounting
Jan Kiszka
jan.kiszka at siemens.com
Fri Aug 30 18:59:17 CEST 2019
On 30.08.19 18:04, Philippe Gerum wrote:
> RTDM already refcounts rtdm_fd descriptors to prevent unsafe module
> unloading while connections are still active. We can remove the legacy
> module refcounting done by the generic socket code, since every socket
> is covered by an RTDM file descriptor.
>
> Signed-off-by: Philippe Gerum <rpm at xenomai.org>
> ---
> .../drivers/net/stack/include/rtnet_socket.h | 15 +++--------
> kernel/drivers/net/stack/ipv4/icmp.c | 4 +--
> kernel/drivers/net/stack/socket.c | 27 ++++++-------------
> 3 files changed, 13 insertions(+), 33 deletions(-)
>
> diff --git a/kernel/drivers/net/stack/include/rtnet_socket.h b/kernel/drivers/net/stack/include/rtnet_socket.h
> index 351e62c77..0d8850c7f 100644
> --- a/kernel/drivers/net/stack/include/rtnet_socket.h
> +++ b/kernel/drivers/net/stack/include/rtnet_socket.h
> @@ -76,8 +76,6 @@ struct rtsocket {
> int ifindex;
> } packet;
> } prot;
> -
> - struct module *owner;
> };
>
>
> @@ -97,10 +95,7 @@ int rtnet_put_arg(struct rtdm_fd *fd, void *dst,
> #define rt_socket_dereference(sock) \
> rtdm_fd_unlock(rt_socket_fd(sock))
>
> -int __rt_socket_init(struct rtdm_fd *fd, unsigned short protocol,
> - struct module *module);
> -#define rt_socket_init(fd, proto) \
> - __rt_socket_init(fd, proto, THIS_MODULE)
> +int rt_socket_init(struct rtdm_fd *fd, unsigned short protocol);
>
> void rt_socket_cleanup(struct rtdm_fd *fd);
> int rt_socket_common_ioctl(struct rtdm_fd *fd, int request, void __user *arg);
> @@ -110,16 +105,12 @@ int rt_socket_select_bind(struct rtdm_fd *fd,
> enum rtdm_selecttype type,
> unsigned fd_index);
>
> -int __rt_bare_socket_init(struct rtdm_fd *fd, unsigned short protocol,
> - unsigned int priority, unsigned int pool_size,
> - struct module *module);
> -#define rt_bare_socket_init(fd, proto, prio, pool_sz) \
> - __rt_bare_socket_init(fd, proto, prio, pool_sz, THIS_MODULE)
> +int rt_bare_socket_init(struct rtdm_fd *fd, unsigned short protocol,
> + unsigned int priority, unsigned int pool_size);
>
> static inline void rt_bare_socket_cleanup(struct rtsocket *sock)
> {
> rtskb_pool_release(&sock->skb_pool);
> - module_put(sock->owner);
> }
>
> #endif /* __RTNET_SOCKET_H_ */
> diff --git a/kernel/drivers/net/stack/ipv4/icmp.c b/kernel/drivers/net/stack/ipv4/icmp.c
> index 58d97cd7f..a944ef6b7 100644
> --- a/kernel/drivers/net/stack/ipv4/icmp.c
> +++ b/kernel/drivers/net/stack/ipv4/icmp.c
> @@ -526,8 +526,8 @@ void __init rt_icmp_init(void)
> {
> int skbs;
>
> - skbs = __rt_bare_socket_init(icmp_fd, IPPROTO_ICMP, RT_ICMP_PRIO,
> - ICMP_REPLY_POOL_SIZE, NULL);
> + skbs = rt_bare_socket_init(icmp_fd, IPPROTO_ICMP, RT_ICMP_PRIO,
> + ICMP_REPLY_POOL_SIZE);
> BUG_ON(skbs < 0);
> if (skbs < ICMP_REPLY_POOL_SIZE)
> printk("RTnet: allocated only %d icmp rtskbs\n", skbs);
> diff --git a/kernel/drivers/net/stack/socket.c b/kernel/drivers/net/stack/socket.c
> index ce4e4cb46..747db052f 100644
> --- a/kernel/drivers/net/stack/socket.c
> +++ b/kernel/drivers/net/stack/socket.c
> @@ -50,36 +50,27 @@ MODULE_PARM_DESC(socket_rtskbs, "Default number of realtime socket buffers in so
> * internal socket functions *
> ************************************************************************/
>
> -int __rt_bare_socket_init(struct rtdm_fd *fd, unsigned short protocol,
> - unsigned int priority, unsigned int pool_size,
> - struct module *module)
> +int rt_bare_socket_init(struct rtdm_fd *fd, unsigned short protocol,
> + unsigned int priority, unsigned int pool_size)
> {
> struct rtsocket *sock = rtdm_fd_to_private(fd);
> int err;
>
> - err = try_module_get(module);
> - if (!err)
> - return -EAFNOSUPPORT;
> -
> err = rtskb_pool_init(&sock->skb_pool, pool_size, NULL, fd);
> - if (err < 0) {
> - module_put(module);
> + if (err < 0)
> return err;
> - }
>
> sock->protocol = protocol;
> sock->priority = priority;
> - sock->owner = module;
>
> return err;
> }
> -EXPORT_SYMBOL_GPL(__rt_bare_socket_init);
> +EXPORT_SYMBOL_GPL(rt_bare_socket_init);
>
> /***
> * rt_socket_init - initialises a new socket structure
> */
> -int __rt_socket_init(struct rtdm_fd *fd, unsigned short protocol,
> - struct module *module)
> +int rt_socket_init(struct rtdm_fd *fd, unsigned short protocol)
> {
> struct rtsocket *sock = rtdm_fd_to_private(fd);
> unsigned int pool_size;
> @@ -94,10 +85,10 @@ int __rt_socket_init(struct rtdm_fd *fd, unsigned short protocol,
> rtdm_lock_init(&sock->param_lock);
> rtdm_sem_init(&sock->pending_sem, 0);
>
> - pool_size = __rt_bare_socket_init(fd, protocol,
> + pool_size = rt_bare_socket_init(fd, protocol,
> RTSKB_PRIO_VALUE(SOCK_DEF_PRIO,
> RTSKB_DEF_RT_CHANNEL),
> - socket_rtskbs, module);
> + socket_rtskbs);
> sock->pool_size = pool_size;
> mutex_init(&sock->pool_nrt_lock);
>
> @@ -112,7 +103,7 @@ int __rt_socket_init(struct rtdm_fd *fd, unsigned short protocol,
>
> return 0;
> }
> -EXPORT_SYMBOL_GPL(__rt_socket_init);
> +EXPORT_SYMBOL_GPL(rt_socket_init);
>
>
> /***
> @@ -133,8 +124,6 @@ void rt_socket_cleanup(struct rtdm_fd *fd)
> rtskb_pool_release(&sock->skb_pool);
>
> mutex_unlock(&sock->pool_nrt_lock);
> -
> - module_put(sock->owner);
> }
> EXPORT_SYMBOL_GPL(rt_socket_cleanup);
>
>
Thanks, applied to next.
Jan
--
Siemens AG, Corporate Technology, CT RDA IOT SES-DE
Corporate Competence Center Embedded Linux
More information about the Xenomai
mailing list