void dma_resv_init(struct dma_resv *obj)
 {
        ww_mutex_init(&obj->lock, &reservation_ww_class);
-       seqcount_init(&obj->seq);
+       seqcount_ww_mutex_init(&obj->seq, &obj->lock);
 
        RCU_INIT_POINTER(obj->fence, NULL);
        RCU_INIT_POINTER(obj->fence_excl, NULL);
        fobj = dma_resv_get_list(obj);
        count = fobj->shared_count;
 
-       preempt_disable();
        write_seqcount_begin(&obj->seq);
 
        for (i = 0; i < count; ++i) {
        smp_store_mb(fobj->shared_count, count);
 
        write_seqcount_end(&obj->seq);
-       preempt_enable();
        dma_fence_put(old);
 }
 EXPORT_SYMBOL(dma_resv_add_shared_fence);
        if (fence)
                dma_fence_get(fence);
 
-       preempt_disable();
        write_seqcount_begin(&obj->seq);
        /* write_seqcount_begin provides the necessary memory barrier */
        RCU_INIT_POINTER(obj->fence_excl, fence);
        if (old)
                old->shared_count = 0;
        write_seqcount_end(&obj->seq);
-       preempt_enable();
 
        /* inplace update, no shared fences */
        while (i--)
        src_list = dma_resv_get_list(dst);
        old = dma_resv_get_excl(dst);
 
-       preempt_disable();
        write_seqcount_begin(&dst->seq);
        /* write_seqcount_begin provides the necessary memory barrier */
        RCU_INIT_POINTER(dst->fence_excl, new);
        RCU_INIT_POINTER(dst->fence, dst_list);
        write_seqcount_end(&dst->seq);
-       preempt_enable();
 
        dma_resv_list_free(src_list);
        dma_fence_put(old);
 
        new->shared_count = k;
 
        /* Install the new fence list, seqcount provides the barriers */
-       preempt_disable();
        write_seqcount_begin(&resv->seq);
        RCU_INIT_POINTER(resv->fence, new);
        write_seqcount_end(&resv->seq);
-       preempt_enable();
 
        /* Drop the references to the removed fences or move them to ef_list */
        for (i = j, k = 0; i < old->shared_count; ++i) {