lkml.org 
[lkml]   [2009]   [Jun]   [28]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
/
Date
From
Subjectarray of pointers with rcu
Paul,
I'd like to implement a static array of pointers with rcu.
(Note that Documentation/RCU/arrayRCU.txt addresses only the case of
static arrays where the data (rather than a pointer to the data) is
located in each array element).
The array is implemented today in kvm as follows:

struct kvm_io_bus {
int dev_count;
#define NR_IOBUS_DEVS 6
struct kvm_io_device *devs[NR_IOBUS_DEVS];
};

It's easy to use rcu_assign_pointer and
rcu_dereference to access each value in the array,
so that's fine.

However, I also have the dev_count value to handle.
This value is usually used in loops like this

for (i = 0; i < bus->dev_count; ++i) {
... uses bus->devs[i] ...
}

I can assign the dev_count value with rcu_assign_pointer and even though
it is not a pointer I think it should work fine. However, to access
dev_count I think that rcu_dereference will not do what I want:

#define rcu_dereference(p) ({ \
typeof(p) _________p1 = ACCESS_ONCE(p);
\
smp_read_barrier_depends(); \
(_________p1); \
})


The use of dev_count is not through a dependency so
smp_read_barrier_depends will not be enough on most architectures.

So it seems that what I really need is something like:
#define rcu_read_value(p) ({ \
typeof(p) _________p1 = ACCESS_ONCE(p);
\
smp_rmb(); \
(_________p1); \
})

And maybe
#define rcu_assign_value rcu_assign_pointer
for symmetry.

Comments?

--
MST


\
 
 \ /
  Last update: 2009-06-28 15:25    [W:0.165 / U:0.204 seconds]
©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site