Merge tag 'v4.4.35' into linux-linaro-lsk-v4.4
This is the 4.4.35 stable release
This commit is contained in:
commit
edf995d84e
34 changed files with 310 additions and 103 deletions
7
Makefile
7
Makefile
|
@ -1,6 +1,6 @@
|
|||
VERSION = 4
|
||||
PATCHLEVEL = 4
|
||||
SUBLEVEL = 34
|
||||
SUBLEVEL = 35
|
||||
EXTRAVERSION =
|
||||
NAME = Blurry Fish Butt
|
||||
|
||||
|
@ -395,11 +395,12 @@ KBUILD_CFLAGS := -Wall -Wundef -Wstrict-prototypes -Wno-trigraphs \
|
|||
-fno-strict-aliasing -fno-common \
|
||||
-Werror-implicit-function-declaration \
|
||||
-Wno-format-security \
|
||||
-std=gnu89
|
||||
-std=gnu89 $(call cc-option,-fno-PIE)
|
||||
|
||||
|
||||
KBUILD_AFLAGS_KERNEL :=
|
||||
KBUILD_CFLAGS_KERNEL :=
|
||||
KBUILD_AFLAGS := -D__ASSEMBLY__
|
||||
KBUILD_AFLAGS := -D__ASSEMBLY__ $(call cc-option,-fno-PIE)
|
||||
KBUILD_AFLAGS_MODULE := -DMODULE
|
||||
KBUILD_CFLAGS_MODULE := -DMODULE
|
||||
KBUILD_LDFLAGS_MODULE := -T $(srctree)/scripts/module-common.lds
|
||||
|
|
|
@ -352,7 +352,6 @@ static void amd_detect_cmp(struct cpuinfo_x86 *c)
|
|||
#ifdef CONFIG_SMP
|
||||
unsigned bits;
|
||||
int cpu = smp_processor_id();
|
||||
unsigned int socket_id, core_complex_id;
|
||||
|
||||
bits = c->x86_coreid_bits;
|
||||
/* Low order bits define the core id (index of core in socket) */
|
||||
|
@ -370,10 +369,7 @@ static void amd_detect_cmp(struct cpuinfo_x86 *c)
|
|||
if (c->x86 != 0x17 || !cpuid_edx(0x80000006))
|
||||
return;
|
||||
|
||||
socket_id = (c->apicid >> bits) - 1;
|
||||
core_complex_id = (c->apicid & ((1 << bits) - 1)) >> 3;
|
||||
|
||||
per_cpu(cpu_llc_id, cpu) = (socket_id << 3) | core_complex_id;
|
||||
per_cpu(cpu_llc_id, cpu) = c->apicid >> 3;
|
||||
#endif
|
||||
}
|
||||
|
||||
|
|
|
@ -199,7 +199,18 @@ static void kvm_on_user_return(struct user_return_notifier *urn)
|
|||
struct kvm_shared_msrs *locals
|
||||
= container_of(urn, struct kvm_shared_msrs, urn);
|
||||
struct kvm_shared_msr_values *values;
|
||||
unsigned long flags;
|
||||
|
||||
/*
|
||||
* Disabling irqs at this point since the following code could be
|
||||
* interrupted and executed through kvm_arch_hardware_disable()
|
||||
*/
|
||||
local_irq_save(flags);
|
||||
if (locals->registered) {
|
||||
locals->registered = false;
|
||||
user_return_notifier_unregister(urn);
|
||||
}
|
||||
local_irq_restore(flags);
|
||||
for (slot = 0; slot < shared_msrs_global.nr; ++slot) {
|
||||
values = &locals->values[slot];
|
||||
if (values->host != values->curr) {
|
||||
|
@ -207,8 +218,6 @@ static void kvm_on_user_return(struct user_return_notifier *urn)
|
|||
values->curr = values->host;
|
||||
}
|
||||
}
|
||||
locals->registered = false;
|
||||
user_return_notifier_unregister(urn);
|
||||
}
|
||||
|
||||
static void shared_msr_update(unsigned slot, u32 msr)
|
||||
|
@ -3317,6 +3326,7 @@ long kvm_arch_vcpu_ioctl(struct file *filp,
|
|||
};
|
||||
case KVM_SET_VAPIC_ADDR: {
|
||||
struct kvm_vapic_addr va;
|
||||
int idx;
|
||||
|
||||
r = -EINVAL;
|
||||
if (!lapic_in_kernel(vcpu))
|
||||
|
@ -3324,7 +3334,9 @@ long kvm_arch_vcpu_ioctl(struct file *filp,
|
|||
r = -EFAULT;
|
||||
if (copy_from_user(&va, argp, sizeof va))
|
||||
goto out;
|
||||
idx = srcu_read_lock(&vcpu->kvm->srcu);
|
||||
r = kvm_lapic_set_vapic_addr(vcpu, va.vapic_addr);
|
||||
srcu_read_unlock(&vcpu->kvm->srcu, idx);
|
||||
break;
|
||||
}
|
||||
case KVM_X86_SETUP_MCE: {
|
||||
|
|
|
@ -12,6 +12,7 @@ targets += purgatory.ro
|
|||
|
||||
KBUILD_CFLAGS := -fno-strict-aliasing -Wall -Wstrict-prototypes -fno-zero-initialized-in-bss -fno-builtin -ffreestanding -c -MD -Os -mcmodel=large
|
||||
KBUILD_CFLAGS += -m$(BITS)
|
||||
KBUILD_CFLAGS += $(call cc-option,-fno-PIE)
|
||||
|
||||
$(obj)/purgatory.ro: $(PURGATORY_OBJS) FORCE
|
||||
$(call if_changed,ld)
|
||||
|
|
|
@ -1022,6 +1022,8 @@ static int __device_suspend_noirq(struct device *dev, pm_message_t state, bool a
|
|||
TRACE_DEVICE(dev);
|
||||
TRACE_SUSPEND(0);
|
||||
|
||||
dpm_wait_for_children(dev, async);
|
||||
|
||||
if (async_error)
|
||||
goto Complete;
|
||||
|
||||
|
@ -1033,8 +1035,6 @@ static int __device_suspend_noirq(struct device *dev, pm_message_t state, bool a
|
|||
if (dev->power.syscore || dev->power.direct_complete)
|
||||
goto Complete;
|
||||
|
||||
dpm_wait_for_children(dev, async);
|
||||
|
||||
if (dev->pm_domain) {
|
||||
info = "noirq power domain ";
|
||||
callback = pm_noirq_op(&dev->pm_domain->ops, state);
|
||||
|
@ -1169,6 +1169,8 @@ static int __device_suspend_late(struct device *dev, pm_message_t state, bool as
|
|||
|
||||
__pm_runtime_disable(dev, false);
|
||||
|
||||
dpm_wait_for_children(dev, async);
|
||||
|
||||
if (async_error)
|
||||
goto Complete;
|
||||
|
||||
|
@ -1180,8 +1182,6 @@ static int __device_suspend_late(struct device *dev, pm_message_t state, bool as
|
|||
if (dev->power.syscore || dev->power.direct_complete)
|
||||
goto Complete;
|
||||
|
||||
dpm_wait_for_children(dev, async);
|
||||
|
||||
if (dev->pm_domain) {
|
||||
info = "late power domain ";
|
||||
callback = pm_late_early_op(&dev->pm_domain->ops, state);
|
||||
|
|
|
@ -313,7 +313,7 @@ static void __init mmp2_clk_init(struct device_node *np)
|
|||
}
|
||||
|
||||
pxa_unit->apmu_base = of_iomap(np, 1);
|
||||
if (!pxa_unit->mpmu_base) {
|
||||
if (!pxa_unit->apmu_base) {
|
||||
pr_err("failed to map apmu registers\n");
|
||||
return;
|
||||
}
|
||||
|
|
|
@ -262,7 +262,7 @@ static void __init pxa168_clk_init(struct device_node *np)
|
|||
}
|
||||
|
||||
pxa_unit->apmu_base = of_iomap(np, 1);
|
||||
if (!pxa_unit->mpmu_base) {
|
||||
if (!pxa_unit->apmu_base) {
|
||||
pr_err("failed to map apmu registers\n");
|
||||
return;
|
||||
}
|
||||
|
|
|
@ -282,7 +282,7 @@ static void __init pxa910_clk_init(struct device_node *np)
|
|||
}
|
||||
|
||||
pxa_unit->apmu_base = of_iomap(np, 1);
|
||||
if (!pxa_unit->mpmu_base) {
|
||||
if (!pxa_unit->apmu_base) {
|
||||
pr_err("failed to map apmu registers\n");
|
||||
return;
|
||||
}
|
||||
|
@ -294,7 +294,7 @@ static void __init pxa910_clk_init(struct device_node *np)
|
|||
}
|
||||
|
||||
pxa_unit->apbcp_base = of_iomap(np, 3);
|
||||
if (!pxa_unit->mpmu_base) {
|
||||
if (!pxa_unit->apbcp_base) {
|
||||
pr_err("failed to map apbcp registers\n");
|
||||
return;
|
||||
}
|
||||
|
|
|
@ -4542,6 +4542,15 @@ static int __init caam_algapi_init(void)
|
|||
if (!aes_inst && (alg_sel == OP_ALG_ALGSEL_AES))
|
||||
continue;
|
||||
|
||||
/*
|
||||
* Check support for AES modes not available
|
||||
* on LP devices.
|
||||
*/
|
||||
if ((cha_vid & CHA_ID_LS_AES_MASK) == CHA_ID_LS_AES_LP)
|
||||
if ((alg->class1_alg_type & OP_ALG_AAI_MASK) ==
|
||||
OP_ALG_AAI_XTS)
|
||||
continue;
|
||||
|
||||
t_alg = caam_alg_alloc(alg);
|
||||
if (IS_ERR(t_alg)) {
|
||||
err = PTR_ERR(t_alg);
|
||||
|
|
|
@ -532,6 +532,7 @@ struct amdgpu_bo {
|
|||
u64 metadata_flags;
|
||||
void *metadata;
|
||||
u32 metadata_size;
|
||||
unsigned prime_shared_count;
|
||||
/* list of all virtual address to which this bo
|
||||
* is associated to
|
||||
*/
|
||||
|
|
|
@ -117,7 +117,7 @@ static int amdgpu_bo_list_set(struct amdgpu_device *adev,
|
|||
entry->allowed_domains = AMDGPU_GEM_DOMAIN_GTT;
|
||||
}
|
||||
entry->tv.bo = &entry->robj->tbo;
|
||||
entry->tv.shared = true;
|
||||
entry->tv.shared = !entry->robj->prime_shared_count;
|
||||
|
||||
if (entry->prefered_domains == AMDGPU_GEM_DOMAIN_GDS)
|
||||
gds_obj = entry->robj;
|
||||
|
|
|
@ -77,20 +77,36 @@ struct drm_gem_object *amdgpu_gem_prime_import_sg_table(struct drm_device *dev,
|
|||
list_add_tail(&bo->list, &adev->gem.objects);
|
||||
mutex_unlock(&adev->gem.mutex);
|
||||
|
||||
bo->prime_shared_count = 1;
|
||||
return &bo->gem_base;
|
||||
}
|
||||
|
||||
int amdgpu_gem_prime_pin(struct drm_gem_object *obj)
|
||||
{
|
||||
struct amdgpu_bo *bo = gem_to_amdgpu_bo(obj);
|
||||
int ret = 0;
|
||||
long ret = 0;
|
||||
|
||||
ret = amdgpu_bo_reserve(bo, false);
|
||||
if (unlikely(ret != 0))
|
||||
return ret;
|
||||
|
||||
/*
|
||||
* Wait for all shared fences to complete before we switch to future
|
||||
* use of exclusive fence on this prime shared bo.
|
||||
*/
|
||||
ret = reservation_object_wait_timeout_rcu(bo->tbo.resv, true, false,
|
||||
MAX_SCHEDULE_TIMEOUT);
|
||||
if (unlikely(ret < 0)) {
|
||||
DRM_DEBUG_PRIME("Fence wait failed: %li\n", ret);
|
||||
amdgpu_bo_unreserve(bo);
|
||||
return ret;
|
||||
}
|
||||
|
||||
/* pin buffer into GTT */
|
||||
ret = amdgpu_bo_pin(bo, AMDGPU_GEM_DOMAIN_GTT, NULL);
|
||||
if (likely(ret == 0))
|
||||
bo->prime_shared_count++;
|
||||
|
||||
amdgpu_bo_unreserve(bo);
|
||||
return ret;
|
||||
}
|
||||
|
@ -105,6 +121,8 @@ void amdgpu_gem_prime_unpin(struct drm_gem_object *obj)
|
|||
return;
|
||||
|
||||
amdgpu_bo_unpin(bo);
|
||||
if (bo->prime_shared_count)
|
||||
bo->prime_shared_count--;
|
||||
amdgpu_bo_unreserve(bo);
|
||||
}
|
||||
|
||||
|
|
|
@ -59,7 +59,6 @@ config I2C_CHARDEV
|
|||
|
||||
config I2C_MUX
|
||||
tristate "I2C bus multiplexing support"
|
||||
depends on HAS_IOMEM
|
||||
help
|
||||
Say Y here if you want the I2C core to support the ability to
|
||||
handle multiplexed I2C bus topologies, by presenting each
|
||||
|
|
|
@ -63,6 +63,7 @@ config I2C_MUX_PINCTRL
|
|||
|
||||
config I2C_MUX_REG
|
||||
tristate "Register-based I2C multiplexer"
|
||||
depends on HAS_IOMEM
|
||||
help
|
||||
If you say yes to this option, support will be included for a
|
||||
register based I2C multiplexer. This driver provides access to
|
||||
|
|
|
@ -80,6 +80,8 @@ static struct ib_cm {
|
|||
__be32 random_id_operand;
|
||||
struct list_head timewait_list;
|
||||
struct workqueue_struct *wq;
|
||||
/* Sync on cm change port state */
|
||||
spinlock_t state_lock;
|
||||
} cm;
|
||||
|
||||
/* Counter indexes ordered by attribute ID */
|
||||
|
@ -161,6 +163,8 @@ struct cm_port {
|
|||
struct ib_mad_agent *mad_agent;
|
||||
struct kobject port_obj;
|
||||
u8 port_num;
|
||||
struct list_head cm_priv_prim_list;
|
||||
struct list_head cm_priv_altr_list;
|
||||
struct cm_counter_group counter_group[CM_COUNTER_GROUPS];
|
||||
};
|
||||
|
||||
|
@ -241,6 +245,12 @@ struct cm_id_private {
|
|||
u8 service_timeout;
|
||||
u8 target_ack_delay;
|
||||
|
||||
struct list_head prim_list;
|
||||
struct list_head altr_list;
|
||||
/* Indicates that the send port mad is registered and av is set */
|
||||
int prim_send_port_not_ready;
|
||||
int altr_send_port_not_ready;
|
||||
|
||||
struct list_head work_list;
|
||||
atomic_t work_count;
|
||||
};
|
||||
|
@ -259,20 +269,47 @@ static int cm_alloc_msg(struct cm_id_private *cm_id_priv,
|
|||
struct ib_mad_agent *mad_agent;
|
||||
struct ib_mad_send_buf *m;
|
||||
struct ib_ah *ah;
|
||||
struct cm_av *av;
|
||||
unsigned long flags, flags2;
|
||||
int ret = 0;
|
||||
|
||||
/* don't let the port to be released till the agent is down */
|
||||
spin_lock_irqsave(&cm.state_lock, flags2);
|
||||
spin_lock_irqsave(&cm.lock, flags);
|
||||
if (!cm_id_priv->prim_send_port_not_ready)
|
||||
av = &cm_id_priv->av;
|
||||
else if (!cm_id_priv->altr_send_port_not_ready &&
|
||||
(cm_id_priv->alt_av.port))
|
||||
av = &cm_id_priv->alt_av;
|
||||
else {
|
||||
pr_info("%s: not valid CM id\n", __func__);
|
||||
ret = -ENODEV;
|
||||
spin_unlock_irqrestore(&cm.lock, flags);
|
||||
goto out;
|
||||
}
|
||||
spin_unlock_irqrestore(&cm.lock, flags);
|
||||
/* Make sure the port haven't released the mad yet */
|
||||
mad_agent = cm_id_priv->av.port->mad_agent;
|
||||
ah = ib_create_ah(mad_agent->qp->pd, &cm_id_priv->av.ah_attr);
|
||||
if (IS_ERR(ah))
|
||||
return PTR_ERR(ah);
|
||||
if (!mad_agent) {
|
||||
pr_info("%s: not a valid MAD agent\n", __func__);
|
||||
ret = -ENODEV;
|
||||
goto out;
|
||||
}
|
||||
ah = ib_create_ah(mad_agent->qp->pd, &av->ah_attr);
|
||||
if (IS_ERR(ah)) {
|
||||
ret = PTR_ERR(ah);
|
||||
goto out;
|
||||
}
|
||||
|
||||
m = ib_create_send_mad(mad_agent, cm_id_priv->id.remote_cm_qpn,
|
||||
cm_id_priv->av.pkey_index,
|
||||
av->pkey_index,
|
||||
0, IB_MGMT_MAD_HDR, IB_MGMT_MAD_DATA,
|
||||
GFP_ATOMIC,
|
||||
IB_MGMT_BASE_VERSION);
|
||||
if (IS_ERR(m)) {
|
||||
ib_destroy_ah(ah);
|
||||
return PTR_ERR(m);
|
||||
ret = PTR_ERR(m);
|
||||
goto out;
|
||||
}
|
||||
|
||||
/* Timeout set by caller if response is expected. */
|
||||
|
@ -282,7 +319,10 @@ static int cm_alloc_msg(struct cm_id_private *cm_id_priv,
|
|||
atomic_inc(&cm_id_priv->refcount);
|
||||
m->context[0] = cm_id_priv;
|
||||
*msg = m;
|
||||
return 0;
|
||||
|
||||
out:
|
||||
spin_unlock_irqrestore(&cm.state_lock, flags2);
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int cm_alloc_response_msg(struct cm_port *port,
|
||||
|
@ -352,7 +392,8 @@ static void cm_init_av_for_response(struct cm_port *port, struct ib_wc *wc,
|
|||
grh, &av->ah_attr);
|
||||
}
|
||||
|
||||
static int cm_init_av_by_path(struct ib_sa_path_rec *path, struct cm_av *av)
|
||||
static int cm_init_av_by_path(struct ib_sa_path_rec *path, struct cm_av *av,
|
||||
struct cm_id_private *cm_id_priv)
|
||||
{
|
||||
struct cm_device *cm_dev;
|
||||
struct cm_port *port = NULL;
|
||||
|
@ -387,7 +428,17 @@ static int cm_init_av_by_path(struct ib_sa_path_rec *path, struct cm_av *av)
|
|||
&av->ah_attr);
|
||||
av->timeout = path->packet_life_time + 1;
|
||||
|
||||
return 0;
|
||||
spin_lock_irqsave(&cm.lock, flags);
|
||||
if (&cm_id_priv->av == av)
|
||||
list_add_tail(&cm_id_priv->prim_list, &port->cm_priv_prim_list);
|
||||
else if (&cm_id_priv->alt_av == av)
|
||||
list_add_tail(&cm_id_priv->altr_list, &port->cm_priv_altr_list);
|
||||
else
|
||||
ret = -EINVAL;
|
||||
|
||||
spin_unlock_irqrestore(&cm.lock, flags);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int cm_alloc_id(struct cm_id_private *cm_id_priv)
|
||||
|
@ -677,6 +728,8 @@ struct ib_cm_id *ib_create_cm_id(struct ib_device *device,
|
|||
spin_lock_init(&cm_id_priv->lock);
|
||||
init_completion(&cm_id_priv->comp);
|
||||
INIT_LIST_HEAD(&cm_id_priv->work_list);
|
||||
INIT_LIST_HEAD(&cm_id_priv->prim_list);
|
||||
INIT_LIST_HEAD(&cm_id_priv->altr_list);
|
||||
atomic_set(&cm_id_priv->work_count, -1);
|
||||
atomic_set(&cm_id_priv->refcount, 1);
|
||||
return &cm_id_priv->id;
|
||||
|
@ -892,6 +945,15 @@ retest:
|
|||
break;
|
||||
}
|
||||
|
||||
spin_lock_irq(&cm.lock);
|
||||
if (!list_empty(&cm_id_priv->altr_list) &&
|
||||
(!cm_id_priv->altr_send_port_not_ready))
|
||||
list_del(&cm_id_priv->altr_list);
|
||||
if (!list_empty(&cm_id_priv->prim_list) &&
|
||||
(!cm_id_priv->prim_send_port_not_ready))
|
||||
list_del(&cm_id_priv->prim_list);
|
||||
spin_unlock_irq(&cm.lock);
|
||||
|
||||
cm_free_id(cm_id->local_id);
|
||||
cm_deref_id(cm_id_priv);
|
||||
wait_for_completion(&cm_id_priv->comp);
|
||||
|
@ -1192,12 +1254,13 @@ int ib_send_cm_req(struct ib_cm_id *cm_id,
|
|||
goto out;
|
||||
}
|
||||
|
||||
ret = cm_init_av_by_path(param->primary_path, &cm_id_priv->av);
|
||||
ret = cm_init_av_by_path(param->primary_path, &cm_id_priv->av,
|
||||
cm_id_priv);
|
||||
if (ret)
|
||||
goto error1;
|
||||
if (param->alternate_path) {
|
||||
ret = cm_init_av_by_path(param->alternate_path,
|
||||
&cm_id_priv->alt_av);
|
||||
&cm_id_priv->alt_av, cm_id_priv);
|
||||
if (ret)
|
||||
goto error1;
|
||||
}
|
||||
|
@ -1639,7 +1702,8 @@ static int cm_req_handler(struct cm_work *work)
|
|||
cm_format_paths_from_req(req_msg, &work->path[0], &work->path[1]);
|
||||
|
||||
memcpy(work->path[0].dmac, cm_id_priv->av.ah_attr.dmac, ETH_ALEN);
|
||||
ret = cm_init_av_by_path(&work->path[0], &cm_id_priv->av);
|
||||
ret = cm_init_av_by_path(&work->path[0], &cm_id_priv->av,
|
||||
cm_id_priv);
|
||||
if (ret) {
|
||||
ib_get_cached_gid(work->port->cm_dev->ib_device,
|
||||
work->port->port_num, 0, &work->path[0].sgid,
|
||||
|
@ -1650,7 +1714,8 @@ static int cm_req_handler(struct cm_work *work)
|
|||
goto rejected;
|
||||
}
|
||||
if (req_msg->alt_local_lid) {
|
||||
ret = cm_init_av_by_path(&work->path[1], &cm_id_priv->alt_av);
|
||||
ret = cm_init_av_by_path(&work->path[1], &cm_id_priv->alt_av,
|
||||
cm_id_priv);
|
||||
if (ret) {
|
||||
ib_send_cm_rej(cm_id, IB_CM_REJ_INVALID_ALT_GID,
|
||||
&work->path[0].sgid,
|
||||
|
@ -2705,7 +2770,8 @@ int ib_send_cm_lap(struct ib_cm_id *cm_id,
|
|||
goto out;
|
||||
}
|
||||
|
||||
ret = cm_init_av_by_path(alternate_path, &cm_id_priv->alt_av);
|
||||
ret = cm_init_av_by_path(alternate_path, &cm_id_priv->alt_av,
|
||||
cm_id_priv);
|
||||
if (ret)
|
||||
goto out;
|
||||
cm_id_priv->alt_av.timeout =
|
||||
|
@ -2817,7 +2883,8 @@ static int cm_lap_handler(struct cm_work *work)
|
|||
cm_init_av_for_response(work->port, work->mad_recv_wc->wc,
|
||||
work->mad_recv_wc->recv_buf.grh,
|
||||
&cm_id_priv->av);
|
||||
cm_init_av_by_path(param->alternate_path, &cm_id_priv->alt_av);
|
||||
cm_init_av_by_path(param->alternate_path, &cm_id_priv->alt_av,
|
||||
cm_id_priv);
|
||||
ret = atomic_inc_and_test(&cm_id_priv->work_count);
|
||||
if (!ret)
|
||||
list_add_tail(&work->list, &cm_id_priv->work_list);
|
||||
|
@ -3009,7 +3076,7 @@ int ib_send_cm_sidr_req(struct ib_cm_id *cm_id,
|
|||
return -EINVAL;
|
||||
|
||||
cm_id_priv = container_of(cm_id, struct cm_id_private, id);
|
||||
ret = cm_init_av_by_path(param->path, &cm_id_priv->av);
|
||||
ret = cm_init_av_by_path(param->path, &cm_id_priv->av, cm_id_priv);
|
||||
if (ret)
|
||||
goto out;
|
||||
|
||||
|
@ -3446,7 +3513,9 @@ out:
|
|||
static int cm_migrate(struct ib_cm_id *cm_id)
|
||||
{
|
||||
struct cm_id_private *cm_id_priv;
|
||||
struct cm_av tmp_av;
|
||||
unsigned long flags;
|
||||
int tmp_send_port_not_ready;
|
||||
int ret = 0;
|
||||
|
||||
cm_id_priv = container_of(cm_id, struct cm_id_private, id);
|
||||
|
@ -3455,7 +3524,14 @@ static int cm_migrate(struct ib_cm_id *cm_id)
|
|||
(cm_id->lap_state == IB_CM_LAP_UNINIT ||
|
||||
cm_id->lap_state == IB_CM_LAP_IDLE)) {
|
||||
cm_id->lap_state = IB_CM_LAP_IDLE;
|
||||
/* Swap address vector */
|
||||
tmp_av = cm_id_priv->av;
|
||||
cm_id_priv->av = cm_id_priv->alt_av;
|
||||
cm_id_priv->alt_av = tmp_av;
|
||||
/* Swap port send ready state */
|
||||
tmp_send_port_not_ready = cm_id_priv->prim_send_port_not_ready;
|
||||
cm_id_priv->prim_send_port_not_ready = cm_id_priv->altr_send_port_not_ready;
|
||||
cm_id_priv->altr_send_port_not_ready = tmp_send_port_not_ready;
|
||||
} else
|
||||
ret = -EINVAL;
|
||||
spin_unlock_irqrestore(&cm_id_priv->lock, flags);
|
||||
|
@ -3875,6 +3951,9 @@ static void cm_add_one(struct ib_device *ib_device)
|
|||
port->cm_dev = cm_dev;
|
||||
port->port_num = i;
|
||||
|
||||
INIT_LIST_HEAD(&port->cm_priv_prim_list);
|
||||
INIT_LIST_HEAD(&port->cm_priv_altr_list);
|
||||
|
||||
ret = cm_create_port_fs(port);
|
||||
if (ret)
|
||||
goto error1;
|
||||
|
@ -3932,6 +4011,8 @@ static void cm_remove_one(struct ib_device *ib_device, void *client_data)
|
|||
{
|
||||
struct cm_device *cm_dev = client_data;
|
||||
struct cm_port *port;
|
||||
struct cm_id_private *cm_id_priv;
|
||||
struct ib_mad_agent *cur_mad_agent;
|
||||
struct ib_port_modify port_modify = {
|
||||
.clr_port_cap_mask = IB_PORT_CM_SUP
|
||||
};
|
||||
|
@ -3955,15 +4036,27 @@ static void cm_remove_one(struct ib_device *ib_device, void *client_data)
|
|||
|
||||
port = cm_dev->port[i-1];
|
||||
ib_modify_port(ib_device, port->port_num, 0, &port_modify);
|
||||
/* Mark all the cm_id's as not valid */
|
||||
spin_lock_irq(&cm.lock);
|
||||
list_for_each_entry(cm_id_priv, &port->cm_priv_altr_list, altr_list)
|
||||
cm_id_priv->altr_send_port_not_ready = 1;
|
||||
list_for_each_entry(cm_id_priv, &port->cm_priv_prim_list, prim_list)
|
||||
cm_id_priv->prim_send_port_not_ready = 1;
|
||||
spin_unlock_irq(&cm.lock);
|
||||
/*
|
||||
* We flush the queue here after the going_down set, this
|
||||
* verify that no new works will be queued in the recv handler,
|
||||
* after that we can call the unregister_mad_agent
|
||||
*/
|
||||
flush_workqueue(cm.wq);
|
||||
ib_unregister_mad_agent(port->mad_agent);
|
||||
spin_lock_irq(&cm.state_lock);
|
||||
cur_mad_agent = port->mad_agent;
|
||||
port->mad_agent = NULL;
|
||||
spin_unlock_irq(&cm.state_lock);
|
||||
ib_unregister_mad_agent(cur_mad_agent);
|
||||
cm_remove_port_fs(port);
|
||||
}
|
||||
|
||||
device_unregister(cm_dev->device);
|
||||
kfree(cm_dev);
|
||||
}
|
||||
|
@ -3976,6 +4069,7 @@ static int __init ib_cm_init(void)
|
|||
INIT_LIST_HEAD(&cm.device_list);
|
||||
rwlock_init(&cm.device_lock);
|
||||
spin_lock_init(&cm.lock);
|
||||
spin_lock_init(&cm.state_lock);
|
||||
cm.listen_service_table = RB_ROOT;
|
||||
cm.listen_service_id = be64_to_cpu(IB_CM_ASSIGN_SERVICE_ID);
|
||||
cm.remote_id_table = RB_ROOT;
|
||||
|
|
|
@ -175,7 +175,7 @@ struct ib_umem *ib_umem_get(struct ib_ucontext *context, unsigned long addr,
|
|||
|
||||
cur_base = addr & PAGE_MASK;
|
||||
|
||||
if (npages == 0) {
|
||||
if (npages == 0 || npages > UINT_MAX) {
|
||||
ret = -EINVAL;
|
||||
goto out;
|
||||
}
|
||||
|
|
|
@ -244,12 +244,9 @@ static int ib_uverbs_cleanup_ucontext(struct ib_uverbs_file *file,
|
|||
container_of(uobj, struct ib_uqp_object, uevent.uobject);
|
||||
|
||||
idr_remove_uobj(&ib_uverbs_qp_idr, uobj);
|
||||
if (qp != qp->real_qp) {
|
||||
ib_close_qp(qp);
|
||||
} else {
|
||||
if (qp == qp->real_qp)
|
||||
ib_uverbs_detach_umcast(qp, uqp);
|
||||
ib_destroy_qp(qp);
|
||||
}
|
||||
ib_destroy_qp(qp);
|
||||
ib_uverbs_release_uevent(file, &uqp->uevent);
|
||||
kfree(uqp);
|
||||
}
|
||||
|
|
|
@ -102,7 +102,10 @@ static struct ib_ah *create_iboe_ah(struct ib_pd *pd, struct ib_ah_attr *ah_attr
|
|||
if (vlan_tag < 0x1000)
|
||||
vlan_tag |= (ah_attr->sl & 7) << 13;
|
||||
ah->av.eth.port_pd = cpu_to_be32(to_mpd(pd)->pdn | (ah_attr->port_num << 24));
|
||||
ah->av.eth.gid_index = mlx4_ib_gid_index_to_real_index(ibdev, ah_attr->port_num, ah_attr->grh.sgid_index);
|
||||
ret = mlx4_ib_gid_index_to_real_index(ibdev, ah_attr->port_num, ah_attr->grh.sgid_index);
|
||||
if (ret < 0)
|
||||
return ERR_PTR(ret);
|
||||
ah->av.eth.gid_index = ret;
|
||||
ah->av.eth.vlan = cpu_to_be16(vlan_tag);
|
||||
if (ah_attr->static_rate) {
|
||||
ah->av.eth.stat_rate = ah_attr->static_rate + MLX4_STAT_RATE_OFFSET;
|
||||
|
|
|
@ -253,11 +253,14 @@ struct ib_cq *mlx4_ib_create_cq(struct ib_device *ibdev,
|
|||
if (context)
|
||||
if (ib_copy_to_udata(udata, &cq->mcq.cqn, sizeof (__u32))) {
|
||||
err = -EFAULT;
|
||||
goto err_dbmap;
|
||||
goto err_cq_free;
|
||||
}
|
||||
|
||||
return &cq->ibcq;
|
||||
|
||||
err_cq_free:
|
||||
mlx4_cq_free(dev->dev, &cq->mcq);
|
||||
|
||||
err_dbmap:
|
||||
if (context)
|
||||
mlx4_ib_db_unmap_user(to_mucontext(context), &cq->db);
|
||||
|
|
|
@ -787,8 +787,7 @@ struct ib_cq *mlx5_ib_create_cq(struct ib_device *ibdev,
|
|||
if (err)
|
||||
goto err_create;
|
||||
} else {
|
||||
/* for now choose 64 bytes till we have a proper interface */
|
||||
cqe_size = 64;
|
||||
cqe_size = cache_line_size() == 128 ? 128 : 64;
|
||||
err = create_cq_kernel(dev, cq, entries, cqe_size, &cqb,
|
||||
&index, &inlen);
|
||||
if (err)
|
||||
|
|
|
@ -947,13 +947,13 @@ static void mlx5_ib_event(struct mlx5_core_dev *dev, void *context,
|
|||
{
|
||||
struct mlx5_ib_dev *ibdev = (struct mlx5_ib_dev *)context;
|
||||
struct ib_event ibev;
|
||||
|
||||
bool fatal = false;
|
||||
u8 port = 0;
|
||||
|
||||
switch (event) {
|
||||
case MLX5_DEV_EVENT_SYS_ERROR:
|
||||
ibdev->ib_active = false;
|
||||
ibev.event = IB_EVENT_DEVICE_FATAL;
|
||||
fatal = true;
|
||||
break;
|
||||
|
||||
case MLX5_DEV_EVENT_PORT_UP:
|
||||
|
@ -998,6 +998,9 @@ static void mlx5_ib_event(struct mlx5_core_dev *dev, void *context,
|
|||
|
||||
if (ibdev->ib_active)
|
||||
ib_dispatch_event(&ibev);
|
||||
|
||||
if (fatal)
|
||||
ibdev->ib_active = false;
|
||||
}
|
||||
|
||||
static void get_ext_port_caps(struct mlx5_ib_dev *dev)
|
||||
|
|
|
@ -494,9 +494,6 @@ int intel_lpss_suspend(struct device *dev)
|
|||
for (i = 0; i < LPSS_PRIV_REG_COUNT; i++)
|
||||
lpss->priv_ctx[i] = readl(lpss->priv + i * 4);
|
||||
|
||||
/* Put the device into reset state */
|
||||
writel(0, lpss->priv + LPSS_PRIV_RESETS);
|
||||
|
||||
return 0;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(intel_lpss_suspend);
|
||||
|
|
|
@ -354,6 +354,8 @@ int mfd_clone_cell(const char *cell, const char **clones, size_t n_clones)
|
|||
clones[i]);
|
||||
}
|
||||
|
||||
put_device(dev);
|
||||
|
||||
return 0;
|
||||
}
|
||||
EXPORT_SYMBOL(mfd_clone_cell);
|
||||
|
|
|
@ -475,48 +475,64 @@ static const struct pci_device_id iwl_hw_card_ids[] = {
|
|||
MODULE_DEVICE_TABLE(pci, iwl_hw_card_ids);
|
||||
|
||||
#ifdef CONFIG_ACPI
|
||||
#define SPL_METHOD "SPLC"
|
||||
#define SPL_DOMAINTYPE_MODULE BIT(0)
|
||||
#define SPL_DOMAINTYPE_WIFI BIT(1)
|
||||
#define SPL_DOMAINTYPE_WIGIG BIT(2)
|
||||
#define SPL_DOMAINTYPE_RFEM BIT(3)
|
||||
#define ACPI_SPLC_METHOD "SPLC"
|
||||
#define ACPI_SPLC_DOMAIN_WIFI (0x07)
|
||||
|
||||
static u64 splx_get_pwr_limit(struct iwl_trans *trans, union acpi_object *splx)
|
||||
static u64 splc_get_pwr_limit(struct iwl_trans *trans, union acpi_object *splc)
|
||||
{
|
||||
union acpi_object *limits, *domain_type, *power_limit;
|
||||
union acpi_object *data_pkg, *dflt_pwr_limit;
|
||||
int i;
|
||||
|
||||
if (splx->type != ACPI_TYPE_PACKAGE ||
|
||||
splx->package.count != 2 ||
|
||||
splx->package.elements[0].type != ACPI_TYPE_INTEGER ||
|
||||
splx->package.elements[0].integer.value != 0) {
|
||||
IWL_ERR(trans, "Unsupported splx structure\n");
|
||||
/* We need at least two elements, one for the revision and one
|
||||
* for the data itself. Also check that the revision is
|
||||
* supported (currently only revision 0).
|
||||
*/
|
||||
if (splc->type != ACPI_TYPE_PACKAGE ||
|
||||
splc->package.count < 2 ||
|
||||
splc->package.elements[0].type != ACPI_TYPE_INTEGER ||
|
||||
splc->package.elements[0].integer.value != 0) {
|
||||
IWL_DEBUG_INFO(trans,
|
||||
"Unsupported structure returned by the SPLC method. Ignoring.\n");
|
||||
return 0;
|
||||
}
|
||||
|
||||
limits = &splx->package.elements[1];
|
||||
if (limits->type != ACPI_TYPE_PACKAGE ||
|
||||
limits->package.count < 2 ||
|
||||
limits->package.elements[0].type != ACPI_TYPE_INTEGER ||
|
||||
limits->package.elements[1].type != ACPI_TYPE_INTEGER) {
|
||||
IWL_ERR(trans, "Invalid limits element\n");
|
||||
/* loop through all the packages to find the one for WiFi */
|
||||
for (i = 1; i < splc->package.count; i++) {
|
||||
union acpi_object *domain;
|
||||
|
||||
data_pkg = &splc->package.elements[i];
|
||||
|
||||
/* Skip anything that is not a package with the right
|
||||
* amount of elements (i.e. at least 2 integers).
|
||||
*/
|
||||
if (data_pkg->type != ACPI_TYPE_PACKAGE ||
|
||||
data_pkg->package.count < 2 ||
|
||||
data_pkg->package.elements[0].type != ACPI_TYPE_INTEGER ||
|
||||
data_pkg->package.elements[1].type != ACPI_TYPE_INTEGER)
|
||||
continue;
|
||||
|
||||
domain = &data_pkg->package.elements[0];
|
||||
if (domain->integer.value == ACPI_SPLC_DOMAIN_WIFI)
|
||||
break;
|
||||
|
||||
data_pkg = NULL;
|
||||
}
|
||||
|
||||
if (!data_pkg) {
|
||||
IWL_DEBUG_INFO(trans,
|
||||
"No element for the WiFi domain returned by the SPLC method.\n");
|
||||
return 0;
|
||||
}
|
||||
|
||||
domain_type = &limits->package.elements[0];
|
||||
power_limit = &limits->package.elements[1];
|
||||
if (!(domain_type->integer.value & SPL_DOMAINTYPE_WIFI)) {
|
||||
IWL_DEBUG_INFO(trans, "WiFi power is not limited\n");
|
||||
return 0;
|
||||
}
|
||||
|
||||
return power_limit->integer.value;
|
||||
dflt_pwr_limit = &data_pkg->package.elements[1];
|
||||
return dflt_pwr_limit->integer.value;
|
||||
}
|
||||
|
||||
static void set_dflt_pwr_limit(struct iwl_trans *trans, struct pci_dev *pdev)
|
||||
{
|
||||
acpi_handle pxsx_handle;
|
||||
acpi_handle handle;
|
||||
struct acpi_buffer splx = {ACPI_ALLOCATE_BUFFER, NULL};
|
||||
struct acpi_buffer splc = {ACPI_ALLOCATE_BUFFER, NULL};
|
||||
acpi_status status;
|
||||
|
||||
pxsx_handle = ACPI_HANDLE(&pdev->dev);
|
||||
|
@ -527,23 +543,24 @@ static void set_dflt_pwr_limit(struct iwl_trans *trans, struct pci_dev *pdev)
|
|||
}
|
||||
|
||||
/* Get the method's handle */
|
||||
status = acpi_get_handle(pxsx_handle, (acpi_string)SPL_METHOD, &handle);
|
||||
status = acpi_get_handle(pxsx_handle, (acpi_string)ACPI_SPLC_METHOD,
|
||||
&handle);
|
||||
if (ACPI_FAILURE(status)) {
|
||||
IWL_DEBUG_INFO(trans, "SPL method not found\n");
|
||||
IWL_DEBUG_INFO(trans, "SPLC method not found\n");
|
||||
return;
|
||||
}
|
||||
|
||||
/* Call SPLC with no arguments */
|
||||
status = acpi_evaluate_object(handle, NULL, NULL, &splx);
|
||||
status = acpi_evaluate_object(handle, NULL, NULL, &splc);
|
||||
if (ACPI_FAILURE(status)) {
|
||||
IWL_ERR(trans, "SPLC invocation failed (0x%x)\n", status);
|
||||
return;
|
||||
}
|
||||
|
||||
trans->dflt_pwr_limit = splx_get_pwr_limit(trans, splx.pointer);
|
||||
trans->dflt_pwr_limit = splc_get_pwr_limit(trans, splc.pointer);
|
||||
IWL_DEBUG_INFO(trans, "Default power limit set to %lld\n",
|
||||
trans->dflt_pwr_limit);
|
||||
kfree(splx.pointer);
|
||||
kfree(splc.pointer);
|
||||
}
|
||||
|
||||
#else /* CONFIG_ACPI */
|
||||
|
|
|
@ -109,6 +109,7 @@
|
|||
/* OMAP_RTC_OSC_REG bit fields: */
|
||||
#define OMAP_RTC_OSC_32KCLK_EN BIT(6)
|
||||
#define OMAP_RTC_OSC_SEL_32KCLK_SRC BIT(3)
|
||||
#define OMAP_RTC_OSC_OSC32K_GZ_DISABLE BIT(4)
|
||||
|
||||
/* OMAP_RTC_IRQWAKEEN bit fields: */
|
||||
#define OMAP_RTC_IRQWAKEEN_ALARM_WAKEEN BIT(1)
|
||||
|
@ -646,8 +647,9 @@ static int omap_rtc_probe(struct platform_device *pdev)
|
|||
*/
|
||||
if (rtc->has_ext_clk) {
|
||||
reg = rtc_read(rtc, OMAP_RTC_OSC_REG);
|
||||
rtc_write(rtc, OMAP_RTC_OSC_REG,
|
||||
reg | OMAP_RTC_OSC_SEL_32KCLK_SRC);
|
||||
reg &= ~OMAP_RTC_OSC_OSC32K_GZ_DISABLE;
|
||||
reg |= OMAP_RTC_OSC_32KCLK_EN | OMAP_RTC_OSC_SEL_32KCLK_SRC;
|
||||
rtc_writel(rtc, OMAP_RTC_OSC_REG, reg);
|
||||
}
|
||||
|
||||
rtc->type->lock(rtc);
|
||||
|
|
|
@ -56,8 +56,11 @@ static struct uwb_rc *uwb_rc_find_by_index(int index)
|
|||
struct uwb_rc *rc = NULL;
|
||||
|
||||
dev = class_find_device(&uwb_rc_class, NULL, &index, uwb_rc_index_match);
|
||||
if (dev)
|
||||
if (dev) {
|
||||
rc = dev_get_drvdata(dev);
|
||||
put_device(dev);
|
||||
}
|
||||
|
||||
return rc;
|
||||
}
|
||||
|
||||
|
@ -467,7 +470,9 @@ struct uwb_rc *__uwb_rc_try_get(struct uwb_rc *target_rc)
|
|||
if (dev) {
|
||||
rc = dev_get_drvdata(dev);
|
||||
__uwb_rc_get(rc);
|
||||
put_device(dev);
|
||||
}
|
||||
|
||||
return rc;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(__uwb_rc_try_get);
|
||||
|
@ -520,8 +525,11 @@ struct uwb_rc *uwb_rc_get_by_grandpa(const struct device *grandpa_dev)
|
|||
|
||||
dev = class_find_device(&uwb_rc_class, NULL, grandpa_dev,
|
||||
find_rc_grandpa);
|
||||
if (dev)
|
||||
if (dev) {
|
||||
rc = dev_get_drvdata(dev);
|
||||
put_device(dev);
|
||||
}
|
||||
|
||||
return rc;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(uwb_rc_get_by_grandpa);
|
||||
|
@ -553,8 +561,10 @@ struct uwb_rc *uwb_rc_get_by_dev(const struct uwb_dev_addr *addr)
|
|||
struct uwb_rc *rc = NULL;
|
||||
|
||||
dev = class_find_device(&uwb_rc_class, NULL, addr, find_rc_dev);
|
||||
if (dev)
|
||||
if (dev) {
|
||||
rc = dev_get_drvdata(dev);
|
||||
put_device(dev);
|
||||
}
|
||||
|
||||
return rc;
|
||||
}
|
||||
|
|
|
@ -97,6 +97,8 @@ static bool uwb_rc_class_device_exists(struct uwb_rc *target_rc)
|
|||
|
||||
dev = class_find_device(&uwb_rc_class, NULL, target_rc, find_rc);
|
||||
|
||||
put_device(dev);
|
||||
|
||||
return (dev != NULL);
|
||||
}
|
||||
|
||||
|
|
|
@ -221,6 +221,7 @@ struct ext4_io_submit {
|
|||
#define EXT4_MAX_BLOCK_SIZE 65536
|
||||
#define EXT4_MIN_BLOCK_LOG_SIZE 10
|
||||
#define EXT4_MAX_BLOCK_LOG_SIZE 16
|
||||
#define EXT4_MAX_CLUSTER_LOG_SIZE 30
|
||||
#ifdef __KERNEL__
|
||||
# define EXT4_BLOCK_SIZE(s) ((s)->s_blocksize)
|
||||
#else
|
||||
|
|
|
@ -3394,7 +3394,15 @@ static int ext4_fill_super(struct super_block *sb, void *data, int silent)
|
|||
if (blocksize < EXT4_MIN_BLOCK_SIZE ||
|
||||
blocksize > EXT4_MAX_BLOCK_SIZE) {
|
||||
ext4_msg(sb, KERN_ERR,
|
||||
"Unsupported filesystem blocksize %d", blocksize);
|
||||
"Unsupported filesystem blocksize %d (%d log_block_size)",
|
||||
blocksize, le32_to_cpu(es->s_log_block_size));
|
||||
goto failed_mount;
|
||||
}
|
||||
if (le32_to_cpu(es->s_log_block_size) >
|
||||
(EXT4_MAX_BLOCK_LOG_SIZE - EXT4_MIN_BLOCK_LOG_SIZE)) {
|
||||
ext4_msg(sb, KERN_ERR,
|
||||
"Invalid log block size: %u",
|
||||
le32_to_cpu(es->s_log_block_size));
|
||||
goto failed_mount;
|
||||
}
|
||||
|
||||
|
@ -3533,6 +3541,13 @@ static int ext4_fill_super(struct super_block *sb, void *data, int silent)
|
|||
"block size (%d)", clustersize, blocksize);
|
||||
goto failed_mount;
|
||||
}
|
||||
if (le32_to_cpu(es->s_log_cluster_size) >
|
||||
(EXT4_MAX_CLUSTER_LOG_SIZE - EXT4_MIN_BLOCK_LOG_SIZE)) {
|
||||
ext4_msg(sb, KERN_ERR,
|
||||
"Invalid log cluster size: %u",
|
||||
le32_to_cpu(es->s_log_cluster_size));
|
||||
goto failed_mount;
|
||||
}
|
||||
sbi->s_cluster_bits = le32_to_cpu(es->s_log_cluster_size) -
|
||||
le32_to_cpu(es->s_log_block_size);
|
||||
sbi->s_clusters_per_group =
|
||||
|
|
|
@ -1997,6 +1997,10 @@ static int fuse_write_end(struct file *file, struct address_space *mapping,
|
|||
{
|
||||
struct inode *inode = page->mapping->host;
|
||||
|
||||
/* Haven't copied anything? Skip zeroing, size extending, dirtying. */
|
||||
if (!copied)
|
||||
goto unlock;
|
||||
|
||||
if (!PageUptodate(page)) {
|
||||
/* Zero any unwritten bytes at the end of the page */
|
||||
size_t endoff = (pos + copied) & ~PAGE_CACHE_MASK;
|
||||
|
@ -2007,6 +2011,8 @@ static int fuse_write_end(struct file *file, struct address_space *mapping,
|
|||
|
||||
fuse_write_update_size(inode, pos + copied);
|
||||
set_page_dirty(page);
|
||||
|
||||
unlock:
|
||||
unlock_page(page);
|
||||
page_cache_release(page);
|
||||
|
||||
|
|
|
@ -203,8 +203,10 @@ static int __init test_suspend(void)
|
|||
|
||||
/* RTCs have initialized by now too ... can we use one? */
|
||||
dev = class_find_device(rtc_class, NULL, NULL, has_wakealarm);
|
||||
if (dev)
|
||||
if (dev) {
|
||||
rtc = rtc_class_open(dev_name(dev));
|
||||
put_device(dev);
|
||||
}
|
||||
if (!rtc) {
|
||||
printk(warn_no_rtc);
|
||||
return 0;
|
||||
|
|
|
@ -1500,24 +1500,31 @@ static int bcm_connect(struct socket *sock, struct sockaddr *uaddr, int len,
|
|||
struct sockaddr_can *addr = (struct sockaddr_can *)uaddr;
|
||||
struct sock *sk = sock->sk;
|
||||
struct bcm_sock *bo = bcm_sk(sk);
|
||||
int ret = 0;
|
||||
|
||||
if (len < sizeof(*addr))
|
||||
return -EINVAL;
|
||||
|
||||
if (bo->bound)
|
||||
return -EISCONN;
|
||||
lock_sock(sk);
|
||||
|
||||
if (bo->bound) {
|
||||
ret = -EISCONN;
|
||||
goto fail;
|
||||
}
|
||||
|
||||
/* bind a device to this socket */
|
||||
if (addr->can_ifindex) {
|
||||
struct net_device *dev;
|
||||
|
||||
dev = dev_get_by_index(&init_net, addr->can_ifindex);
|
||||
if (!dev)
|
||||
return -ENODEV;
|
||||
|
||||
if (!dev) {
|
||||
ret = -ENODEV;
|
||||
goto fail;
|
||||
}
|
||||
if (dev->type != ARPHRD_CAN) {
|
||||
dev_put(dev);
|
||||
return -ENODEV;
|
||||
ret = -ENODEV;
|
||||
goto fail;
|
||||
}
|
||||
|
||||
bo->ifindex = dev->ifindex;
|
||||
|
@ -1528,17 +1535,24 @@ static int bcm_connect(struct socket *sock, struct sockaddr *uaddr, int len,
|
|||
bo->ifindex = 0;
|
||||
}
|
||||
|
||||
bo->bound = 1;
|
||||
|
||||
if (proc_dir) {
|
||||
/* unique socket address as filename */
|
||||
sprintf(bo->procname, "%lu", sock_i_ino(sk));
|
||||
bo->bcm_proc_read = proc_create_data(bo->procname, 0644,
|
||||
proc_dir,
|
||||
&bcm_proc_fops, sk);
|
||||
if (!bo->bcm_proc_read) {
|
||||
ret = -ENOMEM;
|
||||
goto fail;
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
bo->bound = 1;
|
||||
|
||||
fail:
|
||||
release_sock(sk);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int bcm_recvmsg(struct socket *sock, struct msghdr *msg, size_t size,
|
||||
|
|
|
@ -140,7 +140,8 @@ static int nft_dynset_init(const struct nft_ctx *ctx,
|
|||
if (tb[NFTA_DYNSET_TIMEOUT] != NULL) {
|
||||
if (!(set->flags & NFT_SET_TIMEOUT))
|
||||
return -EINVAL;
|
||||
timeout = be64_to_cpu(nla_get_be64(tb[NFTA_DYNSET_TIMEOUT]));
|
||||
timeout = msecs_to_jiffies(be64_to_cpu(nla_get_be64(
|
||||
tb[NFTA_DYNSET_TIMEOUT])));
|
||||
}
|
||||
|
||||
priv->sreg_key = nft_parse_register(tb[NFTA_DYNSET_SREG_KEY]);
|
||||
|
@ -227,7 +228,8 @@ static int nft_dynset_dump(struct sk_buff *skb, const struct nft_expr *expr)
|
|||
goto nla_put_failure;
|
||||
if (nla_put_string(skb, NFTA_DYNSET_SET_NAME, priv->set->name))
|
||||
goto nla_put_failure;
|
||||
if (nla_put_be64(skb, NFTA_DYNSET_TIMEOUT, cpu_to_be64(priv->timeout)))
|
||||
if (nla_put_be64(skb, NFTA_DYNSET_TIMEOUT,
|
||||
cpu_to_be64(jiffies_to_msecs(priv->timeout))))
|
||||
goto nla_put_failure;
|
||||
if (priv->expr && nft_expr_dump(skb, NFTA_DYNSET_EXPR, priv->expr))
|
||||
goto nla_put_failure;
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
#!/bin/sh
|
||||
|
||||
echo "int foo(void) { char X[200]; return 3; }" | $* -S -x c -c -O0 -mcmodel=kernel -fstack-protector - -o - 2> /dev/null | grep -q "%gs"
|
||||
echo "int foo(void) { char X[200]; return 3; }" | $* -S -x c -c -O0 -mcmodel=kernel -fno-PIE -fstack-protector - -o - 2> /dev/null | grep -q "%gs"
|
||||
if [ "$?" -eq "0" ] ; then
|
||||
echo y
|
||||
else
|
||||
|
|
Loading…
Add table
Reference in a new issue