Hi, On Wed, Apr 10, 2019 at 7:31 AM Sebastian Andrzej Siewior <bigeasy@xxxxxxxxxxxxx> wrote: > > There is no difference between spinlock_t and raw_spinlock_t for !RT > kernels. trie_update_elem() will allocate memory while holding ->lock > which is not possible on RT kernels. I am new to RT kernel. For !RT kernel, it is OK to hold a lock and call malloc with GFP_ATOMIC. Is this different for RT kernel? Thanks, Song > > Make the ->lock a spinlock_t. > > Signed-off-by: Sebastian Andrzej Siewior <bigeasy@xxxxxxxxxxxxx> > --- > kernel/bpf/lpm_trie.c | 12 ++++++------ > 1 file changed, 6 insertions(+), 6 deletions(-) > > diff --git a/kernel/bpf/lpm_trie.c b/kernel/bpf/lpm_trie.c > index 93a5cbbde421c..2ceb32452b594 100644 > --- a/kernel/bpf/lpm_trie.c > +++ b/kernel/bpf/lpm_trie.c > @@ -37,7 +37,7 @@ struct lpm_trie { > size_t n_entries; > size_t max_prefixlen; > size_t data_size; > - raw_spinlock_t lock; > + spinlock_t lock; > }; > > /* This trie implements a longest prefix match algorithm that can be used to > @@ -318,7 +318,7 @@ static int trie_update_elem(struct bpf_map *map, > if (key->prefixlen > trie->max_prefixlen) > return -EINVAL; > > - raw_spin_lock_irqsave(&trie->lock, irq_flags); > + spin_lock_irqsave(&trie->lock, irq_flags); > > /* Allocate and fill a new node */ > > @@ -425,7 +425,7 @@ static int trie_update_elem(struct bpf_map *map, > kfree(im_node); > } > > - raw_spin_unlock_irqrestore(&trie->lock, irq_flags); > + spin_unlock_irqrestore(&trie->lock, irq_flags); > > return ret; > } > @@ -445,7 +445,7 @@ static int trie_delete_elem(struct bpf_map *map, void *_key) > if (key->prefixlen > trie->max_prefixlen) > return -EINVAL; > > - raw_spin_lock_irqsave(&trie->lock, irq_flags); > + spin_lock_irqsave(&trie->lock, irq_flags); > > /* Walk the tree looking for an exact key/length match and keeping > * track of the path we traverse. We will need to know the node > @@ -521,7 +521,7 @@ static int trie_delete_elem(struct bpf_map *map, void *_key) > kfree_rcu(node, rcu); > > out: > - raw_spin_unlock_irqrestore(&trie->lock, irq_flags); > + spin_unlock_irqrestore(&trie->lock, irq_flags); > > return ret; > } > @@ -583,7 +583,7 @@ static struct bpf_map *trie_alloc(union bpf_attr *attr) > if (ret) > goto out_err; > > - raw_spin_lock_init(&trie->lock); > + spin_lock_init(&trie->lock); > > return &trie->map; > out_err: > -- > 2.20.1 >