Re: [RFC PATCH] selinux: reduce the number of calls to synchronize_net() when flushing caches

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Thursday, July 03, 2014 10:57:23 AM Jaejyn Shin wrote:
> Thank you for your effort !!
> 
> The booting time might not be a problem for other people, but it was a
> serious problem for me.

I haven't heard any comments so I'm going to go ahead and move this into 
SELinux #next.

> 2014-06-28 5:41 GMT+09:00 Paul Moore <pmoore@xxxxxxxxxx>:
> > When flushing the AVC, such as during a policy load, the various
> > network caches are also flushed, with each making a call to
> > synchronize_net() which has shown to be expensive in some cases.
> > This patch consolidates the network cache flushes into a single AVC
> > callback which only calls synchronize_net() once for each AVC cache
> > flush.
> > 
> > Reported-by: Jaejyn Shin <flagon22bass@xxxxxxxxx>
> > Signed-off-by: Paul Moore <pmoore@xxxxxxxxxx>
> > ---
> > 
> >  security/selinux/hooks.c           |   14 ++++++++++++++
> >  security/selinux/include/netif.h   |    2 ++
> >  security/selinux/include/netnode.h |    2 ++
> >  security/selinux/include/netport.h |    2 ++
> >  security/selinux/netif.c           |   15 +--------------
> >  security/selinux/netnode.c         |   15 +--------------
> >  security/selinux/netport.c         |   15 +--------------
> >  7 files changed, 23 insertions(+), 42 deletions(-)
> > 
> > diff --git a/security/selinux/hooks.c b/security/selinux/hooks.c
> > index 336f0a0..39bc8c9 100644
> > --- a/security/selinux/hooks.c
> > +++ b/security/selinux/hooks.c
> > @@ -161,6 +161,17 @@ static int selinux_peerlbl_enabled(void)
> > 
> >         return (selinux_policycap_alwaysnetwork || netlbl_enabled() ||
> > 
> > selinux_xfrm_enabled());
> > 
> >  }
> > 
> > +static int selinux_netcache_avc_callback(u32 event)
> > +{
> > +       if (event == AVC_CALLBACK_RESET) {
> > +               sel_netif_flush();
> > +               sel_netnode_flush();
> > +               sel_netport_flush();
> > +               synchronize_net();
> > +       }
> > +       return 0;
> > +}
> > +
> > 
> >  /*
> >  
> >   * initialise the security for the init task
> >   */
> > 
> > @@ -5993,6 +6004,9 @@ static __init int selinux_init(void)
> > 
> >         if (register_security(&selinux_ops))
> >         
> >                 panic("SELinux: Unable to register with kernel.\n");
> > 
> > +       if (avc_add_callback(selinux_netcache_avc_callback,
> > AVC_CALLBACK_RESET))
> > +               panic("SELinux: Unable to register AVC netcache
> > callback\n");
> > +
> > 
> >         if (selinux_enforcing)
> >         
> >                 printk(KERN_DEBUG "SELinux:  Starting in enforcing
> > 
> > mode\n");
> > 
> >         else
> > 
> > diff --git a/security/selinux/include/netif.h
> > b/security/selinux/include/netif.h
> > index 43d5072..57c6eae 100644
> > --- a/security/selinux/include/netif.h
> > +++ b/security/selinux/include/netif.h
> > @@ -17,6 +17,8 @@
> > 
> >  #ifndef _SELINUX_NETIF_H_
> >  #define _SELINUX_NETIF_H_
> > 
> > +void sel_netif_flush(void);
> > +
> > 
> >  int sel_netif_sid(int ifindex, u32 *sid);
> >  
> >  #endif /* _SELINUX_NETIF_H_ */
> > 
> > diff --git a/security/selinux/include/netnode.h
> > b/security/selinux/include/netnode.h
> > index df7a5ed..937668d 100644
> > --- a/security/selinux/include/netnode.h
> > +++ b/security/selinux/include/netnode.h
> > @@ -27,6 +27,8 @@
> > 
> >  #ifndef _SELINUX_NETNODE_H
> >  #define _SELINUX_NETNODE_H
> > 
> > +void sel_netnode_flush(void);
> > +
> > 
> >  int sel_netnode_sid(void *addr, u16 family, u32 *sid);
> >  
> >  #endif
> > 
> > diff --git a/security/selinux/include/netport.h
> > b/security/selinux/include/netport.h
> > index 4d965b8..d1ce896 100644
> > --- a/security/selinux/include/netport.h
> > +++ b/security/selinux/include/netport.h
> > @@ -26,6 +26,8 @@
> > 
> >  #ifndef _SELINUX_NETPORT_H
> >  #define _SELINUX_NETPORT_H
> > 
> > +void sel_netport_flush(void);
> > +
> > 
> >  int sel_netport_sid(u8 protocol, u16 pnum, u32 *sid);
> >  
> >  #endif
> > 
> > diff --git a/security/selinux/netif.c b/security/selinux/netif.c
> > index 694e9e4..3c3de4c 100644
> > --- a/security/selinux/netif.c
> > +++ b/security/selinux/netif.c
> > @@ -240,7 +240,7 @@ static void sel_netif_kill(int ifindex)
> > 
> >   * Remove all entries from the network interface table.
> >   *
> >   */
> > 
> > -static void sel_netif_flush(void)
> > +void sel_netif_flush(void)
> > 
> >  {
> >  
> >         int idx;
> >         struct sel_netif *netif;
> > 
> > @@ -252,15 +252,6 @@ static void sel_netif_flush(void)
> > 
> >         spin_unlock_bh(&sel_netif_lock);
> >  
> >  }
> > 
> > -static int sel_netif_avc_callback(u32 event)
> > -{
> > -       if (event == AVC_CALLBACK_RESET) {
> > -               sel_netif_flush();
> > -               synchronize_net();
> > -       }
> > -       return 0;
> > -}
> > -
> > 
> >  static int sel_netif_netdev_notifier_handler(struct notifier_block *this,
> >  
> >                                              unsigned long event, void
> > 
> > *ptr)
> > 
> >  {
> > 
> > @@ -291,10 +282,6 @@ static __init int sel_netif_init(void)
> > 
> >         register_netdevice_notifier(&sel_netif_netdev_notifier);
> > 
> > -       err = avc_add_callback(sel_netif_avc_callback,
> > AVC_CALLBACK_RESET);
> > -       if (err)
> > -               panic("avc_add_callback() failed, error %d\n", err);
> > -
> > 
> >         return err;
> >  
> >  }
> > 
> > diff --git a/security/selinux/netnode.c b/security/selinux/netnode.c
> > index 03a72c3..ddf3152 100644
> > --- a/security/selinux/netnode.c
> > +++ b/security/selinux/netnode.c
> > @@ -283,7 +283,7 @@ int sel_netnode_sid(void *addr, u16 family, u32 *sid)
> > 
> >   * Remove all entries from the network address table.
> >   *
> >   */
> > 
> > -static void sel_netnode_flush(void)
> > +void sel_netnode_flush(void)
> > 
> >  {
> >  
> >         unsigned int idx;
> >         struct sel_netnode *node, *node_tmp;
> > 
> > @@ -300,15 +300,6 @@ static void sel_netnode_flush(void)
> > 
> >         spin_unlock_bh(&sel_netnode_lock);
> >  
> >  }
> > 
> > -static int sel_netnode_avc_callback(u32 event)
> > -{
> > -       if (event == AVC_CALLBACK_RESET) {
> > -               sel_netnode_flush();
> > -               synchronize_net();
> > -       }
> > -       return 0;
> > -}
> > -
> > 
> >  static __init int sel_netnode_init(void)
> >  {
> >  
> >         int iter;
> > 
> > @@ -322,10 +313,6 @@ static __init int sel_netnode_init(void)
> > 
> >                 sel_netnode_hash[iter].size = 0;
> >         
> >         }
> > 
> > -       ret = avc_add_callback(sel_netnode_avc_callback,
> > AVC_CALLBACK_RESET);
> > -       if (ret != 0)
> > -               panic("avc_add_callback() failed, error %d\n", ret);
> > -
> > 
> >         return ret;
> >  
> >  }
> > 
> > diff --git a/security/selinux/netport.c b/security/selinux/netport.c
> > index d353797..73ac678 100644
> > --- a/security/selinux/netport.c
> > +++ b/security/selinux/netport.c
> > @@ -217,7 +217,7 @@ int sel_netport_sid(u8 protocol, u16 pnum, u32 *sid)
> > 
> >   * Remove all entries from the network address table.
> >   *
> >   */
> > 
> > -static void sel_netport_flush(void)
> > +void sel_netport_flush(void)
> > 
> >  {
> >  
> >         unsigned int idx;
> >         struct sel_netport *port, *port_tmp;
> > 
> > @@ -234,15 +234,6 @@ static void sel_netport_flush(void)
> > 
> >         spin_unlock_bh(&sel_netport_lock);
> >  
> >  }
> > 
> > -static int sel_netport_avc_callback(u32 event)
> > -{
> > -       if (event == AVC_CALLBACK_RESET) {
> > -               sel_netport_flush();
> > -               synchronize_net();
> > -       }
> > -       return 0;
> > -}
> > -
> > 
> >  static __init int sel_netport_init(void)
> >  {
> >  
> >         int iter;
> > 
> > @@ -256,10 +247,6 @@ static __init int sel_netport_init(void)
> > 
> >                 sel_netport_hash[iter].size = 0;
> >         
> >         }
> > 
> > -       ret = avc_add_callback(sel_netport_avc_callback,
> > AVC_CALLBACK_RESET);
> > -       if (ret != 0)
> > -               panic("avc_add_callback() failed, error %d\n", ret);
> > -
> > 
> >         return ret;
> >  
> >  }

-- 
paul moore
security and virtualization @ redhat

_______________________________________________
Selinux mailing list
Selinux@xxxxxxxxxxxxx
To unsubscribe, send email to Selinux-leave@xxxxxxxxxxxxx.
To get help, send an email containing "help" to Selinux-request@xxxxxxxxxxxxx.




[Index of Archives]     [Selinux Refpolicy]     [Linux SGX]     [Fedora Users]     [Fedora Desktop]     [Yosemite Photos]     [Yosemite Camping]     [Yosemite Campsites]     [KDE Users]     [Gnome Users]

  Powered by Linux