本文整理汇总了C++中smp_wmb函数的典型用法代码示例。如果您正苦于以下问题:C++ smp_wmb函数的具体用法?C++ smp_wmb怎么用?C++ smp_wmb使用的例子?那么恭喜您, 这里精选的函数代码示例或许可以为您提供帮助。
在下文中一共展示了smp_wmb函数的20个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于我们的系统推荐出更棒的C++代码示例。
示例1: wakeup_secondary
static void __init wakeup_secondary(void)
{
/*
* Write the address of secondary startup routine into the
* AuxCoreBoot1 where ROM code will jump and start executing
* on secondary core once out of WFE
* A barrier is added to ensure that write buffer is drained
*/
omap_auxcoreboot_addr(virt_to_phys(omap_secondary_startup));
smp_wmb();
/*
* Send a 'sev' to wake the secondary core from WFE.
* Drain the outstanding writes to memory
*/
dsb();
set_event();
mb();
}
开发者ID:Medvedroid,项目名称:OT_903D-kernel-2.6.35.7,代码行数:19,代码来源:omap-smp.c
示例2: __bfq_exit_single_io_context
/**
* __bfq_exit_single_io_context - deassociate @cic from any running task.
* @bfqd: bfq_data on which @cic is valid.
* @cic: the cic being exited.
*
* Whenever no more tasks are using @cic or @bfqd is deallocated we
* need to invalidate its entry in the radix tree hash table and to
* release the queues it refers to.
*
* Called under the queue lock.
*/
static void __bfq_exit_single_io_context(struct bfq_data *bfqd,
struct cfq_io_context *cic)
{
struct io_context *ioc = cic->ioc;
list_del_init(&cic->queue_list);
/*
* Make sure dead mark is seen for dead queues
*/
smp_wmb();
rcu_assign_pointer(cic->key, bfqd_dead_key(bfqd));
/*
* No write-side locking as no task is using @ioc (they're exited
* or bfqd is being deallocated.
*/
rcu_read_lock();
if (rcu_dereference(ioc->ioc_data) == cic) {
rcu_read_unlock();
spin_lock(&ioc->lock);
rcu_assign_pointer(ioc->ioc_data, NULL);
spin_unlock(&ioc->lock);
} else
rcu_read_unlock();
if (cic->cfqq[BLK_RW_ASYNC] != NULL) {
bfq_exit_bfqq(bfqd, cic->cfqq[BLK_RW_ASYNC]);
cic->cfqq[BLK_RW_ASYNC] = NULL;
}
if (cic->cfqq[BLK_RW_SYNC] != NULL) {
/*
* If the bic is using a shared queue, put the reference
* taken on the io_context when the bic started using a
* shared bfq_queue.
*/
if (bfq_bfqq_coop(cic->cfqq[BLK_RW_SYNC]))
put_io_context(ioc);
bfq_exit_bfqq(bfqd, cic->cfqq[BLK_RW_SYNC]);
cic->cfqq[BLK_RW_SYNC] = NULL;
}
}
开发者ID:hothanhbinh,项目名称:AndromadusMod-New,代码行数:54,代码来源:bfq-ioc.c
示例3: sys_setresuid
/*
* This function implements a generic ability to update ruid, euid,
* and suid. This allows you to implement the 4.4 compatible seteuid().
*/
asmlinkage long sys_setresuid(uid_t ruid, uid_t euid, uid_t suid)
{
int old_ruid = current->uid;
int old_euid = current->euid;
int old_suid = current->suid;
int retval;
retval = security_task_setuid(ruid, euid, suid, LSM_SETID_RES);
if (retval)
return retval;
if (!capable(CAP_SETUID)) {
if ((ruid != (uid_t) -1) && (ruid != current->uid) &&
(ruid != current->euid) && (ruid != current->suid))
return -EPERM;
if ((euid != (uid_t) -1) && (euid != current->uid) &&
(euid != current->euid) && (euid != current->suid))
return -EPERM;
if ((suid != (uid_t) -1) && (suid != current->uid) &&
(suid != current->euid) && (suid != current->suid))
return -EPERM;
}
if (ruid != (uid_t) -1) {
if (ruid != current->uid && set_user(ruid, euid != current->euid) < 0)
return -EAGAIN;
}
if (euid != (uid_t) -1) {
if (euid != current->euid) {
set_dumpable(current->mm, suid_dumpable);
smp_wmb();
}
current->euid = euid;
}
current->fsuid = current->euid;
if (suid != (uid_t) -1)
current->suid = suid;
key_fsuid_changed(current);
proc_id_connector(current, PROC_EVENT_UID);
return security_task_post_setuid(old_ruid, old_euid, old_suid, LSM_SETID_RES);
}
开发者ID:maraz,项目名称:linux-2.6,代码行数:46,代码来源:sys.c
示例4: comedi_buf_munge
/*
* munging is applied to data by core as it passes between user
* and kernel space
*/
static unsigned int comedi_buf_munge(struct comedi_async *async,
unsigned int num_bytes)
{
struct comedi_subdevice *s = async->subdevice;
unsigned int count = 0;
const unsigned num_sample_bytes = bytes_per_sample(s);
if (!s->munge || (async->cmd.flags & CMDF_RAWDATA)) {
async->munge_count += num_bytes;
count = num_bytes;
} else {
/* don't munge partial samples */
num_bytes -= num_bytes % num_sample_bytes;
while (count < num_bytes) {
int block_size = num_bytes - count;
unsigned int buf_end;
buf_end = async->prealloc_bufsz - async->munge_ptr;
if (block_size > buf_end)
block_size = buf_end;
s->munge(s->device, s,
async->prealloc_buf + async->munge_ptr,
block_size, async->munge_chan);
/*
* ensure data is munged in buffer before the
* async buffer munge_count is incremented
*/
smp_wmb();
async->munge_chan += block_size / num_sample_bytes;
async->munge_chan %= async->cmd.chanlist_len;
async->munge_count += block_size;
async->munge_ptr += block_size;
async->munge_ptr %= async->prealloc_bufsz;
count += block_size;
}
}
return count;
}
开发者ID:jay-caoj,项目名称:linux-3.9.6,代码行数:46,代码来源:comedi_buf.c
示例5: socfpga_boot_secondary
static int socfpga_boot_secondary(unsigned int cpu, struct task_struct *idle)
{
int trampoline_size = &secondary_trampoline_end - &secondary_trampoline;
if (cpu1start_addr) {
memcpy(phys_to_virt(0), &secondary_trampoline, trampoline_size);
__raw_writel(virt_to_phys(socfpga_secondary_startup),
(sys_manager_base_addr + (cpu1start_addr & 0x000000ff)));
flush_cache_all();
smp_wmb();
outer_clean_range(0, trampoline_size);
/* This will release CPU #1 out of reset.*/
__raw_writel(0, rst_manager_base_addr + 0x10);
}
return 0;
}
开发者ID:01org,项目名称:KVMGT-kernel,代码行数:20,代码来源:platsmp.c
示例6: dtl_start
static int dtl_start(struct dtl *dtl)
{
struct dtl_ring *dtlr = &per_cpu(dtl_rings, dtl->cpu);
dtlr->buf = dtl->buf;
dtlr->buf_end = dtl->buf + dtl->buf_entries;
dtlr->write_index = 0;
/* setting write_ptr enables logging into our buffer */
smp_wmb();
dtlr->write_ptr = dtl->buf;
/* enable event logging */
dtlr->saved_dtl_mask = lppaca[dtl->cpu].dtl_enable_mask;
lppaca[dtl->cpu].dtl_enable_mask |= dtl_event_mask;
dtl_consumer = consume_dtle;
atomic_inc(&dtl_count);
return 0;
}
开发者ID:710leo,项目名称:LVS,代码行数:20,代码来源:dtl.c
示例7: chaos_read_callback
static void chaos_read_callback(struct urb *urb)
{
struct chaoskey *dev = urb->context;
int status = urb->status;
usb_dbg(dev->interface, "callback status (%d)", status);
if (status == 0)
dev->valid = urb->actual_length;
else
dev->valid = 0;
dev->used = 0;
/* must be seen first before validity is announced */
smp_wmb();
dev->reading = false;
wake_up(&dev->wait_q);
}
开发者ID:mkrufky,项目名称:linux,代码行数:20,代码来源:chaoskey.c
示例8: wakeup_secondary
static void __init wakeup_secondary(void)
{
#if defined(CHIPREG_BOOT_2ND_ADDR_OFFSET)
void __iomem *chipRegBase;
chipRegBase = IOMEM(KONA_CHIPREG_VA);
writel((virt_to_phys(kona_secondary_startup) & (~0x3))|0x1, chipRegBase + CHIPREG_BOOT_2ND_ADDR_OFFSET);
smp_wmb();
/*
* Send a 'sev' to wake the secondary core from WFE.
* Drain the outstanding writes to memory
*/
dsb_sev();
mb();
#endif
}
开发者ID:CVlaspoel,项目名称:VSMC-i9105p,代码行数:20,代码来源:platsmp.c
示例9: enqueue_ih_ring_entry
/*
* This assumes that it can't be called concurrently with itself
* but only with dequeue_ih_ring_entry.
*/
static bool
enqueue_ih_ring_entry(struct kfd_dev *kfd, const void *ih_ring_entry)
{
unsigned int rptr = atomic_read(&kfd->interrupt_ring_rptr);
unsigned int wptr = atomic_read(&kfd->interrupt_ring_wptr);
if ((rptr - wptr) % kfd->interrupt_ring_size == kfd->device_info->ih_ring_entry_size) {
/* This is very bad, the system is likely to hang. */
dev_err_ratelimited(radeon_kfd_chardev(),
"Interrupt ring overflow, dropping interrupt.\n");
return false;
}
memcpy(kfd->interrupt_ring + wptr, ih_ring_entry, kfd->device_info->ih_ring_entry_size);
wptr = (wptr + kfd->device_info->ih_ring_entry_size) % kfd->interrupt_ring_size;
smp_wmb(); /* Ensure memcpy'd data is visible before wptr update. */
atomic_set(&kfd->interrupt_ring_wptr, wptr);
return true;
}
开发者ID:gic4107,项目名称:HSA-linux,代码行数:24,代码来源:kfd_interrupt.c
示例10: kgdb_arch_set_breakpoint
int kgdb_arch_set_breakpoint(struct kgdb_bkpt *bpt)
{
int err;
unsigned long addr_wr = writable_address(bpt->bpt_addr);
if (addr_wr == 0)
return -1;
err = probe_kernel_read(bpt->saved_instr, (char *)bpt->bpt_addr,
BREAK_INSTR_SIZE);
if (err)
return err;
err = probe_kernel_write((char *)addr_wr, arch_kgdb_ops.gdb_bpt_instr,
BREAK_INSTR_SIZE);
smp_wmb();
flush_icache_range((unsigned long)bpt->bpt_addr,
(unsigned long)bpt->bpt_addr + BREAK_INSTR_SIZE);
return err;
}
开发者ID:020gzh,项目名称:linux,代码行数:20,代码来源:kgdb.c
示例11: vdso_init
static int __init vdso_init(void)
{
int data_pages = sizeof(vdso_data_store) >> PAGE_SHIFT;
/*
* We can disable vDSO support generally, but we need to retain
* one page to support the two-bundle (16-byte) rt_sigreturn path.
*/
if (!vdso_enabled) {
size_t offset = (unsigned long)&__vdso_rt_sigreturn;
static struct page *sigret_page;
sigret_page = alloc_page(GFP_KERNEL | __GFP_ZERO);
BUG_ON(sigret_page == NULL);
vdso_pagelist = &sigret_page;
vdso_pages = 1;
BUG_ON(offset >= PAGE_SIZE);
memcpy(page_address(sigret_page) + offset,
vdso_start + offset, 16);
#ifdef CONFIG_COMPAT
vdso32_pages = vdso_pages;
vdso32_pagelist = vdso_pagelist;
#endif
vdso_ready = 1;
return 0;
}
vdso_pages = (vdso_end - vdso_start) >> PAGE_SHIFT;
vdso_pages += data_pages;
vdso_pagelist = vdso_setup(vdso_start, vdso_pages);
#ifdef CONFIG_COMPAT
vdso32_pages = (vdso32_end - vdso32_start) >> PAGE_SHIFT;
vdso32_pages += data_pages;
vdso32_pagelist = vdso_setup(vdso32_start, vdso32_pages);
#endif
smp_wmb();
vdso_ready = 1;
return 0;
}
开发者ID:0-T-0,项目名称:ps4-linux,代码行数:41,代码来源:vdso.c
示例12: reuseport_add_sock
/**
* reuseport_add_sock - Add a socket to the reuseport group of another.
* @sk: New socket to add to the group.
* @sk2: Socket belonging to the existing reuseport group.
* @bind_inany: Whether or not the group is bound to a local INANY address.
*
* May return ENOMEM and not add socket to group under memory pressure.
*/
int reuseport_add_sock(struct sock *sk, struct sock *sk2, bool bind_inany)
{
struct sock_reuseport *old_reuse, *reuse;
if (!rcu_access_pointer(sk2->sk_reuseport_cb)) {
int err = reuseport_alloc(sk2, bind_inany);
if (err)
return err;
}
spin_lock_bh(&reuseport_lock);
reuse = rcu_dereference_protected(sk2->sk_reuseport_cb,
lockdep_is_held(&reuseport_lock));
old_reuse = rcu_dereference_protected(sk->sk_reuseport_cb,
lockdep_is_held(&reuseport_lock));
if (old_reuse && old_reuse->num_socks != 1) {
spin_unlock_bh(&reuseport_lock);
return -EBUSY;
}
if (reuse->num_socks == reuse->max_socks) {
reuse = reuseport_grow(reuse);
if (!reuse) {
spin_unlock_bh(&reuseport_lock);
return -ENOMEM;
}
}
reuse->socks[reuse->num_socks] = sk;
/* paired with smp_rmb() in reuseport_select_sock() */
smp_wmb();
reuse->num_socks++;
rcu_assign_pointer(sk->sk_reuseport_cb, reuse);
spin_unlock_bh(&reuseport_lock);
if (old_reuse)
call_rcu(&old_reuse->rcu, reuseport_free_rcu);
return 0;
}
开发者ID:avagin,项目名称:linux,代码行数:49,代码来源:sock_reuseport.c
示例13: vlan_dev_set_egress_priority
int vlan_dev_set_egress_priority(const struct net_device *dev,
u32 skb_prio, u16 vlan_prio)
{
struct vlan_dev_info *vlan = vlan_dev_info(dev);
struct vlan_priority_tci_mapping *mp = NULL;
struct vlan_priority_tci_mapping *np;
u32 vlan_qos = (vlan_prio << VLAN_PRIO_SHIFT) & VLAN_PRIO_MASK;
/* See if a priority mapping exists.. */
mp = vlan->egress_priority_map[skb_prio & 0xF];
while (mp) {
if (mp->priority == skb_prio) {
if (mp->vlan_qos && !vlan_qos)
vlan->nr_egress_mappings--;
else if (!mp->vlan_qos && vlan_qos)
vlan->nr_egress_mappings++;
mp->vlan_qos = vlan_qos;
return 0;
}
mp = mp->next;
}
/* Create a new mapping then. */
mp = vlan->egress_priority_map[skb_prio & 0xF];
np = kmalloc(sizeof(struct vlan_priority_tci_mapping), GFP_KERNEL);
if (!np)
return -ENOBUFS;
np->next = mp;
np->priority = skb_prio;
np->vlan_qos = vlan_qos;
/* Before inserting this element in hash table, make sure all its fields
* are committed to memory.
* coupled with smp_rmb() in vlan_dev_get_egress_qos_mask()
*/
smp_wmb();
vlan->egress_priority_map[skb_prio & 0xF] = np;
if (vlan_qos)
vlan->nr_egress_mappings++;
return 0;
}
开发者ID:jing-git,项目名称:rt-n56u,代码行数:41,代码来源:vlan_dev.c
示例14: __rtas_suspend_last_cpu
static int __rtas_suspend_last_cpu(struct rtas_suspend_me_data *data, int wake_when_done)
{
u16 slb_size = mmu_slb_size;
int rc = H_MULTI_THREADS_ACTIVE;
int cpu;
slb_set_size(SLB_MIN_SIZE);
printk(KERN_DEBUG "calling ibm,suspend-me on cpu %i\n", smp_processor_id());
while (rc == H_MULTI_THREADS_ACTIVE && !data->done) {
rc = rtas_call(data->token, 0, 1, NULL);
if (rc && rc != H_MULTI_THREADS_ACTIVE)
printk(KERN_DEBUG "ibm,suspend-me returned %d\n", rc);
}
smp_rmb();
if (rc || data->error)
slb_set_size(slb_size);
if (data->error)
rc = data->error;
data->error = rc;
if (wake_when_done) {
smp_wmb();
data->done = 1;
/* Ensure data->done is seen on all CPUs that are about to wake up
as a result of the H_PROD below */
mb();
for_each_online_cpu(cpu)
plpar_hcall_norets(H_PROD, get_hard_smp_processor_id(cpu));
}
if (atomic_dec_return(&data->working) == 0)
complete(data->complete);
return rc;
}
开发者ID:710leo,项目名称:LVS,代码行数:41,代码来源:rtas.c
示例15: virtqueue_read_next_desc
static int
virtqueue_read_next_desc(VuDev *dev, struct vring_desc *desc,
int i, unsigned int max, unsigned int *next)
{
/* If this descriptor says it doesn't chain, we're done. */
if (!(desc[i].flags & VRING_DESC_F_NEXT)) {
return VIRTQUEUE_READ_DESC_DONE;
}
/* Check they're not leading us off end of descriptors. */
*next = desc[i].next;
/* Make sure compiler knows to grab that: we don't want it changing! */
smp_wmb();
if (*next >= max) {
vu_panic(dev, "Desc next is %u", next);
return VIRTQUEUE_READ_DESC_ERROR;
}
return VIRTQUEUE_READ_DESC_MORE;
}
开发者ID:Marshalzxy,项目名称:qemu,代码行数:21,代码来源:libvhost-user.c
示例16: acpi_aml_write_kern
static int acpi_aml_write_kern(const char *buf, int len)
{
int ret;
struct circ_buf *crc = &acpi_aml_io.out_crc;
int n;
char *p;
ret = acpi_aml_lock_write(crc, ACPI_AML_OUT_KERN);
if (ret < 0)
return ret;
/* sync tail before inserting logs */
smp_mb();
p = &crc->buf[crc->head];
n = min(len, circ_space_to_end(crc));
memcpy(p, buf, n);
/* sync head after inserting logs */
smp_wmb();
crc->head = (crc->head + n) & (ACPI_AML_BUF_SIZE - 1);
acpi_aml_unlock_fifo(ACPI_AML_OUT_KERN, true);
return n;
}
开发者ID:1314cc,项目名称:linux,代码行数:21,代码来源:acpi_dbg.c
示例17: rcu_end_batch
/*
* For a given cpu, push the previous batch of callbacks onto a (global)
* pending list, then make the current batch the previous. A new, empty
* current batch exists after this operation.
*
* Locklessly tolerates changes being made by call_rcu() to the current
* batch, locklessly tolerates the current batch becoming the previous
* batch, and locklessly tolerates a new, empty current batch becoming
* available. Requires that the previous batch be quiescent by the time
* rcu_end_batch is invoked.
*/
static void rcu_end_batch(struct rcu_data *rd, struct rcu_list *pending)
{
int prev;
struct rcu_list *plist; /* some cpus' previous list */
prev = (ACCESS_ONCE(rd->which) & 1) ^ 1;
plist = &rd->cblist[prev];
/* Chain previous batch of callbacks, if any, to the pending list */
if (plist->head) {
rcu_list_join(pending, plist);
rcu_list_init(plist);
smp_wmb();
}
/*
* Swap current and previous lists. Other cpus must not see this
* out-of-order w.r.t. the just-completed plist init, hence the above
* smp_wmb().
*/
rd->which++;
}
开发者ID:ARMP,项目名称:samsung_kernel_cooper,代码行数:32,代码来源:jrcu.c
示例18: fifo_buf_recv
/*
*recive data to buffer
*/
int fifo_buf_recv(struct fifo_buf *fifo, int fd)
{
int alen = 0, len = 0, outlen = 0, off = 0;
alen = (fifo->mask + 1) - (fifo->in - fifo->out);
off = fifo->in & fifo->mask;
len = min(alen, fifo->size - off);
outlen += recv(fd, fifo->data + off, len, 0);
if(outlen == len && alen - len > 0)
outlen += recv(fd, fifo->data, alen - len, 0);
/*
* make sure that the data is copied before
* incrementing the fifo->out index counter
*/
if(outlen > 0){
smp_wmb();
fifo->in += outlen;
}
return outlen;
}
开发者ID:xinchuantao,项目名称:container,代码行数:24,代码来源:fifo_tcp.c
示例19: bpf_dp_disconnect_port
/* Called with ovs_mutex. */
void bpf_dp_disconnect_port(struct vport *p)
{
struct datapath *dp = p->dp;
struct plum *plum, *dest_plum;
u32 dest;
if (p->port_no == OVSP_LOCAL || p->port_no >= PLUM_MAX_PORTS)
return;
plum = ovsl_dereference(dp->plums[0]);
dest = atomic_read(&plum->ports[p->port_no]);
if (dest) {
dest_plum = ovsl_dereference(dp->plums[dest >> 16]);
atomic_set(&dest_plum->ports[dest & 0xffff], 0);
}
atomic_set(&plum->ports[p->port_no], 0);
smp_wmb();
/* leave the stats allocated until plum is freed */
}
开发者ID:iovisor-obsolete,项目名称:old_bpf_historical,代码行数:22,代码来源:bpf_plum.c
示例20: generic_cpu_enable
int generic_cpu_enable(unsigned int cpu)
{
/* Do the normal bootup if we haven't
* already bootstrapped. */
if (system_state != SYSTEM_RUNNING)
return -ENOSYS;
/* get the target out of it's holding state */
per_cpu(cpu_state, cpu) = CPU_UP_PREPARE;
smp_wmb();
while (!cpu_online(cpu))
cpu_relax();
#ifdef CONFIG_PPC64
fixup_irqs(cpu_online_map);
/* counter the irq disable in fixup_irqs */
local_irq_enable();
#endif
return 0;
}
开发者ID:ForayJones,项目名称:iods,代码行数:21,代码来源:smp.c
注:本文中的smp_wmb函数示例由纯净天空整理自Github/MSDocs等源码及文档管理平台,相关代码片段筛选自各路编程大神贡献的开源项目,源码版权归原作者所有,传播和使用请参考对应项目的License;未经允许,请勿转载。 |
请发表评论