@@ -831,42 +831,18 @@ static ssize_t show_rps_map(struct netdev_rx_queue *queue, char *buf)
831831 return len < PAGE_SIZE ? len : - EINVAL ;
832832}
833833
834- static ssize_t store_rps_map (struct netdev_rx_queue * queue ,
835- const char * buf , size_t len )
834+ static int netdev_rx_queue_set_rps_mask (struct netdev_rx_queue * queue ,
835+ cpumask_var_t mask )
836836{
837- struct rps_map * old_map , * map ;
838- cpumask_var_t mask ;
839- int err , cpu , i ;
840837 static DEFINE_MUTEX (rps_map_mutex );
841-
842- if (!capable (CAP_NET_ADMIN ))
843- return - EPERM ;
844-
845- if (!alloc_cpumask_var (& mask , GFP_KERNEL ))
846- return - ENOMEM ;
847-
848- err = bitmap_parse (buf , len , cpumask_bits (mask ), nr_cpumask_bits );
849- if (err ) {
850- free_cpumask_var (mask );
851- return err ;
852- }
853-
854- if (!cpumask_empty (mask )) {
855- cpumask_and (mask , mask , housekeeping_cpumask (HK_TYPE_DOMAIN ));
856- cpumask_and (mask , mask , housekeeping_cpumask (HK_TYPE_WQ ));
857- if (cpumask_empty (mask )) {
858- free_cpumask_var (mask );
859- return - EINVAL ;
860- }
861- }
838+ struct rps_map * old_map , * map ;
839+ int cpu , i ;
862840
863841 map = kzalloc (max_t (unsigned int ,
864842 RPS_MAP_SIZE (cpumask_weight (mask )), L1_CACHE_BYTES ),
865843 GFP_KERNEL );
866- if (!map ) {
867- free_cpumask_var (mask );
844+ if (!map )
868845 return - ENOMEM ;
869- }
870846
871847 i = 0 ;
872848 for_each_cpu_and (cpu , mask , cpu_online_mask )
@@ -893,9 +869,45 @@ static ssize_t store_rps_map(struct netdev_rx_queue *queue,
893869
894870 if (old_map )
895871 kfree_rcu (old_map , rcu );
872+ return 0 ;
873+ }
896874
875+ int rps_cpumask_housekeeping (struct cpumask * mask )
876+ {
877+ if (!cpumask_empty (mask )) {
878+ cpumask_and (mask , mask , housekeeping_cpumask (HK_TYPE_DOMAIN ));
879+ cpumask_and (mask , mask , housekeeping_cpumask (HK_TYPE_WQ ));
880+ if (cpumask_empty (mask ))
881+ return - EINVAL ;
882+ }
883+ return 0 ;
884+ }
885+
886+ static ssize_t store_rps_map (struct netdev_rx_queue * queue ,
887+ const char * buf , size_t len )
888+ {
889+ cpumask_var_t mask ;
890+ int err ;
891+
892+ if (!capable (CAP_NET_ADMIN ))
893+ return - EPERM ;
894+
895+ if (!alloc_cpumask_var (& mask , GFP_KERNEL ))
896+ return - ENOMEM ;
897+
898+ err = bitmap_parse (buf , len , cpumask_bits (mask ), nr_cpumask_bits );
899+ if (err )
900+ goto out ;
901+
902+ err = rps_cpumask_housekeeping (mask );
903+ if (err )
904+ goto out ;
905+
906+ err = netdev_rx_queue_set_rps_mask (queue , mask );
907+
908+ out :
897909 free_cpumask_var (mask );
898- return len ;
910+ return err ? : len ;
899911}
900912
901913static ssize_t show_rps_dev_flow_table_cnt (struct netdev_rx_queue * queue ,
0 commit comments