From 3283f54c7a0444b2e51ec79a4da57e7871528f05 Mon Sep 17 00:00:00 2001 From: xqyjlj Date: Wed, 25 Oct 2023 20:31:25 +0800 Subject: 🎈 perf: perf rt_hw_interrupt_disable/enable (#8042) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Shell Co-authored-by: Shell --- components/net/netdev/src/netdev.c | 35 ++++++++++++++++++----------------- 1 file changed, 18 insertions(+), 17 deletions(-) (limited to 'components/net/netdev/src/netdev.c') diff --git a/components/net/netdev/src/netdev.c b/components/net/netdev/src/netdev.c index eca32f71a1..569ba27040 100644 --- a/components/net/netdev/src/netdev.c +++ b/components/net/netdev/src/netdev.c @@ -34,6 +34,7 @@ struct netdev *netdev_default = RT_NULL; /* The global network register callback */ static netdev_callback_fn g_netdev_register_callback = RT_NULL; static netdev_callback_fn g_netdev_default_change_callback = RT_NULL; +static RT_DEFINE_SPINLOCK(_spinlock); /** * This function will register network interface device and @@ -96,7 +97,7 @@ int netdev_register(struct netdev *netdev, const char *name, void *user_data) /* initialize current network interface device single list */ rt_slist_init(&(netdev->list)); - level = rt_hw_interrupt_disable(); + level = rt_spin_lock_irqsave(&_spinlock); if (netdev_list == RT_NULL) { @@ -108,7 +109,7 @@ int netdev_register(struct netdev *netdev, const char *name, void *user_data) rt_slist_append(&(netdev_list->list), &(netdev->list)); } - rt_hw_interrupt_enable(level); + rt_spin_unlock_irqrestore(&_spinlock, level); if (netdev_default == RT_NULL) { @@ -146,7 +147,7 @@ int netdev_unregister(struct netdev *netdev) return -RT_ERROR; } - level = rt_hw_interrupt_disable(); + level = rt_spin_lock_irqsave(&_spinlock); for (node = &(netdev_list->list); node; node = rt_slist_next(node)) { @@ -169,7 +170,7 @@ int netdev_unregister(struct netdev *netdev) break; } } - rt_hw_interrupt_enable(level); + rt_spin_unlock_irqrestore(&_spinlock, level); if (netdev_default == RT_NULL) { @@ -219,19 +220,19 @@ struct netdev *netdev_get_first_by_flags(uint16_t flags) return RT_NULL; } - level = rt_hw_interrupt_disable(); + level = rt_spin_lock_irqsave(&_spinlock); for (node = &(netdev_list->list); node; node = rt_slist_next(node)) { netdev = rt_slist_entry(node, struct netdev, list); if (netdev && (netdev->flags & flags) != 0) { - rt_hw_interrupt_enable(level); + rt_spin_unlock_irqrestore(&_spinlock, level); return netdev; } } - rt_hw_interrupt_enable(level); + rt_spin_unlock_irqrestore(&_spinlock, level); return RT_NULL; } @@ -256,19 +257,19 @@ struct netdev *netdev_get_by_ipaddr(ip_addr_t *ip_addr) return RT_NULL; } - level = rt_hw_interrupt_disable(); + level = rt_spin_lock_irqsave(&_spinlock); for (node = &(netdev_list->list); node; node = rt_slist_next(node)) { netdev = rt_slist_entry(node, struct netdev, list); if (netdev && ip_addr_cmp(&(netdev->ip_addr), ip_addr)) { - rt_hw_interrupt_enable(level); + rt_spin_unlock_irqrestore(&_spinlock, level); return netdev; } } - rt_hw_interrupt_enable(level); + rt_spin_unlock_irqrestore(&_spinlock, level); return RT_NULL; } @@ -293,19 +294,19 @@ struct netdev *netdev_get_by_name(const char *name) return RT_NULL; } - level = rt_hw_interrupt_disable(); + level = rt_spin_lock_irqsave(&_spinlock); for (node = &(netdev_list->list); node; node = rt_slist_next(node)) { netdev = rt_slist_entry(node, struct netdev, list); if (netdev && (rt_strncmp(netdev->name, name, rt_strlen(netdev->name) < RT_NAME_MAX ? rt_strlen(netdev->name) : RT_NAME_MAX) == 0)) { - rt_hw_interrupt_enable(level); + rt_spin_unlock_irqrestore(&_spinlock, level); return netdev; } } - rt_hw_interrupt_enable(level); + rt_spin_unlock_irqrestore(&_spinlock, level); return RT_NULL; } @@ -332,7 +333,7 @@ struct netdev *netdev_get_by_family(int family) return RT_NULL; } - level = rt_hw_interrupt_disable(); + level = rt_spin_lock_irqsave(&_spinlock); for (node = &(netdev_list->list); node; node = rt_slist_next(node)) { @@ -340,7 +341,7 @@ struct netdev *netdev_get_by_family(int family) pf = (struct sal_proto_family *) netdev->sal_user_data; if (pf && pf->skt_ops && pf->family == family && netdev_is_up(netdev)) { - rt_hw_interrupt_enable(level); + rt_spin_unlock_irqrestore(&_spinlock, level); return netdev; } } @@ -351,12 +352,12 @@ struct netdev *netdev_get_by_family(int family) pf = (struct sal_proto_family *) netdev->sal_user_data; if (pf && pf->skt_ops && pf->sec_family == family && netdev_is_up(netdev)) { - rt_hw_interrupt_enable(level); + rt_spin_unlock_irqrestore(&_spinlock, level); return netdev; } } - rt_hw_interrupt_enable(level); + rt_spin_unlock_irqrestore(&_spinlock, level); return RT_NULL; } -- cgit v1.3.1