Module Name: src
Committed By: msaitoh
Date: Fri Aug 23 02:33:16 UTC 2019
Modified Files:
src/sys/net: if_vlan.c
Log Message:
- kmem_alloc(,KM_SLEEP) never return NULL, so remove NULL check.
- VLAN ID is never duplicated, so break the loop when found. Also move
kmen_free() outside of ETHER_LOCK(ec)/ETHER_UNLOCK(ec) to reduce the hold
time. suggested by ozaki-r.
- Whitespace fix.
To generate a diff of this commit:
cvs rdiff -u -r1.145 -r1.146 src/sys/net/if_vlan.c
Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.
Modified files:
Index: src/sys/net/if_vlan.c
diff -u src/sys/net/if_vlan.c:1.145 src/sys/net/if_vlan.c:1.146
--- src/sys/net/if_vlan.c:1.145 Wed Aug 21 06:00:07 2019
+++ src/sys/net/if_vlan.c Fri Aug 23 02:33:15 2019
@@ -1,4 +1,4 @@
-/* $NetBSD: if_vlan.c,v 1.145 2019/08/21 06:00:07 msaitoh Exp $ */
+/* $NetBSD: if_vlan.c,v 1.146 2019/08/23 02:33:15 msaitoh Exp $ */
/*
* Copyright (c) 2000, 2001 The NetBSD Foundation, Inc.
@@ -78,7 +78,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: if_vlan.c,v 1.145 2019/08/21 06:00:07 msaitoh Exp $");
+__KERNEL_RCSID(0, "$NetBSD: if_vlan.c,v 1.146 2019/08/23 02:33:15 msaitoh Exp $");
#ifdef _KERNEL_OPT
#include "opt_inet.h"
@@ -487,10 +487,6 @@ vlan_config(struct ifvlan *ifv, struct i
}
/* Add a vid to the list */
vidmem = kmem_alloc(sizeof(struct vlanid_list), KM_SLEEP);
- if (vidmem == NULL) {
- error = ENOMEM;
- goto viderr;
- }
vidmem->vid = vid;
ETHER_LOCK(ec);
SIMPLEQ_INSERT_TAIL(&ec->ec_vids, vidmem, vid_list);
@@ -502,7 +498,6 @@ vlan_config(struct ifvlan *ifv, struct i
* HW tagging function.
*/
error = (*ec->ec_vlan_cb)(ec, vid, true);
-viderr:
if (error) {
ec->ec_nvlans--;
if (ec->ec_nvlans == 0) {
@@ -638,18 +633,21 @@ vlan_unconfig_locked(struct ifvlan *ifv,
case IFT_ETHER:
{
struct ethercom *ec = (void *)p;
- struct vlanid_list *vlanidp, *tmpp;
+ struct vlanid_list *vlanidp;
uint16_t vid = EVL_VLANOFTAG(nmib->ifvm_tag);
ETHER_LOCK(ec);
- SIMPLEQ_FOREACH_SAFE(vlanidp, &ec->ec_vids, vid_list, tmpp) {
+ SIMPLEQ_FOREACH(vlanidp, &ec->ec_vids, vid_list) {
if (vlanidp->vid == vid) {
SIMPLEQ_REMOVE(&ec->ec_vids, vlanidp,
vlanid_list, vid_list);
- kmem_free(vlanidp, sizeof(*vlanidp));
+ break;
}
}
ETHER_UNLOCK(ec);
+ if (vlanidp != NULL)
+ kmem_free(vlanidp, sizeof(*vlanidp));
+
if (ec->ec_vlan_cb != NULL) {
/*
* Call ec_vlan_cb(). It will setup VLAN HW filter or
@@ -1038,7 +1036,7 @@ vlan_ioctl(struct ifnet *ifp, u_long cmd
error = ENOENT;
break;
}
-
+
error = vlan_config(ifv, pr, vlr.vlr_tag);
if (error != 0)
break;