@@ -969,16 +969,30 @@ static unsigned int node_get_marks(struct xa_node *node, unsigned int offset)
969
969
return marks ;
970
970
}
971
971
972
+ static inline void node_mark_slots (struct xa_node * node , unsigned int sibs ,
973
+ xa_mark_t mark )
974
+ {
975
+ int i ;
976
+
977
+ if (sibs == 0 )
978
+ node_mark_all (node , mark );
979
+ else {
980
+ for (i = 0 ; i < XA_CHUNK_SIZE ; i += sibs + 1 )
981
+ node_set_mark (node , i , mark );
982
+ }
983
+ }
984
+
972
985
static void node_set_marks (struct xa_node * node , unsigned int offset ,
973
- struct xa_node * child , unsigned int marks )
986
+ struct xa_node * child , unsigned int sibs ,
987
+ unsigned int marks )
974
988
{
975
989
xa_mark_t mark = XA_MARK_0 ;
976
990
977
991
for (;;) {
978
992
if (marks & (1 << (__force unsigned int )mark )) {
979
993
node_set_mark (node , offset , mark );
980
994
if (child )
981
- node_mark_all (child , mark );
995
+ node_mark_slots (child , sibs , mark );
982
996
}
983
997
if (mark == XA_MARK_MAX )
984
998
break ;
@@ -1077,7 +1091,8 @@ void xas_split(struct xa_state *xas, void *entry, unsigned int order)
1077
1091
child -> nr_values = xa_is_value (entry ) ?
1078
1092
XA_CHUNK_SIZE : 0 ;
1079
1093
RCU_INIT_POINTER (child -> parent , node );
1080
- node_set_marks (node , offset , child , marks );
1094
+ node_set_marks (node , offset , child , xas -> xa_sibs ,
1095
+ marks );
1081
1096
rcu_assign_pointer (node -> slots [offset ],
1082
1097
xa_mk_node (child ));
1083
1098
if (xa_is_value (curr ))
@@ -1086,7 +1101,7 @@ void xas_split(struct xa_state *xas, void *entry, unsigned int order)
1086
1101
} else {
1087
1102
unsigned int canon = offset - xas -> xa_sibs ;
1088
1103
1089
- node_set_marks (node , canon , NULL , marks );
1104
+ node_set_marks (node , canon , NULL , 0 , marks );
1090
1105
rcu_assign_pointer (node -> slots [canon ], entry );
1091
1106
while (offset > canon )
1092
1107
rcu_assign_pointer (node -> slots [offset -- ],
0 commit comments